]> gitweb.factorcode.org Git - factor.git/blob - basis/calendar/calendar-tests.factor
scryfall: better moxfield words
[factor.git] / basis / calendar / calendar-tests.factor
1 USING: accessors grouping kernel math math.order ranges
2 math.vectors random sequences threads tools.test ;
3 IN: calendar
4
5 [ 2004 12 32 0   0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
6 [ 2004  2 30 0   0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
7 [ 2003  2 29 0   0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
8 [ 2004 -2  9 0   0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
9 [ 2004 12  0 0   0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
10 [ 2004 12  1 24  0  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
11 [ 2004 12  1 23 60  0 instant <timestamp> ] [ not-in-interval? ] must-fail-with
12 [ 2004 12  1 23 59 60 instant <timestamp> ] [ not-in-interval? ] must-fail-with
13 { } [
14     2014 12 1 23 59 59+99/100 instant <timestamp> drop
15 ] unit-test
16
17 { f } [ 1900 leap-year? ] unit-test
18 { t } [ 1904 leap-year? ] unit-test
19 { t } [ 2000 leap-year? ] unit-test
20 { f } [ 2001 leap-year? ] unit-test
21 { f } [ 2006 leap-year? ] unit-test
22 { t } [ 2020 leap-year? ] unit-test
23
24 { t } [ 2006 10 10 0 0 0 instant <timestamp> 1 seconds time+
25         2006 10 10 0 0 1 instant <timestamp> = ] unit-test
26 { t } [ 2006 10 10 0 0 0 instant <timestamp> 100 seconds time+
27         2006 10 10 0 1 40 instant <timestamp> = ] unit-test
28 { t } [ 2006 10 10 0 0 0 instant <timestamp> -100 seconds time+
29         2006 10 9 23 58 20 instant <timestamp> = ] unit-test
30 { t } [ 2006 10 10 0 0 0 instant <timestamp> 86400 seconds time+
31         2006 10 11 0 0 0 instant <timestamp> = ] unit-test
32
33 { t } [ 2006 10 10 0 0 0 instant <timestamp> 10 minutes time+
34         2006 10 10 0 10 0 instant <timestamp> = ] unit-test
35 { +eq+ } [ 2006 10 10 0 0 0 instant <timestamp> 10.5 minutes time+
36         2006 10 10 0 10 30 instant <timestamp> <=> ] unit-test
37 { t } [ 2006 10 10 0 0 0 instant <timestamp> 3/4 minutes time+
38         2006 10 10 0 0 45 instant <timestamp> = ] unit-test
39 { t } [ 2006 10 10 0 0 0 instant <timestamp> -3/4 minutes time+
40         2006 10 9 23 59 15 instant <timestamp> = ] unit-test
41
42 { t } [ 2006 10 10 0 0 0 instant <timestamp> 7200 minutes time+
43         2006 10 15 0 0 0 instant <timestamp> = ] unit-test
44 { t } [ 2006 10 10 0 0 0 instant <timestamp> -10 minutes time+
45         2006 10 9 23 50 0 instant <timestamp> = ] unit-test
46 { t } [ 2006 10 10 0 0 0 instant <timestamp> -100 minutes time+
47         2006 10 9 22 20 0 instant <timestamp> = ] unit-test
48
49 { t } [ 2006 1 1 0 0 0 instant <timestamp> 1 hours time+
50         2006 1 1 1 0 0 instant <timestamp> = ] unit-test
51 { t } [ 2006 1 1 0 0 0 instant <timestamp> 24 hours time+
52         2006 1 2 0 0 0 instant <timestamp> = ] unit-test
53 { t } [ 2006 1 1 0 0 0 instant <timestamp> -24 hours time+
54         2005 12 31 0 0 0 instant <timestamp> = ] unit-test
55 { t } [ 2006 1 1 0 0 0 instant <timestamp> 12 hours time+
56         2006 1 1 12 0 0 instant <timestamp> = ] unit-test
57 { t } [ 2006 1 1 0 0 0 instant <timestamp> 72 hours time+
58         2006 1 4 0 0 0 instant <timestamp> = ] unit-test
59
60 { t } [ 2006 1 1 0 0 0 instant <timestamp> 1 days time+
61         2006 1 2 0 0 0 instant <timestamp> = ] unit-test
62 { t } [ 2006 1 1 0 0 0 instant <timestamp> -1 days time+
63         2005 12 31 0 0 0 instant <timestamp> = ] unit-test
64 { t } [ 2006 1 1 0 0 0 instant <timestamp> 365 days time+
65         2007 1 1 0 0 0 instant <timestamp> = ] unit-test
66 { t } [ 2006 1 1 0 0 0 instant <timestamp> -365 days time+
67         2005 1 1 0 0 0 instant <timestamp> = ] unit-test
68 { t } [ 2004 1 1 0 0 0 instant <timestamp> 365 days time+
69         2004 12 31 0 0 0 instant <timestamp> = ] unit-test
70 { t } [ 2004 1 1 0 0 0 instant <timestamp> 366 days time+
71         2005 1 1 0 0 0 instant <timestamp> = ] unit-test
72
73 { t } [ 2006 1 1 0 0 0 instant <timestamp> 11 months time+
74         2006 12 1 0 0 0 instant <timestamp> = ] unit-test
75 { t } [ 2006 1 1 0 0 0 instant <timestamp> 12 months time+
76         2007 1 1 0 0 0 instant <timestamp> = ] unit-test
77 { t } [ 2006 1 1 0 0 0 instant <timestamp> 24 months time+
78         2008 1 1 0 0 0 instant <timestamp> = ] unit-test
79 { t } [ 2006 1 1 0 0 0 instant <timestamp> 13 months time+
80         2007 2 1 0 0 0 instant <timestamp> = ] unit-test
81 { t } [ 2006 1 1 0 0 0 instant <timestamp> 1 months time+
82         2006 2 1 0 0 0 instant <timestamp> = ] unit-test
83 { t } [ 2006 1 1 0 0 0 instant <timestamp> 0 months time+
84         2006 1 1 0 0 0 instant <timestamp> = ] unit-test
85 { t } [ 2006 1 1 0 0 0 instant <timestamp> -1 months time+
86         2005 12 1 0 0 0 instant <timestamp> = ] unit-test
87 { t } [ 2006 1 1 0 0 0 instant <timestamp> -2 months time+
88         2005 11 1 0 0 0 instant <timestamp> = ] unit-test
89 { t } [ 2006 1 1 0 0 0 instant <timestamp> -13 months time+
90         2004 12 1 0 0 0 instant <timestamp> = ] unit-test
91 { t } [ 2006 1 1 0 0 0 instant <timestamp> -24 months time+
92         2004 1 1 0 0 0 instant <timestamp> = ] unit-test
93 { t } [ 2004 2 29 0 0 0 instant <timestamp> 12 months time+
94         2005 3 1 0 0 0 instant <timestamp> = ] unit-test
95 { t } [ 2004 2 29 0 0 0 instant <timestamp> -12 months time+
96         2003 3 1 0 0 0 instant <timestamp> = ] unit-test
97
98 { t } [ 2006 1 1 0 0 0 instant <timestamp> 0 years time+
99         2006 1 1 0 0 0 instant <timestamp> = ] unit-test
100 { t } [ 2006 1 1 0 0 0 instant <timestamp> 1 years time+
101         2007 1 1 0 0 0 instant <timestamp> = ] unit-test
102 { t } [ 2006 1 1 0 0 0 instant <timestamp> -1 years time+
103         2005 1 1 0 0 0 instant <timestamp> = ] unit-test
104 { t } [ 2006 1 1 0 0 0 instant <timestamp> -100 years time+
105         1906 1 1 0 0 0 instant <timestamp> = ] unit-test
106 ! [ t ] [ 2004 2 29 0 0 0 instant <timestamp> -1 years time+
107 !         2003 2 28 0 0 0 instant <timestamp> = ] unit-test
108
109 { 5 } [ 2006 7 14 0 0 0 instant <timestamp> day-of-week ] unit-test
110
111 { t } [ 2006 7 14 [ julian-day-number julian-day-number>date 0 0 0 instant <timestamp> ] 3keep 0 0 0 instant <timestamp> = ] unit-test
112
113 { 1 } [ 2006 1 1 0 0 0 instant <timestamp> day-of-year ] unit-test
114 { 60 } [ 2004 2 29 0 0 0 instant <timestamp> day-of-year ] unit-test
115 { 61 } [ 2004 3 1 0 0 0 instant <timestamp> day-of-year ] unit-test
116 { 366 } [ 2004 12 31 0 0 0 instant <timestamp> day-of-year ] unit-test
117 { 365 } [ 2003 12 31 0 0 0 instant <timestamp> day-of-year ] unit-test
118 { 60 } [ 2003 3 1 0 0 0 instant <timestamp> day-of-year ] unit-test
119
120 { t } [ 2004 12 31 0 0 0 instant <timestamp> dup = ] unit-test
121 { t } [ 2004 1 1 0 0 0 instant <timestamp> 10 seconds 5 years time+ time+
122         2009 1 1 0 0 10 instant <timestamp> = ] unit-test
123 { t } [ 2004 1 1 0 0 0 instant <timestamp> -10 seconds -5 years time+ time+
124         1998 12 31 23 59 50 instant <timestamp> = ] unit-test
125
126 { t } [ 2004 1 1 23 0 0 12 hours <timestamp> >gmt
127         2004 1 1 11 0 0 instant <timestamp> = ] unit-test
128 { t } [ 2004 1 1 5 0 0 -11 hours <timestamp> >gmt
129         2004 1 1 16 0 0 instant <timestamp> = ] unit-test
130 { t } [ 2004 1 1 23 0 0 9+1/2 hours <timestamp> >gmt
131         2004 1 1 13 30 0 instant <timestamp> = ] unit-test
132
133 { t } [
134     2004 1 1 3 0 0 instant <timestamp>
135     2004 1 1 1 0 0 instant <timestamp> 3 am =
136 ] unit-test
137
138 { t } [
139     2004 1 1 0 0 0 instant <timestamp>
140     2004 1 1 1 0 0 instant <timestamp> 12 am =
141 ] unit-test
142
143 { t } [
144     2004 1 1 12 0 0 instant <timestamp>
145     2004 1 1 1 0 0 instant <timestamp> 12 pm =
146 ] unit-test
147
148 { t } [
149     2004 1 1 23 0 0 instant <timestamp>
150     2004 1 1 1 0 0 instant <timestamp> 11 pm =
151 ] unit-test
152
153 { +eq+ } [ 2004 1 1 13 30 0 instant <timestamp>
154         2004 1 1 12 30 0 -1 hours <timestamp> <=> ] unit-test
155
156 { +gt+ } [ 2004 1 1 13 30 0 instant <timestamp>
157         2004 1 1 12 30 0 instant <timestamp> <=> ] unit-test
158
159 { +lt+ } [ 2004 1 1 12 30 0 instant <timestamp>
160         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
161
162 { +gt+ } [ 2005 1 1 12 30 0 instant <timestamp>
163         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
164
165 { t } [ 0 micros>timestamp unix-1970 = ] unit-test
166 { t } [ 123456789000000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
167 { t } [ 123456789123456000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
168
169 : checktime+ ( duration -- ? ) now dup clone [ rot time+ drop ] keep = ;
170
171 { t } [ 5 seconds checktime+ ] unit-test
172
173 { t } [ 5 minutes checktime+ ] unit-test
174
175 { t } [ 5 hours checktime+ ] unit-test
176
177 { t } [ 5 days checktime+ ] unit-test
178
179 { t } [ 5 weeks checktime+ ] unit-test
180
181 { t } [ 5 months checktime+ ] unit-test
182
183 { t } [ 5 years checktime+ ] unit-test
184
185 { t } [ now 50 milliseconds sleep now before? ] unit-test
186 { t } [ now 50 milliseconds sleep now swap after? ] unit-test
187 { t } [ now 50 milliseconds sleep now 50 milliseconds sleep now swapd between? ] unit-test
188
189 { 4 12 } [ 2009 easter [ month>> ] [ day>> ] bi ] unit-test
190 { 4 2 } [ 1961 easter [ month>> ] [ day>> ] bi ] unit-test
191
192 { t } [ 1325376000 unix-time>timestamp 2012 <year-gmt> = ] unit-test
193 { t } [ 1356998399 unix-time>timestamp 2013 <year-gmt> 1 seconds time- = ] unit-test
194
195 { t } [ now now-gmt time- duration>seconds 1/5 < ] unit-test
196 { t } [ now-gmt now time- duration>seconds 1/5 < ] unit-test
197
198 { t } [ 1500000000 random [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test
199
200 { t } [
201     2009 1 29 <date> 1 months time+
202     2009 2 28 <date> =
203 ] unit-test
204
205 { t } [
206     2008 1 29 <date> 1 months time+
207     2008 2 29 <date> =
208 ] unit-test
209
210 { { 1 1 1 2 2 2 3 3 3 4 4 4 } } [
211     12 [1..b] [ 2020 swap 1 <date> quarter ] map
212 ] unit-test
213
214 { 0 }
215 [ now-gmt gmt-offset>> duration>seconds ] unit-test
216
217 ! am
218 [ now 30 am ] [ not-in-interval? ] must-fail-with
219
220 ! pm
221 [ now 30 pm ] [ not-in-interval? ] must-fail-with
222
223 { 1 } [ 2018 12 31 <date> week-number ] unit-test
224
225 { 16 } [ 2019 4 17 <date> week-number ] unit-test
226
227 { 53 } [ 2021 1 1 <date> week-number ] unit-test
228
229 { 53 } [ 2004 weeks-in-week-year ] unit-test
230 { 52 } [ 2013 weeks-in-week-year ] unit-test
231
232 {
233     T{ timestamp { year 2019 } { month 11 } { day 4 } }
234 } [ 2019 308 year-ordinal>timestamp ] unit-test
235
236 {
237     T{ timestamp { year 2020 } { month 11 } { day 3 } }
238 } [ 2020 308 year-ordinal>timestamp ] unit-test
239
240 {
241     T{ timestamp { year 2019 } { month 12 } { day 31 } }
242 } [ 2019 365 year-ordinal>timestamp ] unit-test
243
244 {
245     T{ timestamp { year 2020 } { month 12 } { day 31 } }
246 } [ 2020 366 year-ordinal>timestamp ] unit-test
247
248 { t } [
249     2020 <year> timestamp>year-dates-gmt
250     [ >date< ymd>ordinal ] map [ < ] monotonic?
251 ] unit-test
252
253 { t } [
254     1999 2025 [a..b] [
255         <year> timestamp>year-dates-gmt
256         [ >date< ymd>ordinal ] map [ < ] monotonic?
257     ] map [ ] all?
258 ] unit-test
259
260 { t } [
261     1999 2025 [a..b] [
262         <year-gmt> timestamp>year-dates-gmt
263         [ >date< ymd>ordinal ] map [ < ] monotonic?
264     ] map [ ] all?
265 ] unit-test
266
267 { 136 } [ 2014 1 10 <date>  2014 7 20 <date>  weekdays-between ] unit-test
268 { 137 } [ 2014 1 10 <date>  2014 7 21 <date>  weekdays-between ] unit-test
269 { 138 } [ 2014 1 10 <date>  2014 7 22 <date>  weekdays-between ] unit-test
270 { 139 } [ 2014 1 10 <date>  2014 7 23 <date>  weekdays-between ] unit-test
271 { 140 } [ 2014 1 10 <date>  2014 7 24 <date>  weekdays-between ] unit-test
272 { 141 } [ 2014 1 10 <date>  2014 7 25 <date>  weekdays-between ] unit-test
273 { 141 } [ 2014 1 10 <date>  2014 7 26 <date>  weekdays-between ] unit-test
274 { 141 } [ 2014 1 10 <date>  2014 7 27 <date>  weekdays-between ] unit-test
275 { 142 } [ 2014 1 10 <date>  2014 7 28 <date>  weekdays-between ] unit-test
276 { 143 } [ 2014 1 10 <date>  2014 7 29 <date>  weekdays-between ] unit-test
277 { 144 } [ 2014 1 10 <date>  2014 7 30 <date>  weekdays-between ] unit-test
278 { 145 } [ 2014 1 10 <date>  2014 7 31 <date>  weekdays-between ] unit-test
279 { 146 } [ 2014 1 10 <date>  2014 8 1 <date>  weekdays-between ] unit-test
280 { 146 } [ 2014 1 10 <date>  2014 8 2 <date>  weekdays-between ] unit-test
281 { 146 } [ 2014 1 10 <date>  2014 8 3 <date>  weekdays-between ] unit-test
282 { 147 } [ 2014 1 10 <date>  2014 8 4 <date>  weekdays-between ] unit-test
283 { 148 } [ 2014 1 10 <date>  2014 8 5 <date>  weekdays-between ] unit-test
284 { 149 } [ 2014 1 10 <date>  2014 8 6 <date>  weekdays-between ] unit-test
285 { 150 } [ 2014 1 10 <date>  2014 8 7 <date>  weekdays-between ] unit-test
286 { 151 } [ 2014 1 10 <date>  2014 8 8 <date>  weekdays-between ] unit-test
287 { 151 } [ 2014 1 10 <date>  2014 8 9 <date>  weekdays-between ] unit-test
288 { 151 } [ 2014 1 10 <date>  2014 8 10 <date>  weekdays-between ] unit-test
289
290
291 { t } [
292     2014 1 1 <date-gmt>
293     2014 <year-gmt> timestamp>year-dates-gmt
294     [ weekdays-between ] with map [ <= ] monotonic?
295 ] unit-test
296
297 { t } [
298     2020 1 1 <date-gmt>
299     2020 <year-gmt> timestamp>year-dates-gmt
300     [ weekdays-between ] with map [ <= ] monotonic?
301 ] unit-test
302
303 { t } [
304     2014 1 1 <date-gmt>
305     2014 <year-gmt> timestamp>year-dates-gmt
306     [ weekdays-between ] with map
307     dup 1 tail swap v- [ 1 <= ] all?
308 ] unit-test
309
310 { t } [
311     2020 1 1 <date-gmt>
312     2020 <year-gmt> timestamp>year-dates-gmt
313     [ weekdays-between ] with map
314     dup 1 tail swap v- [ 1 <= ] all?
315 ] unit-test
316
317 { 0 } [
318     2014 1 1 <date-gmt>
319     2014 <year-gmt> timestamp>year-dates-gmt
320     [ weekdays-between2 ] with map
321
322     2014 1 1 <date-gmt>
323     2014 <year-gmt> timestamp>year-dates-gmt
324     [ weekdays-between ] with map
325
326     v- sum
327 ] unit-test
328
329 {
330     {
331         T{ timestamp { year 2020 } { month 3 } { day 1 } }
332         T{ timestamp { year 2020 } { month 3 } { day 8 } }
333         T{ timestamp { year 2020 } { month 3 } { day 15 } }
334         T{ timestamp { year 2020 } { month 3 } { day 22 } }
335         T{ timestamp { year 2020 } { month 3 } { day 29 } }
336     }
337 } [
338     2020 march gmt 5 <iota> [ sunday-of-month ] with map
339 ] unit-test
340
341
342 {
343     {
344         T{ timestamp { year 2020 } { month 2 } { day 1 } }
345         T{ timestamp { year 2020 } { month 2 } { day 8 } }
346         T{ timestamp { year 2020 } { month 2 } { day 15 } }
347         T{ timestamp { year 2020 } { month 2 } { day 22 } }
348         T{ timestamp { year 2020 } { month 2 } { day 29 } }
349     }
350 } [
351     2020 february gmt 5 <iota> [ saturday-of-month ] with map
352 ] unit-test
353
354
355 ! 5th monday of dec 2020 is in january, why not
356 {
357     {
358         T{ timestamp { year 2020 } { month 12 } { day 7 } }
359         T{ timestamp { year 2020 } { month 12 } { day 14 } }
360         T{ timestamp { year 2020 } { month 12 } { day 21 } }
361         T{ timestamp { year 2020 } { month 12 } { day 28 } }
362         T{ timestamp { year 2021 } { month 1 } { day 4 } }
363     }
364 } [
365     2020 december gmt 5 <iota> [ monday-of-month ] with map
366 ] unit-test
367
368 { t } [
369     now [ start-of-year ] [ end-of-year ] bi same-year?
370 ] unit-test
371
372 { t } [
373     now [ start-of-month ] [ end-of-month ] bi same-month?
374 ] unit-test
375
376 { t } [
377     now [ first-day-of-month ] [ last-day-of-month ] bi same-month?
378 ] unit-test
379
380 ! XXX: Different algorithm for start/end of week and week number
381 ! { t } [
382 !     now [ start-of-week ] [ end-of-week ] bi same-week?
383 ! ] unit-test
384
385 { t } [
386     now [ start-of-day ] [ end-of-day ] bi same-day?
387 ] unit-test
388
389 { t } [
390     now [ start-of-hour ] [ end-of-hour ] bi same-hour?
391 ] unit-test
392
393 { t } [
394     now [ start-of-minute ] [ end-of-minute ] bi same-minute?
395 ] unit-test
396
397 { t } [
398     now [ start-of-second ] [ end-of-second ] bi same-second?
399 ] unit-test
400
401 ! Clone things by default
402 { f }
403 [
404     now [ start-of-year ] [ end-of-year ] bi
405     [ month>> ] bi@ =
406 ] unit-test
407
408 { f } [
409     now [ first-day-of-month ] [ last-day-of-month ] bi
410     [ day>> ] bi@ =
411 ] unit-test
412
413
414 { f } [
415     now [ first-day-of-decade ] [ last-day-of-decade ] bi
416     [ year>> ] bi@ =
417 ] unit-test
418
419
420 { f } [
421     now [ start-of-millennium ] [ end-of-millennium ] bi
422     [ year>> ] bi@ =
423 ] unit-test
424
425 { f } [
426     now [ start-of-year ] [ end-of-year ] bi same-day?
427 ] unit-test
428
429 { f } [
430     now [ start-of-year ] [ end-of-year ] bi same-day-of-year?
431 ] unit-test
432
433
434 { t } [ 1999 1 1 <date> 2000 1 1 <date> same-day-of-year? ] unit-test
435 { f } [ 1999 1 1 <date> 2000 1 1 <date> same-day? ] unit-test
436 { t } [
437     2000 1 1 <date> 4 >>hour
438     2000 1 1 <date> same-day?
439 ] unit-test