chronic 0.2.2 → 0.10.2

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +8 -0
  4. data/HISTORY.md +243 -0
  5. data/LICENSE +21 -0
  6. data/README.md +182 -0
  7. data/Rakefile +62 -15
  8. data/chronic.gemspec +23 -0
  9. data/lib/chronic/date.rb +82 -0
  10. data/lib/chronic/grabber.rb +24 -17
  11. data/lib/chronic/handler.rb +97 -0
  12. data/lib/chronic/handlers.rb +490 -312
  13. data/lib/chronic/mini_date.rb +38 -0
  14. data/lib/chronic/numerizer.rb +130 -0
  15. data/lib/chronic/ordinal.rb +33 -24
  16. data/lib/chronic/parser.rb +268 -0
  17. data/lib/chronic/pointer.rb +22 -17
  18. data/lib/chronic/repeater.rb +137 -107
  19. data/lib/chronic/repeaters/repeater_day.rb +51 -44
  20. data/lib/chronic/repeaters/repeater_day_name.rb +50 -43
  21. data/lib/chronic/repeaters/repeater_day_portion.rb +97 -81
  22. data/lib/chronic/repeaters/repeater_fortnight.rb +61 -54
  23. data/lib/chronic/repeaters/repeater_hour.rb +51 -44
  24. data/lib/chronic/repeaters/repeater_minute.rb +51 -44
  25. data/lib/chronic/repeaters/repeater_month.rb +79 -60
  26. data/lib/chronic/repeaters/repeater_month_name.rb +85 -83
  27. data/lib/chronic/repeaters/repeater_season.rb +110 -22
  28. data/lib/chronic/repeaters/repeater_season_name.rb +41 -22
  29. data/lib/chronic/repeaters/repeater_second.rb +41 -34
  30. data/lib/chronic/repeaters/repeater_time.rb +128 -104
  31. data/lib/chronic/repeaters/repeater_week.rb +65 -58
  32. data/lib/chronic/repeaters/repeater_weekday.rb +86 -0
  33. data/lib/chronic/repeaters/repeater_weekend.rb +59 -52
  34. data/lib/chronic/repeaters/repeater_year.rb +72 -52
  35. data/lib/chronic/scalar.rb +53 -46
  36. data/lib/chronic/season.rb +26 -0
  37. data/lib/chronic/separator.rb +174 -43
  38. data/lib/chronic/sign.rb +49 -0
  39. data/lib/chronic/span.rb +31 -0
  40. data/lib/chronic/tag.rb +37 -0
  41. data/lib/chronic/time.rb +40 -0
  42. data/lib/chronic/time_zone.rb +21 -11
  43. data/lib/chronic/token.rb +51 -0
  44. data/lib/chronic.rb +94 -69
  45. data/test/helper.rb +12 -0
  46. data/test/test_chronic.rb +183 -0
  47. data/test/test_daylight_savings.rb +118 -0
  48. data/test/{test_Handler.rb → test_handler.rb} +73 -55
  49. data/test/test_mini_date.rb +32 -0
  50. data/test/test_numerizer.rb +86 -0
  51. data/test/test_parsing.rb +891 -248
  52. data/test/{test_RepeaterDayName.rb → test_repeater_day_name.rb} +16 -17
  53. data/test/test_repeater_day_portion.rb +254 -0
  54. data/test/{test_RepeaterFortnight.rb → test_repeater_fortnight.rb} +17 -18
  55. data/test/{test_RepeaterHour.rb → test_repeater_hour.rb} +23 -20
  56. data/test/test_repeater_minute.rb +34 -0
  57. data/test/{test_RepeaterMonth.rb → test_repeater_month.rb} +21 -18
  58. data/test/{test_RepeaterMonthName.rb → test_repeater_month_name.rb} +18 -19
  59. data/test/test_repeater_season.rb +40 -0
  60. data/test/{test_RepeaterTime.rb → test_repeater_time.rb} +39 -23
  61. data/test/{test_RepeaterWeek.rb → test_repeater_week.rb} +17 -18
  62. data/test/test_repeater_weekday.rb +55 -0
  63. data/test/{test_RepeaterWeekend.rb → test_repeater_weekend.rb} +22 -23
  64. data/test/{test_RepeaterYear.rb → test_repeater_year.rb} +25 -19
  65. data/test/{test_Span.rb → test_span.rb} +7 -8
  66. data/test/{test_Token.rb → test_token.rb} +6 -7
  67. metadata +163 -85
  68. data/History.txt +0 -49
  69. data/Manifest.txt +0 -47
  70. data/README.txt +0 -149
  71. data/lib/chronic/chronic.rb +0 -239
  72. data/lib/numerizer/numerizer.rb +0 -103
  73. data/test/suite.rb +0 -9
  74. data/test/test_Chronic.rb +0 -50
  75. data/test/test_Numerizer.rb +0 -48
  76. data/test/test_Time.rb +0 -50
data/test/test_parsing.rb CHANGED
@@ -1,592 +1,1235 @@
1
- require 'chronic'
2
- require 'test/unit'
1
+ require 'helper'
3
2
 
4
- class TestParsing < Test::Unit::TestCase
3
+ class TestParsing < 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
-
12
- def test_parse_guess_dates
13
- # rm_sd
10
+
11
+ def test_handle_generic
12
+ time = Chronic.parse("2012-08-02T13:00:00")
13
+ assert_equal Time.local(2012, 8, 2, 13), time
14
+
15
+ time = Chronic.parse("2012-08-02T13:00:00+01:00")
16
+ assert_equal Time.utc(2012, 8, 2, 12), time
17
+
18
+ time = Chronic.parse("2012-08-02T08:00:00-04:00")
19
+ assert_equal Time.utc(2012, 8, 2, 12), time
20
+
21
+ time = Chronic.parse("2013-08-01T19:30:00.345-07:00")
22
+ time2 = Time.parse("2013-08-01 019:30:00.345-07:00")
23
+ assert_in_delta time, time2, 0.001
24
+
25
+ time = Chronic.parse("2012-08-02T12:00:00Z")
26
+ assert_equal Time.utc(2012, 8, 2, 12), time
27
+
28
+ time = Chronic.parse("2012-01-03 01:00:00.100")
29
+ time2 = Time.parse("2012-01-03 01:00:00.100")
30
+ assert_in_delta time, time2, 0.001
31
+
32
+ time = Chronic.parse("2012-01-03 01:00:00.234567")
33
+ time2 = Time.parse("2012-01-03 01:00:00.234567")
34
+ assert_in_delta time, time2, 0.000001
35
+
36
+ assert_nil Chronic.parse("1/1/32.1")
37
+
38
+ time = Chronic.parse("28th", {:guess => :begin})
39
+ assert_equal Time.new(Time.now.year, Time.now.month, 28), time
40
+ end
41
+
42
+ def test_handle_rmn_sd
43
+ time = parse_now("aug 3")
44
+ assert_equal Time.local(2006, 8, 3, 12), time
45
+
46
+ time = parse_now("aug 3", :context => :past)
47
+ assert_equal Time.local(2006, 8, 3, 12), time
48
+
49
+ time = parse_now("aug. 3")
50
+ assert_equal Time.local(2006, 8, 3, 12), time
51
+
52
+ time = parse_now("aug 20")
53
+ assert_equal Time.local(2006, 8, 20, 12), time
54
+
55
+ time = parse_now("aug-20")
56
+ assert_equal Time.local(2006, 8, 20, 12), time
57
+
58
+ time = parse_now("aug 20", :context => :future)
59
+ assert_equal Time.local(2006, 8, 20, 12), time
14
60
 
15
61
  time = parse_now("may 27")
16
62
  assert_equal Time.local(2007, 5, 27, 12), time
17
-
63
+
18
64
  time = parse_now("may 28", :context => :past)
