1# frozen_string_literal: true
2require 'test/unit'
3require 'date'
4
5class DateSub < Date; end
6class DateTimeSub < DateTime; end
7
8class TestDate < Test::Unit::TestCase
9
10  def test__const
11    assert_nil(Date::MONTHNAMES[0])
12    assert_equal('January', Date::MONTHNAMES[1])
13    assert_equal(13, Date::MONTHNAMES.size)
14    assert_equal('Sunday', Date::DAYNAMES[0])
15    assert_equal(7, Date::DAYNAMES.size)
16
17    assert_nil(Date::ABBR_MONTHNAMES[0])
18    assert_equal('Jan', Date::ABBR_MONTHNAMES[1])
19    assert_equal(13, Date::ABBR_MONTHNAMES.size)
20    assert_equal('Sun', Date::ABBR_DAYNAMES[0])
21    assert_equal(7, Date::ABBR_DAYNAMES.size)
22
23    assert(Date::MONTHNAMES.frozen?)
24    assert(Date::MONTHNAMES[1].frozen?)
25    assert(Date::DAYNAMES.frozen?)
26    assert(Date::DAYNAMES[0].frozen?)
27
28    assert(Date::ABBR_MONTHNAMES.frozen?)
29    assert(Date::ABBR_MONTHNAMES[1].frozen?)
30    assert(Date::ABBR_DAYNAMES.frozen?)
31    assert(Date::ABBR_DAYNAMES[0].frozen?)
32  end
33
34  def test_sub
35    d = DateSub.new
36    dt = DateTimeSub.new
37
38    assert_instance_of(DateSub, d)
39    assert_instance_of(DateTimeSub, dt)
40
41    assert_instance_of(DateSub, DateSub.today)
42    assert_instance_of(DateTimeSub, DateTimeSub.now)
43
44    assert_equal('-4712-01-01', d.to_s)
45    assert_equal('-4712-01-01T00:00:00+00:00', dt.to_s)
46
47    d2 = d + 1
48    assert_instance_of(DateSub, d2)
49    d2 = d - 1
50    assert_instance_of(DateSub, d2)
51    d2 = d >> 1
52    assert_instance_of(DateSub, d2)
53    d2 = d << 1
54    assert_instance_of(DateSub, d2)
55    d2 = d.succ
56    assert_instance_of(DateSub, d2)
57    d2 = d.next
58    assert_instance_of(DateSub, d2)
59    d2 = d.italy
60    assert_instance_of(DateSub, d2)
61    d2 = d.england
62    assert_instance_of(DateSub, d2)
63    d2 = d.julian
64    assert_instance_of(DateSub, d2)
65    d2 = d.gregorian
66    assert_instance_of(DateSub, d2)
67    s = Marshal.dump(d)
68    d2 = Marshal.load(s)
69    assert_equal(d2, d)
70    assert_instance_of(DateSub, d2)
71
72    dt2 = dt + 1
73    assert_instance_of(DateTimeSub, dt2)
74    dt2 = dt - 1
75    assert_instance_of(DateTimeSub, dt2)
76    dt2 = dt >> 1
77    assert_instance_of(DateTimeSub, dt2)
78    dt2 = dt << 1
79    assert_instance_of(DateTimeSub, dt2)
80    dt2 = dt.succ
81    assert_instance_of(DateTimeSub, dt2)
82    dt2 = dt.next
83    assert_instance_of(DateTimeSub, dt2)
84    dt2 = dt.italy
85    assert_instance_of(DateTimeSub, dt2)
86    dt2 = dt.england
87    assert_instance_of(DateTimeSub, dt2)
88    dt2 = dt.julian
89    assert_instance_of(DateTimeSub, dt2)
90    dt2 = dt.gregorian
91    assert_instance_of(DateTimeSub, dt2)
92    s = Marshal.dump(dt)
93    dt2 = Marshal.load(s)
94    assert_equal(dt2, dt)
95    assert_instance_of(DateTimeSub, dt2)
96  end
97
98  def test_eql_p
99    d = Date.jd(0)
100    d2 = Date.jd(0)
101    dt = DateTime.jd(0)
102    dt2 = DateTime.jd(0)
103
104    assert_equal(d, d2)
105    assert_not_equal(d, 0)
106
107    assert_equal(dt, dt2)
108    assert_not_equal(dt, 0)
109
110    assert_equal(d, dt)
111    assert_equal(d2, dt2)
112  end
113
114  def test_hash
115    h = {}
116    h[Date.new(1999,5,23)] = 0
117    h[Date.new(1999,5,24)] = 1
118    h[Date.new(1999,5,25)] = 2
119    h[Date.new(1999,5,25)] = 9
120    assert_equal(3, h.size)
121    assert_equal(9, h[Date.new(1999,5,25)])
122    assert_equal(9, h[DateTime.new(1999,5,25)])
123
124    h = {}
125    h[DateTime.new(1999,5,23)] = 0
126    h[DateTime.new(1999,5,24)] = 1
127    h[DateTime.new(1999,5,25)] = 2
128    h[DateTime.new(1999,5,25)] = 9
129    assert_equal(3, h.size)
130    assert_equal(9, h[Date.new(1999,5,25)])
131    assert_equal(9, h[DateTime.new(1999,5,25)])
132
133    assert_instance_of(String, Date.new(1999,5,25).hash.to_s)
134  end
135
136  def test_freeze
137    d = Date.new
138    d.freeze
139    assert_equal(true, d.frozen?)
140    assert_instance_of(Integer, d.yday)
141    assert_instance_of(String, d.to_s)
142  end
143
144  def test_submillisecond_comparison
145    d1 = DateTime.new(2013, 12, 6, 0, 0, Rational(1, 10000))
146    d2 = DateTime.new(2013, 12, 6, 0, 0, Rational(2, 10000))
147    # d1 is 0.0001s earlier than d2
148    assert_equal(-1, d1 <=> d2)
149    assert_equal(0, d1 <=> d1)
150    assert_equal(1, d2 <=> d1)
151  end
152
153end
154