chronic 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. data/HISTORY.md +76 -0
  2. data/LICENSE +21 -0
  3. data/Manifest.txt +2 -0
  4. data/README.md +165 -0
  5. data/Rakefile +137 -32
  6. data/benchmark/benchmark.rb +13 -0
  7. data/chronic.gemspec +85 -0
  8. data/lib/chronic/chronic.rb +60 -50
  9. data/lib/chronic/grabber.rb +2 -2
  10. data/lib/chronic/handlers.rb +221 -111
  11. data/lib/{numerizer → chronic/numerizer}/numerizer.rb +17 -23
  12. data/lib/chronic/ordinal.rb +6 -6
  13. data/lib/chronic/pointer.rb +3 -3
  14. data/lib/chronic/repeater.rb +27 -12
  15. data/lib/chronic/repeaters/repeater_day.rb +23 -18
  16. data/lib/chronic/repeaters/repeater_day_name.rb +19 -14
  17. data/lib/chronic/repeaters/repeater_day_portion.rb +23 -22
  18. data/lib/chronic/repeaters/repeater_fortnight.rb +16 -11
  19. data/lib/chronic/repeaters/repeater_hour.rb +20 -15
  20. data/lib/chronic/repeaters/repeater_minute.rb +31 -16
  21. data/lib/chronic/repeaters/repeater_month.rb +33 -24
  22. data/lib/chronic/repeaters/repeater_month_name.rb +31 -26
  23. data/lib/chronic/repeaters/repeater_season.rb +136 -9
  24. data/lib/chronic/repeaters/repeater_season_name.rb +38 -17
  25. data/lib/chronic/repeaters/repeater_second.rb +15 -10
  26. data/lib/chronic/repeaters/repeater_time.rb +53 -43
  27. data/lib/chronic/repeaters/repeater_week.rb +16 -11
  28. data/lib/chronic/repeaters/repeater_weekday.rb +77 -0
  29. data/lib/chronic/repeaters/repeater_weekend.rb +14 -9
  30. data/lib/chronic/repeaters/repeater_year.rb +31 -25
  31. data/lib/chronic/scalar.rb +16 -14
  32. data/lib/chronic/separator.rb +25 -10
  33. data/lib/chronic/time_zone.rb +23 -0
  34. data/lib/chronic.rb +69 -14
  35. data/test/helper.rb +7 -0
  36. data/test/test_Chronic.rb +17 -18
  37. data/test/test_DaylightSavings.rb +118 -0
  38. data/test/test_Handler.rb +37 -38
  39. data/test/test_Numerizer.rb +8 -5
  40. data/test/test_RepeaterDayName.rb +15 -16
  41. data/test/test_RepeaterFortnight.rb +16 -17
  42. data/test/test_RepeaterHour.rb +18 -19
  43. data/test/test_RepeaterMinute.rb +34 -0
  44. data/test/test_RepeaterMonth.rb +16 -17
  45. data/test/test_RepeaterMonthName.rb +17 -18
  46. data/test/test_RepeaterTime.rb +20 -22
  47. data/test/test_RepeaterWeek.rb +16 -17
  48. data/test/test_RepeaterWeekday.rb +55 -0
  49. data/test/test_RepeaterWeekend.rb +21 -22
  50. data/test/test_RepeaterYear.rb +17 -18
  51. data/test/test_Span.rb +5 -6
  52. data/test/test_Time.rb +49 -0
  53. data/test/test_Token.rb +5 -6
  54. data/test/test_parsing.rb +338 -178
  55. metadata +78 -50
  56. data/History.txt +0 -38
  57. data/README.txt +0 -149
  58. data/test/suite.rb +0 -9
data/test/test_parsing.rb CHANGED
@@ -1,550 +1,710 @@
1
- require 'chronic'
2
- require 'test/unit'
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
3
2
 
4
3
  class TestParsing < Test::Unit::TestCase
5
4
  # Wed Aug 16 14:00:00 UTC 2006
6
5
  TIME_2006_08_16_14_00_00 = Time.local(2006, 8, 16, 14, 0, 0, 0)
7
-
6
+
8
7
  def setup
9
8
  @time_2006_08_16_14_00_00 = TIME_2006_08_16_14_00_00
10
9
  end
11
-
10
+
12
11
  def test_parse_guess_dates
13
12
  # rm_sd
14
13
 
15
14
  time = parse_now("may 27")
16
15
  assert_equal Time.local(2007, 5, 27, 12), time
