@@ -42,6 +42,14 @@ defmodule DateTest do
42
42
43
43
assert to_string ( % { date | calendar: FakeCalendar } ) == "1/1/2000"
44
44
assert Date . to_string ( % { date | calendar: FakeCalendar } ) == "1/1/2000"
45
+
46
+ date2 = Date . new! ( 5_874_897 , 12 , 31 )
47
+ assert to_string ( date2 ) == "5874897-12-31"
48
+ assert Date . to_string ( date2 ) == "5874897-12-31"
49
+ assert Date . to_string ( Map . from_struct ( date2 ) ) == "5874897-12-31"
50
+
51
+ assert to_string ( % { date2 | calendar: FakeCalendar } ) == "31/12/5874897"
52
+ assert Date . to_string ( % { date2 | calendar: FakeCalendar } ) == "31/12/5874897"
45
53
end
46
54
47
55
test "inspect/1" do
@@ -50,29 +58,56 @@ defmodule DateTest do
50
58
51
59
date = % { ~D[ 2000-01-01] | calendar: FakeCalendar }
52
60
assert inspect ( date ) == "~D[1/1/2000 FakeCalendar]"
61
+
62
+ assert inspect ( Date . new! ( 5_874_897 , 12 , 31 ) ) == "Date.new!(5874897, 12, 31)"
63
+ assert inspect ( Date . new! ( - 5_874_897 , 1 , 1 ) ) == "Date.new!(-5874897, 1, 1)"
64
+
65
+ date2 = % { Date . new! ( 5_874_897 , 12 , 31 ) | calendar: FakeCalendar }
66
+
67
+ assert inspect ( % { date2 | calendar: FakeCalendar } ) ==
68
+ "Date.new!(5874897, 12, 31, FakeCalendar)"
53
69
end
54
70
55
71
test "compare/2" do
56
72
date1 = ~D[ -0001-12-30]
57
73
date2 = ~D[ -0001-12-31]
58
74
date3 = ~D[ 0001-01-01]
75
+ date4 = Date . new! ( 5_874_897 , 12 , 31 )
76
+ date5 = Date . new! ( - 4713 , 1 , 1 )
77
+
59
78
assert Date . compare ( date1 , date1 ) == :eq
60
79
assert Date . compare ( date1 , date2 ) == :lt
61
80
assert Date . compare ( date2 , date1 ) == :gt
62
81
assert Date . compare ( date3 , date3 ) == :eq
63
82
assert Date . compare ( date2 , date3 ) == :lt
64
83
assert Date . compare ( date3 , date2 ) == :gt
84
+ assert Date . compare ( date4 , date1 ) == :gt
85
+ assert Date . compare ( date1 , date4 ) == :lt
86
+ assert Date . compare ( date4 , date4 ) == :eq
87
+ assert Date . compare ( date4 , date5 ) == :gt
88
+ assert Date . compare ( date5 , date4 ) == :lt
89
+ assert Date . compare ( date5 , date5 ) == :eq
65
90
end
66
91
67
92
test "before?/2 and after?/2" do
68
93
date1 = ~D[ 2022-11-01]
69
94
date2 = ~D[ 2022-11-02]
95
+ date3 = Date . new! ( 5_874_897 , 12 , 31 )
96
+ date4 = Date . new! ( - 4713 , 1 , 1 )
70
97
71
98
assert Date . before? ( date1 , date2 )
99
+ assert Date . before? ( date1 , date3 )
100
+ assert Date . before? ( date4 , date1 )
72
101
assert not Date . before? ( date2 , date1 )
102
+ assert not Date . before? ( date3 , date1 )
103
+ assert not Date . before? ( date1 , date4 )
73
104
74
105
assert Date . after? ( date2 , date1 )
106
+ assert Date . after? ( date3 , date2 )
107
+ assert Date . after? ( date2 , date4 )
75
108
assert not Date . after? ( date1 , date2 )
109
+ assert not Date . after? ( date2 , date3 )
110
+ assert not Date . after? ( date4 , date2 )
76
111
end
77
112
78
113
test "compare/2 across calendars" do
@@ -149,22 +184,16 @@ defmodule DateTest do
149
184
150
185
test "add/2" do
151
186
assert Date . add ( ~D[ 0000-01-01] , 3_652_424 ) == ~D[ 9999-12-31]
152
-
153
- assert_raise FunctionClauseError , fn ->
154
- Date . add ( ~D[ 0000-01-01] , 3_652_425 )
155
- end
156
-
187
+ assert Date . add ( ~D[ 0000-01-01] , 3_652_425 ) == Date . new! ( 10000 , 1 , 1 )
157
188
assert Date . add ( ~D[ 0000-01-01] , - 1 ) == ~D[ -0001-12-31]
158
189
assert Date . add ( ~D[ 0000-01-01] , - 365 ) == ~D[ -0001-01-01]
159
190
assert Date . add ( ~D[ 0000-01-01] , - 366 ) == ~D[ -0002-12-31]
160
191
assert Date . add ( ~D[ 0000-01-01] , - ( 365 * 4 ) ) == ~D[ -0004-01-02]
161
192
assert Date . add ( ~D[ 0000-01-01] , - ( 365 * 5 ) ) == ~D[ -0005-01-02]
162
193
assert Date . add ( ~D[ 0000-01-01] , - ( 365 * 100 ) ) == ~D[ -0100-01-25]
163
194
assert Date . add ( ~D[ 0000-01-01] , - 3_652_059 ) == ~D[ -9999-01-01]
164
-
165
- assert_raise FunctionClauseError , fn ->
166
- Date . add ( ~D[ 0000-01-01] , - 3_652_060 )
167
- end
195
+ assert Date . add ( ~D[ 0000-01-01] , - 3_652_060 ) == Date . new! ( - 10000 , 12 , 31 )
196
+ assert Date . add ( Date . new! ( 5_874_897 , 12 , 31 ) , 1 ) == Date . new! ( 5_874_898 , 1 , 1 )
168
197
end
169
198
170
199
test "diff/2" do
@@ -174,6 +203,9 @@ defmodule DateTest do
174
203
assert Date . diff ( ~D[ 0000-01-01] , ~D[ -0001-01-01] ) == 365
175
204
assert Date . diff ( ~D[ -0003-01-01] , ~D[ -0004-01-01] ) == 366
176
205
206
+ assert Date . diff ( Date . new! ( 5_874_898 , 1 , 1 ) , Date . new! ( 5_874_897 , 1 , 1 ) ) == 365
207
+ assert Date . diff ( Date . new! ( 5_874_905 , 1 , 1 ) , Date . new! ( 5_874_904 , 1 , 1 ) ) == 366
208
+
177
209
date1 = ~D[ 2000-01-01]
178
210
date2 = Calendar.Holocene . date ( 12000 , 01 , 14 )
179
211
assert Date . diff ( date1 , date2 ) == - 13
@@ -194,6 +226,17 @@ defmodule DateTest do
194
226
assert Date . shift ( ~D[ 2000-01-01] , month: 12 ) == ~D[ 2001-01-01]
195
227
assert Date . shift ( ~D[ 0000-01-01] , day: 2 , year: 1 , month: 37 ) == ~D[ 0004-02-03]
196
228
229
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , day: - 1 ) == Date . new! ( 5_874_904 , 2 , 28 )
230
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , month: - 2 ) == Date . new! ( 5_874_903 , 12 , 29 )
231
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , week: - 9 ) == Date . new! ( 5_874_903 , 12 , 28 )
232
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , month: 1 ) == Date . new! ( 5_874_904 , 3 , 29 )
233
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , year: - 1 ) == Date . new! ( 5_874_903 , 2 , 28 )
234
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , year: - 4 ) == Date . new! ( 5_874_900 , 2 , 28 )
235
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , year: 4 ) == Date . new! ( 5_874_908 , 2 , 29 )
236
+
237
+ assert Date . shift ( Date . new! ( 5_874_904 , 2 , 29 ) , day: 1 , year: 4 , month: 2 ) ==
238
+ Date . new! ( 5_874_908 , 4 , 30 )
239
+
197
240
assert_raise ArgumentError ,
198
241
"unsupported unit :second. Expected :year, :month, :week, :day" ,
199
242
fn -> Date . shift ( ~D[ 2012-02-29] , second: 86400 ) end
0 commit comments