19
65
  assert_equal Time.local(2006, 5, 28, 12), time
20
-
66
+
21
67
  time = parse_now("may 28 5pm", :context => :past)
22
68
  assert_equal Time.local(2006, 5, 28, 17), time
23
-
69
+
24
70
  time = parse_now("may 28 at 5pm", :context => :past)
25
71
  assert_equal Time.local(2006, 5, 28, 17), time
26
-
72
+
27
73
  time = parse_now("may 28 at 5:32.19pm", :context => :past)
28
74
  assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
29
-
30
- # rm_od
31
-
75
+
76
+ time = parse_now("may 28 at 5:32:19.764")
77
+ assert_in_delta Time.local(2007, 5, 28, 17, 32, 19, 764000), time, 0.001
78
+ end
79
+
80
+ def test_handle_rmn_sd_on
81
+ time = parse_now("5pm on may 28")
82
+ assert_equal Time.local(2007, 5, 28, 17), time
83
+
84
+ time = parse_now("5pm may 28")
85
+ assert_equal Time.local(2007, 5, 28, 17), time
86
+
87
+ time = parse_now("5 on may 28", :ambiguous_time_range => :none)
88
+ assert_equal Time.local(2007, 5, 28, 05), time
89
+ end
90
+
91
+ def test_handle_rmn_od
32
92
  time = parse_now("may 27th")
33
93
  assert_equal Time.local(2007, 5, 27, 12), time
34
-
94
+
35
95
  time = parse_now("may 27th", :context => :past)
36
96
  assert_equal Time.local(2006, 5, 27, 12), time
37
-
97
+
38
98
  time = parse_now("may 27th 5:00 pm", :context => :past)
39
99
  assert_equal Time.local(2006, 5, 27, 17), time
40
-
100
+
41
101
  time = parse_now("may 27th at 5pm", :context => :past)
42
102
  assert_equal Time.local(2006, 5, 27, 17), time
43
-
103
+
44
104
  time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
45
105
  assert_equal Time.local(2007, 5, 27, 5), time
46
-
47
- # rm_sy
48
-
49
- time = parse_now("June 1979")
50
- assert_equal Time.local(1979, 6, 16, 0), time
51
-
52
- time = parse_now("dec 79")
53
- assert_equal Time.local(1979, 12, 16, 12), time
54
-
55
- # rm_sd_sy
56
-
106
+ end
107
+
108
+ def test_handle_od_rm
109
+ time = parse_now("fifteenth of this month")
110
+ assert_equal Time.local(2006, 8, 15, 12), time
111
+ end
112
+
113
+ def test_handle_od_rmn
114
+ time = parse_now("22nd February")
115
+ assert_equal Time.local(2007, 2, 22, 12), time
116
+
117
+ time = parse_now("31st of may at 6:30pm")
118
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
119
+
120
+ time = parse_now("11th december 8am")
121
+ assert_equal Time.local(2006, 12, 11, 8), time
122
+ end
123
+
124
+ def test_handle_sy_rmn_od
125
+ time = parse_now("2009 May 22nd")
126
+ assert_equal Time.local(2009, 05, 22, 12), time
127
+ end
128
+
129
+ def test_handle_sd_rmn
130
+ time = parse_now("22 February")
131
+ assert_equal Time.local(2007, 2, 22, 12), time
132
+
133
+ time = parse_now("22 feb")
134
+ assert_equal Time.local(2007, 2, 22, 12), time
135
+
136
+ time = parse_now("22-feb")
137
+ assert_equal Time.local(2007, 2, 22, 12), time
138
+
139
+ time = parse_now("31 of may at 6:30pm")
140
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
141
+
142
+ time = parse_now("11 december 8am")
143
+ assert_equal Time.local(2006, 12, 11, 8), time
144
+ end
145
+
146
+ def test_handle_rmn_od_on
147
+ time = parse_now("5:00 pm may 27th", :context => :past)
148
+ assert_equal Time.local(2006, 5, 27, 17), time
149
+
150
+ time = parse_now("05:00 pm may 27th", :context => :past)
151
+ assert_equal Time.local(2006, 5, 27, 17), time
152
+
153
+ time = parse_now("5pm on may 27th", :context => :past)
154
+ assert_equal Time.local(2006, 5, 27, 17), time
155
+
156
+ time = parse_now("5 on may 27th", :ambiguous_time_range => :none)
157
+ assert_equal Time.local(2007, 5, 27, 5), time
158
+ end
159
+
160
+ def test_handle_rmn_sy
161
+ time = parse_now("may 97")
162
+ assert_equal Time.local(1997, 5, 16, 12), time
163
+
164
+ time = parse_now("may 33", :ambiguous_year_future_bias => 10)
165
+ assert_equal Time.local(2033, 5, 16, 12), time
166
+
167
+ time = parse_now("may 32")
168
+ assert_equal Time.local(2032, 5, 16, 12, 0, 0), time
169
+ end
170
+
171
+ def test_handle_rdn_rmn_sd_t_tz_sy
172
+ time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
173
+ assert_equal 1175558400, time.to_i
174
+ end
175
+
176
+ def test_handle_sy_sm_sd_t_tz
177
+ time = parse_now("2011-07-03 22:11:35 +0100")
178
+ assert_equal 1309727495, time.to_i
179
+
180
+ time = parse_now("2011-07-03 22:11:35 +01:00")
181
+ assert_equal 1309727495, time.to_i
182
+
183
+ time = parse_now("2011-07-03 16:11:35 -05:00")
184
+ assert_equal 1309727495, time.to_i
185
+
186
+ time = parse_now("2011-07-03 21:11:35 UTC")
187
+ assert_equal 1309727495, time.to_i
188
+
189
+ time = parse_now("2011-07-03 21:11:35.362 UTC")
190
+ assert_in_delta 1309727495.362, time.to_f, 0.001
191
+ end
192
+
193
+ def test_handle_rmn_sd_sy
194
+ time = parse_now("November 18, 2010")
195
+ assert_equal Time.local(2010, 11, 18, 12), time
196
+
197
+ time = parse_now("Jan 1,2010")
198
+ assert_equal Time.local(2010, 1, 1, 12), time
199
+
200
+ time = parse_now("February 14, 2004")
201
+ assert_equal Time.local(2004, 2, 14, 12), time
202
+
57
203
  time = parse_now("jan 3 2010")
58
204
  assert_equal Time.local(2010, 1, 3, 12), time
59
-
205
+
60
206
  time = parse_now("jan 3 2010 midnight")
61
207
  assert_equal Time.local(2010, 1, 4, 0), time
62
-
208
+
63
209
  time = parse_now("jan 3 2010 at midnight")
64
210
  assert_equal Time.local(2010, 1, 4, 0), time
65
-
211
+
66
212
  time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
67
213
  assert_equal Time.local(2010, 1, 3, 4), time
68
-
69
- #time = parse_now("January 12, '00")
70
- #assert_equal Time.local(2000, 1, 12, 12), time
71
-
214
+
215
+ time = parse_now("may 27, 1979")
216
+ assert_equal Time.local(1979, 5, 27, 12), time
217
+
72
218
  time = parse_now("may 27 79")
73
219
  assert_equal Time.local(1979, 5, 27, 12), time
74
-
220
+
75
221
  time = parse_now("may 27 79 4:30")
76
222
  assert_equal Time.local(1979, 5, 27, 16, 30), time
77
-
223
+
78
224
  time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
79
225
  assert_equal Time.local(1979, 5, 27, 4, 30), time
80
-
81
- # sd_rm_sy
82
226
 
