blob: a3db6df5494e02cc26bac9bdc0d70afdc8bb4de6 [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 *
18from dateutil.tz import *
19
20from datetime import *
21
22import calendar
23import time
24
25class RelativeDeltaTest(unittest.TestCase):
26 now = datetime(2003, 9, 17, 20, 54, 47, 282310)
27 today = date(2003, 9, 17)
28
29 def testNextMonth(self):
30 self.assertEqual(self.now+relativedelta(months=+1),
31 datetime(2003, 10, 17, 20, 54, 47, 282310))
32
33 def testNextMonthPlusOneWeek(self):
34 self.assertEqual(self.now+relativedelta(months=+1, weeks=+1),
35 datetime(2003, 10, 24, 20, 54, 47, 282310))
36 def testNextMonthPlusOneWeek10am(self):
37 self.assertEqual(self.today +
38 relativedelta(months=+1, weeks=+1, hour=10),
39 datetime(2003, 10, 24, 10, 0))
40
41 def testNextMonthPlusOneWeek10amDiff(self):
42 self.assertEqual(relativedelta(datetime(2003, 10, 24, 10, 0),
43 self.today),
44 relativedelta(months=+1, days=+7, hours=+10))
45
46 def testOneMonthBeforeOneYear(self):
47 self.assertEqual(self.now+relativedelta(years=+1, months=-1),
48 datetime(2004, 8, 17, 20, 54, 47, 282310))
49
50 def testMonthsOfDiffNumOfDays(self):
51 self.assertEqual(date(2003, 1, 27)+relativedelta(months=+1),
52 date(2003, 2, 27))
53 self.assertEqual(date(2003, 1, 31)+relativedelta(months=+1),
54 date(2003, 2, 28))
55 self.assertEqual(date(2003, 1, 31)+relativedelta(months=+2),
56 date(2003, 3, 31))
57
58 def testMonthsOfDiffNumOfDaysWithYears(self):
59 self.assertEqual(date(2000, 2, 28)+relativedelta(years=+1),
60 date(2001, 2, 28))
61 self.assertEqual(date(2000, 2, 29)+relativedelta(years=+1),
62 date(2001, 2, 28))
63
64 self.assertEqual(date(1999, 2, 28)+relativedelta(years=+1),
65 date(2000, 2, 28))
66 self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
67 date(2000, 3, 1))
68 self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
69 date(2000, 3, 1))
70
71 self.assertEqual(date(2001, 2, 28)+relativedelta(years=-1),
72 date(2000, 2, 28))
73 self.assertEqual(date(2001, 3, 1)+relativedelta(years=-1),
74 date(2000, 3, 1))
75
76 def testNextFriday(self):
77 self.assertEqual(self.today +
78 relativedelta(weekday=(calendar.FRIDAY, +1)),
79 date(2003, 9, 19))
80
81 def testLastFridayInThisMonth(self):
82 self.assertEqual(self.today +
83 relativedelta(day=31, weekday=(calendar.FRIDAY, -1)),
84 date(2003, 9, 26))
85
86 def testNextWednesdayIsToday(self):
87 self.assertEqual(self.today +
88 relativedelta(weekday=(calendar.WEDNESDAY, +1)),
89 date(2003, 9, 17))
90
91
92 def testNextWenesdayNotToday(self):
93 self.assertEqual(self.today +
94 relativedelta(days=+1,
95 weekday=(calendar.WEDNESDAY, +1)),
96 date(2003, 9, 24))
97
98 def test15thISOYearWeek(self):
99 self.assertEqual(date(2003, 1, 1) +
100 relativedelta(day=4, weekday=(0, -1), weeks=+14),
101 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
142class ParserTest(unittest.TestCase):
143 def setUp(self):
144 self.tzoffsets = {"BRST": -10800}
145 self.brsttz = tzoffset("BRST", -10800)
146 self.default = datetime(2003, 9, 25)
147
148 def testDateCommandFormat(self):
149 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
150 tzoffsets=self.tzoffsets),
151 datetime(2003, 9, 25, 10, 36, 28,
152 tzinfo=self.brsttz))
153
154 def testDateCommandFormatReversed(self):
155 self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
156 tzoffsets=self.tzoffsets),
157 datetime(2003, 9, 25, 10, 36, 28,
158 tzinfo=self.brsttz))
159
160 def testDateCommandFormatIgnoreTz(self):
161 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
162 ignoretz=True),
163 datetime(2003, 9, 25, 10, 36, 28))
164
165 def testDateCommandFormatStrip1(self):
166 self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
167 datetime(2003, 9, 25, 10, 36, 28))
168
169 def testDateCommandFormatStrip2(self):
170 self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
171 datetime(2003, 9, 25, 10, 36, 28))
172
173 def testDateCommandFormatStrip3(self):
174 self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
175 datetime(2003, 9, 25, 10, 36, 28))
176
177 def testDateCommandFormatStrip4(self):
178 self.assertEqual(parse("Thu 10:36:28", default=self.default),
179 datetime(2003, 9, 25, 10, 36, 28))
180
181 def testDateCommandFormatStrip5(self):
182 self.assertEqual(parse("Sep 10:36:28", default=self.default),
183 datetime(2003, 9, 25, 10, 36, 28))
184
185 def testDateCommandFormatStrip6(self):
186 self.assertEqual(parse("10:36:28", default=self.default),
187 datetime(2003, 9, 25, 10, 36, 28))
188
189 def testDateCommandFormatStrip7(self):
190 self.assertEqual(parse("10:36", default=self.default),
191 datetime(2003, 9, 25, 10, 36))
192
193 def testDateCommandFormatStrip8(self):
194 self.assertEqual(parse("Thu Sep 25 2003"),
195 datetime(2003, 9, 25))
196
197 def testDateCommandFormatStrip9(self):
198 self.assertEqual(parse("Sep 25 2003"),
199 datetime(2003, 9, 25))
200
201 def testDateCommandFormatStrip9(self):
202 self.assertEqual(parse("Sep 2003", default=self.default),
203 datetime(2003, 9, 25))
204
205 def testDateCommandFormatStrip10(self):
206 self.assertEqual(parse("Sep", default=self.default),
207 datetime(2003, 9, 25))
208
209 def testDateCommandFormatStrip11(self):
210 self.assertEqual(parse("2003", default=self.default),
211 datetime(2003, 9, 25))
212
213 def testDateRCommandFormat(self):
214 self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
215 datetime(2003, 9, 25, 10, 49, 41,
216 tzinfo=self.brsttz))
217
218 def testISOFormat(self):
219 self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
220 datetime(2003, 9, 25, 10, 49, 41, 500000,
221 tzinfo=self.brsttz))
222
223 def testISOFormatStrip1(self):
224 self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
225 datetime(2003, 9, 25, 10, 49, 41,
226 tzinfo=self.brsttz))
227
228 def testISOFormatStrip2(self):
229 self.assertEqual(parse("2003-09-25T10:49:41"),
230 datetime(2003, 9, 25, 10, 49, 41))
231
232 def testISOFormatStrip3(self):
233 self.assertEqual(parse("2003-09-25T10:49"),
234 datetime(2003, 9, 25, 10, 49))
235
236 def testISOFormatStrip4(self):
237 self.assertEqual(parse("2003-09-25T10"),
238 datetime(2003, 9, 25, 10))
239
240 def testISOFormatStrip5(self):
241 self.assertEqual(parse("2003-09-25"),
242 datetime(2003, 9, 25))
243
244 def testISOStrippedFormat(self):
245 self.assertEqual(parse("20030925T104941.5-0300"),
246 datetime(2003, 9, 25, 10, 49, 41, 500000,
247 tzinfo=self.brsttz))
248
249 def testISOStrippedFormatStrip1(self):
250 self.assertEqual(parse("20030925T104941-0300"),
251 datetime(2003, 9, 25, 10, 49, 41,
252 tzinfo=self.brsttz))
253
254 def testISOStrippedFormatStrip2(self):
255 self.assertEqual(parse("20030925T104941"),
256 datetime(2003, 9, 25, 10, 49, 41))
257
258 def testISOStrippedFormatStrip3(self):
259 self.assertEqual(parse("20030925T1049"),
260 datetime(2003, 9, 25, 10, 49, 0))
261
262 def testISOStrippedFormatStrip4(self):
263 self.assertEqual(parse("20030925T10"),
264 datetime(2003, 9, 25, 10))
265
266 def testISOStrippedFormatStrip5(self):
267 self.assertEqual(parse("20030925"),
268 datetime(2003, 9, 25))
269
270 def testDateWithDash1(self):
271 self.assertEqual(parse("2003-09-25"),
272 datetime(2003, 9, 25))
273
274 def testDateWithDash2(self):
275 self.assertEqual(parse("2003-Sep-25"),
276 datetime(2003, 9, 25))
277
278 def testDateWithDash3(self):
279 self.assertEqual(parse("25-Sep-2003"),
280 datetime(2003, 9, 25))
281
282 def testDateWithDash4(self):
283 self.assertEqual(parse("25-Sep-2003"),
284 datetime(2003, 9, 25))
285
286 def testDateWithDash5(self):
287 self.assertEqual(parse("Sep-25-2003"),
288 datetime(2003, 9, 25))
289
290 def testDateWithDash6(self):
291 self.assertEqual(parse("09-25-2003"),
292 datetime(2003, 9, 25))
293
294 def testDateWithDash7(self):
295 self.assertEqual(parse("25-09-2003"),
296 datetime(2003, 9, 25))
297
298 def testDateWithDash8(self):
299 self.assertEqual(parse("10-09-2003", dayfirst=True),
300 datetime(2003, 9, 10))
301
302 def testDateWithDash9(self):
303 self.assertEqual(parse("10-09-2003"),
304 datetime(2003, 10, 9))
305
306 def testDateWithDash10(self):
307 self.assertEqual(parse("10-09-03"),
308 datetime(2003, 10, 9))
309
310 def testDateWithDash11(self):
311 self.assertEqual(parse("10-09-03", yearfirst=True),
312 datetime(2010, 9, 3))
313
314 def testDateWithDot1(self):
315 self.assertEqual(parse("2003.09.25"),
316 datetime(2003, 9, 25))
317
318 def testDateWithDot2(self):
319 self.assertEqual(parse("2003.Sep.25"),
320 datetime(2003, 9, 25))
321
322 def testDateWithDot3(self):
323 self.assertEqual(parse("25.Sep.2003"),
324 datetime(2003, 9, 25))
325
326 def testDateWithDot4(self):
327 self.assertEqual(parse("25.Sep.2003"),
328 datetime(2003, 9, 25))
329
330 def testDateWithDot5(self):
331 self.assertEqual(parse("Sep.25.2003"),
332 datetime(2003, 9, 25))
333
334 def testDateWithDot6(self):
335 self.assertEqual(parse("09.25.2003"),
336 datetime(2003, 9, 25))
337
338 def testDateWithDot7(self):
339 self.assertEqual(parse("25.09.2003"),
340 datetime(2003, 9, 25))
341
342 def testDateWithDot8(self):
343 self.assertEqual(parse("10.09.2003", dayfirst=True),
344 datetime(2003, 9, 10))
345
346 def testDateWithDot9(self):
347 self.assertEqual(parse("10.09.2003"),
348 datetime(2003, 10, 9))
349
350 def testDateWithDot10(self):
351 self.assertEqual(parse("10.09.03"),
352 datetime(2003, 10, 9))
353
354 def testDateWithDot11(self):
355 self.assertEqual(parse("10.09.03", yearfirst=True),
356 datetime(2010, 9, 3))
357
358 def testDateWithSlash1(self):
359 self.assertEqual(parse("2003/09/25"),
360 datetime(2003, 9, 25))
361
362 def testDateWithSlash2(self):
363 self.assertEqual(parse("2003/Sep/25"),
364 datetime(2003, 9, 25))
365
366 def testDateWithSlash3(self):
367 self.assertEqual(parse("25/Sep/2003"),
368 datetime(2003, 9, 25))
369
370 def testDateWithSlash4(self):
371 self.assertEqual(parse("25/Sep/2003"),
372 datetime(2003, 9, 25))
373
374 def testDateWithSlash5(self):
375 self.assertEqual(parse("Sep/25/2003"),
376 datetime(2003, 9, 25))
377
378 def testDateWithSlash6(self):
379 self.assertEqual(parse("09/25/2003"),
380 datetime(2003, 9, 25))
381
382 def testDateWithSlash7(self):
383 self.assertEqual(parse("25/09/2003"),
384 datetime(2003, 9, 25))
385
386 def testDateWithSlash8(self):
387 self.assertEqual(parse("10/09/2003", dayfirst=True),
388 datetime(2003, 9, 10))
389
390 def testDateWithSlash9(self):
391 self.assertEqual(parse("10/09/2003"),
392 datetime(2003, 10, 9))
393
394 def testDateWithSlash10(self):
395 self.assertEqual(parse("10/09/03"),
396 datetime(2003, 10, 9))
397
398 def testDateWithSlash11(self):
399 self.assertEqual(parse("10/09/03", yearfirst=True),
400 datetime(2010, 9, 3))
401
402 def testDateWithSpace12(self):
403 self.assertEqual(parse("25 09 03"),
404 datetime(2003, 9, 25))
405
406 def testDateWithSpace13(self):
407 self.assertEqual(parse("25 09 03"),
408 datetime(2003, 9, 25))
409
410 def testDateWithSpace1(self):
411 self.assertEqual(parse("2003 09 25"),
412 datetime(2003, 9, 25))
413
414 def testDateWithSpace2(self):
415 self.assertEqual(parse("2003 Sep 25"),
416 datetime(2003, 9, 25))
417
418 def testDateWithSpace3(self):
419 self.assertEqual(parse("25 Sep 2003"),
420 datetime(2003, 9, 25))
421
422 def testDateWithSpace4(self):
423 self.assertEqual(parse("25 Sep 2003"),
424 datetime(2003, 9, 25))
425
426 def testDateWithSpace5(self):
427 self.assertEqual(parse("Sep 25 2003"),
428 datetime(2003, 9, 25))
429
430 def testDateWithSpace6(self):
431 self.assertEqual(parse("09 25 2003"),
432 datetime(2003, 9, 25))
433
434 def testDateWithSpace7(self):
435 self.assertEqual(parse("25 09 2003"),
436 datetime(2003, 9, 25))
437
438 def testDateWithSpace8(self):
439 self.assertEqual(parse("10 09 2003", dayfirst=True),
440 datetime(2003, 9, 10))
441
442 def testDateWithSpace9(self):
443 self.assertEqual(parse("10 09 2003"),
444 datetime(2003, 10, 9))
445
446 def testDateWithSpace10(self):
447 self.assertEqual(parse("10 09 03"),
448 datetime(2003, 10, 9))
449
450 def testDateWithSpace11(self):
451 self.assertEqual(parse("10 09 03", yearfirst=True),
452 datetime(2010, 9, 3))
453
454 def testDateWithSpace12(self):
455 self.assertEqual(parse("25 09 03"),
456 datetime(2003, 9, 25))
457
458 def testDateWithSpace13(self):
459 self.assertEqual(parse("25 09 03"),
460 datetime(2003, 9, 25))
461
462 def testStrangelyOrderedDate1(self):
463 self.assertEqual(parse("03 25 Sep"),
464 datetime(2003, 9, 25))
465
466 def testStrangelyOrderedDate2(self):
467 self.assertEqual(parse("2003 25 Sep"),
468 datetime(2003, 9, 25))
469
470 def testStrangelyOrderedDate3(self):
471 self.assertEqual(parse("25 03 Sep"),
472 datetime(2025, 9, 3))
473
474 def testHourWithLetters(self):
475 self.assertEqual(parse("10h36m28.5s", default=self.default),
476 datetime(2003, 9, 25, 10, 36, 28, 500000))
477
478 def testHourWithLettersStrip1(self):
479 self.assertEqual(parse("10h36m28s", default=self.default),
480 datetime(2003, 9, 25, 10, 36, 28))
481
482 def testHourWithLettersStrip1(self):
483 self.assertEqual(parse("10h36m", default=self.default),
484 datetime(2003, 9, 25, 10, 36))
485
486 def testHourWithLettersStrip2(self):
487 self.assertEqual(parse("10h", default=self.default),
488 datetime(2003, 9, 25, 10))
489
490 def testHourAmPm1(self):
491 self.assertEqual(parse("10h am", default=self.default),
492 datetime(2003, 9, 25, 10))
493
494 def testHourAmPm2(self):
495 self.assertEqual(parse("10h pm", default=self.default),
496 datetime(2003, 9, 25, 22))
497
498 def testHourAmPm3(self):
499 self.assertEqual(parse("10am", default=self.default),
500 datetime(2003, 9, 25, 10))
501
502 def testHourAmPm4(self):
503 self.assertEqual(parse("10pm", default=self.default),
504 datetime(2003, 9, 25, 22))
505
506 def testHourAmPm5(self):
507 self.assertEqual(parse("10:00 am", default=self.default),
508 datetime(2003, 9, 25, 10))
509
510 def testHourAmPm6(self):
511 self.assertEqual(parse("10:00 pm", default=self.default),
512 datetime(2003, 9, 25, 22))
513
514 def testHourAmPm7(self):
515 self.assertEqual(parse("10:00am", default=self.default),
516 datetime(2003, 9, 25, 10))
517
518 def testHourAmPm8(self):
519 self.assertEqual(parse("10:00pm", default=self.default),
520 datetime(2003, 9, 25, 22))
521
522 def testHourAmPm9(self):
523 self.assertEqual(parse("10:00a.m", default=self.default),
524 datetime(2003, 9, 25, 10))
525
526 def testHourAmPm10(self):
527 self.assertEqual(parse("10:00p.m", default=self.default),
528 datetime(2003, 9, 25, 22))
529
530 def testHourAmPm11(self):
531 self.assertEqual(parse("10:00a.m.", default=self.default),
532 datetime(2003, 9, 25, 10))
533
534 def testHourAmPm12(self):
535 self.assertEqual(parse("10:00p.m.", default=self.default),
536 datetime(2003, 9, 25, 22))
537
538 def testPertain(self):
539 self.assertEqual(parse("Sep 03", default=self.default),
540 datetime(2003, 9, 3))
541 self.assertEqual(parse("Sep of 03", default=self.default),
542 datetime(2003, 9, 25))
543
544 def testWeekdayAlone(self):
545 self.assertEqual(parse("Wed", default=self.default),
546 datetime(2003, 10, 1))
547
548 def testLongWeekday(self):
549 self.assertEqual(parse("Wednesday", default=self.default),
550 datetime(2003, 10, 1))
551
552 def testLongMonth(self):
553 self.assertEqual(parse("October", default=self.default),
554 datetime(2003, 10, 25))
555
556 def testFuzzy(self):
557 s = "Today is 25 of September of 2003, exactly " \
558 "at 10:49:41 with timezone -03:00."
559 self.assertEqual(parse(s, fuzzy=True),
560 datetime(2003, 9, 25, 10, 49, 41,
561 tzinfo=self.brsttz))
562
563 def testExtraSpace(self):
564 self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
565 datetime(1976, 7, 4, 0, 1, 2))
566
567 def testRandomFormat1(self):
568 self.assertEqual(parse("Wed, July 10, '96"),
569 datetime(1996, 7, 10, 0, 0))
570
571 def testRandomFormat2(self):
572 self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
573 ignoretz=True),
574 datetime(1996, 7, 10, 15, 8, 56))
575
576 def testRandomFormat3(self):
577 self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
578 datetime(1996, 7, 10, 12, 8))
579
580 def testRandomFormat4(self):
581 self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
582 ignoretz=True),
583 datetime(1952, 4, 12, 15, 30, 42))
584
585 def testRandomFormat5(self):
586 self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
587 ignoretz=True),
588 datetime(1994, 11, 5, 8, 15, 30))
589
590 def testRandomFormat6(self):
591 self.assertEqual(parse("1994-11-05T08:15:30-05:00",
592 ignoretz=True),
593 datetime(1994, 11, 5, 8, 15, 30))
594
595 def testRandomFormat7(self):
596 self.assertEqual(parse("1994-11-05T08:15:30Z",
597 ignoretz=True),
598 datetime(1994, 11, 5, 8, 15, 30))
599
600 def testRandomFormat8(self):
601 self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
602
603 def testRandomFormat9(self):
604 self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
605
606 def testRandomFormat10(self):
607 self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
608
609 def testRandomFormat11(self):
610 self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
611
612 def testRandomFormat12(self):
613 self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
614
615 def testRandomFormat13(self):
616 self.assertEqual(parse("0:01:02", default=self.default),
617 datetime(2003, 9, 25, 0, 1, 2))
618
619 def testRandomFormat14(self):
620 self.assertEqual(parse("12h 01m02s am", default=self.default),
621 datetime(2003, 9, 25, 0, 1, 2))
622
623 def testRandomFormat15(self):
624 self.assertEqual(parse("0:01:02 on July 4, 1976"),
625 datetime(1976, 7, 4, 0, 1, 2))
626
627 def testRandomFormat16(self):
628 self.assertEqual(parse("0:01:02 on July 4, 1976"),
629 datetime(1976, 7, 4, 0, 1, 2))
630
631 def testRandomFormat17(self):
632 self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
633 datetime(1976, 7, 4, 0, 1, 2))
634
635 def testRandomFormat18(self):
636 self.assertEqual(parse("July 4, 1976 12:01:02 am"),
637 datetime(1976, 7, 4, 0, 1, 2))
638
639 def testRandomFormat19(self):
640 self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
641 datetime(1995, 1, 2, 4, 24, 27))
642
643 def testRandomFormat20(self):
644 self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
645 datetime(1995, 4, 4, 0, 22, 12))
646
647 def testRandomFormat21(self):
648 self.assertEqual(parse("04.04.95 00:22"),
649 datetime(1995, 4, 4, 0, 22))
650
651 def testRandomFormat22(self):
652 self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
653 datetime(1999, 1, 1, 11, 23, 34, 578000))
654
655 def testRandomFormat23(self):
656 self.assertEqual(parse("950404 122212"),
657 datetime(1995, 4, 4, 12, 22, 12))
658
659 def testRandomFormat24(self):
660 self.assertEqual(parse("0:00 PM, PST", default=self.default,
661 ignoretz=True),
662 datetime(2003, 9, 25, 12, 0))
663
664 def testRandomFormat25(self):
665 self.assertEqual(parse("12:08 PM", default=self.default),
666 datetime(2003, 9, 25, 12, 8))
667
668 def testRandomFormat26(self):
669 self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
670 datetime(1990, 6, 13, 5, 50))
671
672 def testRandomFormat27(self):
673 self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
674
675 def testRandomFormat28(self):
676 self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
677
678 def testRandomFormat29(self):
679 self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
680
681 def testRandomFormat30(self):
682 self.assertEqual(parse("01h02m03", default=self.default),
683 datetime(2003, 9, 25, 1, 2, 3))
684
685 def testRandomFormat31(self):
686 self.assertEqual(parse("01h02", default=self.default),
687 datetime(2003, 9, 25, 1, 2))
688
689 def testRandomFormat32(self):
690 self.assertEqual(parse("01h02s", default=self.default),
691 datetime(2003, 9, 25, 1, 0, 2))
692
693 def testRandomFormat33(self):
694 self.assertEqual(parse("01m02", default=self.default),
695 datetime(2003, 9, 25, 0, 1, 2))
696
697 def testRandomFormat34(self):
698 self.assertEqual(parse("01m02h", default=self.default),
699 datetime(2003, 9, 25, 2, 1))
700
701class EasterTest(unittest.TestCase):
702 easterlist = [
703 # WESTERN ORTHODOX
704 (date(1990, 4, 15), date(1990, 4, 15)),
705 (date(1991, 3, 31), date(1991, 4, 7)),
706 (date(1992, 4, 19), date(1992, 4, 26)),
707 (date(1993, 4, 11), date(1993, 4, 18)),
708 (date(1994, 4, 3), date(1994, 5, 1)),
709 (date(1995, 4, 16), date(1995, 4, 23)),
710 (date(1996, 4, 7), date(1996, 4, 14)),
711 (date(1997, 3, 30), date(1997, 4, 27)),
712 (date(1998, 4, 12), date(1998, 4, 19)),
713 (date(1999, 4, 4), date(1999, 4, 11)),
714
715 (date(2000, 4, 23), date(2000, 4, 30)),
716 (date(2001, 4, 15), date(2001, 4, 15)),
717 (date(2002, 3, 31), date(2002, 5, 5)),
718 (date(2003, 4, 20), date(2003, 4, 27)),
719 (date(2004, 4, 11), date(2004, 4, 11)),
720 (date(2005, 3, 27), date(2005, 5, 1)),
721 (date(2006, 4, 16), date(2006, 4, 23)),
722 (date(2007, 4, 8), date(2007, 4, 8)),
723 (date(2008, 3, 23), date(2008, 4, 27)),
724 (date(2009, 4, 12), date(2009, 4, 19)),
725
726 (date(2010, 4, 4), date(2010, 4, 4)),
727 (date(2011, 4, 24), date(2011, 4, 24)),
728 (date(2012, 4, 8), date(2012, 4, 15)),
729 (date(2013, 3, 31), date(2013, 5, 5)),
730 (date(2014, 4, 20), date(2014, 4, 20)),
731 (date(2015, 4, 5), date(2015, 4, 12)),
732 (date(2016, 3, 27), date(2016, 5, 1)),
733 (date(2017, 4, 16), date(2017, 4, 16)),
734 (date(2018, 4, 1), date(2018, 4, 8)),
735 (date(2019, 4, 21), date(2019, 4, 28)),
736
737 (date(2020, 4, 12), date(2020, 4, 19)),
738 (date(2021, 4, 4), date(2021, 5, 2)),
739 (date(2022, 4, 17), date(2022, 4, 24)),
740 (date(2023, 4, 9), date(2023, 4, 16)),
741 (date(2024, 3, 31), date(2024, 5, 5)),
742 (date(2025, 4, 20), date(2025, 4, 20)),
743 (date(2026, 4, 5), date(2026, 4, 12)),
744 (date(2027, 3, 28), date(2027, 5, 2)),
745 (date(2028, 4, 16), date(2028, 4, 16)),
746 (date(2029, 4, 1), date(2029, 4, 8)),
747
748 (date(2030, 4, 21), date(2030, 4, 28)),
749 (date(2031, 4, 13), date(2031, 4, 13)),
750 (date(2032, 3, 28), date(2032, 5, 2)),
751 (date(2033, 4, 17), date(2033, 4, 24)),
752 (date(2034, 4, 9), date(2034, 4, 9)),
753 (date(2035, 3, 25), date(2035, 4, 29)),
754 (date(2036, 4, 13), date(2036, 4, 20)),
755 (date(2037, 4, 5), date(2037, 4, 5)),
756 (date(2038, 4, 25), date(2038, 4, 25)),
757 (date(2039, 4, 10), date(2039, 4, 17)),
758
759 (date(2040, 4, 1), date(2040, 5, 6)),
760 (date(2041, 4, 21), date(2041, 4, 21)),
761 (date(2042, 4, 6), date(2042, 4, 13)),
762 (date(2043, 3, 29), date(2043, 5, 3)),
763 (date(2044, 4, 17), date(2044, 4, 24)),
764 (date(2045, 4, 9), date(2045, 4, 9)),
765 (date(2046, 3, 25), date(2046, 4, 29)),
766 (date(2047, 4, 14), date(2047, 4, 21)),
767 (date(2048, 4, 5), date(2048, 4, 5)),
768 (date(2049, 4, 18), date(2049, 4, 25)),
769
770 (date(2050, 4, 10), date(2050, 4, 17)),
771 ]
772
773 def testEaster(self):
774 for western, orthodox in self.easterlist:
775 self.assertEqual(western, easter(western.year, EASTER_WESTERN))
776 self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
777
778class TZTest(unittest.TestCase):
779
780 EST5EDT = """
781VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
782ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
783S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
784YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
785yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
786wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
7878uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
788YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
789BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
790iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
791znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
792cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
793Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
794JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
795jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
7964GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
797b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
798o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
799AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
800AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
801AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
802AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
803AEVQVAAAAAABAAAAAQ==
804 """
805
806 def testStrStart1(self):
807 self.assertEqual(datetime(2003,4,6,1,59,
808 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
809 self.assertEqual(datetime(2003,4,6,2,00,
810 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
811
812 def testStrEnd1(self):
813 self.assertEqual(datetime(2003,10,26,0,59,
814 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
815 self.assertEqual(datetime(2003,10,26,1,00,
816 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
817
818 def testStrStart2(self):
819 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
820 self.assertEqual(datetime(2003,4,6,1,59,
821 tzinfo=tzstr(s)).tzname(), "EST")
822 self.assertEqual(datetime(2003,4,6,2,00,
823 tzinfo=tzstr(s)).tzname(), "EDT")
824
825 def testStrEnd2(self):
826 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
827 self.assertEqual(datetime(2003,10,26,0,59,
828 tzinfo=tzstr(s)).tzname(), "EDT")
829 self.assertEqual(datetime(2003,10,26,1,00,
830 tzinfo=tzstr(s)).tzname(), "EST")
831
832 def testStrStart3(self):
833 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
834 self.assertEqual(datetime(2003,4,6,1,59,
835 tzinfo=tzstr(s)).tzname(), "EST")
836 self.assertEqual(datetime(2003,4,6,2,00,
837 tzinfo=tzstr(s)).tzname(), "EDT")
838
839 def testStrEnd3(self):
840 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
841 self.assertEqual(datetime(2003,10,26,0,59,
842 tzinfo=tzstr(s)).tzname(), "EDT")
843 self.assertEqual(datetime(2003,10,26,1,00,
844 tzinfo=tzstr(s)).tzname(), "EST")
845
846 def testStrStart4(self):
847 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
848 self.assertEqual(datetime(2003,4,6,1,59,
849 tzinfo=tzstr(s)).tzname(), "EST")
850 self.assertEqual(datetime(2003,4,6,2,00,
851 tzinfo=tzstr(s)).tzname(), "EDT")
852
853 def testStrEnd4(self):
854 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
855 self.assertEqual(datetime(2003,10,26,0,59,
856 tzinfo=tzstr(s)).tzname(), "EDT")
857 self.assertEqual(datetime(2003,10,26,1,00,
858 tzinfo=tzstr(s)).tzname(), "EST")
859
860 def testStrStart5(self):
861 s = "EST5EDT4,95/02:00:00,298/02:00"
862 self.assertEqual(datetime(2003,4,6,1,59,
863 tzinfo=tzstr(s)).tzname(), "EST")
864 self.assertEqual(datetime(2003,4,6,2,00,
865 tzinfo=tzstr(s)).tzname(), "EDT")
866
867 def testStrEnd5(self):
868 s = "EST5EDT4,95/02:00:00,298/02"
869 self.assertEqual(datetime(2003,10,26,0,59,
870 tzinfo=tzstr(s)).tzname(), "EDT")
871 self.assertEqual(datetime(2003,10,26,1,00,
872 tzinfo=tzstr(s)).tzname(), "EST")
873
874 def testStrStart6(self):
875 s = "EST5EDT4,J96/02:00:00,J299/02:00"
876 self.assertEqual(datetime(2003,4,6,1,59,
877 tzinfo=tzstr(s)).tzname(), "EST")
878 self.assertEqual(datetime(2003,4,6,2,00,
879 tzinfo=tzstr(s)).tzname(), "EDT")
880
881 def testStrEnd6(self):
882 s = "EST5EDT4,J96/02:00:00,J299/02"
883 self.assertEqual(datetime(2003,10,26,0,59,
884 tzinfo=tzstr(s)).tzname(), "EDT")
885 self.assertEqual(datetime(2003,10,26,1,00,
886 tzinfo=tzstr(s)).tzname(), "EST")
887
888 def testStrCmp1(self):
889 self.assertEqual(tzstr("EST5EDT"),
890 tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
891
892 def testStrCmp2(self):
893 self.assertEqual(tzstr("EST5EDT"),
894 tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
895
896 def testRangeCmp1(self):
897 self.assertEqual(tzstr("EST5EDT"),
898 tzrange("EST", -18000, "EDT", -14400,
899 relativedelta(hours=+2,
900 month=4, day=1,
901 weekday=(6, 1)),
902 relativedelta(hours=+1,
903 month=10, day=31,
904 weekday=(6, -1))))
905
906 def testRangeCmp2(self):
907 self.assertEqual(tzstr("EST5EDT"),
908 tzrange("EST", -18000, "EDT"))
909
910 def testFileStart1(self):
911 tz = tzfile(StringIO(base64.decodestring(self.EST5EDT)))
912 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
913 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
914
915 def testFileEnd1(self):
916 tz = tzfile(StringIO(base64.decodestring(self.EST5EDT)))
917 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
918 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
919
920if __name__ == "__main__":
921 unittest.main()
922
923# vim:ts=4:sw=4