17
-
16
+
18
17
  time = parse_now("may 28", :context => :past)
19
18
  assert_equal Time.local(2006, 5, 28, 12), time
20
-
19
+
21
20
  time = parse_now("may 28 5pm", :context => :past)
22
21
  assert_equal Time.local(2006, 5, 28, 17), time
23
-
22
+
24
23
  time = parse_now("may 28 at 5pm", :context => :past)
25
24
  assert_equal Time.local(2006, 5, 28, 17), time
26
-
25
+
27
26
  time = parse_now("may 28 at 5:32.19pm", :context => :past)
28
27
  assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
29
-
28
+
29
+ # rm_sd_on
30
+
31
+ time = parse_now("5pm on may 28")
32
+ assert_equal Time.local(2007, 5, 28, 17), time
33
+
34
+ time = parse_now("5pm may 28")
35
+ assert_equal Time.local(2007, 5, 28, 17), time
36
+
37
+ time = parse_now("5 on may 28", :ambiguous_time_range => :none)
38
+ assert_equal Time.local(2007, 5, 28, 05), time
39
+
30
40
  # rm_od
31
-
41
+
32
42
  time = parse_now("may 27th")
33
43
  assert_equal Time.local(2007, 5, 27, 12), time
34
-
44
+
35
45
  time = parse_now("may 27th", :context => :past)
36
46
  assert_equal Time.local(2006, 5, 27, 12), time
37
-
47
+
38
48
  time = parse_now("may 27th 5:00 pm", :context => :past)
39
49
  assert_equal Time.local(2006, 5, 27, 17), time
40
-
50
+
41
51
  time = parse_now("may 27th at 5pm", :context => :past)
42
52
  assert_equal Time.local(2006, 5, 27, 17), time
43
-
53
+
44
54
  time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
45
55
  assert_equal Time.local(2007, 5, 27, 5), time
46
-
56
+
57
+ # rm_od_on
58
+
59
+ time = parse_now("5:00 pm may 27th", :context => :past)
60
+ assert_equal Time.local(2006, 5, 27, 17), time
61
+
62
+ time = parse_now("5pm on may 27th", :context => :past)
63
+ assert_equal Time.local(2006, 5, 27, 17), time
64
+
65
+ time = parse_now("5 on may 27th", :ambiguous_time_range => :none)
66
+ assert_equal Time.local(2007, 5, 27, 5), time
67
+
47
68
  # rm_sy
48
-
69
+
49
70
  time = parse_now("June 1979")
50
71
  assert_equal Time.local(1979, 6, 16, 0), time
51
-
72
+
52
73
  time = parse_now("dec 79")
53
74
  assert_equal Time.local(1979, 12, 16, 12), time
54
-
75
+
55
76
  # rm_sd_sy
56
-
77
+
57
78
  time = parse_now("jan 3 2010")
58
79
  assert_equal Time.local(2010, 1, 3, 12), time
59
-
80
+
60
81
  time = parse_now("jan 3 2010 midnight")
61
82
  assert_equal Time.local(2010, 1, 4, 0), time
62
-
83
+
63
84
  time = parse_now("jan 3 2010 at midnight")
64
85
  assert_equal Time.local(2010, 1, 4, 0), time
65
-
86
+
66
87
  time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
67
88
  assert_equal Time.local(2010, 1, 3, 4), time
68
-
89
+
69
90
  #time = parse_now("January 12, '00")
70
91
  #assert_equal Time.local(2000, 1, 12, 12), time
71
-
92
+
93
+ time = parse_now("may 27, 1979")
94
+ assert_equal Time.local(1979, 5, 27, 12), time
95
+
72
96
  time = parse_now("may 27 79")
73
97
  assert_equal Time.local(1979, 5, 27, 12), time
74
-
98
+
75
99
  time = parse_now("may 27 79 4:30")
76
100
  assert_equal Time.local(1979, 5, 27, 16, 30), time
77
-
101
+
78
102
  time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
79
103
  assert_equal Time.local(1979, 5, 27, 4, 30), time
80
-
104
+
81
105
  # sd_rm_sy
82
106
 
83
107
  time = parse_now("3 jan 2010")
84
108
  assert_equal Time.local(2010, 1, 3, 12), time
85
-
109
+
86
110
  time = parse_now("3 jan 2010 4pm")
87
111
  assert_equal Time.local(2010, 1, 3, 16), time
88
-
112
+
113
+ time = parse_now("27 Oct 2006 7:30pm")
114
+ assert_equal Time.local(2006, 10, 27, 19, 30), time
115
+
89
116
  # sm_sd_sy