227
+ time = parse_now("may 27 32")
228
+ assert_equal Time.local(2032, 5, 27, 12, 0, 0), time
229
+
230
+ time = parse_now("oct 5 2012 1045pm")
231
+ assert_equal Time.local(2012, 10, 5, 22, 45), time
232
+ end
233
+
234
+ def test_handle_rmn_od_sy
235
+ time = parse_now("may 1st 01")
236
+ assert_equal Time.local(2001, 5, 1, 12), time
237
+
238
+ time = parse_now("November 18th 2010")
239
+ assert_equal Time.local(2010, 11, 18, 12), time
240
+
241
+ time = parse_now("November 18th, 2010")
242
+ assert_equal Time.local(2010, 11, 18, 12), time
243
+
244
+ time = parse_now("November 18th 2010 midnight")
245
+ assert_equal Time.local(2010, 11, 19, 0), time
246
+
247
+ time = parse_now("November 18th 2010 at midnight")
248
+ assert_equal Time.local(2010, 11, 19, 0), time
249
+
250
+ time = parse_now("November 18th 2010 at 4")
251
+ assert_equal Time.local(2010, 11, 18, 16), time
252
+
253
+ time = parse_now("November 18th 2010 at 4", :ambiguous_time_range => :none)
254
+ assert_equal Time.local(2010, 11, 18, 4), time
255
+
256
+ time = parse_now("March 30th, 1979")
257
+ assert_equal Time.local(1979, 3, 30, 12), time
258
+
259
+ time = parse_now("March 30th 79")
260
+ assert_equal Time.local(1979, 3, 30, 12), time
261
+
262
+ time = parse_now("March 30th 79 4:30")
263
+ assert_equal Time.local(1979, 3, 30, 16, 30), time
264
+
265
+ time = parse_now("March 30th 79 at 4:30", :ambiguous_time_range => :none)
266
+ assert_equal Time.local(1979, 3, 30, 4, 30), time
267
+ end
268
+
269
+ def test_handle_od_rmn_sy
270
+ time = parse_now("22nd February 2012")
271
+ assert_equal Time.local(2012, 2, 22, 12), time
272
+
273
+ time = parse_now("11th december 79")
274
+ assert_equal Time.local(1979, 12, 11, 12), time
275
+ end
276
+
277
+ def test_handle_sd_rmn_sy
83
278
  time = parse_now("3 jan 2010")
84
279
  assert_equal Time.local(2010, 1, 3, 12), time
85
-
280
+
86
281
  time = parse_now("3 jan 2010 4pm")
87
282
  assert_equal Time.local(2010, 1, 3, 16), time
88
-
89
- # sm_sd_sy
90
-
283
+
284
+ time = parse_now("27 Oct 2006 7:30pm")
285
+ assert_equal Time.local(2006, 10, 27, 19, 30), time
286
+ end
287
+
288
+ def test_handle_sm_sd_sy
91
289
  time = parse_now("5/27/1979")
92
290
  assert_equal Time.local(1979, 5, 27, 12), time
93
-
291
+
94
292
  time = parse_now("5/27/1979 4am")
95
293
  assert_equal Time.local(1979, 5, 27, 4), time
96
-
97
- # sd_sm_sy
98
-
294
+
295
+ time = parse_now("7/12/11")
296
+ assert_equal Time.local(2011, 7, 12, 12), time
297
+
298
+ time = parse_now("7/12/11", :endian_precedence => :little)
299
+ assert_equal Time.local(2011, 12, 7, 12), time
300
+
301
+ time = parse_now("9/19/2011 6:05:57 PM")
302
+ assert_equal Time.local(2011, 9, 19, 18, 05, 57), time
303
+
304
+ # month day overflows
305
+ time = parse_now("30/2/2000")
306
+ assert_nil time
307
+
308
+ time = parse_now("2013-03-12 17:00", :context => :past)
309
+ assert_equal Time.local(2013, 3, 12, 17, 0, 0), time
310
+ end
311
+
312
+ def test_handle_sd_sm_sy
99
313
  time = parse_now("27/5/1979")
100
314
  assert_equal Time.local(1979, 5, 27, 12), time
101
-
315
+
102
316
  time = parse_now("27/5/1979 @ 0700")
103
317
  assert_equal Time.local(1979, 5, 27, 7), time
104
-
105
- # sm_sy
106
-
107
- time = parse_now("05/06")
108
- assert_equal Time.local(2006, 5, 16, 12), time
109
-
110
- time = parse_now("12/06")
111
- assert_equal Time.local(2006, 12, 16, 12), time
112
-
113
- time = parse_now("13/06")
114
- assert_equal nil, time
115
-
116
- # sy_sm_sd
117
-
318
+
319
+ time = parse_now("03/18/2012 09:26 pm")
320
+ assert_equal Time.local(2012, 3, 18, 21, 26), time
321
+
322
+ time = parse_now("30.07.2013 16:34:22")
323
+ assert_equal Time.local(2013, 7, 30, 16, 34, 22), time
324
+
325
+ time = parse_now("09.08.2013")
326
+ assert_equal Time.local(2013, 8, 9, 12), time
327
+
328
+ time = parse_now("30-07-2013 21:53:49")
329
+ assert_equal Time.local(2013, 7, 30, 21, 53, 49), time
330
+ end
331
+
332
+ def test_handle_sy_sm_sd
118
333
  time = parse_now("2000-1-1")
119
334
  assert_equal Time.local(2000, 1, 1, 12), time
120
-
335
+
121
336
  time = parse_now("2006-08-20")
122
337
  assert_equal Time.local(2006, 8, 20, 12), time
123
-
338
+
124
339
  time = parse_now("2006-08-20 7pm")
125
340
  assert_equal Time.local(2006, 8, 20, 19), time
126
-
341
+
127
342
  time = parse_now("2006-08-20 03:00")
128
343
  assert_equal Time.local(2006, 8, 20, 3), time
129
-
344
+
130
345
  time = parse_now("2006-08-20 03:30:30")
131
346
  assert_equal Time.local(2006, 8, 20, 3, 30, 30), time
132
-
347
+
133
348
  time = parse_now("2006-08-20 15:30:30")
134
349
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
135
-
350
+
136
351
  time = parse_now("2006-08-20 15:30.30")
