OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / test / date / test_date_base.rb
1 require 'test/unit'
2 require 'date'
3
4 begin
5   require 'calendar'
6   include  Calendar
7 rescue LoadError
8 end
9
10 class TestDateBase < Test::Unit::TestCase
11
12   def setup
13     if defined?(Calendar)
14       @from ||= julian_day_number_from_absolute(absolute_from_julian(1, 1, 1601))
15       @to ||= julian_day_number_from_absolute(absolute_from_julian(12, 31, 2400))
16       @from4t ||= julian_day_number_from_absolute(absolute_from_julian(1, 1, 1970))
17       @to4t ||= julian_day_number_from_absolute(absolute_from_julian(12, 31, 2037))
18     end
19   end
20
21   def test__inf
22     assert_equal(0, Date::Infinity.new(-1) <=> Date::Infinity.new(-1))
23     assert_equal(-1, Date::Infinity.new(-1) <=> Date::Infinity.new(+1))
24     assert_equal(-1, Date::Infinity.new(-1) <=> 0)
25
26     assert_equal(1, Date::Infinity.new(+1) <=> Date::Infinity.new(-1))
27     assert_equal(0, Date::Infinity.new(+1) <=> Date::Infinity.new(+1))
28     assert_equal(1, Date::Infinity.new(+1) <=> 0)
29
30     assert_equal(1, 0 <=> Date::Infinity.new(-1))
31     assert_equal(-1, 0 <=> Date::Infinity.new(+1))
32     assert_equal(0, 0 <=> 0)
33
34     assert_equal(0, Date::ITALY <=> Date::ITALY)
35     assert_equal(-1, Date::ITALY <=> Date::ENGLAND)
36     assert_equal(-1, Date::ITALY <=> Date::JULIAN)
37     assert_equal(1, Date::ITALY <=> Date::GREGORIAN)
38
39     assert_equal(1, Date::ENGLAND <=> Date::ITALY)
40     assert_equal(0, Date::ENGLAND <=> Date::ENGLAND)
41     assert_equal(-1, Date::ENGLAND <=> Date::JULIAN)
42     assert_equal(1, Date::ENGLAND <=> Date::GREGORIAN)
43
44     assert_equal(1, Date::JULIAN <=> Date::ITALY)
45     assert_equal(1, Date::JULIAN <=> Date::ENGLAND)
46     assert_equal(0, Date::JULIAN <=> Date::JULIAN)
47     assert_equal(1, Date::JULIAN <=> Date::GREGORIAN)
48
49     assert_equal(-1, Date::GREGORIAN <=> Date::ITALY)
50     assert_equal(-1, Date::GREGORIAN <=> Date::ENGLAND)
51     assert_equal(-1, Date::GREGORIAN <=> Date::JULIAN)
52     assert_equal(0, Date::GREGORIAN <=> Date::GREGORIAN)
53   end
54
55   def test_ordinal__julian
56     unless defined?(Calendar)
57       return
58     end
59     for j in @from..@to
60       m, d, y = julian_from_absolute(absolute_from_julian_day_number(j))
61       j0 = julian_day_number_from_absolute(absolute_from_julian(12, 31, y - 1))
62       j2 = julian_day_number_from_absolute(absolute_from_julian(m, d, y))
63       assert_equal(j, j2)
64       oy, od = Date.__send__(:jd_to_ordinal, j, Date::JULIAN)
65       assert_equal(y, oy)
66       assert_equal(j2 - j0, od)
67       oj = Date.__send__(:ordinal_to_jd, oy, od, Date::JULIAN)
68       assert_equal(j, oj)
69     end
70   end
71
72   def test_ordinal__gregorian
73     unless defined?(Calendar)
74       return
75     end
76     for j in @from..@to
77       m, d, y = gregorian_from_absolute(absolute_from_julian_day_number(j))
78       j0 =
79         julian_day_number_from_absolute(absolute_from_gregorian(12, 31, y - 1))
80       j2 = julian_day_number_from_absolute(absolute_from_gregorian(m, d, y))
81       assert_equal(j, j2)
82       oy, od = Date.__send__(:jd_to_ordinal, j, Date::GREGORIAN)
83       assert_equal(y, oy)
84       assert_equal(j2 - j0, od)
85       oj = Date.__send__(:ordinal_to_jd, oy, od, Date::GREGORIAN)
86       assert_equal(j, oj)
87     end
88   end
89
90   def test_civil__julian
91     unless defined?(Calendar)
92       return
93     end
94     for j in @from..@to
95       m, d, y = julian_from_absolute(absolute_from_julian_day_number(j))
96       j2 = julian_day_number_from_absolute(absolute_from_julian(m, d, y))
97       assert_equal(j2, j)
98       cy, cm, cd = Date.__send__(:jd_to_civil, j, Date::JULIAN)
99       assert_equal(y, cy)
100       assert_equal(m, cm)
101       assert_equal(d, cd)
102       cj = Date.__send__(:civil_to_jd, cy, cm, cd, Date::JULIAN)
103       assert_equal(j, cj)
104     end
105   end
106
107   def test_civil__gregorian
108     unless defined?(Calendar)
109       return
110     end
111     for j in @from..@to
112       m, d, y = gregorian_from_absolute(absolute_from_julian_day_number(j))
113       j2 = julian_day_number_from_absolute(absolute_from_gregorian(m, d, y))
114       assert_equal(j2, j)
115       cy, cm, cd = Date.__send__(:jd_to_civil, j, Date::GREGORIAN)
116       assert_equal(y, cy)
117       assert_equal(m, cm)
118       assert_equal(d, cd)
119       cj = Date.__send__(:civil_to_jd, cy, cm, cd, Date::GREGORIAN)
120       assert_equal(j, cj)
121     end
122   end
123
124   def test_commercial__gregorian
125     unless defined?(Calendar)
126       return
127     end
128     for j in @from..@to
129       w, d, y = iso_from_absolute(absolute_from_julian_day_number(j))
130       j2 = julian_day_number_from_absolute(absolute_from_iso(w, d, y))
131       assert_equal(j2, j)
132       cy, cw, cd = Date.__send__(:jd_to_commercial, j, Date::GREGORIAN)
133       assert_equal(y, cy)
134       assert_equal(w, cw)
135       assert_equal(d, cd)
136       cj = Date.__send__(:commercial_to_jd, cy, cw, cd, Date::GREGORIAN)
137       assert_equal(j, cj)
138     end
139   end
140
141   def test_weeknum
142     unless defined?(Calendar)
143       return
144     end
145     for j in @from..@to
146       for k in 0..1
147         wy, ww, wd = Date.__send__(:jd_to_weeknum, j, k, Date::GREGORIAN)
148         wj = Date.__send__(:weeknum_to_jd, wy, ww, wd, k, Date::GREGORIAN)
149         assert_equal(j, wj)
150       end
151     end
152   end
153
154   def test_weeknum__2
155     unless defined?(Calendar)
156       return
157     end
158     for j in @from4t..@to4t
159       d = Date.jd(j)
160       t = Time.mktime(d.year, d.mon, d.mday)
161       [
162        '%Y %U %w',
163        '%Y %U %u',
164        '%Y %W %w',
165        '%Y %W %u'
166       ].each do |fmt|
167         s = t.strftime(fmt)
168         d2 = Date.strptime(s, fmt)
169         assert_equal(j, d2.jd)
170       end
171     end
172   end
173
174   def test_nth_kday
175     unless defined?(Calendar)
176       return
177     end
178     for y in 1601..2401
179       for m in 1..12
180         for n in -5..5
181           next if n == 0
182           for k in 0..6
183             j = julian_day_number_from_absolute(Nth_Kday(n, k, m, y))
184             j2 =  Date.__send__(:nth_kday_to_jd, y, m, n, k, Date::GREGORIAN)
185             assert_equal(j, j2)
186
187             d1 =  Date.__send__(:jd_to_nth_kday, j2, Date::GREGORIAN)
188             j3 =  Date.__send__(:nth_kday_to_jd, *d1)
189             assert_equal(j, j3)
190           end
191         end
192       end
193     end
194   end
195
196   def test_mjd
197     jd = Date.__send__(:mjd_to_jd, 51321)
198     mjd = Date.__send__(:jd_to_mjd, jd)
199     assert_equal(51321, mjd)
200   end
201
202   def test_ld
203     jd = Date.__send__(:ld_to_jd, 152162)
204     ld = Date.__send__(:jd_to_ld, jd)
205     assert_equal(152162, ld)
206   end
207
208   def test_wday
209     assert_equal(4, Date.__send__(:jd_to_wday, 3))
210     assert_equal(3, Date.__send__(:jd_to_wday, 2))
211     assert_equal(2, Date.__send__(:jd_to_wday, 1))
212     assert_equal(1, Date.__send__(:jd_to_wday, 0))
213     assert_equal(0, Date.__send__(:jd_to_wday, -1))
214     assert_equal(6, Date.__send__(:jd_to_wday, -2))
215     assert_equal(5, Date.__send__(:jd_to_wday, -3))
216   end
217
218   def test_leap?
219     assert_equal(true, Date.julian_leap?(1900))
220     assert_equal(false, Date.julian_leap?(1999))
221     assert_equal(true, Date.julian_leap?(2000))
222
223     assert_equal(false, Date.gregorian_leap?(1900))
224     assert_equal(false, Date.gregorian_leap?(1999))
225     assert_equal(true, Date.gregorian_leap?(2000))
226
227     assert_equal(Date.leap?(1990), Date.gregorian_leap?(1900))
228     assert_equal(Date.leap?(1999), Date.gregorian_leap?(1999))
229     assert_equal(Date.leap?(2000), Date.gregorian_leap?(2000))
230   end
231
232   def test_valid_jd
233     valid_jd_p =  :_valid_jd?
234     assert_equal(-1, Date.__send__(valid_jd_p, -1))
235     assert_equal(0, Date.__send__(valid_jd_p, 0))
236     assert_equal(1, Date.__send__(valid_jd_p, 1))
237     assert_equal(2452348, Date.__send__(valid_jd_p, 2452348))
238   end
239
240   def test_valid_ordinal
241     valid_ordinal_p = :_valid_ordinal?
242     assert_nil(Date.__send__(valid_ordinal_p, 1999,366))
243     assert_equal(2451910, Date.__send__(valid_ordinal_p, 2000,366))
244     assert_nil(Date.__send__(valid_ordinal_p, 1999,-366))
245     assert_equal(2451545, Date.__send__(valid_ordinal_p, 2000,-366))
246     assert_equal(2452275, Date.__send__(valid_ordinal_p, 2001,365))
247     assert_nil(Date.__send__(valid_ordinal_p, 2001,366))
248     assert_equal(Date.__send__(valid_ordinal_p, 2001,1),
249                  Date.__send__(valid_ordinal_p, 2001,-365))
250     assert_nil(Date.__send__(valid_ordinal_p, 2001,-366))
251     assert_equal(2452348, Date.__send__(valid_ordinal_p, 2002,73))
252   end
253
254   def test_valid_ordinal__edge
255     valid_ordinal_p = :_valid_ordinal?
256     (1601..2400).each do |y|
257       d = if Date.leap?(y) then 366 else 365 end
258       assert_not_nil(Date.__send__(valid_ordinal_p, y,d))
259       assert_nil(Date.__send__(valid_ordinal_p, y,d + 1))
260       assert_not_nil(Date.__send__(valid_ordinal_p, y,-d))
261       assert_nil(Date.__send__(valid_ordinal_p, y,-(d + 1)))
262     end
263   end
264
265   #        October 1582        
266   #   S   M  Tu   W  Th   F   S
267   #     274 275 276 277 288 289
268   # 290 291 292 293 294 295 296
269   # 297 298 299 300 301 302 303
270   # 304                        
271
272   #        October 1582        
273   #   S   M  Tu   W  Th   F   S
274   #     -92 -91 -90 -89 -78 -77
275   # -76 -75 -74 -73 -72 -71 -70
276   # -69 -68 -67 -66 -65 -64 -63
277   # -62                        
278
279   def test_valid_ordinal__italy
280     valid_ordinal_p =  :_valid_ordinal?
281     (1..355).each do |d|
282       assert_not_nil(Date.__send__(valid_ordinal_p, 1582,d,Date::ITALY))
283     end
284     (356..365).each do |d|
285       assert_nil(Date.__send__(valid_ordinal_p, 1582,d,Date::ITALY))
286     end
287   end
288
289   #       September 1752       
290   #   S   M  Tu   W  Th   F   S
291   #         245 246 258 259 260
292   # 261 262 263 264 265 266 267
293   # 268 269 270 271 272 273 274
294
295   def test_valid_ordinal__england
296     valid_ordinal_p =  :_valid_ordinal?
297     (1..355).each do |d|
298       assert_not_nil(Date.__send__(valid_ordinal_p, 1752,d,Date::ENGLAND))
299     end
300     (356..366).each do |d|
301       assert_nil(Date.__send__(valid_ordinal_p, 1752,d,Date::ENGLAND))
302     end
303   end
304
305   def test_valid_civil
306     valid_civil_p = :_valid_civil?
307     assert_nil(Date.__send__(valid_civil_p, 1999,2,29))
308     assert_equal(2451604, Date.__send__(valid_civil_p, 2000,2,29))
309     assert_nil(Date.__send__(valid_civil_p, 1999,2,-29))
310     assert_equal(2451576, Date.__send__(valid_civil_p, 2000,2,-29))
311     assert_equal(2451941, Date.__send__(valid_civil_p, 2001,1,31))
312     assert_nil(Date.__send__(valid_civil_p, 2001,1,32))
313     assert_equal(Date.__send__(valid_civil_p, 2001,1,1),
314                  Date.__send__(valid_civil_p, 2001,1,-31))
315     assert_nil(Date.__send__(valid_civil_p, 2001,1,-32))
316     assert_equal(2452348, Date.__send__(valid_civil_p, 2002,3,14))
317   end
318
319   def test_valid_civil__edge
320     valid_civil_p = :_valid_civil?
321     (1601..2400).each do |y|
322       d = if Date.leap?(y) then 29 else 28 end
323       assert_not_nil(Date.__send__(valid_civil_p, y,2,d))
324       assert_nil(Date.__send__(valid_civil_p, y,2,d + 1))
325       assert_not_nil(Date.__send__(valid_civil_p, y,2,-d))
326       assert_nil(Date.__send__(valid_civil_p, y,2,-(d + 1)))
327     end
328   end
329
330   #     October 1582    
331   #  S  M Tu  W Th  F  S
332   #     1  2  3  4 15 16
333   # 17 18 19 20 21 22 23
334   # 24 25 26 27 28 29 30
335   # 31                  
336
337   def test_valid_civil__italy
338     valid_civil_p = :_valid_civil?
339     (1..4).each do |d|
340       assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
341     end
342     (5..14).each do |d|
343       assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
344     end
345     (15..31).each do |d|
346       assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
347     end
348     (32..100).each do |d|
349       assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
350     end
351     (-31..-22).each do |d|
352       assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
353     end
354     (-21..-1).each do |d|
355       assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
356     end
357   end
358
359   #    September 1752   
360   #  S  M Tu  W Th  F  S
361   #        1  2 14 15 16
362   # 17 18 19 20 21 22 23
363   # 24 25 26 27 28 29 30
364
365   def test_valid_civil__england
366     valid_civil_p = :_valid_civil?
367     (1..2).each do |d|
368       assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
369     end
370     (3..13).each do |d|
371       assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
372     end
373     (14..30).each do |d|
374       assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
375     end
376     (31..100).each do |d|
377       assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
378     end
379     (-31..-20).each do |d|
380       assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
381     end
382     (-19..-1).each do |d|
383       assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
384     end
385   end
386
387   def test_valid_commercial
388     valid_commercial_p = :_valid_commercial?
389     assert_nil(Date.__send__(valid_commercial_p, 1999,53,1))
390     assert_equal(2453367, Date.__send__(valid_commercial_p, 2004,53,1))
391     assert_nil(Date.__send__(valid_commercial_p, 1999,-53,-1))
392     assert_equal(2453009, Date.__send__(valid_commercial_p, 2004,-53,-1))
393     assert_equal(2452348, Date.__send__(valid_commercial_p, 2002,11,4))
394   end
395
396   def test_valid_weeknum
397     valid_weeknum_p = :_valid_weeknum?
398     assert_nil(Date.__send__(valid_weeknum_p, 1999,53,0, 0))
399     assert_equal(2454101, Date.__send__(valid_weeknum_p, 2006,53,0, 0))
400     assert_nil(Date.__send__(valid_weeknum_p, 1999,-53,-1, 0))
401     assert_equal(2453743, Date.__send__(valid_weeknum_p, 2006,-53,-1, 0))
402     assert_equal(2452355, Date.__send__(valid_weeknum_p, 2002,11,4, 0))
403     assert_nil(Date.__send__(valid_weeknum_p, 1999,53,0, 1))
404     assert_equal(2454101, Date.__send__(valid_weeknum_p, 2006,52,6, 1))
405     assert_nil(Date.__send__(valid_weeknum_p, 1999,-53,-1, 1))
406     assert_equal(2453743, Date.__send__(valid_weeknum_p, 2006,-52,-2, 1))
407     assert_equal(2452355, Date.__send__(valid_weeknum_p, 2002,11,3, 1))
408   end
409
410   def test_valid_nth_kday
411     valid_nth_kday_p = :_valid_nth_kday?
412     assert_nil(Date.__send__(valid_nth_kday_p, 1992,2, 5,0))
413     assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, 5,6))
414     assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, 5,-1))
415     assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, -1,6))
416     assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, -1,-1))
417   end
418
419   def test_valid_time
420     valid_time_p = :_valid_time?
421     assert_equal(Rational(0), DateTime.__send__(valid_time_p, 0,0,0))
422     assert_nil(DateTime.__send__(valid_time_p, 25,59,59))
423     assert_nil(DateTime.__send__(valid_time_p, 23,60,59))
424     assert_nil(DateTime.__send__(valid_time_p, 23,59,60))
425     assert_equal(Rational(86399, 86400),
426                  DateTime.__send__(valid_time_p, 23,59,59))
427     assert_equal(Rational(86399, 86400),
428                  DateTime.__send__(valid_time_p, -1,-1,-1))
429     assert_equal(Rational(1), DateTime.__send__(valid_time_p, 24,0,0))
430     assert_nil(DateTime.__send__(valid_time_p, 24,0,1))
431     assert_nil(DateTime.__send__(valid_time_p, 24,1,0))
432     assert_nil(DateTime.__send__(valid_time_p, 24,1,1))
433   end
434
435 end