4 class TestParsing < Test::Unit::TestCase
5 # Wed Aug 16 14:00:00 UTC 2006
6 TIME_2006_08_16_14_00_00 = Time.local(2006, 8, 16, 14, 0, 0, 0)
9 @time_2006_08_16_14_00_00 = TIME_2006_08_16_14_00_00
12 def test_parse_guess_dates
15 time = parse_now("may 27")
16 assert_equal Time.local(2007, 5, 27, 12), time
18 time = parse_now("may 28", :context => :past)
19 assert_equal Time.local(2006, 5, 28, 12), time
21 time = parse_now("may 28 5pm", :context => :past)
22 assert_equal Time.local(2006, 5, 28, 17), time
24 time = parse_now("may 28 at 5pm", :context => :past)
25 assert_equal Time.local(2006, 5, 28, 17), time
27 time = parse_now("may 28 at 5:32.19pm", :context => :past)
28 assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
32 time = parse_now("may 27th")
33 assert_equal Time.local(2007, 5, 27, 12), time
35 time = parse_now("may 27th", :context => :past)
36 assert_equal Time.local(2006, 5, 27, 12), time
38 time = parse_now("may 27th 5:00 pm", :context => :past)
39 assert_equal Time.local(2006, 5, 27, 17), time
41 time = parse_now("may 27th at 5pm", :context => :past)
42 assert_equal Time.local(2006, 5, 27, 17), time
44 time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
45 assert_equal Time.local(2007, 5, 27, 5), time
49 time = parse_now("June 1979")
50 assert_equal Time.local(1979, 6, 16, 0), time
52 time = parse_now("dec 79")
53 assert_equal Time.local(1979, 12, 16, 12), time
57 time = parse_now("jan 3 2010")
58 assert_equal Time.local(2010, 1, 3, 12), time
60 time = parse_now("jan 3 2010 midnight")
61 assert_equal Time.local(2010, 1, 4, 0), time
63 time = parse_now("jan 3 2010 at midnight")
64 assert_equal Time.local(2010, 1, 4, 0), time
66 time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
67 assert_equal Time.local(2010, 1, 3, 4), time
69 #time = parse_now("January 12, '00")
70 #assert_equal Time.local(2000, 1, 12, 12), time
72 time = parse_now("may 27 79")
73 assert_equal Time.local(1979, 5, 27, 12), time
75 time = parse_now("may 27 79 4:30")
76 assert_equal Time.local(1979, 5, 27, 16, 30), time
78 time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
79 assert_equal Time.local(1979, 5, 27, 4, 30), time
83 time = parse_now("3 jan 2010")
84 assert_equal Time.local(2010, 1, 3, 12), time
86 time = parse_now("3 jan 2010 4pm")
87 assert_equal Time.local(2010, 1, 3, 16), time
91 time = parse_now("5/27/1979")
92 assert_equal Time.local(1979, 5, 27, 12), time
94 time = parse_now("5/27/1979 4am")
95 assert_equal Time.local(1979, 5, 27, 4), time
99 time = parse_now("27/5/1979")
100 assert_equal Time.local(1979, 5, 27, 12), time
102 time = parse_now("27/5/1979 @ 0700")
103 assert_equal Time.local(1979, 5, 27, 7), time
107 time = parse_now("05/06")
108 assert_equal Time.local(2006, 5, 16, 12), time
110 time = parse_now("12/06")
111 assert_equal Time.local(2006, 12, 16, 12), time
113 time = parse_now("13/06")
114 assert_equal nil, time
118 time = parse_now("2000-1-1")
119 assert_equal Time.local(2000, 1, 1, 12), time
121 time = parse_now("2006-08-20")
122 assert_equal Time.local(2006, 8, 20, 12), time
124 time = parse_now("2006-08-20 7pm")
125 assert_equal Time.local(2006, 8, 20, 19), time
127 time = parse_now("2006-08-20 03:00")
128 assert_equal Time.local(2006, 8, 20, 3), time
130 time = parse_now("2006-08-20 03:30:30")
131 assert_equal Time.local(2006, 8, 20, 3, 30, 30), time
133 time = parse_now("2006-08-20 15:30:30")
134 assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
136 time = parse_now("2006-08-20 15:30.30")
137 assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
139 # rdn_rm_rd_rt_rtz_ry
141 time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
142 assert_equal Time.local(2007, 4, 2, 17), time
145 time = parse_now(now.to_s)
146 assert_equal now.to_s, time.to_s
150 #time = parse_now("jan 5 13:00")
151 #assert_equal Time.local(2007, 1, 5, 13), time
153 # due to limitations of the Time class, these don't work
155 time = parse_now("may 40")
156 assert_equal nil, time
158 time = parse_now("may 27 40")
159 assert_equal nil, time
161 time = parse_now("1800-08-20")
162 assert_equal nil, time
166 Chronic.parse('two months ago this friday')
169 def test_parse_guess_r
170 time = parse_now("friday")
171 assert_equal Time.local(2006, 8, 18, 12), time
173 time = parse_now("tue")
174 assert_equal Time.local(2006, 8, 22, 12), time
176 time = parse_now("5")
177 assert_equal Time.local(2006, 8, 16, 17), time
179 time = Chronic.parse("5", :now => Time.local(2006, 8, 16, 3, 0, 0, 0), :ambiguous_time_range => :none)
180 assert_equal Time.local(2006, 8, 16, 5), time
182 time = parse_now("13:00")
183 assert_equal Time.local(2006, 8, 17, 13), time
185 time = parse_now("13:45")
186 assert_equal Time.local(2006, 8, 17, 13, 45), time
188 time = parse_now("november")
189 assert_equal Time.local(2006, 11, 16), time
192 def test_parse_guess_rr
193 time = parse_now("friday 13:00")
194 assert_equal Time.local(2006, 8, 18, 13), time
196 time = parse_now("monday 4:00")
197 assert_equal Time.local(2006, 8, 21, 16), time
199 time = parse_now("sat 4:00", :ambiguous_time_range => :none)
200 assert_equal Time.local(2006, 8, 19, 4), time
202 time = parse_now("sunday 4:20", :ambiguous_time_range => :none)
203 assert_equal Time.local(2006, 8, 20, 4, 20), time
205 time = parse_now("4 pm")
206 assert_equal Time.local(2006, 8, 16, 16), time
208 time = parse_now("4 am", :ambiguous_time_range => :none)
209 assert_equal Time.local(2006, 8, 16, 4), time
211 time = parse_now("4:00 in the morning")
212 assert_equal Time.local(2006, 8, 16, 4), time
214 time = parse_now("november 4")
215 assert_equal Time.local(2006, 11, 4, 12), time
217 time = parse_now("aug 24")
218 assert_equal Time.local(2006, 8, 24, 12), time
221 def test_parse_guess_rrr
222 time = parse_now("friday 1 pm")
223 assert_equal Time.local(2006, 8, 18, 13), time
225 time = parse_now("friday 11 at night")
226 assert_equal Time.local(2006, 8, 18, 23), time
228 time = parse_now("friday 11 in the evening")
229 assert_equal Time.local(2006, 8, 18, 23), time
231 time = parse_now("sunday 6am")
232 assert_equal Time.local(2006, 8, 20, 6), time
234 time = parse_now("friday evening at 7")
235 assert_equal Time.local(2006, 8, 18, 19), time
238 def test_parse_guess_gr
241 time = parse_now("this year")
242 assert_equal Time.local(2006, 10, 24, 12, 30), time
244 time = parse_now("this year", :context => :past)
245 assert_equal Time.local(2006, 4, 24, 12, 30), time
249 time = parse_now("this month")
250 assert_equal Time.local(2006, 8, 24, 12), time
252 time = parse_now("this month", :context => :past)
253 assert_equal Time.local(2006, 8, 8, 12), time
255 time = Chronic.parse("next month", :now => Time.local(2006, 11, 15))
256 assert_equal Time.local(2006, 12, 16, 12), time
260 time = parse_now("last november")
261 assert_equal Time.local(2005, 11, 16), time
265 time = parse_now("this fortnight")
266 assert_equal Time.local(2006, 8, 21, 19, 30), time
268 time = parse_now("this fortnight", :context => :past)
269 assert_equal Time.local(2006, 8, 14, 19), time
273 time = parse_now("this week")
274 assert_equal Time.local(2006, 8, 18, 7, 30), time
276 time = parse_now("this week", :context => :past)
277 assert_equal Time.local(2006, 8, 14, 19), time
281 time = parse_now("this weekend")
282 assert_equal Time.local(2006, 8, 20), time
284 time = parse_now("this weekend", :context => :past)
285 assert_equal Time.local(2006, 8, 13), time
287 time = parse_now("last weekend")
288 assert_equal Time.local(2006, 8, 13), time
292 time = parse_now("this day")
293 assert_equal Time.local(2006, 8, 16, 19, 30), time
295 time = parse_now("this day", :context => :past)
296 assert_equal Time.local(2006, 8, 16, 7), time
298 time = parse_now("today")
299 assert_equal Time.local(2006, 8, 16, 19, 30), time
301 time = parse_now("yesterday")
302 assert_equal Time.local(2006, 8, 15, 12), time
304 time = parse_now("tomorrow")
305 assert_equal Time.local(2006, 8, 17, 12), time
309 time = parse_now("this tuesday")
310 assert_equal Time.local(2006, 8, 22, 12), time
312 time = parse_now("next tuesday")
313 assert_equal Time.local(2006, 8, 22, 12), time
315 time = parse_now("last tuesday")
316 assert_equal Time.local(2006, 8, 15, 12), time
318 time = parse_now("this wed")
319 assert_equal Time.local(2006, 8, 23, 12), time
321 time = parse_now("next wed")
322 assert_equal Time.local(2006, 8, 23, 12), time
324 time = parse_now("last wed")
325 assert_equal Time.local(2006, 8, 9, 12), time
329 time = parse_now("this morning")
330 assert_equal Time.local(2006, 8, 16, 9), time
332 time = parse_now("tonight")
333 assert_equal Time.local(2006, 8, 16, 22), time
337 time = parse_now("next minute")
338 assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
342 time = parse_now("this second")
343 assert_equal Time.local(2006, 8, 16, 14), time
345 time = parse_now("this second", :context => :past)
346 assert_equal Time.local(2006, 8, 16, 14), time
348 time = parse_now("next second")
349 assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
351 time = parse_now("last second")
352 assert_equal Time.local(2006, 8, 16, 13, 59, 59), time
355 def test_parse_guess_grr
356 time = parse_now("yesterday at 4:00")
357 assert_equal Time.local(2006, 8, 15, 16), time
359 time = parse_now("today at 9:00")
360 assert_equal Time.local(2006, 8, 16, 9), time
362 time = parse_now("today at 2100")
363 assert_equal Time.local(2006, 8, 16, 21), time
365 time = parse_now("this day at 0900")
366 assert_equal Time.local(2006, 8, 16, 9), time
368 time = parse_now("tomorrow at 0900")
369 assert_equal Time.local(2006, 8, 17, 9), time
371 time = parse_now("yesterday at 4:00", :ambiguous_time_range => :none)
372 assert_equal Time.local(2006, 8, 15, 4), time
374 time = parse_now("last friday at 4:00")
375 assert_equal Time.local(2006, 8, 11, 16), time
377 time = parse_now("next wed 4:00")
378 assert_equal Time.local(2006, 8, 23, 16), time
380 time = parse_now("yesterday afternoon")
381 assert_equal Time.local(2006, 8, 15, 15), time
383 time = parse_now("last week tuesday")
384 assert_equal Time.local(2006, 8, 8, 12), time
386 time = parse_now("tonight at 7")
387 assert_equal Time.local(2006, 8, 16, 19), time
389 time = parse_now("tonight 7")
390 assert_equal Time.local(2006, 8, 16, 19), time
392 time = parse_now("7 tonight")
393 assert_equal Time.local(2006, 8, 16, 19), time
396 def test_parse_guess_grrr
397 time = parse_now("today at 6:00pm")
398 assert_equal Time.local(2006, 8, 16, 18), time
400 time = parse_now("today at 6:00am")
401 assert_equal Time.local(2006, 8, 16, 6), time
403 time = parse_now("this day 1800")
404 assert_equal Time.local(2006, 8, 16, 18), time
406 time = parse_now("yesterday at 4:00pm")
407 assert_equal Time.local(2006, 8, 15, 16), time
409 time = parse_now("tomorrow evening at 7")
410 assert_equal Time.local(2006, 8, 17, 19), time
412 time = parse_now("tomorrow morning at 5:30")
413 assert_equal Time.local(2006, 8, 17, 5, 30), time
416 def test_parse_guess_rgr
417 time = parse_now("afternoon yesterday")
418 assert_equal Time.local(2006, 8, 15, 15), time
420 time = parse_now("tuesday last week")
421 assert_equal Time.local(2006, 8, 8, 12), time
424 def test_parse_guess_s_r_p
427 time = parse_now("3 years ago")
428 assert_equal Time.local(2003, 8, 16, 14), time
430 time = parse_now("1 month ago")
431 assert_equal Time.local(2006, 7, 16, 14), time
433 time = parse_now("1 fortnight ago")
434 assert_equal Time.local(2006, 8, 2, 14), time
436 time = parse_now("2 fortnights ago")
437 assert_equal Time.local(2006, 7, 19, 14), time
439 time = parse_now("3 weeks ago")
440 assert_equal Time.local(2006, 7, 26, 14), time
442 time = parse_now("2 weekends ago")
443 assert_equal Time.local(2006, 8, 5), time
445 time = parse_now("3 days ago")
446 assert_equal Time.local(2006, 8, 13, 14), time
448 #time = parse_now("1 monday ago")
449 #assert_equal Time.local(2006, 8, 14, 12), time
451 time = parse_now("5 mornings ago")
452 assert_equal Time.local(2006, 8, 12, 9), time
454 time = parse_now("7 hours ago")
455 assert_equal Time.local(2006, 8, 16, 7), time
457 time = parse_now("3 minutes ago")
458 assert_equal Time.local(2006, 8, 16, 13, 57), time
460 time = parse_now("20 seconds before now")
461 assert_equal Time.local(2006, 8, 16, 13, 59, 40), time
465 time = parse_now("3 years from now")
466 assert_equal Time.local(2009, 8, 16, 14, 0, 0), time
468 time = parse_now("6 months hence")
469 assert_equal Time.local(2007, 2, 16, 14), time
471 time = parse_now("3 fortnights hence")
472 assert_equal Time.local(2006, 9, 27, 14), time
474 time = parse_now("1 week from now")
475 assert_equal Time.local(2006, 8, 23, 14, 0, 0), time
477 time = parse_now("1 weekend from now")
478 assert_equal Time.local(2006, 8, 19), time
480 time = parse_now("2 weekends from now")
481 assert_equal Time.local(2006, 8, 26), time
483 time = parse_now("1 day hence")
484 assert_equal Time.local(2006, 8, 17, 14), time
486 time = parse_now("5 mornings hence")
487 assert_equal Time.local(2006, 8, 21, 9), time
489 time = parse_now("1 hour from now")
490 assert_equal Time.local(2006, 8, 16, 15), time
492 time = parse_now("20 minutes hence")
493 assert_equal Time.local(2006, 8, 16, 14, 20), time
495 time = parse_now("20 seconds from now")
496 assert_equal Time.local(2006, 8, 16, 14, 0, 20), time
498 time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
499 assert_equal Time.local(2007, 1, 7, 23, 30), time
502 def test_parse_guess_p_s_r
503 time = parse_now("in 3 hours")
504 assert_equal Time.local(2006, 8, 16, 17), time
507 def test_parse_guess_s_r_p_a
510 time = parse_now("3 years ago tomorrow")
511 assert_equal Time.local(2003, 8, 17, 12), time
513 time = parse_now("3 years ago this friday")
514 assert_equal Time.local(2003, 8, 18, 12), time
516 time = parse_now("3 months ago saturday at 5:00 pm")
517 assert_equal Time.local(2006, 5, 19, 17), time
519 time = parse_now("2 days from this second")
520 assert_equal Time.local(2006, 8, 18, 14), time
522 time = parse_now("7 hours before tomorrow at midnight")
523 assert_equal Time.local(2006, 8, 17, 17), time
528 def test_parse_guess_o_r_s_r
529 time = parse_now("3rd wednesday in november")
530 assert_equal Time.local(2006, 11, 15, 12), time
532 time = parse_now("10th wednesday in november")
533 assert_equal nil, time
535 # time = parse_now("3rd wednesday in 2007")
536 # assert_equal Time.local(2007, 1, 20, 12), time
539 def test_parse_guess_o_r_g_r
540 time = parse_now("3rd month next year")
541 assert_equal Time.local(2007, 3, 16, 12, 30), time
543 time = parse_now("3rd thursday this september")
544 assert_equal Time.local(2006, 9, 21, 12), time
546 time = parse_now("4th day last week")
547 assert_equal Time.local(2006, 8, 9, 12), time
550 def test_parse_guess_nonsense
551 time = parse_now("some stupid nonsense")
552 assert_equal nil, time
556 span = parse_now("friday", :guess => false)
557 assert_equal Time.local(2006, 8, 18), span.begin
558 assert_equal Time.local(2006, 8, 19), span.end
560 span = parse_now("november", :guess => false)
561 assert_equal Time.local(2006, 11), span.begin
562 assert_equal Time.local(2006, 12), span.end
564 span = Chronic.parse("weekend" , :now => @time_2006_08_16_14_00_00, :guess => false)
565 assert_equal Time.local(2006, 8, 19), span.begin
566 assert_equal Time.local(2006, 8, 21), span.end
570 assert_equal parse_now("33 days from now"), parse_now("thirty-three days from now")
571 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")
572 assert_equal parse_now("may 10th"), parse_now("may tenth")
575 def test_parse_only_complete_pointers
576 assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
577 assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
578 assert_equal parse_now("meeting today at 2pm"), @time_2006_08_16_14_00_00
581 def test_argument_validation
582 assert_raise(Chronic::InvalidArgumentException) do
583 time = Chronic.parse("may 27", :foo => :bar)
586 assert_raise(Chronic::InvalidArgumentException) do
587 time = Chronic.parse("may 27", :context => :bar)
592 def parse_now(string, options={})
593 Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))