137
352
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
138
-
139
- # rdn_rm_rd_rt_rtz_ry
140
-
141
- time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
142
- assert_equal Time.local(2007, 4, 2, 17), time
143
-
144
- now = Time.now
145
- time = parse_now(now.to_s)
146
- assert_equal now.to_s, time.to_s
147
-
148
- # rm_sd_rt
149
-
150
- #time = parse_now("jan 5 13:00")
151
- #assert_equal Time.local(2007, 1, 5, 13), time
152
-
153
- # due to limitations of the Time class, these don't work
154
-
155
- time = parse_now("may 40")
156
- assert_equal nil, time
157
-
158
- time = parse_now("may 27 40")
353
+
354
+ time = parse_now("2006-08-20 15:30:30:000536")
355
+ assert_in_delta Time.local(2006, 8, 20, 15, 30, 30, 536), time, 0.000001
356
+
357
+ time = parse_now("1902-08-20")
358
+ assert_equal Time.local(1902, 8, 20, 12, 0, 0), time
359
+
360
+ time = parse_now("2013.07.30 11:45:23")
361
+ assert_equal Time.local(2013, 7, 30, 11, 45, 23), time
362
+
363
+ time = parse_now("2013.08.09")
364
+ assert_equal Time.local(2013, 8, 9, 12, 0, 0), time
365
+
366
+ # exif date time original
367
+ time = parse_now("2012:05:25 22:06:50")
368
+ assert_equal Time.local(2012, 5, 25, 22, 6, 50), time
369
+ end
370
+
371
+ def test_handle_sm_sd
372
+ time = parse_now("05/06")
373
+ assert_equal Time.local(2007, 5, 6, 12), time
374
+
375
+ time = parse_now("05/06", :endian_precedence => [:little, :medium])
376
+ assert_equal Time.local(2007, 6, 5, 12), time
377
+
378
+ time = parse_now("05/06 6:05:57 PM")
379
+ assert_equal Time.local(2007, 5, 6, 18, 05, 57), time
380
+
381
+ time = parse_now("05/06 6:05:57 PM", :endian_precedence => [:little, :medium])
382
+ assert_equal Time.local(2007, 6, 5, 18, 05, 57), time
383
+
384
+ time = parse_now("13/09")
385
+ assert_equal Time.local(2006, 9, 13, 12), time
386
+
387
+ # future
388
+ time = parse_now("05/06") # future is default context
389
+ assert_equal Time.local(2007, 5, 6, 12), time
390
+
391
+ time = parse_now("1/13", :context => :future)
392
+ assert_equal Time.local(2007, 1, 13, 12), time
393
+
394
+ time = parse_now("3/13", :context => :none)
395
+ assert_equal Time.local(2006, 3, 13, 12), time
396
+ end
397
+
398
+ # def test_handle_sm_sy
399
+ # time = parse_now("05/06")
400
+ # assert_equal Time.local(2006, 5, 16, 12), time
401
+ #
402
+ # time = parse_now("12/06")
403
+ # assert_equal Time.local(2006, 12, 16, 12), time
404
+ #
405
+ # time = parse_now("13/06")
406
+ # assert_equal nil, time
407
+ # end
408
+
409
+ def test_handle_sy_sm
410
+ time = parse_now("2012-06")
411
+ assert_equal Time.local(2012, 06, 16), time
412
+
413
+ time = parse_now("2013/12")
414
+ assert_equal Time.local(2013, 12, 16, 12, 0), time
415
+ end
416
+
417
+ def test_handle_r
418
+ time = parse_now("9am on Saturday")
419
+ assert_equal Time.local(2006, 8, 19, 9), time
420
+
421
+ time = parse_now("on Tuesday")
422
+ assert_equal Time.local(2006, 8, 22, 12), time
423
+
424
+ time = parse_now("1:00:00 PM")
425
+ assert_equal Time.local(2006, 8, 16, 13), time
426
+
427
+ time = parse_now("01:00:00 PM")
428
+ assert_equal Time.local(2006, 8, 16, 13), time
429
+
430
+ time = parse_now("today at 02:00:00", :hours24 => false)
431
+ assert_equal Time.local(2006, 8, 16, 14), time
432
+
433
+ time = parse_now("today at 02:00:00 AM", :hours24 => false)
434
+ assert_equal Time.local(2006, 8, 16, 2), time
435
+
436
+ time = parse_now("today at 3:00:00", :hours24 => true)
437
+ assert_equal Time.local(2006, 8, 16, 3), time
438
+
439
+ time = parse_now("today at 03:00:00", :hours24 => true)
440
+ assert_equal Time.local(2006, 8, 16, 3), time
441
+
442
+ time = parse_now("tomorrow at 4a.m.")
443
+ assert_equal Time.local(2006, 8, 17, 4), time
444
+ end
445
+
446
+ def test_handle_r_g_r
447
+ end
448
+
449
+ def test_handle_srp
450
+ end
451
+
452
+ def test_handle_s_r_p
453
+ end
454
+
455
+ def test_handle_p_s_r
456
+ end
457
+
458
+ def test_handle_s_r_p_a
459
+ time1 = parse_now("two days ago 0:0:0am")
460
+ time2 = parse_now("two days ago 00:00:00am")
461
+ assert_equal time1, time2
462
+ end
463
+
464
+ def test_handle_orr
465
+ time = parse_now("5th tuesday in january")
466
+ assert_equal Time.local(2007, 01, 30, 12), time
467
+
468
+ time = parse_now("5th tuesday in february")
159
469
  assert_equal nil, time
160
-
161
- time = parse_now("1800-08-20")
470
+
471
+ %W(jan feb march april may june july aug sep oct nov dec).each_with_index do |month, index|
472
+ time = parse_now("5th tuesday in #{month}")
473
+
474
+ if time then
475
+ assert_equal time.month, index+1
476
+ end
477
+ end
478
+ end
479
+
480
+ def test_handle_o_r_s_r
481
+ time = parse_now("3rd wednesday in november")
482
+ assert_equal Time.local(2006, 11, 15, 12), time
483
+
484
+ time = parse_now("10th wednesday in november")
162
485
  assert_equal nil, time
486
+
487
+ # time = parse_now("3rd wednesday in 2007")
488
+ # assert_equal Time.local(2007, 1, 20, 12), time
163
489
  end
164
-
165
- def test_foo
166
- Chronic.parse('two months ago this friday')
490
+
491
+ def test_handle_o_r_g_r
492
+ time = parse_now("3rd month next year", :guess => false)
493
+ assert_equal Time.local(2007, 3), time.begin
494
+
495
+ time = parse_now("3rd month next year", :guess => false)
496
+ assert_equal Time.local(2007, 3, 1), time.begin
497
+
498
+ time = parse_now("3rd thursday this september")
499
+ assert_equal Time.local(2006, 9, 21, 12), time
500
+
501
+ now = Time.parse("1/10/2010")
502
+ time = parse_now("3rd thursday this november", :now => now)
503
+ assert_equal Time.local(2010, 11, 18, 12), time
504
+
505
+ time = parse_now("4th day last week")
506
+ assert_equal Time.local(2006, 8, 9, 12), time
507
+ end
508
+
509
+ def test_handle_sm_rmn_sy
510
+ time = parse_now('30-Mar-11')
511
+ assert_equal Time.local(2011, 3, 30, 12), time
512
+
513
+ time = parse_now('31-Aug-12')
514
+ assert_equal Time.local(2012, 8, 31), time
167
515
  end
168
516
 
517
+ # end of testing handlers
518
+
169
519
  def test_parse_guess_r
170
520
  time = parse_now("friday")
171
521
  assert_equal Time.local(2006, 8, 18, 12), time
172
-
522
+
173
523
  time = parse_now("tue")
174
524
  assert_equal Time.local(2006, 8, 22, 12), time
175
-
525
+
176
526
  time = parse_now("5")
177
527
  assert_equal Time.local(2006, 8, 16, 17), time
178
-
528
+
179
529
  time = Chronic.parse("5", :now => Time.local(2006, 8, 16, 3, 0, 0, 0), :ambiguous_time_range => :none)
180
530
  assert_equal Time.local(2006, 8, 16, 5), time
181
-
531
+
182
532
  time = parse_now("13:00")
183
533
  assert_equal Time.local(2006, 8, 17, 13), time
184
-
534
+
185
535
  time = parse_now("13:45")
186
536
  assert_equal Time.local(2006, 8, 17, 13, 45), time
187
-
537
+
538
+ time = parse_now("1:01pm")
539
+ assert_equal Time.local(2006, 8, 16, 13, 01), time
540
+
541
+ time = parse_now("2:01pm")
542
+ assert_equal Time.local(2006, 8, 16, 14, 01), time
543
+
188
544
  time = parse_now("november")
189
545
  assert_equal Time.local(2006, 11, 16), time
190
546
  end
191
-
547
+
192
548
  def test_parse_guess_rr
193
549
  time = parse_now("friday 13:00")
194
550
  assert_equal Time.local(2006, 8, 18, 13), time
195
-
551
+
196
552
  time = parse_now("monday 4:00")
197
553
  assert_equal Time.local(2006, 8, 21, 16), time
198
-
554
+
199
555
  time = parse_now("sat 4:00", :ambiguous_time_range => :none)
200
556
  assert_equal Time.local(2006, 8, 19, 4), time
201
-
557
+
202
558
  time = parse_now("sunday 4:20", :ambiguous_time_range => :none)
203
559
  assert_equal Time.local(2006, 8, 20, 4, 20), time
