chronic_2011 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/.gitignore +6 -0
  2. data/HISTORY.md +4 -0
  3. data/LICENSE +21 -0
  4. data/README.md +180 -0
  5. data/Rakefile +46 -0
  6. data/chronic.gemspec +18 -0
  7. data/lib/chronic.rb +117 -0
  8. data/lib/chronic/chronic.rb +346 -0
  9. data/lib/chronic/grabber.rb +33 -0
  10. data/lib/chronic/handler.rb +88 -0
  11. data/lib/chronic/handlers.rb +553 -0
  12. data/lib/chronic/mini_date.rb +38 -0
  13. data/lib/chronic/numerizer.rb +121 -0
  14. data/lib/chronic/ordinal.rb +47 -0
  15. data/lib/chronic/pointer.rb +32 -0
  16. data/lib/chronic/repeater.rb +142 -0
  17. data/lib/chronic/repeaters/repeater_day.rb +53 -0
  18. data/lib/chronic/repeaters/repeater_day_name.rb +52 -0
  19. data/lib/chronic/repeaters/repeater_day_portion.rb +108 -0
  20. data/lib/chronic/repeaters/repeater_fortnight.rb +71 -0
  21. data/lib/chronic/repeaters/repeater_hour.rb +58 -0
  22. data/lib/chronic/repeaters/repeater_minute.rb +58 -0
  23. data/lib/chronic/repeaters/repeater_month.rb +79 -0
  24. data/lib/chronic/repeaters/repeater_month_name.rb +94 -0
  25. data/lib/chronic/repeaters/repeater_season.rb +109 -0
  26. data/lib/chronic/repeaters/repeater_season_name.rb +43 -0
  27. data/lib/chronic/repeaters/repeater_second.rb +42 -0
  28. data/lib/chronic/repeaters/repeater_time.rb +128 -0
  29. data/lib/chronic/repeaters/repeater_week.rb +74 -0
  30. data/lib/chronic/repeaters/repeater_weekday.rb +85 -0
  31. data/lib/chronic/repeaters/repeater_weekend.rb +66 -0
  32. data/lib/chronic/repeaters/repeater_year.rb +77 -0
  33. data/lib/chronic/scalar.rb +116 -0
  34. data/lib/chronic/season.rb +26 -0
  35. data/lib/chronic/separator.rb +94 -0
  36. data/lib/chronic/span.rb +31 -0
  37. data/lib/chronic/tag.rb +36 -0
  38. data/lib/chronic/time_zone.rb +32 -0
  39. data/lib/chronic/token.rb +47 -0
  40. data/test/helper.rb +12 -0
  41. data/test/test_chronic.rb +148 -0
  42. data/test/test_daylight_savings.rb +118 -0
  43. data/test/test_handler.rb +104 -0
  44. data/test/test_mini_date.rb +32 -0
  45. data/test/test_numerizer.rb +72 -0
  46. data/test/test_parsing.rb +977 -0
  47. data/test/test_repeater_day_name.rb +51 -0
  48. data/test/test_repeater_day_portion.rb +254 -0
  49. data/test/test_repeater_fortnight.rb +62 -0
  50. data/test/test_repeater_hour.rb +68 -0
  51. data/test/test_repeater_minute.rb +34 -0
  52. data/test/test_repeater_month.rb +50 -0
  53. data/test/test_repeater_month_name.rb +56 -0
  54. data/test/test_repeater_season.rb +40 -0
  55. data/test/test_repeater_time.rb +70 -0
  56. data/test/test_repeater_week.rb +62 -0
  57. data/test/test_repeater_weekday.rb +55 -0
  58. data/test/test_repeater_weekend.rb +74 -0
  59. data/test/test_repeater_year.rb +69 -0
  60. data/test/test_span.rb +23 -0
  61. data/test/test_token.rb +25 -0
  62. metadata +156 -0
