]> gitweb.factorcode.org Git - factor.git/blob - basis/calendar/calendar-tests.factor
calendar: cleanup some of the API by making words mutate timestamps.
[factor.git] / basis / calendar / calendar-tests.factor
1 USING: accessors grouping kernel math math.order math.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 { +eq+ } [ 2004 1 1 13 30 0 instant <timestamp>
134         2004 1 1 12 30 0 -1 hours <timestamp> <=> ] unit-test
135
136 { +gt+ } [ 2004 1 1 13 30 0 instant <timestamp>
137         2004 1 1 12 30 0 instant <timestamp> <=> ] unit-test
138
139 { +lt+ } [ 2004 1 1 12 30 0 instant <timestamp>
140         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
141
142 { +gt+ } [ 2005 1 1 12 30 0 instant <timestamp>
143         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
144
145 { t } [ 0 micros>timestamp unix-1970 = ] unit-test
146 { t } [ 123456789000000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
147 { t } [ 123456789123456000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
148
149 : checktime+ ( duration -- ? ) now dup clone [ rot time+ drop ] keep = ;
150
151 { t } [ 5 seconds checktime+ ] unit-test
152
153 { t } [ 5 minutes checktime+ ] unit-test
154
155 { t } [ 5 hours checktime+ ] unit-test
156
157 { t } [ 5 days checktime+ ] unit-test
158
159 { t } [ 5 weeks checktime+ ] unit-test
160
161 { t } [ 5 months checktime+ ] unit-test
162
163 { t } [ 5 years checktime+ ] unit-test
164
165 { t } [ now 50 milliseconds sleep now before? ] unit-test
166 { t } [ now 50 milliseconds sleep now swap after? ] unit-test
167 { t } [ now 50 milliseconds sleep now 50 milliseconds sleep now swapd between? ] unit-test
168
169 { 4 12 } [ 2009 easter [ month>> ] [ day>> ] bi ] unit-test
170 { 4 2 } [ 1961 easter [ month>> ] [ day>> ] bi ] unit-test
171
172 { t } [ 1325376000 unix-time>timestamp 2012 <year-gmt> = ] unit-test
173 { t } [ 1356998399 unix-time>timestamp 2013 <year-gmt> 1 seconds time- = ] unit-test
174
175 { t } [ 1500000000 random [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test
176
177 { t } [
178     2009 1 29 <date> 1 months time+
179     2009 3 1 <date> =
180 ] unit-test
181
182 { t } [
183     2008 1 29 <date> 1 months time+
184     2008 2 29 <date> =
185 ] unit-test
186
187 { t } [
188     2020 <year-gmt> dup 10000 >>second [ >gmt ] bi@ eq?
189 ] unit-test
190
191 { 0 }
192 [ now-gmt gmt-offset>> duration>seconds ] unit-test
193
194 ! am
195 [ now 30 am ] [ not-in-interval? ] must-fail-with
196
197 ! pm
198 [ now 30 pm ] [ not-in-interval? ] must-fail-with
199
200 { 1 } [ 2018 12 31 <date> week-number ] unit-test
201
202 { 16 } [ 2019 4 17 <date> week-number ] unit-test
203
204 { 53 } [ 2021 1 1 <date> week-number ] unit-test
205
206 { 53 } [ 2004 weeks-in-week-year ] unit-test
207 { 52 } [ 2013 weeks-in-week-year ] unit-test
208
209 {
210     T{ timestamp { year 2019 } { month 11 } { day 4 } }
211 } [ 2019 308 year-ordinal>timestamp >gmt midnight ] unit-test
212
213 {
214     T{ timestamp { year 2020 } { month 11 } { day 3 } }
215 } [ 2020 308 year-ordinal>timestamp >gmt midnight ] unit-test
216
217 {
218     T{ timestamp { year 2019 } { month 12 } { day 31 } }
219 } [ 2019 365 year-ordinal>timestamp >gmt midnight ] unit-test
220
221 {
222     T{ timestamp { year 2020 } { month 12 } { day 31 } }
223 } [ 2020 366 year-ordinal>timestamp >gmt midnight ] unit-test
224
225 { t } [
226     2020 <year> timestamp>year-dates-gmt
227     [ >date< ymd>ordinal ] map [ < ] monotonic?
228 ] unit-test
229
230 { t } [
231     1999 2025 [a,b] [
232         <year> timestamp>year-dates-gmt
233         [ >date< ymd>ordinal ] map [ < ] monotonic?
234     ] map [ ] all?
235 ] unit-test
236
237 { t } [
238     1999 2025 [a,b] [
239         <year-gmt> timestamp>year-dates-gmt
240         [ >date< ymd>ordinal ] map [ < ] monotonic?
241     ] map [ ] all?
242 ] unit-test
243
244 { 136 } [ 2014 1 10 <date>  2014 7 20 <date>  weekdays-between ] unit-test
245 { 137 } [ 2014 1 10 <date>  2014 7 21 <date>  weekdays-between ] unit-test
246 { 138 } [ 2014 1 10 <date>  2014 7 22 <date>  weekdays-between ] unit-test
247 { 139 } [ 2014 1 10 <date>  2014 7 23 <date>  weekdays-between ] unit-test
248 { 140 } [ 2014 1 10 <date>  2014 7 24 <date>  weekdays-between ] unit-test
249 { 141 } [ 2014 1 10 <date>  2014 7 25 <date>  weekdays-between ] unit-test
250 { 141 } [ 2014 1 10 <date>  2014 7 26 <date>  weekdays-between ] unit-test
251 { 141 } [ 2014 1 10 <date>  2014 7 27 <date>  weekdays-between ] unit-test
252 { 142 } [ 2014 1 10 <date>  2014 7 28 <date>  weekdays-between ] unit-test
253 { 143 } [ 2014 1 10 <date>  2014 7 29 <date>  weekdays-between ] unit-test
254 { 144 } [ 2014 1 10 <date>  2014 7 30 <date>  weekdays-between ] unit-test
255 { 145 } [ 2014 1 10 <date>  2014 7 31 <date>  weekdays-between ] unit-test
256 { 146 } [ 2014 1 10 <date>  2014 8 1 <date>  weekdays-between ] unit-test
257 { 146 } [ 2014 1 10 <date>  2014 8 2 <date>  weekdays-between ] unit-test
258 { 146 } [ 2014 1 10 <date>  2014 8 3 <date>  weekdays-between ] unit-test
259 { 147 } [ 2014 1 10 <date>  2014 8 4 <date>  weekdays-between ] unit-test
260 { 148 } [ 2014 1 10 <date>  2014 8 5 <date>  weekdays-between ] unit-test
261 { 149 } [ 2014 1 10 <date>  2014 8 6 <date>  weekdays-between ] unit-test
262 { 150 } [ 2014 1 10 <date>  2014 8 7 <date>  weekdays-between ] unit-test
263 { 151 } [ 2014 1 10 <date>  2014 8 8 <date>  weekdays-between ] unit-test
264 { 151 } [ 2014 1 10 <date>  2014 8 9 <date>  weekdays-between ] unit-test
265 { 151 } [ 2014 1 10 <date>  2014 8 10 <date>  weekdays-between ] unit-test
266
267
268 { t } [
269     2014 1 1 <date-gmt>
270     2014 <year-gmt> timestamp>year-dates-gmt
271     [ weekdays-between ] with map [ <= ] monotonic?
272 ] unit-test
273
274 { t } [
275     2020 1 1 <date-gmt>
276     2020 <year-gmt> timestamp>year-dates-gmt
277     [ weekdays-between ] with map [ <= ] monotonic?
278 ] unit-test
279
280 { t } [
281     2014 1 1 <date-gmt>
282     2014 <year-gmt> timestamp>year-dates-gmt
283     [ weekdays-between ] with map
284     dup 1 tail swap v- [ 1 <= ] all?
285 ] unit-test
286
287 { t } [
288     2020 1 1 <date-gmt>
289     2020 <year-gmt> timestamp>year-dates-gmt
290     [ weekdays-between ] with map
291     dup 1 tail swap v- [ 1 <= ] all?
292 ] unit-test
293
294 { 0 } [
295     2014 1 1 <date-gmt>
296     2014 <year-gmt> timestamp>year-dates-gmt
297     [ weekdays-between2 ] with map
298
299     2014 1 1 <date-gmt>
300     2014 <year-gmt> timestamp>year-dates-gmt
301     [ weekdays-between ] with map
302
303     v- sum
304 ] unit-test
305
306 {
307     {
308         T{ timestamp { year 2020 } { month 3 } { day 1 } }
309         T{ timestamp { year 2020 } { month 3 } { day 8 } }
310         T{ timestamp { year 2020 } { month 3 } { day 15 } }
311         T{ timestamp { year 2020 } { month 3 } { day 22 } }
312         T{ timestamp { year 2020 } { month 3 } { day 29 } }
313     }
314 } [
315     2020 march gmt 5 <iota> [ sunday-of-month ] with map
316 ] unit-test
317
318
319 {
320     {
321         T{ timestamp { year 2020 } { month 2 } { day 1 } }
322         T{ timestamp { year 2020 } { month 2 } { day 8 } }
323         T{ timestamp { year 2020 } { month 2 } { day 15 } }
324         T{ timestamp { year 2020 } { month 2 } { day 22 } }
325         T{ timestamp { year 2020 } { month 2 } { day 29 } }
326     }
327 } [
328     2020 february gmt 5 <iota> [ saturday-of-month ] with map
329 ] unit-test
330
331
332 ! 5th monday of dec 2020 is in january, why not
333 {
334     {
335         T{ timestamp { year 2020 } { month 12 } { day 7 } }
336         T{ timestamp { year 2020 } { month 12 } { day 14 } }
337         T{ timestamp { year 2020 } { month 12 } { day 21 } }
338         T{ timestamp { year 2020 } { month 12 } { day 28 } }
339         T{ timestamp { year 2021 } { month 1 } { day 4 } }
340     }
341 } [
342     2020 december gmt 5 <iota> [ monday-of-month ] with map
343 ] unit-test