204
-
560
+
205
561
  time = parse_now("4 pm")
206
562
  assert_equal Time.local(2006, 8, 16, 16), time
207
-
563
+
208
564
  time = parse_now("4 am", :ambiguous_time_range => :none)
209
565
  assert_equal Time.local(2006, 8, 16, 4), time
210
-
566
+
567
+ time = parse_now("12 pm")
568
+ assert_equal Time.local(2006, 8, 16, 12), time
569
+
570
+ time = parse_now("12:01 pm")
571
+ assert_equal Time.local(2006, 8, 16, 12, 1), time
572
+
573
+ time = parse_now("12:01 am")
574
+ assert_equal Time.local(2006, 8, 16, 0, 1), time
575
+
576
+ time = parse_now("12 am")
577
+ assert_equal Time.local(2006, 8, 16), time
578
+
211
579
  time = parse_now("4:00 in the morning")
212
580
  assert_equal Time.local(2006, 8, 16, 4), time
213
-
581
+
582
+ time = parse_now("0:10")
583
+ assert_equal Time.local(2006, 8, 17, 0, 10), time
584
+
214
585
  time = parse_now("november 4")
215
586
  assert_equal Time.local(2006, 11, 4, 12), time
216
-
587
+
217
588
  time = parse_now("aug 24")
218
589
  assert_equal Time.local(2006, 8, 24, 12), time
219
590
  end
220
-
591
+
221
592
  def test_parse_guess_rrr
222
593
  time = parse_now("friday 1 pm")
223
594
  assert_equal Time.local(2006, 8, 18, 13), time
224
-
595
+
225
596
  time = parse_now("friday 11 at night")
226
597
  assert_equal Time.local(2006, 8, 18, 23), time
227
-
598
+
228
599
  time = parse_now("friday 11 in the evening")
229
600
  assert_equal Time.local(2006, 8, 18, 23), time
230
-
601
+
231
602
  time = parse_now("sunday 6am")
232
603
  assert_equal Time.local(2006, 8, 20, 6), time
233
-
604
+
234
605
  time = parse_now("friday evening at 7")
235
606
  assert_equal Time.local(2006, 8, 18, 19), time
236
607
  end
237
-
608
+
238
609
  def test_parse_guess_gr
239
610
  # year
240
-
241
- time = parse_now("this year")
242
- assert_equal Time.local(2006, 10, 24, 12, 30), time
243
-
244
- time = parse_now("this year", :context => :past)
245
- assert_equal Time.local(2006, 4, 24, 12, 30), time
246
-
611
+
612
+ time = parse_now("this year", :guess => false)
613
+ assert_equal Time.local(2006, 8, 17), time.begin
614
+
615
+ time = parse_now("this year", :context => :past, :guess => false)
616
+ assert_equal Time.local(2006, 1, 1), time.begin
617
+
247
618
  # month
248
-
619
+
249
620
  time = parse_now("this month")
250
621
  assert_equal Time.local(2006, 8, 24, 12), time
251
-
622
+
252
623
  time = parse_now("this month", :context => :past)
253
624
  assert_equal Time.local(2006, 8, 8, 12), time
254
-
625
+
255
626
  time = Chronic.parse("next month", :now => Time.local(2006, 11, 15))
256
627
  assert_equal Time.local(2006, 12, 16, 12), time
257
-
628
+
258
629
  # month name
259
-
630
+
260
631
  time = parse_now("last november")
261
632
  assert_equal Time.local(2005, 11, 16), time
262
-
633
+
263
634
  # fortnight
264
-
635
+
265
636
  time = parse_now("this fortnight")
266
637
  assert_equal Time.local(2006, 8, 21, 19, 30), time
267
-
638
+
268
639
  time = parse_now("this fortnight", :context => :past)
269
640
  assert_equal Time.local(2006, 8, 14, 19), time
270
-
641
+
271
642
  # week
272
-
643
+
273
644
  time = parse_now("this week")
274
645
  assert_equal Time.local(2006, 8, 18, 7, 30), time
275
-
646
+
276
647
  time = parse_now("this week", :context => :past)
277
648
  assert_equal Time.local(2006, 8, 14, 19), time
278
-
649
+
279
650
  # weekend
280
-
651
+
281
652
  time = parse_now("this weekend")
282
653
  assert_equal Time.local(2006, 8, 20), time
283
-
654
+
284
655
  time = parse_now("this weekend", :context => :past)
285
656
  assert_equal Time.local(2006, 8, 13), time
286
-
657
+
287
658
  time = parse_now("last weekend")
288
659
  assert_equal Time.local(2006, 8, 13), time
289
-
660
+
290
661
  # day
291
-
662
+
292
663
  time = parse_now("this day")
293
- assert_equal Time.local(2006, 8, 16, 19, 30), time
294
-
664
+ assert_equal Time.local(2006, 8, 16, 19), time
665
+
295
666
  time = parse_now("this day", :context => :past)
296
667
  assert_equal Time.local(2006, 8, 16, 7), time
297
-
668
+
298
669
  time = parse_now("today")
299
- assert_equal Time.local(2006, 8, 16, 19, 30), time
300
-
670
+ assert_equal Time.local(2006, 8, 16, 19), time
671
+
301
672
  time = parse_now("yesterday")
302
673
  assert_equal Time.local(2006, 8, 15, 12), time
303
-
674
+
675
+ now = Time.parse("2011-05-27 23:10") # after 11pm
676
+ time = parse_now("yesterday", :now => now)
677
+ assert_equal Time.local(2011, 05, 26, 12), time
678
+
304
679
  time = parse_now("tomorrow")
305
680
  assert_equal Time.local(2006, 8, 17, 12), time
306
-
681
+
307
682
  # day name
308
-
683
+
309
684
  time = parse_now("this tuesday")
310
685
  assert_equal Time.local(2006, 8, 22, 12), time
311
-
686
+
312
687
  time = parse_now("next tuesday")
313
688
  assert_equal Time.local(2006, 8, 22, 12), time
314
-
689
+
315
690
  time = parse_now("last tuesday")
316
691
  assert_equal Time.local(2006, 8, 15, 12), time
317
-
692
+
318
693
  time = parse_now("this wed")
319
694
  assert_equal Time.local(2006, 8, 23, 12), time
320
-
695
+
321
696
  time = parse_now("next wed")
322
697
  assert_equal Time.local(2006, 8, 23, 12), time
323
-
698
+
324
699
  time = parse_now("last wed")
325
700
  assert_equal Time.local(2006, 8, 9, 12), time
326
-
701
+
702
+ monday = Time.local(2006, 8, 21, 12)
703
+ assert_equal monday, parse_now("mon")
704
+ assert_equal monday, parse_now("mun")
705
+
706
+ tuesday = Time.local(2006, 8, 22, 12)
707
+ assert_equal tuesday, parse_now("tue")
708
+ assert_equal tuesday, parse_now("tus")
709
+
710
+ wednesday = Time.local(2006, 8, 23, 12)
711
+ assert_equal wednesday, parse_now("wed")
712
+ assert_equal wednesday, parse_now("wenns")
713
+
714
+ thursday = Time.local(2006, 8, 17, 12)
715
+ assert_equal thursday, parse_now("thu")
716
+ assert_equal thursday, parse_now("thur")
717
+
718
+ friday = Time.local(2006, 8, 18, 12)
719
+ assert_equal friday, parse_now("fri")
720
+ assert_equal friday, parse_now("fry")
721
+
722
+ saturday = Time.local(2006, 8, 19, 12)
723
+ assert_equal saturday, parse_now("sat")
724
+ assert_equal saturday, parse_now("satterday")
725
+
726
+ sunday = Time.local(2006, 8, 20, 12)
727
+ assert_equal sunday, parse_now("sun")
728
+ assert_equal sunday, parse_now("sum")
729
+
327
730
  # day portion