90
-
117
+
91
118
  time = parse_now("5/27/1979")
92
119
  assert_equal Time.local(1979, 5, 27, 12), time
93
-
120
+
94
121
  time = parse_now("5/27/1979 4am")
95
122
  assert_equal Time.local(1979, 5, 27, 4), time
96
-
123
+
97
124
  # sd_sm_sy
98
-
125
+
99
126
  time = parse_now("27/5/1979")
100
127
  assert_equal Time.local(1979, 5, 27, 12), time
101
-
128
+
102
129
  time = parse_now("27/5/1979 @ 0700")
103
130
  assert_equal Time.local(1979, 5, 27, 7), time
104
-
131
+
105
132
  # sm_sy
106
-
133
+
107
134
  time = parse_now("05/06")
108
135
  assert_equal Time.local(2006, 5, 16, 12), time
109
-
136
+
110
137
  time = parse_now("12/06")
111
138
  assert_equal Time.local(2006, 12, 16, 12), time
112
-
139
+
113
140
  time = parse_now("13/06")
114
141
  assert_equal nil, time
115
-
142
+
116
143
  # sy_sm_sd
117
-
144
+
118
145
  time = parse_now("2000-1-1")
119
146
  assert_equal Time.local(2000, 1, 1, 12), time
120
-
147
+
121
148
  time = parse_now("2006-08-20")
122
149
  assert_equal Time.local(2006, 8, 20, 12), time
123
-
150
+
124
151
  time = parse_now("2006-08-20 7pm")
125
152
  assert_equal Time.local(2006, 8, 20, 19), time
126
-
153
+
127
154
  time = parse_now("2006-08-20 03:00")
128
155
  assert_equal Time.local(2006, 8, 20, 3), time
129
-
156
+
130
157
  time = parse_now("2006-08-20 03:30:30")
131
158
  assert_equal Time.local(2006, 8, 20, 3, 30, 30), time
132
-
159
+
133
160
  time = parse_now("2006-08-20 15:30:30")
134
161
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
135
-
162
+
136
163
  time = parse_now("2006-08-20 15:30.30")
137
164
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
138
-
165
+
166
+ # rdn_rm_rd_rt_rtz_ry
167
+
168
+ time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
169
+ assert_equal 1175558400, time.to_i
170
+
171
+ now = Time.now
172
+ time = parse_now(now.to_s)
173
+ assert_equal now.to_s, time.to_s
174
+
139
175
  # rm_sd_rt
140
-
176
+
141
177
  #time = parse_now("jan 5 13:00")
142
178
  #assert_equal Time.local(2007, 1, 5, 13), time
143
-
144
- # due to limitations of the Time class, these don't work
145
-
179
+
180
+ # old dates
181
+
146
182
  time = parse_now("may 40")
147
- assert_equal nil, time
148
-
183
+ assert_equal Time.local(40, 5, 16, 12, 0, 0), time
184
+
149
185
  time = parse_now("may 27 40")
150
- assert_equal nil, time
151
-
186
+ assert_equal Time.local(40, 5, 27, 12, 0, 0), time
187
+
152
188
  time = parse_now("1800-08-20")
153
- assert_equal nil, time
189
+ assert_equal Time.local(1800, 8, 20, 12, 0, 0), time
154
190
  end
155
191
 
156
192
  def test_parse_guess_r
157
193
  time = parse_now("friday")
158
194
  assert_equal Time.local(2006, 8, 18, 12), time
159
-
195
+
196
+ time = parse_now("tue")
197
+ assert_equal Time.local(2006, 8, 22, 12), time
198
+
160
199
  time = parse_now("5")
161
200
  assert_equal Time.local(2006, 8, 16, 17), time
162
-
201
+
163
202
  time = Chronic.parse("5", :now => Time.local(2006, 8, 16, 3, 0, 0, 0), :ambiguous_time_range => :none)
164
203
  assert_equal Time.local(2006, 8, 16, 5), time
165
-
204
+
166
205
  time = parse_now("13:00")
167
206
  assert_equal Time.local(2006, 8, 17, 13), time
168
-
207
+
169
208
  time = parse_now("13:45")
170
209
  assert_equal Time.local(2006, 8, 17, 13, 45), time
171
-
210
+
172
211
  time = parse_now("november")
173
212
  assert_equal Time.local(2006, 11, 16), time
174
213
  end
175
-
214
+
176
215
  def test_parse_guess_rr