@@ -0,0 +1,32 @@
1
+ require 'helper'
2
+
3
+ class TestMiniDate < TestCase
4
+ def test_valid_month
5
+ assert_raises(ArgumentError){ Chronic::MiniDate.new(0,12) }
6
+ assert_raises(ArgumentError){ Chronic::MiniDate.new(13,1) }
7
+ end
8
+
9
+ def test_is_between
10
+ m=Chronic::MiniDate.new(3,2)
11
+ assert m.is_between?(Chronic::MiniDate.new(2,4), Chronic::MiniDate.new(4,7))
12
+ assert !m.is_between?(Chronic::MiniDate.new(1,5), Chronic::MiniDate.new(2,7))
13
+
14
+ #There was a hang if date tested is in december and outside the testing range
15
+ m=Chronic::MiniDate.new(12,24)
16
+ assert !m.is_between?(Chronic::MiniDate.new(10,1), Chronic::MiniDate.new(12,21))
17
+ end
18
+
19
+ def test_is_between_short_range
20
+ m=Chronic::MiniDate.new(5,10)
21
+ assert m.is_between?(Chronic::MiniDate.new(5,3), Chronic::MiniDate.new(5,12))
22
+ assert !m.is_between?(Chronic::MiniDate.new(5,11), Chronic::MiniDate.new(5,15))
23
+ end
24
+
25
+ def test_is_between_wrapping_range
26
+ m=Chronic::MiniDate.new(1,1)
27
+ assert m.is_between?(Chronic::MiniDate.new(11,11), Chronic::MiniDate.new(2,2))
28
+ m=Chronic::MiniDate.new(12,12)
29
+ assert m.is_between?(Chronic::MiniDate.new(11,11), Chronic::MiniDate.new(1,5))
30
+ end
31
+
32
+ end
@@ -0,0 +1,72 @@
1
+ require 'helper'
2
+
3
+ class ParseNumbersTest < TestCase
4
+
5
+ def test_straight_parsing
6
+ strings = {
7
+ 'one' => 1,
8
+ 'five' => 5,
9
+ 'ten' => 10,
10
+ 'eleven' => 11,
11
+ 'twelve' => 12,
12
+ 'thirteen' => 13,
13
+ 'fourteen' => 14,
14
+ 'fifteen' => 15,
15
+ 'sixteen' => 16,
16
+ 'seventeen' => 17,
17
+ 'eighteen' => 18,
18
+ 'nineteen' => 19,
19
+ 'twenty' => 20,
20
+ 'twenty seven' => 27,
21
+ 'thirty-one' => 31,
22
+ 'thirty-seven' => 37,
23
+ 'thirty seven' => 37,
24
+ 'fifty nine' => 59,
25
+ 'forty two' => 42,
26
+ 'fourty two' => 42,
27
+ # 'a hundred' => 100,
28
+ 'one hundred' => 100,
29
+ 'one hundred and fifty' => 150,
30
+ # 'one fifty' => 150,
31
+ 'two-hundred' => 200,
32
+ '5 hundred' => 500,
33
+ 'nine hundred and ninety nine' => 999,
34
+ 'one thousand' => 1000,
35
+ 'twelve hundred' => 1200,
36
+ 'one thousand two hundred' => 1_200,
37
+ 'seventeen thousand' => 17_000,
38
+ 'twentyone-thousand-four-hundred-and-seventy-three' => 21_473,
39
+ 'seventy four thousand and two' => 74_002,
40
+ 'ninety nine thousand nine hundred ninety nine' => 99_999,
41
+ '100 thousand' => 100_000,
42
+ 'two hundred fifty thousand' => 250_000,
43
+ 'one million' => 1_000_000,
44
+ 'one million two hundred fifty thousand and seven' => 1_250_007,
45
+ 'one billion' => 1_000_000_000,
46
+ 'one billion and one' => 1_000_000_001}
47
+
48
+ strings.each do |key, val|
49
+ assert_equal val, Chronic::Numerizer.numerize(key).to_i
50
+ end
51
+ end
52
+
53
+ def test_ordinal_strings
54
+ {
55
+ 'first' => '1st',
56
+ 'second' => 'second',
57
+ 'second day' => '2nd day',
58
+ 'second of may' => '2nd of may',
59
+ 'fifth' => '5th',
60
+ 'twenty third' => '23rd',
61
+ 'first day month two' => '1st day month 2'
62
+ }.each do |key, val|
63
+ # Use pre_normalize here instead of Numerizer directly because
64
+ # pre_normalize deals with parsing 'second' appropriately
65
+ assert_equal val, Chronic.pre_normalize(key)
66
+ end
67
+ end
68
+
69
+ def test_edges
70
+ assert_equal "27 Oct 2006 7:30am", Chronic::Numerizer.numerize("27 Oct 2006 7:30am")
71
+ end
72
+ end
@@ -0,0 +1,977 @@
1
+ require 'helper'
2
+
3
+ class TestParsing < TestCase
4
+ # Wed Aug 16 14:00:00 UTC 2006
5
+ TIME_2006_08_16_14_00_00 = Time.local(2006, 8, 16, 14, 0, 0, 0)
6
+
7
+ def setup
8
+ @time_2006_08_16_14_00_00 = TIME_2006_08_16_14_00_00
9
+ end
10
+
11
+ def test_handle_rmn_sd
12
+ time = parse_now("aug 3")
13
+ assert_equal Time.local(2006, 8, 3, 12), time
14
+
15
+ time = parse_now("aug 3", :context => :past)
16
+ assert_equal Time.local(2006, 8, 3, 12), time
17
+
18
+ time = parse_now("aug 20")
19
+ assert_equal Time.local(2006, 8, 20, 12), time
20
+
21
+ time = parse_now("aug 20", :context => :future)
22
+ assert_equal Time.local(2006, 8, 20, 12), time
23
+
24
+ time = parse_now("may 27")
25
+ assert_equal Time.local(2007, 5, 27, 12), time
26
+
27
+ time = parse_now("may 28", :context => :past)
28
+ assert_equal Time.local(2006, 5, 28, 12), time
29
+
30
+ time = parse_now("may 28 5pm", :context => :past)
31
+ assert_equal Time.local(2006, 5, 28, 17), time
32
+
33
+ time = parse_now("may 28 at 5pm", :context => :past)
34
+ assert_equal Time.local(2006, 5, 28, 17), time
35
+
36
+ time = parse_now("may 28 at 5:32.19pm", :context => :past)
37
+ assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
38
+ end
39
+
40
+ def test_handle_rmn_sd_on
41
+ time = parse_now("5pm on may 28")
42
+ assert_equal Time.local(2007, 5, 28, 17), time
43
+
44
+ time = parse_now("5pm may 28")
45
+ assert_equal Time.local(2007, 5, 28, 17), time
46
+
47
+ time = parse_now("5 on may 28", :ambiguous_time_range => :none)
48
+ assert_equal Time.local(2007, 5, 28, 05), time
49
+ end
50
+
51
+ def test_handle_rmn_od
52
+ time = parse_now("may 27th")
53
+ assert_equal Time.local(2007, 5, 27, 12), time
54
+
55
+ time = parse_now("may 27th", :context => :past)
56
+ assert_equal Time.local(2006, 5, 27, 12), time
57
+
58
+ time = parse_now("may 27th 5:00 pm", :context => :past)
59
+ assert_equal Time.local(2006, 5, 27, 17), time
60
+
61
+ time = parse_now("may 27th at 5pm", :context => :past)
62
+ assert_equal Time.local(2006, 5, 27, 17), time
63
+
64
+ time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
65
+ assert_equal Time.local(2007, 5, 27, 5), time
66
+ end
67
+
68
+ def test_handle_od_rmn
69
+ time = parse_now("22nd February")
70
+ assert_equal Time.local(2007, 2, 22, 12), time
71
+
72
+ time = parse_now("31st of may at 6:30pm")
73
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
74
+
75
+ time = parse_now("11th december 8am")
76
+ assert_equal Time.local(2006, 12, 11, 8), time
77
+ end
78
+
79
+ def test_handle_sy_rmn_od
80
+ time = parse_now("2009 May 22nd")
81
+ assert_equal Time.local(2009, 05, 22, 12), time
82
+ end
83
+
84
+ def test_handle_sd_rmn
85
+ time = parse_now("22 February")
86
+ assert_equal Time.local(2007, 2, 22, 12), time
87
+
88
+ time = parse_now("31 of may at 6:30pm")
89
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
90
+
91
+ time = parse_now("11 december 8am")
92
+ assert_equal Time.local(2006, 12, 11, 8), time
93
+ end
94
+
95
+ def test_handle_rmn_od_on
96
+ time = parse_now("5:00 pm may 27th", :context => :past)
97
+ assert_equal Time.local(2006, 5, 27, 17), time
98
+
99
+ time = parse_now("05:00 pm may 27th", :context => :past)
100
+ assert_equal Time.local(2006, 5, 27, 17), time
101
+
102
+ time = parse_now("5pm on may 27th", :context => :past)
103
+ assert_equal Time.local(2006, 5, 27, 17), time
104
+
105
+ time = parse_now("5 on may 27th", :ambiguous_time_range => :none)
106
+ assert_equal Time.local(2007, 5, 27, 5), time
107
+ end
108
+
109
+ def test_handle_rmn_sy
110
+ time = parse_now("may 97")
111
+ assert_equal Time.local(1997, 5, 16, 12), time
112
+
113
+ time = parse_now("may 33", :ambiguous_year_future_bias => 10)
114
+ assert_equal Time.local(2033, 5, 16, 12), time
115
+
116
+ time = parse_now("may 32")
117
+ assert_equal Time.local(2032, 5, 16, 12, 0, 0), time
118
+ end
119
+
120
+ def test_handle_rdn_rmn_sd_t_tz_sy
121
+ time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
122
+ assert_equal 1175558400, time.to_i
123
+ end
124
+
125
+ def test_handle_sy_sm_sd_t_tz
126
+ time = parse_now("2011-07-03 22:11:35 +0100")
127
+ assert_equal 1309727495, time.to_i
128
+
129
+ time = parse_now("2011-07-03 22:11:35 +01:00")
130
+ assert_equal 1309727495, time.to_i
131
+
132
+ time = parse_now("2011-07-03 21:11:35 UTC")
133
+ assert_equal 1309727495, time.to_i
134
+ end
135
+
136
+ def test_handle_rmn_sd_sy
137
+ time = parse_now("November 18, 2010")
138
+ assert_equal Time.local(2010, 11, 18, 12), time
139
+
140
+ time = parse_now("Jan 1,2010")
141
+ assert_equal Time.local(2010, 1, 1, 12), time
142
+
143
+ time = parse_now("February 14, 2004")
144
+ assert_equal Time.local(2004, 2, 14, 12), time
145
+
146
+ time = parse_now("jan 3 2010")
147
+ assert_equal Time.local(2010, 1, 3, 12), time
148
+
149
+ time = parse_now("jan 3 2010 midnight")
150
+ assert_equal Time.local(2010, 1, 4, 0), time
151
+
152
+ time = parse_now("jan 3 2010 at midnight")
153
+ assert_equal Time.local(2010, 1, 4, 0), time
154
+
155
+ time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
156
+ assert_equal Time.local(2010, 1, 3, 4), time
157
+
158
+ time = parse_now("may 27, 1979")
159
+ assert_equal Time.local(1979, 5, 27, 12), time
160
+
161
+ time = parse_now("may 27 79")
162
+ assert_equal Time.local(1979, 5, 27, 12), time
163
+
164
+ time = parse_now("may 27 79 4:30")
165
+ assert_equal Time.local(1979, 5, 27, 16, 30), time
166
+
167
+ time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
168
+ assert_equal Time.local(1979, 5, 27, 4, 30), time
169
+
170
+ time = parse_now("may 27 32")
171
+ assert_equal Time.local(2032, 5, 27, 12, 0, 0), time
172
+ end
173
+
174
+ def test_handle_rmn_od_sy
175
+ time = parse_now("may 1st 01")
176
+ assert_equal Time.local(2001, 5, 1, 12), time
177
+
178
+ time = parse_now("November 18th 2010")
179
+ assert_equal Time.local(2010, 11, 18, 12), time
180
+
181
+ time = parse_now("November 18th, 2010")
182
+ assert_equal Time.local(2010, 11, 18, 12), time
183
+
184
+ time = parse_now("November 18th 2010 midnight")
185
+ assert_equal Time.local(2010, 11, 19, 0), time
186
+
187
+ time = parse_now("November 18th 2010 at midnight")
188
+ assert_equal Time.local(2010, 11, 19, 0), time
189
+
190
+ time = parse_now("November 18th 2010 at 4")
191
+ assert_equal Time.local(2010, 11, 18, 16), time
192
+
193
+ time = parse_now("November 18th 2010 at 4", :ambiguous_time_range => :none)
194
+ assert_equal Time.local(2010, 11, 18, 4), time
195
+
196
+ time = parse_now("March 30th, 1979")
197
+ assert_equal Time.local(1979, 3, 30, 12), time
198
+
199
+ time = parse_now("March 30th 79")
200
+ assert_equal Time.local(1979, 3, 30, 12), time
201
+
202
+ time = parse_now("March 30th 79 4:30")
203
+ assert_equal Time.local(1979, 3, 30, 16, 30), time
204
+
205
+ time = parse_now("March 30th 79 at 4:30", :ambiguous_time_range => :none)
206
+ assert_equal Time.local(1979, 3, 30, 4, 30), time
207
+ end
208
+
209
+ def test_handle_od_rmn_sy
210
+ time = parse_now("22nd February 2012")
211
+ assert_equal Time.local(2012, 2, 22, 12), time
212
+
213
+ time = parse_now("11th december 79")
214
+ assert_equal Time.local(1979, 12, 11, 12), time
215
+ end
216
+
217
+ def test_handle_sd_rmn_sy
218
+ time = parse_now("3 jan 2010")
219
+ assert_equal Time.local(2010, 1, 3, 12), time
220
+
221
+ time = parse_now("3 jan 2010 4pm")
222
+ assert_equal Time.local(2010, 1, 3, 16), time
223
+
224
+ time = parse_now("27 Oct 2006 7:30pm")
225
+ assert_equal Time.local(2006, 10, 27, 19, 30), time
226
+ end
227
+
228
+ def test_handle_sm_sd_sy
229
+ time = parse_now("5/27/1979")
230
+ assert_equal Time.local(1979, 5, 27, 12), time
231
+
232
+ time = parse_now("5/27/1979 4am")
233
+ assert_equal Time.local(1979, 5, 27, 4), time
234
+
235
+ time = parse_now("7/12/11")
236
+ assert_equal Time.local(2011, 7, 12, 12), time
237
+
238
+ time = parse_now("7/12/11", :endian_precedence => :little)
239
+ assert_equal Time.local(2011, 12, 7, 12), time
240
+
241
+ time = parse_now("9/19/2011 6:05:57 PM")
242
+ assert_equal Time.local(2011, 9, 19, 18, 05, 57), time
243
+
244
+ # month day overflows
245
+ time = parse_now("30/2/2000")
246
+ assert_nil time
247
+ end
248
+
249
+ def test_handle_sd_sm_sy
250
+ time = parse_now("27/5/1979")
251
+ assert_equal Time.local(1979, 5, 27, 12), time
252
+
253
+ time = parse_now("27/5/1979 @ 0700")
254
+ assert_equal Time.local(1979, 5, 27, 7), time
255
+ end
256
+
257
+ def test_handle_sy_sm_sd
258
+ time = parse_now("2000-1-1")
259
+ assert_equal Time.local(2000, 1, 1, 12), time
260
+
261
+ time = parse_now("2006-08-20")
262
+ assert_equal Time.local(2006, 8, 20, 12), time
263
+
264
+ time = parse_now("2006-08-20 7pm")
265
+ assert_equal Time.local(2006, 8, 20, 19), time
266
+
267
+ time = parse_now("2006-08-20 03:00")
268
+ assert_equal Time.local(2006, 8, 20, 3), time
269
+
270
+ time = parse_now("2006-08-20 03:30:30")
271
+ assert_equal Time.local(2006, 8, 20, 3, 30, 30), time
272
+
273
+ time = parse_now("2006-08-20 15:30:30")
274
+ assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
275
+
276
+ time = parse_now("2006-08-20 15:30.30")
277
+ assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
278
+
279
+ time = parse_now("1902-08-20")
280
+ assert_equal Time.local(1902, 8, 20, 12, 0, 0), time
281
+ end
282
+
283
+ def test_handle_sm_sd
284
+ time = parse_now("05/06")
285
+ assert_equal Time.local(2006, 5, 6, 12), time
286
+
287
+ time = parse_now("05/06", :endian_precedence => [:little, :medium])
288
+ assert_equal Time.local(2006, 6, 5, 12), time
289
+
290
+ time = parse_now("13/01")
291
+ assert_nil time
292
+ end
293
+
294
+ # def test_handle_sm_sy
295
+ # time = parse_now("05/06")
296
+ # assert_equal Time.local(2006, 5, 16, 12), time
297
+ #
298
+ # time = parse_now("12/06")
299
+ # assert_equal Time.local(2006, 12, 16, 12), time
300
+ #
301
+ # time = parse_now("13/06")
302
+ # assert_equal nil, time
303
+ # end
304
+
305
+ def test_handle_r
306
+ end
307
+
308
+ def test_handle_r_g_r
309
+ end
310
+
311
+ def test_handle_srp
312
+ end
313
+
314
+ def test_handle_s_r_p
315
+ end
316
+
317
+ def test_handle_p_s_r
318
+ end
319
+
320
+ def test_handle_s_r_p_a
321
+ end
322
+
323
+ def test_handle_orr
324
+ time = parse_now("5th tuesday in january")
325
+ assert_equal Time.local(2007, 01, 30, 12), time
326
+
327
+ time = parse_now("5th tuesday in february")
328
+ assert_equal nil, time
329
+
330
+ %W(jan feb march april may june july aug sep oct nov dec).each_with_index do |month, index|
331
+ time = parse_now("5th tuesday in #{month}")
332
+
333
+ if time then
334
+ assert_equal time.month, index+1
335
+ end
336
+ end
337
+ end
338
+
339
+ def test_handle_o_r_s_r
340
+ time = parse_now("3rd wednesday in november")
341
+ assert_equal Time.local(2006, 11, 15, 12), time
342
+
343
+ time = parse_now("10th wednesday in november")
344
+ assert_equal nil, time
345
+
346
+ # time = parse_now("3rd wednesday in 2007")
347
+ # assert_equal Time.local(2007, 1, 20, 12), time
348
+ end
349
+
350
+ def test_handle_o_r_g_r
351
+ time = parse_now("3rd month next year", :guess => false)
352
+ assert_equal Time.local(2007, 3), time.begin
353
+
354
+ time = parse_now("3rd month next year", :guess => false)
355
+ assert_equal Time.local(2007, 3, 1), time.begin
356
+
357
+ time = parse_now("3rd thursday this september")
358
+ assert_equal Time.local(2006, 9, 21, 12), time
359
+
360
+ now = Time.parse("1/10/2010")
361
+ time = parse_now("3rd thursday this november", :now => now)
362
+ assert_equal Time.local(2010, 11, 18, 12), time
363
+
364
+ time = parse_now("4th day last week")
365
+ assert_equal Time.local(2006, 8, 9, 12), time
366
+ end
367
+
368
+ # end of testing handlers
369
+
370
+ def test_parse_guess_r
371
+ time = parse_now("friday")
372
+ assert_equal Time.local(2006, 8, 18, 12), time
373
+
374
+ time = parse_now("tue")
375
+ assert_equal Time.local(2006, 8, 22, 12), time
376
+
377
+ time = parse_now("5")
378
+ assert_equal Time.local(2006, 8, 16, 17), time
379
+
380
+ time = Chronic.parse("5", :now => Time.local(2006, 8, 16, 3, 0, 0, 0), :ambiguous_time_range => :none)
381
+ assert_equal Time.local(2006, 8, 16, 5), time
382
+
383
+ time = parse_now("13:00")
384
+ assert_equal Time.local(2006, 8, 17, 13), time
385
+
386
+ time = parse_now("13:45")
387
+ assert_equal Time.local(2006, 8, 17, 13, 45), time
388
+
389
+ time = parse_now("1:01pm")
390
+ assert_equal Time.local(2006, 8, 16, 13, 01), time
391
+
392
+ time = parse_now("2:01pm")
393
+ assert_equal Time.local(2006, 8, 16, 14, 01), time
394
+
395
+ time = parse_now("november")
396
+ assert_equal Time.local(2006, 11, 16), time
397
+ end
398
+
399
+ def test_parse_guess_rr
400
+ time = parse_now("friday 13:00")
401
+ assert_equal Time.local(2006, 8, 18, 13), time
402
+
403
+ time = parse_now("monday 4:00")
404
+ assert_equal Time.local(2006, 8, 21, 16), time
405
+
406
+ time = parse_now("sat 4:00", :ambiguous_time_range => :none)
407
+ assert_equal Time.local(2006, 8, 19, 4), time
408
+
409
+ time = parse_now("sunday 4:20", :ambiguous_time_range => :none)
410
+ assert_equal Time.local(2006, 8, 20, 4, 20), time
411
+
412
+ time = parse_now("4 pm")
413
+ assert_equal Time.local(2006, 8, 16, 16), time
414
+
415
+ time = parse_now("4 am", :ambiguous_time_range => :none)
416
+ assert_equal Time.local(2006, 8, 16, 4), time
417
+
418
+ time = parse_now("12 pm")
419
+ assert_equal Time.local(2006, 8, 16, 12), time
420
+
421
+ time = parse_now("12:01 pm")
422
+ assert_equal Time.local(2006, 8, 16, 12, 1), time
423
+
424
+ time = parse_now("12:01 am")
425
+ assert_equal Time.local(2006, 8, 16, 0, 1), time
426
+
427
+ time = parse_now("12 am")
428
+ assert_equal Time.local(2006, 8, 16), time
429
+
430
+ time = parse_now("4:00 in the morning")
431
+ assert_equal Time.local(2006, 8, 16, 4), time
432
+
433
+ time = parse_now("0:10")
434
+ assert_equal Time.local(2006, 8, 17, 0, 10), time
435
+
436
+ time = parse_now("november 4")
437
+ assert_equal Time.local(2006, 11, 4, 12), time
438
+
439
+ time = parse_now("aug 24")
440
+ assert_equal Time.local(2006, 8, 24, 12), time
441
+ end
442
+
443
+ def test_parse_guess_rrr
444
+ time = parse_now("friday 1 pm")
445
+ assert_equal Time.local(2006, 8, 18, 13), time
446
+
447
+ time = parse_now("friday 11 at night")
448
+ assert_equal Time.local(2006, 8, 18, 23), time
449
+
450
+ time = parse_now("friday 11 in the evening")
451
+ assert_equal Time.local(2006, 8, 18, 23), time
452
+
453
+ time = parse_now("sunday 6am")
454
+ assert_equal Time.local(2006, 8, 20, 6), time
455
+
456
+ time = parse_now("friday evening at 7")
457
+ assert_equal Time.local(2006, 8, 18, 19), time
458
+ end
459
+
460
+ def test_parse_guess_gr
461
+ # year
462
+
463
+ time = parse_now("this year", :guess => false)
464
+ assert_equal Time.local(2006, 8, 17), time.begin
465
+
466
+ time = parse_now("this year", :context => :past, :guess => false)
467
+ assert_equal Time.local(2006, 1, 1), time.begin
468
+
469
+ # month
470
+
471
+ time = parse_now("this month")
472
+ assert_equal Time.local(2006, 8, 24, 12), time
473
+
474
+ time = parse_now("this month", :context => :past)
475
+ assert_equal Time.local(2006, 8, 8, 12), time
476
+
477
+ time = Chronic.parse("next month", :now => Time.local(2006, 11, 15))
478
+ assert_equal Time.local(2006, 12, 16, 12), time
479
+
480
+ # month name
481
+
482
+ time = parse_now("last november")
483
+ assert_equal Time.local(2005, 11, 16), time
484
+
485
+ # fortnight
486
+
487
+ time = parse_now("this fortnight")
488
+ assert_equal Time.local(2006, 8, 21, 19, 30), time
489
+
490
+ time = parse_now("this fortnight", :context => :past)
491
+ assert_equal Time.local(2006, 8, 14, 19), time
492
+
493
+ # week
494
+
495
+ time = parse_now("this week")
496
+ assert_equal Time.local(2006, 8, 18, 7, 30), time
497
+
498
+ time = parse_now("this week", :context => :past)
499
+ assert_equal Time.local(2006, 8, 14, 19), time
500
+
501
+ # weekend
502
+
503
+ time = parse_now("this weekend")
504
+ assert_equal Time.local(2006, 8, 20), time
505
+
506
+ time = parse_now("this weekend", :context => :past)
507
+ assert_equal Time.local(2006, 8, 13), time
508
+
509
+ time = parse_now("last weekend")
510
+ assert_equal Time.local(2006, 8, 13), time
511
+
512
+ # day
513
+
514
+ time = parse_now("this day")
515
+ assert_equal Time.local(2006, 8, 16, 19), time
516
+
517
+ time = parse_now("this day", :context => :past)
518
+ assert_equal Time.local(2006, 8, 16, 7), time
519
+
520
+ time = parse_now("today")
521
+ assert_equal Time.local(2006, 8, 16, 19), time
522
+
523
+ time = parse_now("yesterday")
524
+ assert_equal Time.local(2006, 8, 15, 12), time
525
+
526
+ now = Time.parse("2011-05-27 23:10") # after 11pm
527
+ time = parse_now("yesterday", :now => now)
528
+ assert_equal Time.local(2011, 05, 26, 12), time
529
+
530
+ time = parse_now("tomorrow")
531
+ assert_equal Time.local(2006, 8, 17, 12), time
532
+
533
+ # day name
534
+
535
+ time = parse_now("this tuesday")
536
+ assert_equal Time.local(2006, 8, 22, 12), time
537
+
538
+ time = parse_now("next tuesday")
539
+ assert_equal Time.local(2006, 8, 22, 12), time
540
+
541
+ time = parse_now("last tuesday")
542
+ assert_equal Time.local(2006, 8, 15, 12), time
543
+
544
+ time = parse_now("this wed")
545
+ assert_equal Time.local(2006, 8, 23, 12), time
546
+
547
+ time = parse_now("next wed")
548
+ assert_equal Time.local(2006, 8, 23, 12), time
549
+
550
+ time = parse_now("last wed")
551
+ assert_equal Time.local(2006, 8, 9, 12), time
552
+
553
+ monday = Time.local(2006, 8, 21, 12)
554
+ assert_equal monday, parse_now("mon")
555
+ assert_equal monday, parse_now("mun")
556
+
557
+ tuesday = Time.local(2006, 8, 22, 12)
558
+ assert_equal tuesday, parse_now("tue")
559
+ assert_equal tuesday, parse_now("tus")
560
+
561
+ wednesday = Time.local(2006, 8, 23, 12)
562
+ assert_equal wednesday, parse_now("wed")
563
+ assert_equal wednesday, parse_now("wenns")
564
+
565
+ thursday = Time.local(2006, 8, 17, 12)
566
+ assert_equal thursday, parse_now("thu")
567
+ assert_equal thursday, parse_now("thur")
568
+
569
+ friday = Time.local(2006, 8, 18, 12)
570
+ assert_equal friday, parse_now("fri")
571
+ assert_equal friday, parse_now("fry")
572
+
573
+ saturday = Time.local(2006, 8, 19, 12)
574
+ assert_equal saturday, parse_now("sat")
575
+ assert_equal saturday, parse_now("satterday")
576
+
577
+ sunday = Time.local(2006, 8, 20, 12)
578
+ assert_equal sunday, parse_now("sun")
579
+ assert_equal sunday, parse_now("sum")
580
+
581
+ # day portion
582
+
583
+ time = parse_now("this morning")
584
+ assert_equal Time.local(2006, 8, 16, 9), time
585
+
586
+ time = parse_now("tonight")
587
+ assert_equal Time.local(2006, 8, 16, 22), time
588
+
589
+ # minute
590
+
591
+ time = parse_now("next minute")
592
+ assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
593
+
594
+ # second
595
+
596
+ time = parse_now("this second")
597
+ assert_equal Time.local(2006, 8, 16, 14), time
598
+
599
+ time = parse_now("this second", :context => :past)
600
+ assert_equal Time.local(2006, 8, 16, 14), time
601
+
602
+ time = parse_now("next second")
603
+ assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
604
+
605
+ time = parse_now("last second")
606
+ assert_equal Time.local(2006, 8, 16, 13, 59, 59), time
607
+ end
608
+
609
+ def test_parse_guess_grr
610
+ time = parse_now("yesterday at 4:00")
611
+ assert_equal Time.local(2006, 8, 15, 16), time
612
+
613
+ time = parse_now("today at 9:00")
614
+ assert_equal Time.local(2006, 8, 16, 9), time
615
+
616
+ time = parse_now("today at 2100")
617
+ assert_equal Time.local(2006, 8, 16, 21), time
618
+
619
+ time = parse_now("this day at 0900")
620
+ assert_equal Time.local(2006, 8, 16, 9), time
621
+
622
+ time = parse_now("tomorrow at 0900")
623
+ assert_equal Time.local(2006, 8, 17, 9), time
624
+
625
+ time = parse_now("yesterday at 4:00", :ambiguous_time_range => :none)
626
+ assert_equal Time.local(2006, 8, 15, 4), time
627
+
628
+ time = parse_now("last friday at 4:00")
629
+ assert_equal Time.local(2006, 8, 11, 16), time
630
+
631
+ time = parse_now("next wed 4:00")
632
+ assert_equal Time.local(2006, 8, 23, 16), time
633
+
634
+ time = parse_now("yesterday afternoon")
635
+ assert_equal Time.local(2006, 8, 15, 15), time
636
+
637
+ time = parse_now("last week tuesday")
638
+ assert_equal Time.local(2006, 8, 8, 12), time
639
+
640
+ time = parse_now("tonight at 7")
641
+ assert_equal Time.local(2006, 8, 16, 19), time
642
+
643
+ time = parse_now("tonight 7")
644
+ assert_equal Time.local(2006, 8, 16, 19), time
645
+
646
+ time = parse_now("7 tonight")
647
+ assert_equal Time.local(2006, 8, 16, 19), time
648
+ end
649
+
650
+ def test_parse_guess_grrr
651
+ time = parse_now("today at 6:00pm")
652
+ assert_equal Time.local(2006, 8, 16, 18), time
653
+
654
+ time = parse_now("today at 6:00am")
655
+ assert_equal Time.local(2006, 8, 16, 6), time
656
+
657
+ time = parse_now("this day 1800")
658
+ assert_equal Time.local(2006, 8, 16, 18), time
659
+
660
+ time = parse_now("yesterday at 4:00pm")
661
+ assert_equal Time.local(2006, 8, 15, 16), time
662
+
663
+ time = parse_now("tomorrow evening at 7")
664
+ assert_equal Time.local(2006, 8, 17, 19), time
665
+
666
+ time = parse_now("tomorrow morning at 5:30")
667
+ assert_equal Time.local(2006, 8, 17, 5, 30), time
668
+
669
+ time = parse_now("next monday at 12:01 am")
670
+ assert_equal Time.local(2006, 8, 21, 00, 1), time
671
+
672
+ time = parse_now("next monday at 12:01 pm")
673
+ assert_equal Time.local(2006, 8, 21, 12, 1), time
674
+
675
+ # with context
676
+ time = parse_now("sunday at 8:15pm", :context => :past)
677
+ assert_equal Time.local(2006, 8, 13, 20, 15), time
678
+ end
679
+
680
+ def test_parse_guess_rgr
681
+ time = parse_now("afternoon yesterday")
682
+ assert_equal Time.local(2006, 8, 15, 15), time
683
+
684
+ time = parse_now("tuesday last week")
685
+ assert_equal Time.local(2006, 8, 8, 12), time
686
+ end
687
+
688
+ def test_parse_guess_s_r_p
689
+ # past
690
+
691
+ time = parse_now("3 years ago")
692
+ assert_equal Time.local(2003, 8, 16, 14), time
693
+
694
+ time = parse_now("1 month ago")
695
+ assert_equal Time.local(2006, 7, 16, 14), time
696
+
697
+ time = parse_now("1 fortnight ago")
698
+ assert_equal Time.local(2006, 8, 2, 14), time
699
+
700
+ time = parse_now("2 fortnights ago")
701
+ assert_equal Time.local(2006, 7, 19, 14), time
702
+
703
+ time = parse_now("3 weeks ago")
704
+ assert_equal Time.local(2006, 7, 26, 14), time
705
+
706
+ time = parse_now("2 weekends ago")
707
+ assert_equal Time.local(2006, 8, 5), time
708
+
709
+ time = parse_now("3 days ago")
710
+ assert_equal Time.local(2006, 8, 13, 14), time
711
+
712
+ #time = parse_now("1 monday ago")
713
+ #assert_equal Time.local(2006, 8, 14, 12), time
714
+
715
+ time = parse_now("5 mornings ago")
716
+ assert_equal Time.local(2006, 8, 12, 9), time
717
+
718
+ time = parse_now("7 hours ago")
719
+ assert_equal Time.local(2006, 8, 16, 7), time
720
+
721
+ time = parse_now("3 minutes ago")
722
+ assert_equal Time.local(2006, 8, 16, 13, 57), time
723
+
724
+ time = parse_now("20 seconds before now")
725
+ assert_equal Time.local(2006, 8, 16, 13, 59, 40), time
726
+
727
+ # future
728
+
729
+ time = parse_now("3 years from now")
730
+ assert_equal Time.local(2009, 8, 16, 14, 0, 0), time
731
+
732
+ time = parse_now("6 months hence")
733
+ assert_equal Time.local(2007, 2, 16, 14), time
734
+
735
+ time = parse_now("3 fortnights hence")
736
+ assert_equal Time.local(2006, 9, 27, 14), time
737
+
738
+ time = parse_now("1 week from now")
739
+ assert_equal Time.local(2006, 8, 23, 14, 0, 0), time
740
+
741
+ time = parse_now("1 weekend from now")
742
+ assert_equal Time.local(2006, 8, 19), time
743
+
744
+ time = parse_now("2 weekends from now")
745
+ assert_equal Time.local(2006, 8, 26), time
746
+
747
+ time = parse_now("1 day hence")
748
+ assert_equal Time.local(2006, 8, 17, 14), time
749
+
750
+ time = parse_now("5 mornings hence")
751
+ assert_equal Time.local(2006, 8, 21, 9), time
752
+
753
+ time = parse_now("1 hour from now")
754
+ assert_equal Time.local(2006, 8, 16, 15), time
755
+
756
+ time = parse_now("20 minutes hence")
757
+ assert_equal Time.local(2006, 8, 16, 14, 20), time
758
+
759
+ time = parse_now("20 seconds from now")
760
+ assert_equal Time.local(2006, 8, 16, 14, 0, 20), time
761
+
762
+ time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
763
+ assert_equal Time.local(2007, 1, 7, 23, 30), time
764
+ end
765
+
766
+ def test_parse_guess_p_s_r
767
+ time = parse_now("in 3 hours")
768
+ assert_equal Time.local(2006, 8, 16, 17), time
769
+ end
770
+
771
+ def test_parse_guess_s_r_p_a
772
+ # past
773
+
774
+ time = parse_now("3 years ago tomorrow")
775
+ assert_equal Time.local(2003, 8, 17, 12), time
776
+
777
+ time = parse_now("3 years ago this friday")
778
+ assert_equal Time.local(2003, 8, 18, 12), time
779
+
780
+ time = parse_now("3 months ago saturday at 5:00 pm")
781
+ assert_equal Time.local(2006, 5, 19, 17), time
782
+
783
+ time = parse_now("2 days from this second")
784
+ assert_equal Time.local(2006, 8, 18, 14), time
785
+
786
+ time = parse_now("7 hours before tomorrow at midnight")
787
+ assert_equal Time.local(2006, 8, 17, 17), time
788
+
789
+ # future
790
+ end
791
+
792
+ def test_parse_guess_o_r_g_r
793
+ time = parse_now("3rd month next year", :guess => false)
794
+ assert_equal Time.local(2007, 3), time.begin
795
+
796
+ time = parse_now("3rd month next year", :guess => false)
797
+ assert_equal Time.local(2007, 3, 1), time.begin
798
+
799
+ time = parse_now("3rd thursday this september")
800
+ assert_equal Time.local(2006, 9, 21, 12), time
801
+
802
+ now = Time.parse("1/10/2010")
803
+ time = parse_now("3rd thursday this november", :now => now)
804
+ assert_equal Time.local(2010, 11, 18, 12), time
805
+
806
+ time = parse_now("4th day last week")
807
+ assert_equal Time.local(2006, 8, 9, 12), time
808
+ end
809
+
810
+ def test_parse_guess_nonsense
811
+ time = parse_now("some stupid nonsense")
812
+ assert_equal nil, time
813
+
814
+ time = parse_now("Ham Sandwich")
815
+ assert_equal nil, time
816
+ end
817
+
818
+ def test_parse_span
819
+ span = parse_now("friday", :guess => false)
820
+ assert_equal Time.local(2006, 8, 18), span.begin
821
+ assert_equal Time.local(2006, 8, 19), span.end
822
+
823
+ span = parse_now("november", :guess => false)
824
+ assert_equal Time.local(2006, 11), span.begin
825
+ assert_equal Time.local(2006, 12), span.end
826
+
827
+ span = Chronic.parse("weekend" , :now => @time_2006_08_16_14_00_00, :guess => false)
828
+ assert_equal Time.local(2006, 8, 19), span.begin
829
+ assert_equal Time.local(2006, 8, 21), span.end
830
+ end
831
+
832
+ def test_parse_with_endian_precedence
833
+ date = '11/02/2007'
834
+
835
+ expect_for_middle_endian = Time.local(2007, 11, 2, 12)
836
+ expect_for_little_endian = Time.local(2007, 2, 11, 12)
837
+
838
+ # default precedence should be toward middle endianness
839
+ assert_equal expect_for_middle_endian, Chronic.parse(date)
840
+
841
+ assert_equal expect_for_middle_endian, Chronic.parse(date, :endian_precedence => [:middle, :little])
842
+
843
+ assert_equal expect_for_little_endian, Chronic.parse(date, :endian_precedence => [:little, :middle])
844
+ end
845
+
846
+ def test_parse_words
847
+ assert_equal parse_now("33 days from now"), parse_now("thirty-three days from now")
848
+ 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")
849
+ assert_equal parse_now("may 10th"), parse_now("may tenth")
850
+ end
851
+
852
+ def test_parse_only_complete_pointers
853
+ assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
854
+ assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
855
+ assert_equal parse_now("meeting today at 2pm"), @time_2006_08_16_14_00_00
856
+ end
857
+
858
+ def test_am_pm
859
+ assert_equal Time.local(2006, 8, 16), parse_now("8/16/2006 at 12am")
860
+ assert_equal Time.local(2006, 8, 16, 12), parse_now("8/16/2006 at 12pm")
861
+ end
862
+
863
+ def test_a_p
864
+ assert_equal Time.local(2006, 8, 16, 0, 15), parse_now("8/16/2006 at 12:15a")
865
+ assert_equal Time.local(2006, 8, 16, 18, 30), parse_now("8/16/2006 at 6:30p")
866
+ end
867
+
868
+ def test_argument_validation
869
+ assert_raises(ArgumentError) do
870
+ time = Chronic.parse("may 27", :foo => :bar)
871
+ end
872
+
873
+ assert_raises(ArgumentError) do
874
+ time = Chronic.parse("may 27", :context => :bar)
875
+ end
876
+ end
877
+
878
+ def test_seasons
879
+ t = parse_now("this spring", :guess => false)
880
+ assert_equal Time.local(2007, 3, 20), t.begin
881
+ assert_equal Time.local(2007, 6, 20), t.end
882
+
883
+ t = parse_now("this winter", :guess => false)
884
+ assert_equal Time.local(2006, 12, 22), t.begin
885
+ assert_equal Time.local(2007, 3, 19), t.end
886
+
887
+ t = parse_now("last spring", :guess => false)
888
+ assert_equal Time.local(2006, 3, 20), t.begin
889
+ assert_equal Time.local(2006, 6, 20), t.end
890
+
891
+ t = parse_now("last winter", :guess => false)
892
+ assert_equal Time.local(2005, 12, 22), t.begin
893
+ assert_equal Time.local(2006, 3, 19), t.end
894
+
895
+ t = parse_now("next spring", :guess => false)
896
+ assert_equal Time.local(2007, 3, 20), t.begin
897
+ assert_equal Time.local(2007, 6, 20), t.end
898
+ end
899
+
900
+ # regression
901
+
902
+ # def test_partial
903
+ # assert_equal '', parse_now("2 hours")
904
+ # end
905
+
906
+ def test_days_in_november
907
+ t1 = Chronic.parse('1st thursday in november', :now => Time.local(2007))
908
+ assert_equal Time.local(2007, 11, 1, 12), t1
909
+
910
+ t1 = Chronic.parse('1st friday in november', :now => Time.local(2007))
911
+ assert_equal Time.local(2007, 11, 2, 12), t1
912
+
913
+ t1 = Chronic.parse('1st saturday in november', :now => Time.local(2007))
914
+ assert_equal Time.local(2007, 11, 3, 12), t1
915
+
916
+ # t1 = Chronic.parse('1st sunday in november', :now => Time.local(2007))
917
+ # assert_equal Time.local(2007, 11, 4, 12), t1
918
+
919
+ # Chronic.debug = true
920
+ #
921
+ # t1 = Chronic.parse('1st monday in november', :now => Time.local(2007))
922
+ # assert_equal Time.local(2007, 11, 5, 11), t1
923
+ end
924
+
925
+ def test_now_changes
926
+ t1 = Chronic.parse("now")
927
+ sleep 0.1
928
+ t2 = Chronic.parse("now")
929
+ refute_equal t1, t2
930
+ end
931
+
932
+ def test_noon
933
+ t1 = Chronic.parse('2011-01-01 at noon', :ambiguous_time_range => :none)
934
+ assert_equal Time.local(2011, 1, 1, 12, 0), t1
935
+ end
936
+
937
+ def test_handle_rdn_rmn_sd
938
+ time = parse_now("Thu Aug 10")
939
+ assert_equal Time.local(2006, 8, 10, 12), time
940
+
941
+ time = parse_now("Thursday July 31")
942
+ assert_equal Time.local(2006, 7, 31, 12), time
943
+
944
+ time = parse_now("Thursday December 31")
945
+ assert_equal Time.local(2006, 12, 31, 12), time
946
+ end
947
+
948
+ def test_handle_rdn_rmn_sd_sy
949
+ time = parse_now("Thu Aug 10 2006")
950
+ assert_equal Time.local(2006, 8, 10, 12), time
951
+
952
+ time = parse_now("Thursday July 31 2006")
953
+ assert_equal Time.local(2006, 7, 31, 12), time
954
+
955
+ time = parse_now("Thursday December 31 2006")
956
+ assert_equal Time.local(2006, 12, 31, 12), time
957
+
958
+ time = parse_now("Thursday December 30 2006")
959
+ assert_equal Time.local(2006, 12, 30, 12), time
960
+ end
961
+
962
+ def test_handle_rdn_rmn_od
963
+ time = parse_now("Thu Aug 10th")
964
+ assert_equal Time.local(2006, 8, 10, 12), time
965
+
966
+ time = parse_now("Thursday July 31st")
967
+ assert_equal Time.local(2006, 7, 31, 12), time
968
+
969
+ time = parse_now("Thursday December 31st")
970
+ assert_equal Time.local(2006, 12, 31, 12), time
971
+ end
972
+
973
+ private
974
+ def parse_now(string, options={})
975
+ Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
976
+ end
977
+ end