328
-
731
+
329
732
  time = parse_now("this morning")
330
733
  assert_equal Time.local(2006, 8, 16, 9), time
331
-
734
+
332
735
  time = parse_now("tonight")
333
736
  assert_equal Time.local(2006, 8, 16, 22), time
334
-
737
+
738
+ # hour
739
+
740
+ time = parse_now("next hr")
741
+ assert_equal Time.local(2006, 8, 16, 15, 30, 0), time
742
+
743
+ time = parse_now("next hrs")
744
+ assert_equal Time.local(2006, 8, 16, 15, 30, 0), time
745
+
335
746
  # minute
336
-
747
+
748
+ time = parse_now("next min")
749
+ assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
750
+
751
+ time = parse_now("next mins")
752
+ assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
753
+
337
754
  time = parse_now("next minute")
338
755
  assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
339
-
756
+
340
757
  # second
341
-
758
+
759
+ time = parse_now("next sec")
760
+ assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
761
+
762
+ time = parse_now("next secs")
763
+ assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
764
+
342
765
  time = parse_now("this second")
343
766
  assert_equal Time.local(2006, 8, 16, 14), time
344
-
767
+
345
768
  time = parse_now("this second", :context => :past)
346
769
  assert_equal Time.local(2006, 8, 16, 14), time
347
-
770
+
348
771
  time = parse_now("next second")
349
772
  assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
350
-
773
+
351
774
  time = parse_now("last second")
352
775
  assert_equal Time.local(2006, 8, 16, 13, 59, 59), time
353
776
  end
354
-
355
- def test_parse_guess_grr
777
+
778
+ def test_parse_guess_grr
356
779
  time = parse_now("yesterday at 4:00")
357
780
  assert_equal Time.local(2006, 8, 15, 16), time
358
-
781
+
359
782
  time = parse_now("today at 9:00")
360
783
  assert_equal Time.local(2006, 8, 16, 9), time
361
-
784
+
362
785
  time = parse_now("today at 2100")
363
786
  assert_equal Time.local(2006, 8, 16, 21), time
364
-
787
+
365
788
  time = parse_now("this day at 0900")
366
789
  assert_equal Time.local(2006, 8, 16, 9), time
367
-
790
+
368
791
  time = parse_now("tomorrow at 0900")
369
792
  assert_equal Time.local(2006, 8, 17, 9), time
370
-
793
+
371
794
  time = parse_now("yesterday at 4:00", :ambiguous_time_range => :none)
372
795
  assert_equal Time.local(2006, 8, 15, 4), time
373
-
796
+
374
797
  time = parse_now("last friday at 4:00")
375
798
  assert_equal Time.local(2006, 8, 11, 16), time
376
-
799
+
377
800
  time = parse_now("next wed 4:00")
378
801
  assert_equal Time.local(2006, 8, 23, 16), time
379
-
802
+
380
803
  time = parse_now("yesterday afternoon")
381
804
  assert_equal Time.local(2006, 8, 15, 15), time
382
-
805
+
383
806
  time = parse_now("last week tuesday")
384
807
  assert_equal Time.local(2006, 8, 8, 12), time
385
-
808
+
386
809
  time = parse_now("tonight at 7")
387
810
  assert_equal Time.local(2006, 8, 16, 19), time
388
-
811
+
389
812
  time = parse_now("tonight 7")
390
813
  assert_equal Time.local(2006, 8, 16, 19), time
391
-
814
+
392
815
  time = parse_now("7 tonight")
393
816
  assert_equal Time.local(2006, 8, 16, 19), time
394
817
  end
395
-
818
+
396
819
  def test_parse_guess_grrr
397
820
  time = parse_now("today at 6:00pm")
398
821
  assert_equal Time.local(2006, 8, 16, 18), time
399
-
822
+
400
823
  time = parse_now("today at 6:00am")
401
824
  assert_equal Time.local(2006, 8, 16, 6), time
402
-
825
+
403
826
  time = parse_now("this day 1800")
404
827
  assert_equal Time.local(2006, 8, 16, 18), time
405
-
828
+
406
829
  time = parse_now("yesterday at 4:00pm")
407
830
  assert_equal Time.local(2006, 8, 15, 16), time
408
-
831
+
409
832
  time = parse_now("tomorrow evening at 7")
410
833
  assert_equal Time.local(2006, 8, 17, 19), time
411
-
834
+
412
835
  time = parse_now("tomorrow morning at 5:30")
413
836
  assert_equal Time.local(2006, 8, 17, 5, 30), time
837
+
838
+ time = parse_now("next monday at 12:01 am")
839
+ assert_equal Time.local(2006, 8, 21, 00, 1), time
840
+
841
+ time = parse_now("next monday at 12:01 pm")
842
+ assert_equal Time.local(2006, 8, 21, 12, 1), time
843
+
844
+ # with context
845
+ time = parse_now("sunday at 8:15pm", :context => :past)
846
+ assert_equal Time.local(2006, 8, 13, 20, 15), time
414
847
  end
415
-
848
+
416
849
  def test_parse_guess_rgr
417
850
  time = parse_now("afternoon yesterday")
418
851
  assert_equal Time.local(2006, 8, 15, 15), time
419
-
852
+
420
853
  time = parse_now("tuesday last week")
421
854
  assert_equal Time.local(2006, 8, 8, 12), time
422
855
  end
423
-
856
+
857
+ def test_parse_guess_a_ago
858
+ time = parse_now("AN hour ago")
859
+ assert_equal Time.local(2006, 8, 16, 13), time
860
+
861
+ time = parse_now("A day ago")
862
+ assert_equal Time.local(2006, 8, 15, 14), time
863
+
864
+ time = parse_now("a month ago")
865
+ assert_equal Time.local(2006, 7, 16, 14), time
866
+
867
+ time = parse_now("a year ago")
868
+ assert_equal Time.local(2005, 8, 16, 14), time
869
+ end
870
+
424
871
  def test_parse_guess_s_r_p
425
872
  # past
426
-
873
+
427
874
  time = parse_now("3 years ago")
428
875
  assert_equal Time.local(2003, 8, 16, 14), time
429
-
876
+
430
877
  time = parse_now("1 month ago")
431
878
  assert_equal Time.local(2006, 7, 16, 14), time
432
-
879
+
433
880
  time = parse_now("1 fortnight ago")
434
881
  assert_equal Time.local(2006, 8, 2, 14), time
435
-
882
+
436
883
  time = parse_now("2 fortnights ago")
437
884
  assert_equal Time.local(2006, 7, 19, 14), time
438
-
885
+
439
886
  time = parse_now("3 weeks ago")
440
887
  assert_equal Time.local(2006, 7, 26, 14), time
441
-
888
+
442
889
  time = parse_now("2 weekends ago")
443
890
  assert_equal Time.local(2006, 8, 5), time
444
-
891
+
445
892
  time = parse_now("3 days ago")
446
893
  assert_equal Time.local(2006, 8, 13, 14), time
447
-
894
+
448
895
  #time = parse_now("1 monday ago")
449
896
  #assert_equal Time.local(2006, 8, 14, 12), time
450
-
897
+
451
898
  time = parse_now("5 mornings ago")
452
899
  assert_equal Time.local(2006, 8, 12, 9), time
453
-
900
+
454
901
  time = parse_now("7 hours ago")
455
902
  assert_equal Time.local(2006, 8, 16, 7), time
456
-
903
+
457
904
  time = parse_now("3 minutes ago")
458
905
  assert_equal Time.local(2006, 8, 16, 13, 57), time
459
-
906
+
460
907
  time = parse_now("20 seconds before now")
461
908
  assert_equal Time.local(2006, 8, 16, 13, 59, 40), time
462
909
 