177
216
  time = parse_now("friday 13:00")
178
217
  assert_equal Time.local(2006, 8, 18, 13), time
179
-
218
+
180
219
  time = parse_now("monday 4:00")
181
220
  assert_equal Time.local(2006, 8, 21, 16), time
182
-
221
+
183
222
  time = parse_now("sat 4:00", :ambiguous_time_range => :none)
184
223
  assert_equal Time.local(2006, 8, 19, 4), time
185
-
224
+
186
225
  time = parse_now("sunday 4:20", :ambiguous_time_range => :none)
187
226
  assert_equal Time.local(2006, 8, 20, 4, 20), time
188
-
227
+
189
228
  time = parse_now("4 pm")
190
229
  assert_equal Time.local(2006, 8, 16, 16), time
191
-
230
+
192
231
  time = parse_now("4 am", :ambiguous_time_range => :none)
193
232
  assert_equal Time.local(2006, 8, 16, 4), time
194
-
233
+
234
+ time = parse_now("12 pm")
235
+ assert_equal Time.local(2006, 8, 16, 12), time
236
+
237
+ time = parse_now("12:01 pm")
238
+ assert_equal Time.local(2006, 8, 16, 12, 1), time
239
+
240
+ time = parse_now("12:01 am")
241
+ assert_equal Time.local(2006, 8, 16, 0, 1), time
242
+
243
+ time = parse_now("12 am")
244
+ assert_equal Time.local(2006, 8, 16), time
245
+
195
246
  time = parse_now("4:00 in the morning")
196
247
  assert_equal Time.local(2006, 8, 16, 4), time
197
-
248
+
198
249
  time = parse_now("november 4")
199
250
  assert_equal Time.local(2006, 11, 4, 12), time
200
-
251
+
201
252
  time = parse_now("aug 24")
202
253
  assert_equal Time.local(2006, 8, 24, 12), time
203
254
  end
204
-
255
+
205
256
  def test_parse_guess_rrr
206
257
  time = parse_now("friday 1 pm")
207
258
  assert_equal Time.local(2006, 8, 18, 13), time
208
-
259
+
209
260
  time = parse_now("friday 11 at night")
210
261
  assert_equal Time.local(2006, 8, 18, 23), time
211
-
262
+
212
263
  time = parse_now("friday 11 in the evening")
213
264
  assert_equal Time.local(2006, 8, 18, 23), time
214
-
265
+
215
266
  time = parse_now("sunday 6am")
216
267
  assert_equal Time.local(2006, 8, 20, 6), time
268
+
269
+ time = parse_now("friday evening at 7")
270
+ assert_equal Time.local(2006, 8, 18, 19), time
217
271
  end
218
-
272
+
219
273
  def test_parse_guess_gr
220
274
  # year
221
-
275
+
222
276
  time = parse_now("this year")
223
277
  assert_equal Time.local(2006, 10, 24, 12, 30), time
224
-
278
+
225
279
  time = parse_now("this year", :context => :past)
226
280
  assert_equal Time.local(2006, 4, 24, 12, 30), time
227
-
281
+
228
282
  # month
229
-
283
+
230
284
  time = parse_now("this month")
231
285
  assert_equal Time.local(2006, 8, 24, 12), time
232
-
286
+
233
287
  time = parse_now("this month", :context => :past)
234
288
  assert_equal Time.local(2006, 8, 8, 12), time
235
-
289
+
290
+ time = Chronic.parse("next month", :now => Time.local(2006, 11, 15))
291
+ assert_equal Time.local(2006, 12, 16, 12), time
292
+
236
293
  # month name
237
-
294
+
238
295
  time = parse_now("last november")
239
296
  assert_equal Time.local(2005, 11, 16), time
240
-
297
+
241
298
  # fortnight
242
-
299
+
243
300
  time = parse_now("this fortnight")
244
301
  assert_equal Time.local(2006, 8, 21, 19, 30), time
245
-
302
+
246
303
  time = parse_now("this fortnight", :context => :past)
247
304
  assert_equal Time.local(2006, 8, 14, 19), time
248
-
305
+
249
306
  # week
250
-
307
+
251
308
  time = parse_now("this week")
252
309
  assert_equal Time.local(2006, 8, 18, 7, 30), time
253
-
310
+
254
311
  time = parse_now("this week", :context => :past)
255
312
  assert_equal Time.local(2006, 8, 14, 19), time
256
-
313
+
257
314
  # weekend
258
-
315
+
259
316
  time = parse_now("this weekend")
