blob: 93f1d46b0563de1d5398a2339744c9f1de8ff2b2 [file] [log] [blame]
niemeyer68ae2752003-09-28 01:20:02 +00001#!/usr/bin/python
2import unittest
3from cStringIO import StringIO
4import base64
5import os
6
7# Add build directory to search path
8if os.path.exists("build"):
9 from distutils.util import get_platform
10 import sys
11 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
12 s = os.path.join(os.getcwd(), s)
13 sys.path.insert(0,s)
14
15from dateutil.relativedelta import *
16from dateutil.parser import *
17from dateutil.easter import *
niemeyercb08a352003-10-08 06:02:06 +000018from dateutil.rrule import *
niemeyer68ae2752003-09-28 01:20:02 +000019from dateutil.tz import *
20
21from datetime import *
22
23import calendar
24import time
25
26class RelativeDeltaTest(unittest.TestCase):
27 now = datetime(2003, 9, 17, 20, 54, 47, 282310)
28 today = date(2003, 9, 17)
29
30 def testNextMonth(self):
31 self.assertEqual(self.now+relativedelta(months=+1),
32 datetime(2003, 10, 17, 20, 54, 47, 282310))
33
34 def testNextMonthPlusOneWeek(self):
35 self.assertEqual(self.now+relativedelta(months=+1, weeks=+1),
36 datetime(2003, 10, 24, 20, 54, 47, 282310))
37 def testNextMonthPlusOneWeek10am(self):
38 self.assertEqual(self.today +
39 relativedelta(months=+1, weeks=+1, hour=10),
40 datetime(2003, 10, 24, 10, 0))
41
42 def testNextMonthPlusOneWeek10amDiff(self):
43 self.assertEqual(relativedelta(datetime(2003, 10, 24, 10, 0),
44 self.today),
45 relativedelta(months=+1, days=+7, hours=+10))
46
47 def testOneMonthBeforeOneYear(self):
48 self.assertEqual(self.now+relativedelta(years=+1, months=-1),
49 datetime(2004, 8, 17, 20, 54, 47, 282310))
50
51 def testMonthsOfDiffNumOfDays(self):
52 self.assertEqual(date(2003, 1, 27)+relativedelta(months=+1),
53 date(2003, 2, 27))
54 self.assertEqual(date(2003, 1, 31)+relativedelta(months=+1),
55 date(2003, 2, 28))
56 self.assertEqual(date(2003, 1, 31)+relativedelta(months=+2),
57 date(2003, 3, 31))
58
59 def testMonthsOfDiffNumOfDaysWithYears(self):
60 self.assertEqual(date(2000, 2, 28)+relativedelta(years=+1),
61 date(2001, 2, 28))
62 self.assertEqual(date(2000, 2, 29)+relativedelta(years=+1),
63 date(2001, 2, 28))
64
65 self.assertEqual(date(1999, 2, 28)+relativedelta(years=+1),
66 date(2000, 2, 28))
67 self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
68 date(2000, 3, 1))
69 self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
70 date(2000, 3, 1))
71
72 self.assertEqual(date(2001, 2, 28)+relativedelta(years=-1),
73 date(2000, 2, 28))
74 self.assertEqual(date(2001, 3, 1)+relativedelta(years=-1),
75 date(2000, 3, 1))
76
77 def testNextFriday(self):
niemeyerb47d12a2003-09-29 20:00:21 +000078 self.assertEqual(self.today+relativedelta(weekday=FR),
79 date(2003, 9, 19))
80
81 def testNextFridayInt(self):
82 self.assertEqual(self.today+relativedelta(weekday=calendar.FRIDAY),
niemeyer68ae2752003-09-28 01:20:02 +000083 date(2003, 9, 19))
84
85 def testLastFridayInThisMonth(self):
niemeyerb47d12a2003-09-29 20:00:21 +000086 self.assertEqual(self.today+relativedelta(day=31, weekday=FR(-1)),
niemeyer68ae2752003-09-28 01:20:02 +000087 date(2003, 9, 26))
88
89 def testNextWednesdayIsToday(self):
niemeyerb47d12a2003-09-29 20:00:21 +000090 self.assertEqual(self.today+relativedelta(weekday=WE),
niemeyer68ae2752003-09-28 01:20:02 +000091 date(2003, 9, 17))
92
93
94 def testNextWenesdayNotToday(self):
niemeyerb47d12a2003-09-29 20:00:21 +000095 self.assertEqual(self.today+relativedelta(days=+1, weekday=WE),
niemeyer68ae2752003-09-28 01:20:02 +000096 date(2003, 9, 24))
97
98 def test15thISOYearWeek(self):
99 self.assertEqual(date(2003, 1, 1) +
niemeyerb47d12a2003-09-29 20:00:21 +0000100 relativedelta(day=4, weeks=+14, weekday=MO(-1)),
niemeyer68ae2752003-09-28 01:20:02 +0000101 date(2003, 4, 7))
102
103 def testMillenniumAge(self):
104 self.assertEqual(relativedelta(self.now, date(2001,1,1)),
105 relativedelta(years=+2, months=+8, days=+16,
106 hours=+20, minutes=+54, seconds=+47,
107 microseconds=+282310))
108
109 def testJohnAge(self):
110 self.assertEqual(relativedelta(self.now,
111 datetime(1978, 4, 5, 12, 0)),
112 relativedelta(years=+25, months=+5, days=+12,
113 hours=+8, minutes=+54, seconds=+47,
114 microseconds=+282310))
115
116 def testJohnAgeWithDate(self):
117 self.assertEqual(relativedelta(self.today,
118 datetime(1978, 4, 5, 12, 0)),
119 relativedelta(years=+25, months=+5, days=+11,
120 hours=+12))
121
122 def testYearDay(self):
123 self.assertEqual(date(2003, 1, 1)+relativedelta(yearday=260),
124 date(2003, 9, 17))
125 self.assertEqual(date(2002, 1, 1)+relativedelta(yearday=260),
126 date(2002, 9, 17))
127 self.assertEqual(date(2000, 1, 1)+relativedelta(yearday=260),
128 date(2000, 9, 16))
129 self.assertEqual(self.today+relativedelta(yearday=261),
130 date(2003, 9, 18))
131
132 def testNonLeapYearDay(self):
133 self.assertEqual(date(2003, 1, 1)+relativedelta(nlyearday=260),
134 date(2003, 9, 17))
135 self.assertEqual(date(2002, 1, 1)+relativedelta(nlyearday=260),
136 date(2002, 9, 17))
137 self.assertEqual(date(2000, 1, 1)+relativedelta(nlyearday=260),
138 date(2000, 9, 17))
139 self.assertEqual(self.today+relativedelta(yearday=261),
140 date(2003, 9, 18))
141
niemeyercb08a352003-10-08 06:02:06 +0000142class RRuleTest(unittest.TestCase):
143
144 def testYearly(self):
145 self.assertEqual(list(rrule(FREQ_YEARLY,
146 count=3,
147 dtstart=parse("19970902T090000"))),
148 [datetime(1997, 9, 2, 9, 0),
149 datetime(1998, 9, 2, 9, 0),
150 datetime(1999, 9, 2, 9, 0)])
151
152 def testStrYearly(self):
153 self.assertEqual(list(rrulestr("""
154 DTSTART:19970902T090000
155 RRULE:FREQ=YEARLY;COUNT=3
156 """)),
157 [datetime(1997, 9, 2, 9, 0),
158 datetime(1998, 9, 2, 9, 0),
159 datetime(1999, 9, 2, 9, 0)])
160
161 def testYearlyInterval(self):
162 self.assertEqual(list(rrule(FREQ_YEARLY,
163 count=3,
164 interval=2,
165 dtstart=parse("19970902T090000"))),
166 [datetime(1997, 9, 2, 9, 0),
167 datetime(1999, 9, 2, 9, 0),
168 datetime(2001, 9, 2, 9, 0)])
169
170 def testYearlyIntervalLarge(self):
171 self.assertEqual(list(rrule(FREQ_YEARLY,
172 count=3,
173 interval=100,
174 dtstart=parse("19970902T090000"))),
175 [datetime(1997, 9, 2, 9, 0),
176 datetime(2097, 9, 2, 9, 0),
177 datetime(2197, 9, 2, 9, 0)])
178
179 def testYearlyByMonth(self):
180 self.assertEqual(list(rrule(FREQ_YEARLY,
181 count=3,
182 bymonth=(1,3),
183 dtstart=parse("19970902T090000"))),
184 [datetime(1998, 1, 2, 9, 0),
185 datetime(1998, 3, 2, 9, 0),
186 datetime(1999, 1, 2, 9, 0)])
187
188 def testYearlyByMonthDay(self):
189 self.assertEqual(list(rrule(FREQ_YEARLY,
190 count=3,
191 bymonthday=(1,3),
192 dtstart=parse("19970902T090000"))),
193 [datetime(1997, 9, 3, 9, 0),
194 datetime(1997, 10, 1, 9, 0),
195 datetime(1997, 10, 3, 9, 0)])
196
197 def testYearlyByMonthAndMonthDay(self):
198 self.assertEqual(list(rrule(FREQ_YEARLY,
199 count=3,
200 bymonth=(1,3),
201 bymonthday=(5,7),
202 dtstart=parse("19970902T090000"))),
203 [datetime(1998, 1, 5, 9, 0),
204 datetime(1998, 1, 7, 9, 0),
205 datetime(1998, 3, 5, 9, 0)])
206
207 def testYearlyByWeekDay(self):
208 self.assertEqual(list(rrule(FREQ_YEARLY,
209 count=3,
210 byweekday=(TU,TH),
211 dtstart=parse("19970902T090000"))),
212 [datetime(1997, 9, 2, 9, 0),
213 datetime(1997, 9, 4, 9, 0),
214 datetime(1997, 9, 9, 9, 0)])
215
216 def testYearlyByMonthAndWeekDay(self):
217 self.assertEqual(list(rrule(FREQ_YEARLY,
218 count=3,
219 bymonth=(1,3),
220 byweekday=(TU,TH),
221 dtstart=parse("19970902T090000"))),
222 [datetime(1998, 1, 1, 9, 0),
223 datetime(1998, 1, 6, 9, 0),
224 datetime(1998, 1, 8, 9, 0)])
225
226 def testMonthly(self):
227 self.assertEqual(list(rrule(FREQ_MONTHLY,
228 count=3,
229 dtstart=parse("19970902T090000"))),
230 [datetime(1997, 9, 2, 9, 0),
231 datetime(1997, 10, 2, 9, 0),
232 datetime(1997, 11, 2, 9, 0)])
233
234 def testStrMonthly(self):
235 self.assertEqual(list(rrulestr("""
236 DTSTART:19970902T090000
237 RRULE:FREQ=MONTHLY;COUNT=3
238 """)),
239 [datetime(1997, 9, 2, 9, 0),
240 datetime(1997, 10, 2, 9, 0),
241 datetime(1997, 11, 2, 9, 0)])
242
243 def testMonthlyInterval(self):
244 self.assertEqual(list(rrule(FREQ_MONTHLY,
245 count=3,
246 interval=2,
247 dtstart=parse("19970902T090000"))),
248 [datetime(1997, 9, 2, 9, 0),
249 datetime(1997, 11, 2, 9, 0),
250 datetime(1998, 1, 2, 9, 0)])
251
252 def testMonthlyIntervalLarge(self):
253 self.assertEqual(list(rrule(FREQ_MONTHLY,
254 count=3,
255 interval=18,
256 dtstart=parse("19970902T090000"))),
257 [datetime(1997, 9, 2, 9, 0),
258 datetime(1999, 3, 2, 9, 0),
259 datetime(2000, 9, 2, 9, 0)])
260
261 def testMonthlyByMonth(self):
262 self.assertEqual(list(rrule(FREQ_MONTHLY,
263 count=3,
264 bymonth=(1,3),
265 dtstart=parse("19970902T090000"))),
266 [datetime(1998, 1, 2, 9, 0),
267 datetime(1998, 3, 2, 9, 0),
268 datetime(1999, 1, 2, 9, 0)])
269
270
271 def testMonthlyByMonthDay(self):
272 self.assertEqual(list(rrule(FREQ_MONTHLY,
273 count=3,
274 bymonthday=(1,3),
275 dtstart=parse("19970902T090000"))),
276 [datetime(1997, 9, 3, 9, 0),
277 datetime(1997, 10, 1, 9, 0),
278 datetime(1997, 10, 3, 9, 0)])
279
280 def testMonthlyByMonthAndMonthDay(self):
281 self.assertEqual(list(rrule(FREQ_MONTHLY,
282 count=3,
283 bymonth=(1,3),
284 bymonthday=(5,7),
285 dtstart=parse("19970902T090000"))),
286 [datetime(1998, 1, 5, 9, 0),
287 datetime(1998, 1, 7, 9, 0),
288 datetime(1998, 3, 5, 9, 0)])
289
290 def testMonthlyByWeekDay(self):
291 self.assertEqual(list(rrule(FREQ_MONTHLY,
292 count=3,
293 byweekday=(TU,TH),
294 dtstart=parse("19970902T090000"))),
295 [datetime(1997, 9, 2, 9, 0),
296 datetime(1997, 9, 4, 9, 0),
297 datetime(1997, 9, 9, 9, 0)])
298
299 def testMonthlyByMonthAndWeekDay(self):
300 self.assertEqual(list(rrule(FREQ_MONTHLY,
301 count=3,
302 bymonth=(1,3),
303 byweekday=(TU,TH),
304 dtstart=parse("19970902T090000"))),
305 [datetime(1998, 1, 1, 9, 0),
306 datetime(1998, 1, 6, 9, 0),
307 datetime(1998, 1, 8, 9, 0)])
308
309 def testWeekly(self):
310 self.assertEqual(list(rrule(FREQ_WEEKLY,
311 count=3,
312 dtstart=parse("19970902T090000"))),
313 [datetime(1997, 9, 2, 9, 0),
314 datetime(1997, 9, 9, 9, 0),
315 datetime(1997, 9, 16, 9, 0)])
316
317 def testStrWeekly(self):
318 self.assertEqual(list(rrulestr("""
319 DTSTART:19970902T090000
320 RRULE:FREQ=WEEKLY;COUNT=3
321 """)),
322 [datetime(1997, 9, 2, 9, 0),
323 datetime(1997, 9, 9, 9, 0),
324 datetime(1997, 9, 16, 9, 0)])
325
326 def testWeeklyInterval(self):
327 self.assertEqual(list(rrule(FREQ_WEEKLY,
328 count=3,
329 interval=2,
330 dtstart=parse("19970902T090000"))),
331 [datetime(1997, 9, 2, 9, 0),
332 datetime(1997, 9, 16, 9, 0),
333 datetime(1997, 9, 30, 9, 0)])
334
335 def testWeeklyIntervalLarge(self):
336 self.assertEqual(list(rrule(FREQ_WEEKLY,
337 count=3,
338 interval=20,
339 dtstart=parse("19970902T090000"))),
340 [datetime(1997, 9, 2, 9, 0),
341 datetime(1998, 1, 20, 9, 0),
342 datetime(1998, 6, 9, 9, 0)])
343
344 def testWeeklyByMonth(self):
345 self.assertEqual(list(rrule(FREQ_WEEKLY,
346 count=3,
347 bymonth=(1,3),
348 dtstart=parse("19970902T090000"))),
349 [datetime(1998, 1, 6, 9, 0),
350 datetime(1998, 1, 13, 9, 0),
351 datetime(1998, 1, 20, 9, 0)])
352
353 def testWeeklyByMonthDay(self):
354 self.assertEqual(list(rrule(FREQ_WEEKLY,
355 count=3,
356 bymonthday=(1,3),
357 dtstart=parse("19970902T090000"))),
358 [datetime(1997, 9, 3, 9, 0),
359 datetime(1997, 10, 1, 9, 0),
360 datetime(1997, 10, 3, 9, 0)])
361
362 def testWeeklyByMonthAndMonthDay(self):
363 self.assertEqual(list(rrule(FREQ_WEEKLY,
364 count=3,
365 bymonth=(1,3),
366 bymonthday=(5,7),
367 dtstart=parse("19970902T090000"))),
368 [datetime(1998, 1, 5, 9, 0),
369 datetime(1998, 1, 7, 9, 0),
370 datetime(1998, 3, 5, 9, 0)])
371
372 def testWeeklyByWeekDay(self):
373 self.assertEqual(list(rrule(FREQ_WEEKLY,
374 count=3,
375 byweekday=(TU,TH),
376 dtstart=parse("19970902T090000"))),
377 [datetime(1997, 9, 2, 9, 0),
378 datetime(1997, 9, 4, 9, 0),
379 datetime(1997, 9, 9, 9, 0)])
380
381 def testWeeklyByMonthAndWeekDay(self):
382 # This test is interesting, because it crosses the year
383 # boundary in a weekly period to find day '1' as a
384 # valid recurrence.
385 self.assertEqual(list(rrule(FREQ_WEEKLY,
386 count=3,
387 bymonth=(1,3),
388 byweekday=(TU,TH),
389 dtstart=parse("19970902T090000"))),
390 [datetime(1998, 1, 1, 9, 0),
391 datetime(1998, 1, 6, 9, 0),
392 datetime(1998, 1, 8, 9, 0)])
393
394 def testDaily(self):
395 self.assertEqual(list(rrule(FREQ_DAILY,
396 count=3,
397 dtstart=parse("19970902T090000"))),
398 [datetime(1997, 9, 2, 9, 0),
399 datetime(1997, 9, 3, 9, 0),
400 datetime(1997, 9, 4, 9, 0)])
401
402 def testStrDaily(self):
403 self.assertEqual(list(rrulestr("""
404 DTSTART:19970902T090000
405 RRULE:FREQ=DAILY;COUNT=3
406 """)),
407 [datetime(1997, 9, 2, 9, 0),
408 datetime(1997, 9, 3, 9, 0),
409 datetime(1997, 9, 4, 9, 0)])
410
411 def testDailyInterval(self):
412 self.assertEqual(list(rrule(FREQ_DAILY,
413 count=3,
414 interval=2,
415 dtstart=parse("19970902T090000"))),
416 [datetime(1997, 9, 2, 9, 0),
417 datetime(1997, 9, 4, 9, 0),
418 datetime(1997, 9, 6, 9, 0)])
419
420 def testDailyIntervalLarge(self):
421 self.assertEqual(list(rrule(FREQ_DAILY,
422 count=3,
423 interval=92,
424 dtstart=parse("19970902T090000"))),
425 [datetime(1997, 9, 2, 9, 0),
426 datetime(1997, 12, 3, 9, 0),
427 datetime(1998, 3, 5, 9, 0)])
428
429 def testDailyByMonth(self):
430 self.assertEqual(list(rrule(FREQ_DAILY,
431 count=3,
432 bymonth=(1,3),
433 dtstart=parse("19970902T090000"))),
434 [datetime(1998, 1, 1, 9, 0),
435 datetime(1998, 1, 2, 9, 0),
436 datetime(1998, 1, 3, 9, 0)])
437
438 def testDailyByMonthDay(self):
439 self.assertEqual(list(rrule(FREQ_DAILY,
440 count=3,
441 bymonthday=(1,3),
442 dtstart=parse("19970902T090000"))),
443 [datetime(1997, 9, 3, 9, 0),
444 datetime(1997, 10, 1, 9, 0),
445 datetime(1997, 10, 3, 9, 0)])
446
447 def testDailyByMonthAndMonthDay(self):
448 self.assertEqual(list(rrule(FREQ_DAILY,
449 count=3,
450 bymonth=(1,3),
451 bymonthday=(5,7),
452 dtstart=parse("19970902T090000"))),
453 [datetime(1998, 1, 5, 9, 0),
454 datetime(1998, 1, 7, 9, 0),
455 datetime(1998, 3, 5, 9, 0)])
456
457 def testDailyByWeekDay(self):
458 self.assertEqual(list(rrule(FREQ_DAILY,
459 count=3,
460 byweekday=(TU,TH),
461 dtstart=parse("19970902T090000"))),
462 [datetime(1997, 9, 2, 9, 0),
463 datetime(1997, 9, 4, 9, 0),
464 datetime(1997, 9, 9, 9, 0)])
465
466 def testDailyByMonthAndWeekDay(self):
467 self.assertEqual(list(rrule(FREQ_DAILY,
468 count=3,
469 bymonth=(1,3),
470 byweekday=(TU,TH),
471 dtstart=parse("19970902T090000"))),
472 [datetime(1998, 1, 1, 9, 0),
473 datetime(1998, 1, 6, 9, 0),
474 datetime(1998, 1, 8, 9, 0)])
475
476 def testHourly(self):
477 self.assertEqual(list(rrule(FREQ_HOURLY,
478 count=3,
479 dtstart=parse("19970902T090000"))),
480 [datetime(1997, 9, 2, 9, 0),
481 datetime(1997, 9, 2, 10, 0),
482 datetime(1997, 9, 2, 11, 0)])
483
484 def testStrHourly(self):
485 self.assertEqual(list(rrulestr("""
486 DTSTART:19970902T090000
487 RRULE:FREQ=HOURLY;COUNT=3
488 """)),
489 [datetime(1997, 9, 2, 9, 0),
490 datetime(1997, 9, 2, 10, 0),
491 datetime(1997, 9, 2, 11, 0)])
492
493 def testHourlyInterval(self):
494 self.assertEqual(list(rrule(FREQ_HOURLY,
495 count=3,
496 interval=2,
497 dtstart=parse("19970902T090000"))),
498 [datetime(1997, 9, 2, 9, 0),
499 datetime(1997, 9, 2, 11, 0),
500 datetime(1997, 9, 2, 13, 0)])
501
502 def testHourlyIntervalLarge(self):
503 self.assertEqual(list(rrule(FREQ_HOURLY,
504 count=3,
505 interval=769,
506 dtstart=parse("19970902T090000"))),
507 [datetime(1997, 9, 2, 9, 0),
508 datetime(1997, 10, 4, 10, 0),
509 datetime(1997, 11, 5, 11, 0)])
510
511 def testHourlyByMonth(self):
512 self.assertEqual(list(rrule(FREQ_HOURLY,
513 count=3,
514 bymonth=(1,3),
515 dtstart=parse("19970902T090000"))),
516 [datetime(1998, 1, 1, 0, 0),
517 datetime(1998, 1, 1, 1, 0),
518 datetime(1998, 1, 1, 2, 0)])
519
520 def testHourlyByMonthDay(self):
521 self.assertEqual(list(rrule(FREQ_HOURLY,
522 count=3,
523 bymonthday=(1,3),
524 dtstart=parse("19970902T090000"))),
525 [datetime(1997, 9, 3, 0, 0),
526 datetime(1997, 9, 3, 1, 0),
527 datetime(1997, 9, 3, 2, 0)])
528
529 def testHourlyByMonthAndMonthDay(self):
530 self.assertEqual(list(rrule(FREQ_HOURLY,
531 count=3,
532 bymonth=(1,3),
533 bymonthday=(5,7),
534 dtstart=parse("19970902T090000"))),
535 [datetime(1998, 1, 5, 0, 0),
536 datetime(1998, 1, 5, 1, 0),
537 datetime(1998, 1, 5, 2, 0)])
538
539 def testHourlyByWeekDay(self):
540 self.assertEqual(list(rrule(FREQ_HOURLY,
541 count=3,
542 byweekday=(TU,TH),
543 dtstart=parse("19970902T090000"))),
544 [datetime(1997, 9, 2, 9, 0),
545 datetime(1997, 9, 2, 10, 0),
546 datetime(1997, 9, 2, 11, 0)])
547
548 def testHourlyByMonthAndWeekDay(self):
549 self.assertEqual(list(rrule(FREQ_HOURLY,
550 count=3,
551 bymonth=(1,3),
552 byweekday=(TU,TH),
553 dtstart=parse("19970902T090000"))),
554 [datetime(1998, 1, 1, 0, 0),
555 datetime(1998, 1, 1, 1, 0),
556 datetime(1998, 1, 1, 2, 0)])
557
558 def testMinutely(self):
559 self.assertEqual(list(rrule(FREQ_MINUTELY,
560 count=3,
561 dtstart=parse("19970902T090000"))),
562 [datetime(1997, 9, 2, 9, 0),
563 datetime(1997, 9, 2, 9, 1),
564 datetime(1997, 9, 2, 9, 2)])
565
566 def testStrMinutely(self):
567 self.assertEqual(list(rrulestr("""
568 DTSTART:19970902T090000
569 RRULE:FREQ=MINUTELY;COUNT=3
570 """)),
571 [datetime(1997, 9, 2, 9, 0),
572 datetime(1997, 9, 2, 9, 1),
573 datetime(1997, 9, 2, 9, 2)])
574
575 def testMinutelyInterval(self):
576 self.assertEqual(list(rrule(FREQ_MINUTELY,
577 count=3,
578 interval=2,
579 dtstart=parse("19970902T090000"))),
580 [datetime(1997, 9, 2, 9, 0),
581 datetime(1997, 9, 2, 9, 2),
582 datetime(1997, 9, 2, 9, 4)])
583
584 def testMinutelyIntervalLarge(self):
585 self.assertEqual(list(rrule(FREQ_MINUTELY,
586 count=3,
587 interval=1501,
588 dtstart=parse("19970902T090000"))),
589 [datetime(1997, 9, 2, 9, 0),
590 datetime(1997, 9, 3, 10, 1),
591 datetime(1997, 9, 4, 11, 2)])
592
593 def testMinutelyByMonth(self):
594 self.assertEqual(list(rrule(FREQ_MINUTELY,
595 count=3,
596 bymonth=(1,3),
597 dtstart=parse("19970902T090000"))),
598 [datetime(1998, 1, 1, 0, 0),
599 datetime(1998, 1, 1, 0, 1),
600 datetime(1998, 1, 1, 0, 2)])
601
602 def testMinutelyByMonthDay(self):
603 self.assertEqual(list(rrule(FREQ_MINUTELY,
604 count=3,
605 bymonthday=(1,3),
606 dtstart=parse("19970902T090000"))),
607 [datetime(1997, 9, 3, 0, 0),
608 datetime(1997, 9, 3, 0, 1),
609 datetime(1997, 9, 3, 0, 2)])
610
611 def testMinutelyByMonthAndMonthDay(self):
612 self.assertEqual(list(rrule(FREQ_MINUTELY,
613 count=3,
614 bymonth=(1,3),
615 bymonthday=(5,7),
616 dtstart=parse("19970902T090000"))),
617 [datetime(1998, 1, 5, 0, 0),
618 datetime(1998, 1, 5, 0, 1),
619 datetime(1998, 1, 5, 0, 2)])
620
621 def testMinutelyByWeekDay(self):
622 self.assertEqual(list(rrule(FREQ_MINUTELY,
623 count=3,
624 byweekday=(TU,TH),
625 dtstart=parse("19970902T090000"))),
626 [datetime(1997, 9, 2, 9, 0),
627 datetime(1997, 9, 2, 9, 1),
628 datetime(1997, 9, 2, 9, 2)])
629
630 def testMinutelyByMonthAndWeekDay(self):
631 self.assertEqual(list(rrule(FREQ_MINUTELY,
632 count=3,
633 bymonth=(1,3),
634 byweekday=(TU,TH),
635 dtstart=parse("19970902T090000"))),
636 [datetime(1998, 1, 1, 0, 0),
637 datetime(1998, 1, 1, 0, 1),
638 datetime(1998, 1, 1, 0, 2)])
639
640 def testSecondly(self):
641 self.assertEqual(list(rrule(FREQ_SECONDLY,
642 count=3,
643 dtstart=parse("19970902T090000"))),
644 [datetime(1997, 9, 2, 9, 0, 0),
645 datetime(1997, 9, 2, 9, 0, 1),
646 datetime(1997, 9, 2, 9, 0, 2)])
647
648 def testStrSecondly(self):
649 self.assertEqual(list(rrulestr("""
650 DTSTART:19970902T090000
651 RRULE:FREQ=SECONDLY;COUNT=3
652 """)),
653 [datetime(1997, 9, 2, 9, 0, 0),
654 datetime(1997, 9, 2, 9, 0, 1),
655 datetime(1997, 9, 2, 9, 0, 2)])
656
657 def testSecondlyInterval(self):
658 self.assertEqual(list(rrule(FREQ_SECONDLY,
659 count=3,
660 interval=2,
661 dtstart=parse("19970902T090000"))),
662 [datetime(1997, 9, 2, 9, 0, 0),
663 datetime(1997, 9, 2, 9, 0, 2),
664 datetime(1997, 9, 2, 9, 0, 4)])
665
666 def testSecondlyIntervalLarge(self):
667 self.assertEqual(list(rrule(FREQ_SECONDLY,
668 count=3,
669 interval=90061,
670 dtstart=parse("19970902T090000"))),
671 [datetime(1997, 9, 2, 9, 0, 0),
672 datetime(1997, 9, 3, 10, 1, 1),
673 datetime(1997, 9, 4, 11, 2, 2)])
674
675 def testSecondlyByMonth(self):
676 self.assertEqual(list(rrule(FREQ_SECONDLY,
677 count=3,
678 bymonth=(1,3),
679 dtstart=parse("19970902T090000"))),
680 [datetime(1998, 1, 1, 0, 0, 0),
681 datetime(1998, 1, 1, 0, 0, 1),
682 datetime(1998, 1, 1, 0, 0, 2)])
683
684 def testSecondlyByMonthDay(self):
685 self.assertEqual(list(rrule(FREQ_SECONDLY,
686 count=3,
687 bymonthday=(1,3),
688 dtstart=parse("19970902T090000"))),
689 [datetime(1997, 9, 3, 0, 0, 0),
690 datetime(1997, 9, 3, 0, 0, 1),
691 datetime(1997, 9, 3, 0, 0, 2)])
692
693 def testSecondlyByMonthAndMonthDay(self):
694 self.assertEqual(list(rrule(FREQ_SECONDLY,
695 count=3,
696 bymonth=(1,3),
697 bymonthday=(5,7),
698 dtstart=parse("19970902T090000"))),
699 [datetime(1998, 1, 5, 0, 0, 0),
700 datetime(1998, 1, 5, 0, 0, 1),
701 datetime(1998, 1, 5, 0, 0, 2)])
702
703 def testSecondlyByWeekDay(self):
704 self.assertEqual(list(rrule(FREQ_SECONDLY,
705 count=3,
706 byweekday=(TU,TH),
707 dtstart=parse("19970902T090000"))),
708 [datetime(1997, 9, 2, 9, 0, 0),
709 datetime(1997, 9, 2, 9, 0, 1),
710 datetime(1997, 9, 2, 9, 0, 2)])
711
712 def testSecondlyByMonthAndWeekDay(self):
713 self.assertEqual(list(rrule(FREQ_SECONDLY,
714 count=3,
715 bymonth=(1,3),
716 byweekday=(TU,TH),
717 dtstart=parse("19970902T090000"))),
718 [datetime(1998, 1, 1, 0, 0, 0),
719 datetime(1998, 1, 1, 0, 0, 1),
720 datetime(1998, 1, 1, 0, 0, 2)])
721
722 def testUntilNotMatching(self):
723 self.assertEqual(list(rrule(FREQ_DAILY,
724 count=3,
725 dtstart=parse("19970902T090000"),
726 until=parse("19970905T080000"))),
727 [datetime(1997, 9, 2, 9, 0),
728 datetime(1997, 9, 3, 9, 0),
729 datetime(1997, 9, 4, 9, 0)])
730
731 def testUntilMatching(self):
732 self.assertEqual(list(rrule(FREQ_DAILY,
733 count=3,
734 dtstart=parse("19970902T090000"),
735 until=parse("19970904T090000"))),
736 [datetime(1997, 9, 2, 9, 0),
737 datetime(1997, 9, 3, 9, 0),
738 datetime(1997, 9, 4, 9, 0)])
739
740 def testUntilSingle(self):
741 self.assertEqual(list(rrule(FREQ_DAILY,
742 count=3,
743 dtstart=parse("19970902T090000"),
744 until=parse("19970902T090000"))),
745 [datetime(1997, 9, 2, 9, 0)])
746
747 def testUntilEmpty(self):
748 self.assertEqual(list(rrule(FREQ_DAILY,
749 count=3,
750 dtstart=parse("19970902T090000"),
751 until=parse("19970901T090000"))),
752 [])
753
niemeyer68ae2752003-09-28 01:20:02 +0000754class ParserTest(unittest.TestCase):
755 def setUp(self):
niemeyer97e19252003-10-06 05:52:04 +0000756 self.tzinfos = {"BRST": -10800}
niemeyer68ae2752003-09-28 01:20:02 +0000757 self.brsttz = tzoffset("BRST", -10800)
758 self.default = datetime(2003, 9, 25)
759
760 def testDateCommandFormat(self):
761 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
niemeyer97e19252003-10-06 05:52:04 +0000762 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +0000763 datetime(2003, 9, 25, 10, 36, 28,
764 tzinfo=self.brsttz))
765
766 def testDateCommandFormatReversed(self):
767 self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
niemeyer97e19252003-10-06 05:52:04 +0000768 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +0000769 datetime(2003, 9, 25, 10, 36, 28,
770 tzinfo=self.brsttz))
771
772 def testDateCommandFormatIgnoreTz(self):
773 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
774 ignoretz=True),
775 datetime(2003, 9, 25, 10, 36, 28))
776
777 def testDateCommandFormatStrip1(self):
778 self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
779 datetime(2003, 9, 25, 10, 36, 28))
780
781 def testDateCommandFormatStrip2(self):
782 self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
783 datetime(2003, 9, 25, 10, 36, 28))
784
785 def testDateCommandFormatStrip3(self):
786 self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
787 datetime(2003, 9, 25, 10, 36, 28))
788
789 def testDateCommandFormatStrip4(self):
790 self.assertEqual(parse("Thu 10:36:28", default=self.default),
791 datetime(2003, 9, 25, 10, 36, 28))
792
793 def testDateCommandFormatStrip5(self):
794 self.assertEqual(parse("Sep 10:36:28", default=self.default),
795 datetime(2003, 9, 25, 10, 36, 28))
796
797 def testDateCommandFormatStrip6(self):
798 self.assertEqual(parse("10:36:28", default=self.default),
799 datetime(2003, 9, 25, 10, 36, 28))
800
801 def testDateCommandFormatStrip7(self):
802 self.assertEqual(parse("10:36", default=self.default),
803 datetime(2003, 9, 25, 10, 36))
804
805 def testDateCommandFormatStrip8(self):
806 self.assertEqual(parse("Thu Sep 25 2003"),
807 datetime(2003, 9, 25))
808
809 def testDateCommandFormatStrip9(self):
810 self.assertEqual(parse("Sep 25 2003"),
811 datetime(2003, 9, 25))
812
813 def testDateCommandFormatStrip9(self):
814 self.assertEqual(parse("Sep 2003", default=self.default),
815 datetime(2003, 9, 25))
816
817 def testDateCommandFormatStrip10(self):
818 self.assertEqual(parse("Sep", default=self.default),
819 datetime(2003, 9, 25))
820
821 def testDateCommandFormatStrip11(self):
822 self.assertEqual(parse("2003", default=self.default),
823 datetime(2003, 9, 25))
824
825 def testDateRCommandFormat(self):
826 self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
827 datetime(2003, 9, 25, 10, 49, 41,
828 tzinfo=self.brsttz))
829
830 def testISOFormat(self):
831 self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
832 datetime(2003, 9, 25, 10, 49, 41, 500000,
833 tzinfo=self.brsttz))
834
835 def testISOFormatStrip1(self):
836 self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
837 datetime(2003, 9, 25, 10, 49, 41,
838 tzinfo=self.brsttz))
839
840 def testISOFormatStrip2(self):
841 self.assertEqual(parse("2003-09-25T10:49:41"),
842 datetime(2003, 9, 25, 10, 49, 41))
843
844 def testISOFormatStrip3(self):
845 self.assertEqual(parse("2003-09-25T10:49"),
846 datetime(2003, 9, 25, 10, 49))
847
848 def testISOFormatStrip4(self):
849 self.assertEqual(parse("2003-09-25T10"),
850 datetime(2003, 9, 25, 10))
851
852 def testISOFormatStrip5(self):
853 self.assertEqual(parse("2003-09-25"),
854 datetime(2003, 9, 25))
855
856 def testISOStrippedFormat(self):
857 self.assertEqual(parse("20030925T104941.5-0300"),
858 datetime(2003, 9, 25, 10, 49, 41, 500000,
859 tzinfo=self.brsttz))
860
861 def testISOStrippedFormatStrip1(self):
862 self.assertEqual(parse("20030925T104941-0300"),
863 datetime(2003, 9, 25, 10, 49, 41,
864 tzinfo=self.brsttz))
865
866 def testISOStrippedFormatStrip2(self):
867 self.assertEqual(parse("20030925T104941"),
868 datetime(2003, 9, 25, 10, 49, 41))
869
870 def testISOStrippedFormatStrip3(self):
871 self.assertEqual(parse("20030925T1049"),
872 datetime(2003, 9, 25, 10, 49, 0))
873
874 def testISOStrippedFormatStrip4(self):
875 self.assertEqual(parse("20030925T10"),
876 datetime(2003, 9, 25, 10))
877
878 def testISOStrippedFormatStrip5(self):
879 self.assertEqual(parse("20030925"),
880 datetime(2003, 9, 25))
881
882 def testDateWithDash1(self):
883 self.assertEqual(parse("2003-09-25"),
884 datetime(2003, 9, 25))
885
886 def testDateWithDash2(self):
887 self.assertEqual(parse("2003-Sep-25"),
888 datetime(2003, 9, 25))
889
890 def testDateWithDash3(self):
891 self.assertEqual(parse("25-Sep-2003"),
892 datetime(2003, 9, 25))
893
894 def testDateWithDash4(self):
895 self.assertEqual(parse("25-Sep-2003"),
896 datetime(2003, 9, 25))
897
898 def testDateWithDash5(self):
899 self.assertEqual(parse("Sep-25-2003"),
900 datetime(2003, 9, 25))
901
902 def testDateWithDash6(self):
903 self.assertEqual(parse("09-25-2003"),
904 datetime(2003, 9, 25))
905
906 def testDateWithDash7(self):
907 self.assertEqual(parse("25-09-2003"),
908 datetime(2003, 9, 25))
909
910 def testDateWithDash8(self):
911 self.assertEqual(parse("10-09-2003", dayfirst=True),
912 datetime(2003, 9, 10))
913
914 def testDateWithDash9(self):
915 self.assertEqual(parse("10-09-2003"),
916 datetime(2003, 10, 9))
917
918 def testDateWithDash10(self):
919 self.assertEqual(parse("10-09-03"),
920 datetime(2003, 10, 9))
921
922 def testDateWithDash11(self):
923 self.assertEqual(parse("10-09-03", yearfirst=True),
924 datetime(2010, 9, 3))
925
926 def testDateWithDot1(self):
927 self.assertEqual(parse("2003.09.25"),
928 datetime(2003, 9, 25))
929
930 def testDateWithDot2(self):
931 self.assertEqual(parse("2003.Sep.25"),
932 datetime(2003, 9, 25))
933
934 def testDateWithDot3(self):
935 self.assertEqual(parse("25.Sep.2003"),
936 datetime(2003, 9, 25))
937
938 def testDateWithDot4(self):
939 self.assertEqual(parse("25.Sep.2003"),
940 datetime(2003, 9, 25))
941
942 def testDateWithDot5(self):
943 self.assertEqual(parse("Sep.25.2003"),
944 datetime(2003, 9, 25))
945
946 def testDateWithDot6(self):
947 self.assertEqual(parse("09.25.2003"),
948 datetime(2003, 9, 25))
949
950 def testDateWithDot7(self):
951 self.assertEqual(parse("25.09.2003"),
952 datetime(2003, 9, 25))
953
954 def testDateWithDot8(self):
955 self.assertEqual(parse("10.09.2003", dayfirst=True),
956 datetime(2003, 9, 10))
957
958 def testDateWithDot9(self):
959 self.assertEqual(parse("10.09.2003"),
960 datetime(2003, 10, 9))
961
962 def testDateWithDot10(self):
963 self.assertEqual(parse("10.09.03"),
964 datetime(2003, 10, 9))
965
966 def testDateWithDot11(self):
967 self.assertEqual(parse("10.09.03", yearfirst=True),
968 datetime(2010, 9, 3))
969
970 def testDateWithSlash1(self):
971 self.assertEqual(parse("2003/09/25"),
972 datetime(2003, 9, 25))
973
974 def testDateWithSlash2(self):
975 self.assertEqual(parse("2003/Sep/25"),
976 datetime(2003, 9, 25))
977
978 def testDateWithSlash3(self):
979 self.assertEqual(parse("25/Sep/2003"),
980 datetime(2003, 9, 25))
981
982 def testDateWithSlash4(self):
983 self.assertEqual(parse("25/Sep/2003"),
984 datetime(2003, 9, 25))
985
986 def testDateWithSlash5(self):
987 self.assertEqual(parse("Sep/25/2003"),
988 datetime(2003, 9, 25))
989
990 def testDateWithSlash6(self):
991 self.assertEqual(parse("09/25/2003"),
992 datetime(2003, 9, 25))
993
994 def testDateWithSlash7(self):
995 self.assertEqual(parse("25/09/2003"),
996 datetime(2003, 9, 25))
997
998 def testDateWithSlash8(self):
999 self.assertEqual(parse("10/09/2003", dayfirst=True),
1000 datetime(2003, 9, 10))
1001
1002 def testDateWithSlash9(self):
1003 self.assertEqual(parse("10/09/2003"),
1004 datetime(2003, 10, 9))
1005
1006 def testDateWithSlash10(self):
1007 self.assertEqual(parse("10/09/03"),
1008 datetime(2003, 10, 9))
1009
1010 def testDateWithSlash11(self):
1011 self.assertEqual(parse("10/09/03", yearfirst=True),
1012 datetime(2010, 9, 3))
1013
1014 def testDateWithSpace12(self):
1015 self.assertEqual(parse("25 09 03"),
1016 datetime(2003, 9, 25))
1017
1018 def testDateWithSpace13(self):
1019 self.assertEqual(parse("25 09 03"),
1020 datetime(2003, 9, 25))
1021
1022 def testDateWithSpace1(self):
1023 self.assertEqual(parse("2003 09 25"),
1024 datetime(2003, 9, 25))
1025
1026 def testDateWithSpace2(self):
1027 self.assertEqual(parse("2003 Sep 25"),
1028 datetime(2003, 9, 25))
1029
1030 def testDateWithSpace3(self):
1031 self.assertEqual(parse("25 Sep 2003"),
1032 datetime(2003, 9, 25))
1033
1034 def testDateWithSpace4(self):
1035 self.assertEqual(parse("25 Sep 2003"),
1036 datetime(2003, 9, 25))
1037
1038 def testDateWithSpace5(self):
1039 self.assertEqual(parse("Sep 25 2003"),
1040 datetime(2003, 9, 25))
1041
1042 def testDateWithSpace6(self):
1043 self.assertEqual(parse("09 25 2003"),
1044 datetime(2003, 9, 25))
1045
1046 def testDateWithSpace7(self):
1047 self.assertEqual(parse("25 09 2003"),
1048 datetime(2003, 9, 25))
1049
1050 def testDateWithSpace8(self):
1051 self.assertEqual(parse("10 09 2003", dayfirst=True),
1052 datetime(2003, 9, 10))
1053
1054 def testDateWithSpace9(self):
1055 self.assertEqual(parse("10 09 2003"),
1056 datetime(2003, 10, 9))
1057
1058 def testDateWithSpace10(self):
1059 self.assertEqual(parse("10 09 03"),
1060 datetime(2003, 10, 9))
1061
1062 def testDateWithSpace11(self):
1063 self.assertEqual(parse("10 09 03", yearfirst=True),
1064 datetime(2010, 9, 3))
1065
1066 def testDateWithSpace12(self):
1067 self.assertEqual(parse("25 09 03"),
1068 datetime(2003, 9, 25))
1069
1070 def testDateWithSpace13(self):
1071 self.assertEqual(parse("25 09 03"),
1072 datetime(2003, 9, 25))
1073
1074 def testStrangelyOrderedDate1(self):
1075 self.assertEqual(parse("03 25 Sep"),
1076 datetime(2003, 9, 25))
1077
1078 def testStrangelyOrderedDate2(self):
1079 self.assertEqual(parse("2003 25 Sep"),
1080 datetime(2003, 9, 25))
1081
1082 def testStrangelyOrderedDate3(self):
1083 self.assertEqual(parse("25 03 Sep"),
1084 datetime(2025, 9, 3))
1085
1086 def testHourWithLetters(self):
1087 self.assertEqual(parse("10h36m28.5s", default=self.default),
1088 datetime(2003, 9, 25, 10, 36, 28, 500000))
1089
1090 def testHourWithLettersStrip1(self):
1091 self.assertEqual(parse("10h36m28s", default=self.default),
1092 datetime(2003, 9, 25, 10, 36, 28))
1093
1094 def testHourWithLettersStrip1(self):
1095 self.assertEqual(parse("10h36m", default=self.default),
1096 datetime(2003, 9, 25, 10, 36))
1097
1098 def testHourWithLettersStrip2(self):
1099 self.assertEqual(parse("10h", default=self.default),
1100 datetime(2003, 9, 25, 10))
1101
1102 def testHourAmPm1(self):
1103 self.assertEqual(parse("10h am", default=self.default),
1104 datetime(2003, 9, 25, 10))
1105
1106 def testHourAmPm2(self):
1107 self.assertEqual(parse("10h pm", default=self.default),
1108 datetime(2003, 9, 25, 22))
1109
1110 def testHourAmPm3(self):
1111 self.assertEqual(parse("10am", default=self.default),
1112 datetime(2003, 9, 25, 10))
1113
1114 def testHourAmPm4(self):
1115 self.assertEqual(parse("10pm", default=self.default),
1116 datetime(2003, 9, 25, 22))
1117
1118 def testHourAmPm5(self):
1119 self.assertEqual(parse("10:00 am", default=self.default),
1120 datetime(2003, 9, 25, 10))
1121
1122 def testHourAmPm6(self):
1123 self.assertEqual(parse("10:00 pm", default=self.default),
1124 datetime(2003, 9, 25, 22))
1125
1126 def testHourAmPm7(self):
1127 self.assertEqual(parse("10:00am", default=self.default),
1128 datetime(2003, 9, 25, 10))
1129
1130 def testHourAmPm8(self):
1131 self.assertEqual(parse("10:00pm", default=self.default),
1132 datetime(2003, 9, 25, 22))
1133
1134 def testHourAmPm9(self):
1135 self.assertEqual(parse("10:00a.m", default=self.default),
1136 datetime(2003, 9, 25, 10))
1137
1138 def testHourAmPm10(self):
1139 self.assertEqual(parse("10:00p.m", default=self.default),
1140 datetime(2003, 9, 25, 22))
1141
1142 def testHourAmPm11(self):
1143 self.assertEqual(parse("10:00a.m.", default=self.default),
1144 datetime(2003, 9, 25, 10))
1145
1146 def testHourAmPm12(self):
1147 self.assertEqual(parse("10:00p.m.", default=self.default),
1148 datetime(2003, 9, 25, 22))
1149
1150 def testPertain(self):
1151 self.assertEqual(parse("Sep 03", default=self.default),
1152 datetime(2003, 9, 3))
1153 self.assertEqual(parse("Sep of 03", default=self.default),
1154 datetime(2003, 9, 25))
1155
1156 def testWeekdayAlone(self):
1157 self.assertEqual(parse("Wed", default=self.default),
1158 datetime(2003, 10, 1))
1159
1160 def testLongWeekday(self):
1161 self.assertEqual(parse("Wednesday", default=self.default),
1162 datetime(2003, 10, 1))
1163
1164 def testLongMonth(self):
1165 self.assertEqual(parse("October", default=self.default),
1166 datetime(2003, 10, 25))
1167
1168 def testFuzzy(self):
1169 s = "Today is 25 of September of 2003, exactly " \
1170 "at 10:49:41 with timezone -03:00."
1171 self.assertEqual(parse(s, fuzzy=True),
1172 datetime(2003, 9, 25, 10, 49, 41,
1173 tzinfo=self.brsttz))
1174
1175 def testExtraSpace(self):
1176 self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
1177 datetime(1976, 7, 4, 0, 1, 2))
1178
1179 def testRandomFormat1(self):
1180 self.assertEqual(parse("Wed, July 10, '96"),
1181 datetime(1996, 7, 10, 0, 0))
1182
1183 def testRandomFormat2(self):
1184 self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
1185 ignoretz=True),
1186 datetime(1996, 7, 10, 15, 8, 56))
1187
1188 def testRandomFormat3(self):
1189 self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
1190 datetime(1996, 7, 10, 12, 8))
1191
1192 def testRandomFormat4(self):
1193 self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
1194 ignoretz=True),
1195 datetime(1952, 4, 12, 15, 30, 42))
1196
1197 def testRandomFormat5(self):
1198 self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
1199 ignoretz=True),
1200 datetime(1994, 11, 5, 8, 15, 30))
1201
1202 def testRandomFormat6(self):
1203 self.assertEqual(parse("1994-11-05T08:15:30-05:00",
1204 ignoretz=True),
1205 datetime(1994, 11, 5, 8, 15, 30))
1206
1207 def testRandomFormat7(self):
1208 self.assertEqual(parse("1994-11-05T08:15:30Z",
1209 ignoretz=True),
1210 datetime(1994, 11, 5, 8, 15, 30))
1211
1212 def testRandomFormat8(self):
1213 self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
1214
1215 def testRandomFormat9(self):
1216 self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
1217
1218 def testRandomFormat10(self):
1219 self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
1220
1221 def testRandomFormat11(self):
1222 self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
1223
1224 def testRandomFormat12(self):
1225 self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
1226
1227 def testRandomFormat13(self):
1228 self.assertEqual(parse("0:01:02", default=self.default),
1229 datetime(2003, 9, 25, 0, 1, 2))
1230
1231 def testRandomFormat14(self):
1232 self.assertEqual(parse("12h 01m02s am", default=self.default),
1233 datetime(2003, 9, 25, 0, 1, 2))
1234
1235 def testRandomFormat15(self):
1236 self.assertEqual(parse("0:01:02 on July 4, 1976"),
1237 datetime(1976, 7, 4, 0, 1, 2))
1238
1239 def testRandomFormat16(self):
1240 self.assertEqual(parse("0:01:02 on July 4, 1976"),
1241 datetime(1976, 7, 4, 0, 1, 2))
1242
1243 def testRandomFormat17(self):
1244 self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
1245 datetime(1976, 7, 4, 0, 1, 2))
1246
1247 def testRandomFormat18(self):
1248 self.assertEqual(parse("July 4, 1976 12:01:02 am"),
1249 datetime(1976, 7, 4, 0, 1, 2))
1250
1251 def testRandomFormat19(self):
1252 self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
1253 datetime(1995, 1, 2, 4, 24, 27))
1254
1255 def testRandomFormat20(self):
1256 self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
1257 datetime(1995, 4, 4, 0, 22, 12))
1258
1259 def testRandomFormat21(self):
1260 self.assertEqual(parse("04.04.95 00:22"),
1261 datetime(1995, 4, 4, 0, 22))
1262
1263 def testRandomFormat22(self):
1264 self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
1265 datetime(1999, 1, 1, 11, 23, 34, 578000))
1266
1267 def testRandomFormat23(self):
1268 self.assertEqual(parse("950404 122212"),
1269 datetime(1995, 4, 4, 12, 22, 12))
1270
1271 def testRandomFormat24(self):
1272 self.assertEqual(parse("0:00 PM, PST", default=self.default,
1273 ignoretz=True),
1274 datetime(2003, 9, 25, 12, 0))
1275
1276 def testRandomFormat25(self):
1277 self.assertEqual(parse("12:08 PM", default=self.default),
1278 datetime(2003, 9, 25, 12, 8))
1279
1280 def testRandomFormat26(self):
1281 self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
1282 datetime(1990, 6, 13, 5, 50))
1283
1284 def testRandomFormat27(self):
1285 self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
1286
1287 def testRandomFormat28(self):
1288 self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
1289
1290 def testRandomFormat29(self):
1291 self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
1292
1293 def testRandomFormat30(self):
1294 self.assertEqual(parse("01h02m03", default=self.default),
1295 datetime(2003, 9, 25, 1, 2, 3))
1296
1297 def testRandomFormat31(self):
1298 self.assertEqual(parse("01h02", default=self.default),
1299 datetime(2003, 9, 25, 1, 2))
1300
1301 def testRandomFormat32(self):
1302 self.assertEqual(parse("01h02s", default=self.default),
1303 datetime(2003, 9, 25, 1, 0, 2))
1304
1305 def testRandomFormat33(self):
1306 self.assertEqual(parse("01m02", default=self.default),
1307 datetime(2003, 9, 25, 0, 1, 2))
1308
1309 def testRandomFormat34(self):
1310 self.assertEqual(parse("01m02h", default=self.default),
1311 datetime(2003, 9, 25, 2, 1))
1312
1313class EasterTest(unittest.TestCase):
1314 easterlist = [
1315 # WESTERN ORTHODOX
1316 (date(1990, 4, 15), date(1990, 4, 15)),
1317 (date(1991, 3, 31), date(1991, 4, 7)),
1318 (date(1992, 4, 19), date(1992, 4, 26)),
1319 (date(1993, 4, 11), date(1993, 4, 18)),
1320 (date(1994, 4, 3), date(1994, 5, 1)),
1321 (date(1995, 4, 16), date(1995, 4, 23)),
1322 (date(1996, 4, 7), date(1996, 4, 14)),
1323 (date(1997, 3, 30), date(1997, 4, 27)),
1324 (date(1998, 4, 12), date(1998, 4, 19)),
1325 (date(1999, 4, 4), date(1999, 4, 11)),
1326
1327 (date(2000, 4, 23), date(2000, 4, 30)),
1328 (date(2001, 4, 15), date(2001, 4, 15)),
1329 (date(2002, 3, 31), date(2002, 5, 5)),
1330 (date(2003, 4, 20), date(2003, 4, 27)),
1331 (date(2004, 4, 11), date(2004, 4, 11)),
1332 (date(2005, 3, 27), date(2005, 5, 1)),
1333 (date(2006, 4, 16), date(2006, 4, 23)),
1334 (date(2007, 4, 8), date(2007, 4, 8)),
1335 (date(2008, 3, 23), date(2008, 4, 27)),
1336 (date(2009, 4, 12), date(2009, 4, 19)),
1337
1338 (date(2010, 4, 4), date(2010, 4, 4)),
1339 (date(2011, 4, 24), date(2011, 4, 24)),
1340 (date(2012, 4, 8), date(2012, 4, 15)),
1341 (date(2013, 3, 31), date(2013, 5, 5)),
1342 (date(2014, 4, 20), date(2014, 4, 20)),
1343 (date(2015, 4, 5), date(2015, 4, 12)),
1344 (date(2016, 3, 27), date(2016, 5, 1)),
1345 (date(2017, 4, 16), date(2017, 4, 16)),
1346 (date(2018, 4, 1), date(2018, 4, 8)),
1347 (date(2019, 4, 21), date(2019, 4, 28)),
1348
1349 (date(2020, 4, 12), date(2020, 4, 19)),
1350 (date(2021, 4, 4), date(2021, 5, 2)),
1351 (date(2022, 4, 17), date(2022, 4, 24)),
1352 (date(2023, 4, 9), date(2023, 4, 16)),
1353 (date(2024, 3, 31), date(2024, 5, 5)),
1354 (date(2025, 4, 20), date(2025, 4, 20)),
1355 (date(2026, 4, 5), date(2026, 4, 12)),
1356 (date(2027, 3, 28), date(2027, 5, 2)),
1357 (date(2028, 4, 16), date(2028, 4, 16)),
1358 (date(2029, 4, 1), date(2029, 4, 8)),
1359
1360 (date(2030, 4, 21), date(2030, 4, 28)),
1361 (date(2031, 4, 13), date(2031, 4, 13)),
1362 (date(2032, 3, 28), date(2032, 5, 2)),
1363 (date(2033, 4, 17), date(2033, 4, 24)),
1364 (date(2034, 4, 9), date(2034, 4, 9)),
1365 (date(2035, 3, 25), date(2035, 4, 29)),
1366 (date(2036, 4, 13), date(2036, 4, 20)),
1367 (date(2037, 4, 5), date(2037, 4, 5)),
1368 (date(2038, 4, 25), date(2038, 4, 25)),
1369 (date(2039, 4, 10), date(2039, 4, 17)),
1370
1371 (date(2040, 4, 1), date(2040, 5, 6)),
1372 (date(2041, 4, 21), date(2041, 4, 21)),
1373 (date(2042, 4, 6), date(2042, 4, 13)),
1374 (date(2043, 3, 29), date(2043, 5, 3)),
1375 (date(2044, 4, 17), date(2044, 4, 24)),
1376 (date(2045, 4, 9), date(2045, 4, 9)),
1377 (date(2046, 3, 25), date(2046, 4, 29)),
1378 (date(2047, 4, 14), date(2047, 4, 21)),
1379 (date(2048, 4, 5), date(2048, 4, 5)),
1380 (date(2049, 4, 18), date(2049, 4, 25)),
1381
1382 (date(2050, 4, 10), date(2050, 4, 17)),
1383 ]
1384
1385 def testEaster(self):
1386 for western, orthodox in self.easterlist:
1387 self.assertEqual(western, easter(western.year, EASTER_WESTERN))
1388 self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
1389
1390class TZTest(unittest.TestCase):
1391
niemeyer36139372003-10-07 01:48:15 +00001392 TZFILE_EST5EDT = """
niemeyer68ae2752003-09-28 01:20:02 +00001393VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
1394ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
1395S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
1396YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
1397yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
1398wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
13998uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
1400YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
1401BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
1402iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
1403znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
1404cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
1405Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
1406JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
1407jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
14084GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
1409b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
1410o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
1411AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
1412AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
1413AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
1414AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
1415AEVQVAAAAAABAAAAAQ==
1416 """
1417
niemeyer36139372003-10-07 01:48:15 +00001418 TZICAL_EST5EDT = """
1419BEGIN:VTIMEZONE
1420TZID:US-Eastern
1421LAST-MODIFIED:19870101T000000Z
1422TZURL:http://zones.stds_r_us.net/tz/US-Eastern
1423BEGIN:STANDARD
1424DTSTART:19671029T020000
1425RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
1426TZOFFSETFROM:-0400
1427TZOFFSETTO:-0500
1428TZNAME:EST
1429END:STANDARD
1430BEGIN:DAYLIGHT
1431DTSTART:19870405T020000
1432RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
1433TZOFFSETFROM:-0500
1434TZOFFSETTO:-0400
1435TZNAME:EDT
1436END:DAYLIGHT
1437END:VTIMEZONE
1438 """
1439
niemeyer68ae2752003-09-28 01:20:02 +00001440 def testStrStart1(self):
1441 self.assertEqual(datetime(2003,4,6,1,59,
1442 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
1443 self.assertEqual(datetime(2003,4,6,2,00,
1444 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
1445
1446 def testStrEnd1(self):
1447 self.assertEqual(datetime(2003,10,26,0,59,
1448 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
1449 self.assertEqual(datetime(2003,10,26,1,00,
1450 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
1451
1452 def testStrStart2(self):
1453 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
1454 self.assertEqual(datetime(2003,4,6,1,59,
1455 tzinfo=tzstr(s)).tzname(), "EST")
1456 self.assertEqual(datetime(2003,4,6,2,00,
1457 tzinfo=tzstr(s)).tzname(), "EDT")
1458
1459 def testStrEnd2(self):
1460 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
1461 self.assertEqual(datetime(2003,10,26,0,59,
1462 tzinfo=tzstr(s)).tzname(), "EDT")
1463 self.assertEqual(datetime(2003,10,26,1,00,
1464 tzinfo=tzstr(s)).tzname(), "EST")
1465
1466 def testStrStart3(self):
1467 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
1468 self.assertEqual(datetime(2003,4,6,1,59,
1469 tzinfo=tzstr(s)).tzname(), "EST")
1470 self.assertEqual(datetime(2003,4,6,2,00,
1471 tzinfo=tzstr(s)).tzname(), "EDT")
1472
1473 def testStrEnd3(self):
1474 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
1475 self.assertEqual(datetime(2003,10,26,0,59,
1476 tzinfo=tzstr(s)).tzname(), "EDT")
1477 self.assertEqual(datetime(2003,10,26,1,00,
1478 tzinfo=tzstr(s)).tzname(), "EST")
1479
1480 def testStrStart4(self):
1481 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
1482 self.assertEqual(datetime(2003,4,6,1,59,
1483 tzinfo=tzstr(s)).tzname(), "EST")
1484 self.assertEqual(datetime(2003,4,6,2,00,
1485 tzinfo=tzstr(s)).tzname(), "EDT")
1486
1487 def testStrEnd4(self):
1488 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
1489 self.assertEqual(datetime(2003,10,26,0,59,
1490 tzinfo=tzstr(s)).tzname(), "EDT")
1491 self.assertEqual(datetime(2003,10,26,1,00,
1492 tzinfo=tzstr(s)).tzname(), "EST")
1493
1494 def testStrStart5(self):
1495 s = "EST5EDT4,95/02:00:00,298/02:00"
1496 self.assertEqual(datetime(2003,4,6,1,59,
1497 tzinfo=tzstr(s)).tzname(), "EST")
1498 self.assertEqual(datetime(2003,4,6,2,00,
1499 tzinfo=tzstr(s)).tzname(), "EDT")
1500
1501 def testStrEnd5(self):
1502 s = "EST5EDT4,95/02:00:00,298/02"
1503 self.assertEqual(datetime(2003,10,26,0,59,
1504 tzinfo=tzstr(s)).tzname(), "EDT")
1505 self.assertEqual(datetime(2003,10,26,1,00,
1506 tzinfo=tzstr(s)).tzname(), "EST")
1507
1508 def testStrStart6(self):
1509 s = "EST5EDT4,J96/02:00:00,J299/02:00"
1510 self.assertEqual(datetime(2003,4,6,1,59,
1511 tzinfo=tzstr(s)).tzname(), "EST")
1512 self.assertEqual(datetime(2003,4,6,2,00,
1513 tzinfo=tzstr(s)).tzname(), "EDT")
1514
1515 def testStrEnd6(self):
1516 s = "EST5EDT4,J96/02:00:00,J299/02"
1517 self.assertEqual(datetime(2003,10,26,0,59,
1518 tzinfo=tzstr(s)).tzname(), "EDT")
1519 self.assertEqual(datetime(2003,10,26,1,00,
1520 tzinfo=tzstr(s)).tzname(), "EST")
1521
1522 def testStrCmp1(self):
1523 self.assertEqual(tzstr("EST5EDT"),
1524 tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
1525
1526 def testStrCmp2(self):
1527 self.assertEqual(tzstr("EST5EDT"),
1528 tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
1529
1530 def testRangeCmp1(self):
1531 self.assertEqual(tzstr("EST5EDT"),
1532 tzrange("EST", -18000, "EDT", -14400,
1533 relativedelta(hours=+2,
1534 month=4, day=1,
niemeyerb47d12a2003-09-29 20:00:21 +00001535 weekday=SU(+1)),
niemeyer68ae2752003-09-28 01:20:02 +00001536 relativedelta(hours=+1,
1537 month=10, day=31,
niemeyerb47d12a2003-09-29 20:00:21 +00001538 weekday=SU(-1))))
niemeyer68ae2752003-09-28 01:20:02 +00001539
1540 def testRangeCmp2(self):
1541 self.assertEqual(tzstr("EST5EDT"),
1542 tzrange("EST", -18000, "EDT"))
1543
1544 def testFileStart1(self):
niemeyer36139372003-10-07 01:48:15 +00001545 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
niemeyer68ae2752003-09-28 01:20:02 +00001546 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
1547 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
1548
1549 def testFileEnd1(self):
niemeyer36139372003-10-07 01:48:15 +00001550 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
1551 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
1552 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
1553
1554 def testICalStart1(self):
1555 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
1556 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
1557 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
1558
1559 def testICalEnd1(self):
1560 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
niemeyer68ae2752003-09-28 01:20:02 +00001561 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
1562 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
1563
1564if __name__ == "__main__":
1565 unittest.main()
1566
1567# vim:ts=4:sw=4