463
910
  # future
464
-
911
+
465
912
  time = parse_now("3 years from now")
466
913
  assert_equal Time.local(2009, 8, 16, 14, 0, 0), time
467
-
914
+
468
915
  time = parse_now("6 months hence")
469
916
  assert_equal Time.local(2007, 2, 16, 14), time
470
-
917
+
471
918
  time = parse_now("3 fortnights hence")
472
919
  assert_equal Time.local(2006, 9, 27, 14), time
473
-
920
+
474
921
  time = parse_now("1 week from now")
475
922
  assert_equal Time.local(2006, 8, 23, 14, 0, 0), time
476
-
923
+
477
924
  time = parse_now("1 weekend from now")
478
925
  assert_equal Time.local(2006, 8, 19), time
479
-
926
+
480
927
  time = parse_now("2 weekends from now")
481
928
  assert_equal Time.local(2006, 8, 26), time
482
-
929
+
483
930
  time = parse_now("1 day hence")
484
931
  assert_equal Time.local(2006, 8, 17, 14), time
485
-
932
+
486
933
  time = parse_now("5 mornings hence")
487
934
  assert_equal Time.local(2006, 8, 21, 9), time
488
-
935
+
489
936
  time = parse_now("1 hour from now")
490
937
  assert_equal Time.local(2006, 8, 16, 15), time
491
-
938
+
492
939
  time = parse_now("20 minutes hence")
493
940
  assert_equal Time.local(2006, 8, 16, 14, 20), time
494
-
941
+
495
942
  time = parse_now("20 seconds from now")
496
943
  assert_equal Time.local(2006, 8, 16, 14, 0, 20), time
497
-
944
+
498
945
  time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
499
946
  assert_equal Time.local(2007, 1, 7, 23, 30), time
947
+
948
+ # Two repeaters
949
+ time = parse_now("25 minutes and 20 seconds from now")
950
+ assert_equal Time.local(2006, 8, 16, 14, 25, 20), time
951
+
952
+ time = parse_now("24 hours and 20 minutes from now")
953
+ assert_equal Time.local(2006, 8, 17, 14, 20, 0), time
954
+
955
+ time = parse_now("24 hours 20 minutes from now")
956
+ assert_equal Time.local(2006, 8, 17, 14, 20, 0), time
500
957
  end
501
-
958
+
502
959
  def test_parse_guess_p_s_r
503
960
  time = parse_now("in 3 hours")
504
961
  assert_equal Time.local(2006, 8, 16, 17), time
505
962
  end
506
-
963
+
507
964
  def test_parse_guess_s_r_p_a
508
965
  # past
509
-
966
+
510
967
  time = parse_now("3 years ago tomorrow")
511
968
  assert_equal Time.local(2003, 8, 17, 12), time
512
-
969
+
513
970
  time = parse_now("3 years ago this friday")
514
971
  assert_equal Time.local(2003, 8, 18, 12), time
515
-
972
+
516
973
  time = parse_now("3 months ago saturday at 5:00 pm")
517
974
  assert_equal Time.local(2006, 5, 19, 17), time
518
-
975
+
519
976
  time = parse_now("2 days from this second")
520
977
  assert_equal Time.local(2006, 8, 18, 14), time
521
-
978
+
522
979
  time = parse_now("7 hours before tomorrow at midnight")
523
980
  assert_equal Time.local(2006, 8, 17, 17), time
524
-
981
+
525
982
  # future
526
983
  end
527
-
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
531
-
532
- time = parse_now("10th wednesday in november")
533
- assert_equal nil, time
534
- end
535
-
984
+
536
985
  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
-
986
+ time = parse_now("3rd month next year", :guess => false)
987
+ assert_equal Time.local(2007, 3), time.begin
988
+
989
+ time = parse_now("3rd month next year", :guess => false)
990
+ assert_equal Time.local(2007, 3, 1), time.begin
991
+
540
992
  time = parse_now("3rd thursday this september")
541
993
  assert_equal Time.local(2006, 9, 21, 12), time
542
-
994
+
995
+ now = Time.parse("1/10/2010")
996
+ time = parse_now("3rd thursday this november", :now => now)
997
+ assert_equal Time.local(2010, 11, 18, 12), time
998
+
543
999
  time = parse_now("4th day last week")
544
1000
  assert_equal Time.local(2006, 8, 9, 12), time
545
1001
  end
546
-
1002
+
547
1003
  def test_parse_guess_nonsense
548
1004
  time = parse_now("some stupid nonsense")
549
1005
  assert_equal nil, time
1006
+
1007
+ time = parse_now("Ham Sandwich")
1008
+ assert_equal nil, time
550
1009
  end
551
-
1010
+
552
1011
  def test_parse_span
553
1012
  span = parse_now("friday", :guess => false)
554
1013
  assert_equal Time.local(2006, 8, 18), span.begin
555
1014
  assert_equal Time.local(2006, 8, 19), span.end
556
-
1015
+
557
1016
  span = parse_now("november", :guess => false)
558
1017
  assert_equal Time.local(2006, 11), span.begin
559
1018
  assert_equal Time.local(2006, 12), span.end
560
-
1019
+
561
1020
  span = Chronic.parse("weekend" , :now => @time_2006_08_16_14_00_00, :guess => false)
562
1021
  assert_equal Time.local(2006, 8, 19), span.begin
563
1022
  assert_equal Time.local(2006, 8, 21), span.end
564
1023
  end
565
-
1024
+
1025
+ def test_parse_with_endian_precedence
1026
+ date = '11/02/2007'
1027
+
1028
+ expect_for_middle_endian = Time.local(2007, 11, 2, 12)
1029
+ expect_for_little_endian = Time.local(2007, 2, 11, 12)
1030
+
1031
+ # default precedence should be toward middle endianness
1032
+ assert_equal expect_for_middle_endian, Chronic.parse(date)
1033
+
1034
+ assert_equal expect_for_middle_endian, Chronic.parse(date, :endian_precedence => [:middle, :little])
1035
+
1036
+ assert_equal expect_for_little_endian, Chronic.parse(date, :endian_precedence => [:little, :middle])
1037
+ end
1038
+
566
1039
  def test_parse_words
567
1040
  assert_equal parse_now("33 days from now"), parse_now("thirty-three days from now")
568
1041
  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
1042
  assert_equal parse_now("may 10th"), parse_now("may tenth")
1043
+ assert_equal parse_now("second monday in january"), parse_now("2nd monday in january")
1044
+ end
1045
+
1046
+ def test_relative_to_an_hour_before
1047
+ # example prenormalization "10 to 2" becomes "10 minutes past 2"
1048
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 to 2")
1049
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 till 2")
1050
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 prior to 2")
1051
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 before 2")
1052
+
1053
+ # uses the current hour, so 2006-08-16 13:50:00, not 14:50
1054
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 to")
1055
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 till")
1056
+
1057
+ assert_equal Time.local(2006, 8, 16, 15, 45), parse_now("quarter to 4")
570
1058
  end
571
-
1059
+
1060
+ def test_relative_to_an_hour_after
1061
+ # not nil
1062
+ assert_equal Time.local(2006, 8, 16, 14, 10), parse_now("10 after 2")
1063
+ assert_equal Time.local(2006, 8, 16, 14, 10), parse_now("10 past 2")
1064
+ assert_equal Time.local(2006, 8, 16, 14, 30), parse_now("half past 2")
1065
+ end
1066
+
572
1067
  def test_parse_only_complete_pointers
573
1068
  assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
574
1069
  assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
575
1070
  assert_equal parse_now("meeting today at 2pm"), @time_2006_08_16_14_00_00
576
1071
  end