260
317
  assert_equal Time.local(2006, 8, 20), time
261
-
318
+
262
319
  time = parse_now("this weekend", :context => :past)
263
320
  assert_equal Time.local(2006, 8, 13), time
264
-
321
+
265
322
  time = parse_now("last weekend")
266
323
  assert_equal Time.local(2006, 8, 13), time
267
-
324
+
268
325
  # day
269
-
326
+
270
327
  time = parse_now("this day")
271
328
  assert_equal Time.local(2006, 8, 16, 19, 30), time
272
-
329
+
273
330
  time = parse_now("this day", :context => :past)
274
331
  assert_equal Time.local(2006, 8, 16, 7), time
275
-
332
+
276
333
  time = parse_now("today")
277
334
  assert_equal Time.local(2006, 8, 16, 19, 30), time
278
-
335
+
279
336
  time = parse_now("yesterday")
280
337
  assert_equal Time.local(2006, 8, 15, 12), time
281
-
338
+
282
339
  time = parse_now("tomorrow")
283
340
  assert_equal Time.local(2006, 8, 17, 12), time
284
-
341
+
285
342
  # day name
286
-
343
+
287
344
  time = parse_now("this tuesday")
288
345
  assert_equal Time.local(2006, 8, 22, 12), time
289
-
346
+
290
347
  time = parse_now("next tuesday")
291
348
  assert_equal Time.local(2006, 8, 22, 12), time
292
-
349
+
293
350
  time = parse_now("last tuesday")
294
351
  assert_equal Time.local(2006, 8, 15, 12), time
295
-
352
+
296
353
  time = parse_now("this wed")
297
354
  assert_equal Time.local(2006, 8, 23, 12), time
298
-
355
+
299
356
  time = parse_now("next wed")
300
357
  assert_equal Time.local(2006, 8, 23, 12), time
301
-
358
+
302
359
  time = parse_now("last wed")
303
360
  assert_equal Time.local(2006, 8, 9, 12), time
304
-
361
+
305
362
  # day portion
306
-
363
+
307
364
  time = parse_now("this morning")
308
365
  assert_equal Time.local(2006, 8, 16, 9), time
309
-
366
+
310
367
  time = parse_now("tonight")
311
368
  assert_equal Time.local(2006, 8, 16, 22), time
312
-
369
+
370
+ # minute
371
+
372
+ time = parse_now("next minute")
373
+ assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
374
+
313
375
  # second
314
-
376
+
315
377
  time = parse_now("this second")
316
378
  assert_equal Time.local(2006, 8, 16, 14), time
317
-
379
+
318
380
  time = parse_now("this second", :context => :past)
319
381
  assert_equal Time.local(2006, 8, 16, 14), time
320
-
382
+
321
383
  time = parse_now("next second")
322
384
  assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
323
-
385
+
324
386
  time = parse_now("last second")
325
387
  assert_equal Time.local(2006, 8, 16, 13, 59, 59), time
326
388
  end
327
-
328
- def test_parse_guess_grr
389
+
390
+ def test_parse_guess_grr
329
391
  time = parse_now("yesterday at 4:00")
330
392
  assert_equal Time.local(2006, 8, 15, 16), time
331
-
393
+
332
394
  time = parse_now("today at 9:00")
333
395
  assert_equal Time.local(2006, 8, 16, 9), time
334
-
396
+
335
397
  time = parse_now("today at 2100")
336
398
  assert_equal Time.local(2006, 8, 16, 21), time
337
-
399
+
338
400
  time = parse_now("this day at 0900")
339
401
  assert_equal Time.local(2006, 8, 16, 9), time
340
-
402
+
341
403
  time = parse_now("tomorrow at 0900")
342
404
  assert_equal Time.local(2006, 8, 17, 9), time
343
-
405
+
344
406
  time = parse_now("yesterday at 4:00", :ambiguous_time_range => :none)
345
407
  assert_equal Time.local(2006, 8, 15, 4), time
346
-
408
+
347
409
  time = parse_now("last friday at 4:00")
348
410
  assert_equal Time.local(2006, 8, 11, 16), time
349
-
411
+
350
412
  time = parse_now("next wed 4:00")
351
413
  assert_equal Time.local(2006, 8, 23, 16), time
352
-
414
+
353
415
  time = parse_now("yesterday afternoon")
354
416
  assert_equal Time.local(2006, 8, 15, 15), time
355
-
417
+
356
418
  time = parse_now("last week tuesday")
