chronic_2011 0.1.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 (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