577
-
578
- def test_argument_validation
579
- assert_raise(Chronic::InvalidArgumentException) do
580
- time = Chronic.parse("may 27", :foo => :bar)
581
- end
582
-
583
- assert_raise(Chronic::InvalidArgumentException) do
584
- time = Chronic.parse("may 27", :context => :bar)
585
- end
1072
+
1073
+ def test_am_pm
1074
+ assert_equal Time.local(2006, 8, 16), parse_now("8/16/2006 at 12am")
1075
+ assert_equal Time.local(2006, 8, 16, 12), parse_now("8/16/2006 at 12pm")
586
1076
  end
587
-
1077
+
1078
+ def test_a_p
1079
+ assert_equal Time.local(2006, 8, 16, 0, 15), parse_now("8/16/2006 at 12:15a")
1080
+ assert_equal Time.local(2006, 8, 16, 18, 30), parse_now("8/16/2006 at 6:30p")
1081
+ end
1082
+
1083
+ def test_seasons
1084
+ t = parse_now("this spring", :guess => false)
1085
+ assert_equal Time.local(2007, 3, 20), t.begin
1086
+ assert_equal Time.local(2007, 6, 20), t.end
1087
+
1088
+ t = parse_now("this winter", :guess => false)
1089
+ assert_equal Time.local(2006, 12, 22), t.begin
1090
+ assert_equal Time.local(2007, 3, 19), t.end
1091
+
1092
+ t = parse_now("last spring", :guess => false)
1093
+ assert_equal Time.local(2006, 3, 20), t.begin
1094
+ assert_equal Time.local(2006, 6, 20), t.end
1095
+
1096
+ t = parse_now("last winter", :guess => false)
1097
+ assert_equal Time.local(2005, 12, 22), t.begin
1098
+ assert_equal Time.local(2006, 3, 19), t.end
1099
+
1100
+ t = parse_now("next spring", :guess => false)
1101
+ assert_equal Time.local(2007, 3, 20), t.begin
1102
+ assert_equal Time.local(2007, 6, 20), t.end
1103
+ end
1104
+
1105
+ # regression
1106
+
1107
+ # def test_partial
1108
+ # assert_equal '', parse_now("2 hours")
1109
+ # end
1110
+
1111
+ def test_days_in_november
1112
+ t1 = Chronic.parse('1st thursday in november', :now => Time.local(2007))
1113
+ assert_equal Time.local(2007, 11, 1, 12), t1
1114
+
1115
+ t1 = Chronic.parse('1st friday in november', :now => Time.local(2007))
1116
+ assert_equal Time.local(2007, 11, 2, 12), t1
1117
+
1118
+ t1 = Chronic.parse('1st saturday in november', :now => Time.local(2007))
1119
+ assert_equal Time.local(2007, 11, 3, 12), t1
1120
+
1121
+ # t1 = Chronic.parse('1st sunday in november', :now => Time.local(2007))
1122
+ # assert_equal Time.local(2007, 11, 4, 12), t1
1123
+
1124
+ # Chronic.debug = true
1125
+ #
1126
+ # t1 = Chronic.parse('1st monday in november', :now => Time.local(2007))
1127
+ # assert_equal Time.local(2007, 11, 5, 11), t1
1128
+ end
1129
+
1130
+ def test_now_changes
1131
+ t1 = Chronic.parse("now")
1132
+ sleep 0.1
1133
+ t2 = Chronic.parse("now")
1134
+ refute_equal t1, t2
1135
+ end
1136
+
1137
+ def test_noon
1138
+ t1 = Chronic.parse('2011-01-01 at noon', :ambiguous_time_range => :none)
1139
+ assert_equal Time.local(2011, 1, 1, 12, 0), t1
1140
+ end
1141
+
1142
+ def test_handle_rdn_rmn_sd
1143
+ time = parse_now("Thu Aug 10")
1144
+ assert_equal Time.local(2006, 8, 10, 12), time
1145
+
1146
+ time = parse_now("Thursday July 31")
1147
+ assert_equal Time.local(2006, 7, 31, 12), time
1148
+
1149
+ time = parse_now("Thursday December 31")
1150
+ assert_equal Time.local(2006, 12, 31, 12), time
1151
+ end
1152
+
1153
+ def test_handle_rdn_rmn_sd_rt
1154
+ time = parse_now("Thu Aug 10 4pm")
1155
+ assert_equal Time.local(2006, 8, 10, 16), time
1156
+
1157
+ time = parse_now("Thu Aug 10 at 4pm")
1158
+ assert_equal Time.local(2006, 8, 10, 16), time
1159
+ end
1160
+
1161
+ def test_handle_rdn_rmn_od_rt
1162
+ time = parse_now("Thu Aug 10th at 4pm")
1163
+ assert_equal Time.local(2006, 8, 10, 16), time
1164
+ end
1165
+
1166
+ def test_handle_rdn_od_rt
1167
+ time = parse_now("Thu 17th at 4pm")
1168
+ assert_equal Time.local(2006, 8, 17, 16), time
1169
+
1170
+ time = parse_now("Thu 16th at 4pm")
1171
+ assert_equal Time.local(2006, 8, 16, 16), time
1172
+
1173
+ time = parse_now("Thu 1st at 4pm")
1174
+ assert_equal Time.local(2006, 9, 1, 16), time
1175
+
1176
+ time = parse_now("Thu 1st at 4pm", :context => :past)
1177
+ assert_equal Time.local(2006, 8, 1, 16), time
1178
+ end
1179
+
1180
+ def test_handle_rdn_od
1181
+ time = parse_now("Thu 17th")
1182
+ assert_equal Time.local(2006, 8, 17, 12), time
1183
+ end
1184
+
1185
+ def test_handle_rdn_rmn_sd_sy
1186
+ time = parse_now("Thu Aug 10 2006")
1187
+ assert_equal Time.local(2006, 8, 10, 12), time
1188
+
1189
+ time = parse_now("Thursday July 31 2006")
1190
+ assert_equal Time.local(2006, 7, 31, 12), time
1191
+
1192
+ time = parse_now("Thursday December 31 2006")
1193
+ assert_equal Time.local(2006, 12, 31, 12), time
1194
+
1195
+ time = parse_now("Thursday December 30 2006")
1196
+ assert_equal Time.local(2006, 12, 30, 12), time
1197
+ end
1198
+
1199
+ def test_handle_rdn_rmn_od
1200
+ time = parse_now("Thu Aug 10th")
1201
+ assert_equal Time.local(2006, 8, 10, 12), time
1202
+
1203
+ time = parse_now("Thursday July 31st")
1204
+ assert_equal Time.local(2006, 7, 31, 12), time
1205
+
1206
+ time = parse_now("Thursday December 31st")
1207
+ assert_equal Time.local(2006, 12, 31, 12), time
1208
+ end
1209
+
1210
+ def test_handle_rdn_rmn_od_sy
1211
+ time = parse_now("Thu Aug 10th 2005")
1212
+ assert_equal Time.local(2005, 8, 10, 12), time
1213
+
1214
+ time = parse_now("Thursday July 31st 2005")
1215
+ assert_equal Time.local(2005, 7, 31, 12), time
1216
+
1217
+ time = parse_now("Thursday December 31st 2005")
1218
+ assert_equal Time.local(2005, 12, 31, 12), time
1219
+
1220
+ time = parse_now("Thursday December 30th 2005")
1221
+ assert_equal Time.local(2005, 12, 30, 12), time
1222
+ end
1223
+
1224
+ def test_normalizing_day_portions
1225
+ assert_equal pre_normalize("8:00 pm February 11"), pre_normalize("8:00 p.m. February 11")
1226
+ end
1227
+
588
1228
  private
589
1229
  def parse_now(string, options={})
590
1230
  Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
591
1231
  end
592
- end
1232
+ def pre_normalize(s)
1233
+ Chronic::Parser.new.pre_normalize s
1234
+ end
1235
+ end