357
419
  assert_equal Time.local(2006, 8, 8, 12), time
420
+
421
+ time = parse_now("tonight at 7")
422
+ assert_equal Time.local(2006, 8, 16, 19), time
423
+
424
+ time = parse_now("tonight 7")
425
+ assert_equal Time.local(2006, 8, 16, 19), time
426
+
427
+ time = parse_now("7 tonight")
428
+ assert_equal Time.local(2006, 8, 16, 19), time
358
429
  end
359
-
430
+
360
431
  def test_parse_guess_grrr
361
432
  time = parse_now("today at 6:00pm")
362
433
  assert_equal Time.local(2006, 8, 16, 18), time
363
-
434
+
364
435
  time = parse_now("today at 6:00am")
365
436
  assert_equal Time.local(2006, 8, 16, 6), time
366
-
437
+
367
438
  time = parse_now("this day 1800")
368
439
  assert_equal Time.local(2006, 8, 16, 18), time
369
-
440
+
370
441
  time = parse_now("yesterday at 4:00pm")
371
442
  assert_equal Time.local(2006, 8, 15, 16), time
443
+
444
+ time = parse_now("tomorrow evening at 7")
445
+ assert_equal Time.local(2006, 8, 17, 19), time
446
+
447
+ time = parse_now("tomorrow morning at 5:30")
448
+ assert_equal Time.local(2006, 8, 17, 5, 30), time
449
+
450
+ time = parse_now("next monday at 12:01 am")
451
+ assert_equal Time.local(2006, 8, 21, 00, 1), time
452
+
453
+ time = parse_now("next monday at 12:01 pm")
454
+ assert_equal Time.local(2006, 8, 21, 12, 1), time
372
455
  end
373
-
456
+
374
457
  def test_parse_guess_rgr
375
458
  time = parse_now("afternoon yesterday")
376
459
  assert_equal Time.local(2006, 8, 15, 15), time
377
-
460
+
378
461
  time = parse_now("tuesday last week")
379
462
  assert_equal Time.local(2006, 8, 8, 12), time
380
463
  end
381
-
464
+
382
465
  def test_parse_guess_s_r_p
383
466
  # past
384
-
467
+
385
468
  time = parse_now("3 years ago")
386
469
  assert_equal Time.local(2003, 8, 16, 14), time
387
-
470
+
388
471
  time = parse_now("1 month ago")
389
472
  assert_equal Time.local(2006, 7, 16, 14), time
390
-
473
+
391
474
  time = parse_now("1 fortnight ago")
392
475
  assert_equal Time.local(2006, 8, 2, 14), time
393
-
476
+
394
477
  time = parse_now("2 fortnights ago")
395
478
  assert_equal Time.local(2006, 7, 19, 14), time
396
-
479
+
397
480
  time = parse_now("3 weeks ago")
398
481
  assert_equal Time.local(2006, 7, 26, 14), time
399
-
482
+
400
483
  time = parse_now("2 weekends ago")
401
484
  assert_equal Time.local(2006, 8, 5), time
402
-
485
+
403
486
  time = parse_now("3 days ago")
404
487
  assert_equal Time.local(2006, 8, 13, 14), time
405
-
488
+
406
489
  #time = parse_now("1 monday ago")
407
490
  #assert_equal Time.local(2006, 8, 14, 12), time
408
-
491
+
409
492
  time = parse_now("5 mornings ago")
410
493
  assert_equal Time.local(2006, 8, 12, 9), time
411
-
494
+
412
495
  time = parse_now("7 hours ago")
413
496
  assert_equal Time.local(2006, 8, 16, 7), time
414
-
497
+
415
498
  time = parse_now("3 minutes ago")
416
499
  assert_equal Time.local(2006, 8, 16, 13, 57), time
417
-
500
+
418
501
  time = parse_now("20 seconds before now")
419
502
  assert_equal Time.local(2006, 8, 16, 13, 59, 40), time
420
503
 
421
504
  # future
422
-
505
+
423
506
  time = parse_now("3 years from now")
424
507
  assert_equal Time.local(2009, 8, 16, 14, 0, 0), time
425
-
508
+
426
509
  time = parse_now("6 months hence")
427
510
  assert_equal Time.local(2007, 2, 16, 14), time
428
-
511
+
429
512
  time = parse_now("3 fortnights hence")
430
513
  assert_equal Time.local(2006, 9, 27, 14), time
431
-
514
+
432
515
  time = parse_now("1 week from now")
433
516
  assert_equal Time.local(2006, 8, 23, 14, 0, 0), time
