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