]> gitweb.factorcode.org Git - factor.git/blob - basis/calendar/calendar-tests.factor
Reformat
[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 { t } [ 2014 1 10 <date> weekday? ] unit-test
291 { f } [ 2014 1 10 <date> weekend? ] unit-test
292
293 { t } [ 2014 1 11 <date> weekend? ] unit-test
294 { f } [ 2014 1 11 <date> weekday? ] unit-test
295
296
297 { t } [
298     2014 1 1 <date-gmt>
299     2014 <year-gmt> timestamp>year-dates-gmt
300     [ weekdays-between ] with map [ <= ] monotonic?
301 ] unit-test
302
303 { t } [
304     2020 1 1 <date-gmt>
305     2020 <year-gmt> timestamp>year-dates-gmt
306     [ weekdays-between ] with map [ <= ] monotonic?
307 ] unit-test
308
309 { t } [
310     2014 1 1 <date-gmt>
311     2014 <year-gmt> timestamp>year-dates-gmt
312     [ weekdays-between ] with map
313     dup 1 tail swap v- [ 1 <= ] all?
314 ] unit-test
315
316 { t } [
317     2020 1 1 <date-gmt>
318     2020 <year-gmt> timestamp>year-dates-gmt
319     [ weekdays-between ] with map
320     dup 1 tail swap v- [ 1 <= ] all?
321 ] unit-test
322
323 {
324     {
325         T{ timestamp { year 2020 } { month 3 } { day 1 } }
326         T{ timestamp { year 2020 } { month 3 } { day 8 } }
327         T{ timestamp { year 2020 } { month 3 } { day 15 } }
328         T{ timestamp { year 2020 } { month 3 } { day 22 } }
329         T{ timestamp { year 2020 } { month 3 } { day 29 } }
330     }
331 } [
332     2020 march gmt 5 <iota> [ sunday-of-month ] with map
333 ] unit-test
334
335
336 {
337     {
338         T{ timestamp { year 2020 } { month 2 } { day 1 } }
339         T{ timestamp { year 2020 } { month 2 } { day 8 } }
340         T{ timestamp { year 2020 } { month 2 } { day 15 } }
341         T{ timestamp { year 2020 } { month 2 } { day 22 } }
342         T{ timestamp { year 2020 } { month 2 } { day 29 } }
343     }
344 } [
345     2020 february gmt 5 <iota> [ saturday-of-month ] with map
346 ] unit-test
347
348
349 ! 5th monday of dec 2020 is in january, why not
350 {
351     {
352         T{ timestamp { year 2020 } { month 12 } { day 7 } }
353         T{ timestamp { year 2020 } { month 12 } { day 14 } }
354         T{ timestamp { year 2020 } { month 12 } { day 21 } }
355         T{ timestamp { year 2020 } { month 12 } { day 28 } }
356         T{ timestamp { year 2021 } { month 1 } { day 4 } }
357     }
358 } [
359     2020 december gmt 5 <iota> [ monday-of-month ] with map
360 ] unit-test
361
362 { t } [
363     now [ start-of-year ] [ end-of-year ] bi same-year?
364 ] unit-test
365
366 { t } [
367     now [ start-of-month ] [ end-of-month ] bi same-month?
368 ] unit-test
369
370 { t } [
371     now [ first-day-of-month ] [ last-day-of-month ] bi same-month?
372 ] unit-test
373
374 ! XXX: Different algorithm for start/end of week and week number
375 ! { t } [
376 !     now [ start-of-week ] [ end-of-week ] bi same-week?
377 ! ] unit-test
378
379 { t } [
380     now [ start-of-day ] [ end-of-day ] bi same-day?
381 ] unit-test
382
383 { t } [
384     now [ start-of-hour ] [ end-of-hour ] bi same-hour?
385 ] unit-test
386
387 { t } [
388     now [ start-of-minute ] [ end-of-minute ] bi same-minute?
389 ] unit-test
390
391 { t } [
392     now [ start-of-second ] [ end-of-second ] bi same-second?
393 ] unit-test
394
395 ! Clone things by default
396 { f }
397 [
398     now [ start-of-year ] [ end-of-year ] bi
399     [ month>> ] bi@ =
400 ] unit-test
401
402 { f } [
403     now [ first-day-of-month ] [ last-day-of-month ] bi
404     [ day>> ] bi@ =
405 ] unit-test
406
407
408 { f } [
409     now [ first-day-of-decade ] [ last-day-of-decade ] bi
410     [ year>> ] bi@ =
411 ] unit-test
412
413
414 { f } [
415     now [ start-of-millennium ] [ end-of-millennium ] bi
416     [ year>> ] bi@ =
417 ] unit-test
418
419 { f } [
420     now [ start-of-year ] [ end-of-year ] bi same-day?
421 ] unit-test
422
423 { f } [
424     now [ start-of-year ] [ end-of-year ] bi same-day-of-year?
425 ] unit-test
426
427
428 { t } [ 1999 1 1 <date> 2000 1 1 <date> same-day-of-year? ] unit-test
429 { f } [ 1999 1 1 <date> 2000 1 1 <date> same-day? ] unit-test
430 { t } [
431     2000 1 1 <date> 4 >>hour
432     2000 1 1 <date> same-day?
433 ] unit-test
434
435 {
436     T{ timestamp { year 2023 } { month 4 } { day 9 } }
437     T{ timestamp
438         { year 2023 }
439         { month 4 }
440         { day 15 }
441         { hour 23 }
442         { minute 59 }
443         { second 59+999/1000 }
444     }
445 } [ 2023 4 13 <date-gmt> start-of-week dup end-of-week ] unit-test
446
447 {
448     T{ timestamp
449         { year 2024 }
450         { month 2 }
451         { day 15 }
452         { hour 7 }
453     }
454 } [ 2024 02 15 <date-gmt> 48.87 2.67 sunrise >gmt ] unit-test
455
456 {
457     T{ timestamp
458         { year 2024 }
459         { month 2 }
460         { day 15 }
461         { hour 17 }
462         { minute 7 }
463     }
464 } [ 2024 02 15 <date-gmt> 48.87 2.67 sunset >gmt ] unit-test