434
-
517
+
435
518
  time = parse_now("1 weekend from now")
436
519
  assert_equal Time.local(2006, 8, 19), time
437
-
520
+
438
521
  time = parse_now("2 weekends from now")
439
522
  assert_equal Time.local(2006, 8, 26), time
440
-
523
+
441
524
  time = parse_now("1 day hence")
442
525
  assert_equal Time.local(2006, 8, 17, 14), time
443
-
526
+
444
527
  time = parse_now("5 mornings hence")
445
528
  assert_equal Time.local(2006, 8, 21, 9), time
446
-
529
+
447
530
  time = parse_now("1 hour from now")
448
531
  assert_equal Time.local(2006, 8, 16, 15), time
449
-
532
+
450
533
  time = parse_now("20 minutes hence")
451
534
  assert_equal Time.local(2006, 8, 16, 14, 20), time
452
-
535
+
453
536
  time = parse_now("20 seconds from now")
454
537
  assert_equal Time.local(2006, 8, 16, 14, 0, 20), time
455
-
538
+
456
539
  time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
457
540
  assert_equal Time.local(2007, 1, 7, 23, 30), time
458
541
  end
459
-
542
+
460
543
  def test_parse_guess_p_s_r
461
544
  time = parse_now("in 3 hours")
462
545
  assert_equal Time.local(2006, 8, 16, 17), time
463
546
  end
464
-
547
+
465
548
  def test_parse_guess_s_r_p_a
466
549
  # past
467
-
550
+
468
551
  time = parse_now("3 years ago tomorrow")
469
552
  assert_equal Time.local(2003, 8, 17, 12), time
470
-
553
+
471
554
  time = parse_now("3 years ago this friday")
472
555
  assert_equal Time.local(2003, 8, 18, 12), time
473
-
556
+
474
557
  time = parse_now("3 months ago saturday at 5:00 pm")
475
558
  assert_equal Time.local(2006, 5, 19, 17), time
476
-
559
+
477
560
  time = parse_now("2 days from this second")
478
561
  assert_equal Time.local(2006, 8, 18, 14), time
479
-
562
+
480
563
  time = parse_now("7 hours before tomorrow at midnight")
481
564
  assert_equal Time.local(2006, 8, 17, 17), time
482
-
565
+
483
566
  # future
484
567
  end
485
-
568
+
486
569
  def test_parse_guess_o_r_s_r
487
570
  time = parse_now("3rd wednesday in november")
488
571
  assert_equal Time.local(2006, 11, 15, 12), time
489
-
572
+
490
573
  time = parse_now("10th wednesday in november")
491
574
  assert_equal nil, time
575
+
576
+ # time = parse_now("3rd wednesday in 2007")
577
+ # assert_equal Time.local(2007, 1, 20, 12), time
492
578
  end
493
-
579
+
494
580
  def test_parse_guess_o_r_g_r
495
581
  time = parse_now("3rd month next year")
496
582
  assert_equal Time.local(2007, 3, 16, 12, 30), time
497
-
583
+
498
584
  time = parse_now("3rd thursday this september")
499
585
  assert_equal Time.local(2006, 9, 21, 12), time
500
-
586
+
501
587
  time = parse_now("4th day last week")
502
588
  assert_equal Time.local(2006, 8, 9, 12), time
503
589
  end
504
-
590
+
505
591
  def test_parse_guess_nonsense
506
592
  time = parse_now("some stupid nonsense")
507
593
  assert_equal nil, time
594
+
595
+ time = parse_now("Ham Sandwich")
596
+ assert_equal nil, time
508
597
  end
509
-
598
+
510
599
  def test_parse_span
511
600
  span = parse_now("friday", :guess => false)
512
601
  assert_equal Time.local(2006, 8, 18), span.begin
513
602
  assert_equal Time.local(2006, 8, 19), span.end
514
-
603
+
515
604
  span = parse_now("november", :guess => false)
516
605
  assert_equal Time.local(2006, 11), span.begin
517
606
  assert_equal Time.local(2006, 12), span.end
518
-
607
+
519
608
  span = Chronic.parse("weekend" , :now => @time_2006_08_16_14_00_00, :guess => false)
520
609
  assert_equal Time.local(2006, 8, 19), span.begin
521
610
  assert_equal Time.local(2006, 8, 21), span.end
522
611
  end
523
-
612
+
613
+ def test_parse_with_endian_precedence
614
+ date = '11/02/2007'
615
+
616
+ expect_for_middle_endian = Time.local(2007, 11, 2, 12)
617
+ expect_for_little_endian = Time.local(2007, 2, 11, 12)
618
+
619
+ # default precedence should be toward middle endianness
620
+ assert_equal expect_for_middle_endian, Chronic.parse(date)
621
+
622
+ assert_equal expect_for_middle_endian, Chronic.parse(date, :endian_precedence => [:middle, :little])
623
+
624
+ assert_equal expect_for_little_endian, Chronic.parse(date, :endian_precedence => [:little, :middle])
625
+ end
626
+
524
627
  def test_parse_words
525
628
  assert_equal parse_now("33 days from now"), parse_now("thirty-three days from now")
526
629
  assert_equal parse_now("2867532 seconds from now"), parse_now("two million eight hundred and sixty seven thousand five hundred and thirty two seconds from now")
527
630
  assert_equal parse_now("may 10th"), parse_now("may tenth")
528
631
  end
529
-
632
+
530
633
  def test_parse_only_complete_pointers
531
634
  assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
532
635
  assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
533
636
  assert_equal parse_now("meeting today at 2pm"), @time_2006_08_16_14_00_00
534
637
  end
535
-
638
+
639
+ def test_am_pm
640
+ assert_equal Time.local(2006, 8, 16), parse_now("8/16/2006 at 12am")
641
+ assert_equal Time.local(2006, 8, 16, 12), parse_now("8/16/2006 at 12pm")
642
+ end
643
+
644
+ def test_a_p
645
+ assert_equal Time.local(2006, 8, 16, 0, 15), parse_now("8/16/2006 at 12:15a")
646
+ assert_equal Time.local(2006, 8, 16, 18, 30), parse_now("8/16/2006 at 6:30p")
647
+ end
648
+
536
649
  def test_argument_validation
537
650
  assert_raise(Chronic::InvalidArgumentException) do
538
651
  time = Chronic.parse("may 27", :foo => :bar)
539
652
  end
540
-
653
+
541
654
  assert_raise(Chronic::InvalidArgumentException) do
542
655
  time = Chronic.parse("may 27", :context => :bar)
543
656
  end
544
657
  end
545
-
658
+
659
+ def test_seasons
660
+ t = parse_now("this spring", :guess => false)
661
+ assert_equal Time.local(2007, 3, 20), t.begin
662
+ assert_equal Time.local(2007, 6, 20), t.end
663
+
664
+ t = parse_now("this winter", :guess => false)
665
+ assert_equal Time.local(2006, 12, 22, 23), t.begin
666
+ assert_equal Time.local(2007, 3, 19), t.end
667
+
668
+ t = parse_now("last spring", :guess => false)
669
+ assert_equal Time.local(2006, 3, 20, 23), t.begin
670
+ assert_equal Time.local(2006, 6, 20), t.end
671
+
672
+ t = parse_now("last winter", :guess => false)
673
+ assert_equal Time.local(2005, 12, 22, 23), t.begin
674
+ assert_equal Time.local(2006, 3, 19, 23), t.end
675
+
676
+ t = parse_now("next spring", :guess => false)
677
+ assert_equal Time.local(2007, 3, 20), t.begin
678
+ assert_equal Time.local(2007, 6, 20), t.end
679
+ end
680
+
681
+ # regression
682
+
683
+ # def test_partial
684
+ # assert_equal '', parse_now("2 hours")
685
+ # end
686
+
687
+ def test_days_in_november
688
+ t1 = Chronic.parse('1st thursday in november', :now => Time.local(2007))
689
+ assert_equal Time.local(2007, 11, 1, 12), t1
690
+
691
+ t1 = Chronic.parse('1st friday in november', :now => Time.local(2007))
692
+ assert_equal Time.local(2007, 11, 2, 12), t1
693
+
694
+ t1 = Chronic.parse('1st saturday in november', :now => Time.local(2007))
695
+ assert_equal Time.local(2007, 11, 3, 12), t1
696
+
697
+ t1 = Chronic.parse('1st sunday in november', :now => Time.local(2007))
698
+ assert_equal Time.local(2007, 11, 4, 11), t1
699
+
700
+ # Chronic.debug = true
701
+ #
702
+ # t1 = Chronic.parse('1st monday in november', :now => Time.local(2007))
703
+ # assert_equal Time.local(2007, 11, 5, 11), t1
704
+ end
705
+
546
706
  private
547
707
  def parse_now(string, options={})
548
708
  Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
549
709
  end
550
- end
710
+ end