blob: 6c5396a104677dda1f54cdbb2d28e6bb1c879c57 [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
niemeyer7d8be1a2003-10-09 01:09:42 +0000216 def testYearlyByNWeekDay(self):
217 self.assertEqual(list(rrule(FREQ_YEARLY,
218 count=3,
219 byweekday=(TU(1),TH(-1)),
220 dtstart=parse("19970902T090000"))),
221 [datetime(1997, 12, 25, 9, 0),
222 datetime(1998, 1, 6, 9, 0),
223 datetime(1998, 12, 31, 9, 0)])
224
225 def testYearlyByNWeekDayLarge(self):
226 self.assertEqual(list(rrule(FREQ_YEARLY,
227 count=3,
228 byweekday=(TU(3),TH(-3)),
229 dtstart=parse("19970902T090000"))),
230 [datetime(1997, 12, 11, 9, 0),
231 datetime(1998, 1, 20, 9, 0),
232 datetime(1998, 12, 17, 9, 0)])
233
niemeyercb08a352003-10-08 06:02:06 +0000234 def testYearlyByMonthAndWeekDay(self):
235 self.assertEqual(list(rrule(FREQ_YEARLY,
236 count=3,
237 bymonth=(1,3),
238 byweekday=(TU,TH),
239 dtstart=parse("19970902T090000"))),
240 [datetime(1998, 1, 1, 9, 0),
241 datetime(1998, 1, 6, 9, 0),
242 datetime(1998, 1, 8, 9, 0)])
243
niemeyer7d8be1a2003-10-09 01:09:42 +0000244 def testYearlyByMonthAndNWeekDay(self):
245 self.assertEqual(list(rrule(FREQ_YEARLY,
246 count=3,
247 bymonth=(1,3),
248 byweekday=(TU(1),TH(-1)),
249 dtstart=parse("19970902T090000"))),
250 [datetime(1998, 1, 6, 9, 0),
251 datetime(1998, 1, 29, 9, 0),
252 datetime(1998, 3, 3, 9, 0)])
253
254 def testYearlyByMonthAndNWeekDayLarge(self):
255 # This is interesting because the TH(-3) ends up before
256 # the TU(3).
257 self.assertEqual(list(rrule(FREQ_YEARLY,
258 count=3,
259 bymonth=(1,3),
260 byweekday=(TU(3),TH(-3)),
261 dtstart=parse("19970902T090000"))),
262 [datetime(1998, 1, 15, 9, 0),
263 datetime(1998, 1, 20, 9, 0),
264 datetime(1998, 3, 12, 9, 0)])
265
266 def testYearlyByMonthDayAndWeekDay(self):
267 self.assertEqual(list(rrule(FREQ_YEARLY,
268 count=3,
269 bymonthday=(1,3),
270 byweekday=(TU,TH),
271 dtstart=parse("19970902T090000"))),
272 [datetime(1998, 1, 1, 9, 0),
273 datetime(1998, 2, 3, 9, 0),
274 datetime(1998, 3, 3, 9, 0)])
275
276 def testYearlyByMonthAndMonthDayAndWeekDay(self):
277 self.assertEqual(list(rrule(FREQ_YEARLY,
278 count=3,
279 bymonth=(1,3),
280 bymonthday=(1,3),
281 byweekday=(TU,TH),
282 dtstart=parse("19970902T090000"))),
283 [datetime(1998, 1, 1, 9, 0),
284 datetime(1998, 3, 3, 9, 0),
285 datetime(2001, 3, 1, 9, 0)])
286
287 def testYearlyByYearDay(self):
288 self.assertEqual(list(rrule(FREQ_YEARLY,
289 count=3,
290 byyearday=(1,100,200),
291 dtstart=parse("19970902T090000"))),
292 [datetime(1998, 1, 1, 9, 0),
293 datetime(1998, 4, 10, 9, 0),
294 datetime(1998, 7, 19, 9, 0)])
295
296 def testYearlyByMonthAndYearDay(self):
297 self.assertEqual(list(rrule(FREQ_YEARLY,
298 count=3,
299 bymonth=(4,7),
300 byyearday=(1,100,200),
301 dtstart=parse("19970902T090000"))),
302 [datetime(1998, 4, 10, 9, 0),
303 datetime(1998, 7, 19, 9, 0),
304 datetime(1999, 4, 10, 9, 0)])
305
306 def testYearlyByWeekNo(self):
307 self.assertEqual(list(rrule(FREQ_YEARLY,
308 count=3,
309 byweekno=20,
310 dtstart=parse("19970902T090000"))),
311 [datetime(1998, 5, 11, 9, 0),
312 datetime(1998, 5, 12, 9, 0),
313 datetime(1998, 5, 13, 9, 0)])
314
315 def testYearlyByWeekNoAndWeekDay(self):
316 # That's a nice one. The first days of week number one
317 # may be in the last year.
318 self.assertEqual(list(rrule(FREQ_YEARLY,
319 count=3,
320 byweekno=1,
321 byweekday=MO,
322 dtstart=parse("19970902T090000"))),
323 [datetime(1997, 12, 29, 9, 0),
324 datetime(1999, 1, 4, 9, 0),
325 datetime(2000, 1, 3, 9, 0)])
326
327 def testYearlyByWeekNoAndWeekDayLarge(self):
328 # Another nice test. The last days of week number 52/53
329 # may be in the next year.
330 self.assertEqual(list(rrule(FREQ_YEARLY,
331 count=3,
332 byweekno=52,
333 byweekday=SU,
334 dtstart=parse("19970902T090000"))),
335 [datetime(1997, 12, 28, 9, 0),
336 datetime(1998, 12, 27, 9, 0),
337 datetime(2000, 1, 2, 9, 0)])
338
339 def testYearlyByWeekNoAndWeekDayLast(self):
340 self.assertEqual(list(rrule(FREQ_YEARLY,
341 count=3,
342 byweekno=-1,
343 byweekday=SU,
344 dtstart=parse("19970902T090000"))),
345 [datetime(1997, 12, 28, 9, 0),
346 datetime(1999, 1, 3, 9, 0),
347 datetime(2000, 1, 2, 9, 0)])
348
349 def testYearlyByEaster(self):
350 self.assertEqual(list(rrule(FREQ_YEARLY,
351 count=3,
352 byeaster=0,
353 dtstart=parse("19970902T090000"))),
354 [datetime(1998, 4, 12, 9, 0),
355 datetime(1999, 4, 4, 9, 0),
356 datetime(2000, 4, 23, 9, 0)])
357
358 def testYearlyByEasterPos(self):
359 self.assertEqual(list(rrule(FREQ_YEARLY,
360 count=3,
361 byeaster=1,
362 dtstart=parse("19970902T090000"))),
363 [datetime(1998, 4, 13, 9, 0),
364 datetime(1999, 4, 5, 9, 0),
365 datetime(2000, 4, 24, 9, 0)])
366
367 def testYearlyByEasterNeg(self):
368 self.assertEqual(list(rrule(FREQ_YEARLY,
369 count=3,
370 byeaster=-1,
371 dtstart=parse("19970902T090000"))),
372 [datetime(1998, 4, 11, 9, 0),
373 datetime(1999, 4, 3, 9, 0),
374 datetime(2000, 4, 22, 9, 0)])
375
376 def testYearlyByWeekNoAndWeekDay53(self):
377 self.assertEqual(list(rrule(FREQ_YEARLY,
378 count=3,
379 byweekno=53,
380 byweekday=MO,
381 dtstart=parse("19970902T090000"))),
382 [datetime(1998, 12, 28, 9, 0),
383 datetime(2004, 12, 27, 9, 0),
384 datetime(2009, 12, 28, 9, 0)])
385
386 def testYearlyByWeekNoAndWeekDay53(self):
387 self.assertEqual(list(rrule(FREQ_YEARLY,
388 count=3,
389 byweekno=53,
390 byweekday=MO,
391 dtstart=parse("19970902T090000"))),
392 [datetime(1998, 12, 28, 9, 0),
393 datetime(2004, 12, 27, 9, 0),
394 datetime(2009, 12, 28, 9, 0)])
395
396 def testYearlyByHour(self):
397 self.assertEqual(list(rrule(FREQ_YEARLY,
398 count=3,
399 byhour=(6,18),
400 dtstart=parse("19970902T090000"))),
401 [datetime(1997, 9, 2, 18, 0),
402 datetime(1998, 9, 2, 6, 0),
403 datetime(1998, 9, 2, 18, 0)])
404
405 def testYearlyByMinute(self):
406 self.assertEqual(list(rrule(FREQ_YEARLY,
407 count=3,
408 byminute=(6,18),
409 dtstart=parse("19970902T090000"))),
410 [datetime(1997, 9, 2, 9, 6),
411 datetime(1997, 9, 2, 9, 18),
412 datetime(1998, 9, 2, 9, 6)])
413
414 def testYearlyBySecond(self):
415 self.assertEqual(list(rrule(FREQ_YEARLY,
416 count=3,
417 bysecond=(6,18),
418 dtstart=parse("19970902T090000"))),
419 [datetime(1997, 9, 2, 9, 0, 6),
420 datetime(1997, 9, 2, 9, 0, 18),
421 datetime(1998, 9, 2, 9, 0, 6)])
422
423 def testYearlyByHourAndMinute(self):
424 self.assertEqual(list(rrule(FREQ_YEARLY,
425 count=3,
426 byhour=(6,18),
427 byminute=(6,18),
428 dtstart=parse("19970902T090000"))),
429 [datetime(1997, 9, 2, 18, 6),
430 datetime(1997, 9, 2, 18, 18),
431 datetime(1998, 9, 2, 6, 6)])
432
433 def testYearlyByHourAndSecond(self):
434 self.assertEqual(list(rrule(FREQ_YEARLY,
435 count=3,
436 byhour=(6,18),
437 bysecond=(6,18),
438 dtstart=parse("19970902T090000"))),
439 [datetime(1997, 9, 2, 18, 0, 6),
440 datetime(1997, 9, 2, 18, 0, 18),
441 datetime(1998, 9, 2, 6, 0, 6)])
442
443 def testYearlyByMinuteAndSecond(self):
444 self.assertEqual(list(rrule(FREQ_YEARLY,
445 count=3,
446 byminute=(6,18),
447 bysecond=(6,18),
448 dtstart=parse("19970902T090000"))),
449 [datetime(1997, 9, 2, 9, 6, 6),
450 datetime(1997, 9, 2, 9, 6, 18),
451 datetime(1997, 9, 2, 9, 18, 6)])
452
453 def testYearlyByHourAndMinuteAndSecond(self):
454 self.assertEqual(list(rrule(FREQ_YEARLY,
455 count=3,
456 byhour=(6,18),
457 byminute=(6,18),
458 bysecond=(6,18),
459 dtstart=parse("19970902T090000"))),
460 [datetime(1997, 9, 2, 18, 6, 6),
461 datetime(1997, 9, 2, 18, 6, 18),
462 datetime(1997, 9, 2, 18, 18, 6)])
463
464 def testYearlyBySetPos(self):
465 self.assertEqual(list(rrule(FREQ_YEARLY,
466 count=3,
467 bymonthday=15,
468 byhour=(6,18),
469 bysetpos=(3,-3),
470 dtstart=parse("19970902T090000"))),
471 [datetime(1997, 11, 15, 18, 0),
472 datetime(1998, 2, 15, 6, 0),
473 datetime(1998, 11, 15, 18, 0)])
474
niemeyercb08a352003-10-08 06:02:06 +0000475 def testMonthly(self):
476 self.assertEqual(list(rrule(FREQ_MONTHLY,
477 count=3,
478 dtstart=parse("19970902T090000"))),
479 [datetime(1997, 9, 2, 9, 0),
480 datetime(1997, 10, 2, 9, 0),
481 datetime(1997, 11, 2, 9, 0)])
482
483 def testStrMonthly(self):
484 self.assertEqual(list(rrulestr("""
485 DTSTART:19970902T090000
486 RRULE:FREQ=MONTHLY;COUNT=3
487 """)),
488 [datetime(1997, 9, 2, 9, 0),
489 datetime(1997, 10, 2, 9, 0),
490 datetime(1997, 11, 2, 9, 0)])
491
492 def testMonthlyInterval(self):
493 self.assertEqual(list(rrule(FREQ_MONTHLY,
494 count=3,
495 interval=2,
496 dtstart=parse("19970902T090000"))),
497 [datetime(1997, 9, 2, 9, 0),
498 datetime(1997, 11, 2, 9, 0),
499 datetime(1998, 1, 2, 9, 0)])
500
501 def testMonthlyIntervalLarge(self):
502 self.assertEqual(list(rrule(FREQ_MONTHLY,
503 count=3,
504 interval=18,
505 dtstart=parse("19970902T090000"))),
506 [datetime(1997, 9, 2, 9, 0),
507 datetime(1999, 3, 2, 9, 0),
508 datetime(2000, 9, 2, 9, 0)])
509
510 def testMonthlyByMonth(self):
511 self.assertEqual(list(rrule(FREQ_MONTHLY,
512 count=3,
513 bymonth=(1,3),
514 dtstart=parse("19970902T090000"))),
515 [datetime(1998, 1, 2, 9, 0),
516 datetime(1998, 3, 2, 9, 0),
517 datetime(1999, 1, 2, 9, 0)])
518
519
520 def testMonthlyByMonthDay(self):
521 self.assertEqual(list(rrule(FREQ_MONTHLY,
522 count=3,
523 bymonthday=(1,3),
524 dtstart=parse("19970902T090000"))),
525 [datetime(1997, 9, 3, 9, 0),
526 datetime(1997, 10, 1, 9, 0),
527 datetime(1997, 10, 3, 9, 0)])
528
529 def testMonthlyByMonthAndMonthDay(self):
530 self.assertEqual(list(rrule(FREQ_MONTHLY,
531 count=3,
532 bymonth=(1,3),
533 bymonthday=(5,7),
534 dtstart=parse("19970902T090000"))),
535 [datetime(1998, 1, 5, 9, 0),
536 datetime(1998, 1, 7, 9, 0),
537 datetime(1998, 3, 5, 9, 0)])
538
539 def testMonthlyByWeekDay(self):
540 self.assertEqual(list(rrule(FREQ_MONTHLY,
541 count=3,
542 byweekday=(TU,TH),
543 dtstart=parse("19970902T090000"))),
544 [datetime(1997, 9, 2, 9, 0),
545 datetime(1997, 9, 4, 9, 0),
546 datetime(1997, 9, 9, 9, 0)])
547
niemeyer7d8be1a2003-10-09 01:09:42 +0000548 def testMonthlyByNWeekDay(self):
549 self.assertEqual(list(rrule(FREQ_MONTHLY,
550 count=3,
551 byweekday=(TU(1),TH(-1)),
552 dtstart=parse("19970902T090000"))),
553 [datetime(1997, 9, 2, 9, 0),
554 datetime(1997, 9, 25, 9, 0),
555 datetime(1997, 10, 7, 9, 0)])
556
557 def testMonthlyByNWeekDayLarge(self):
558 self.assertEqual(list(rrule(FREQ_MONTHLY,
559 count=3,
560 byweekday=(TU(3),TH(-3)),
561 dtstart=parse("19970902T090000"))),
562 [datetime(1997, 9, 11, 9, 0),
563 datetime(1997, 9, 16, 9, 0),
564 datetime(1997, 10, 16, 9, 0)])
565
niemeyercb08a352003-10-08 06:02:06 +0000566 def testMonthlyByMonthAndWeekDay(self):
567 self.assertEqual(list(rrule(FREQ_MONTHLY,
568 count=3,
569 bymonth=(1,3),
570 byweekday=(TU,TH),
571 dtstart=parse("19970902T090000"))),
572 [datetime(1998, 1, 1, 9, 0),
573 datetime(1998, 1, 6, 9, 0),
574 datetime(1998, 1, 8, 9, 0)])
575
niemeyer7d8be1a2003-10-09 01:09:42 +0000576 def testMonthlyByMonthAndNWeekDay(self):
577 self.assertEqual(list(rrule(FREQ_MONTHLY,
578 count=3,
579 bymonth=(1,3),
580 byweekday=(TU(1),TH(-1)),
581 dtstart=parse("19970902T090000"))),
582 [datetime(1998, 1, 6, 9, 0),
583 datetime(1998, 1, 29, 9, 0),
584 datetime(1998, 3, 3, 9, 0)])
585
586 def testMonthlyByMonthAndNWeekDayLarge(self):
587 self.assertEqual(list(rrule(FREQ_MONTHLY,
588 count=3,
589 bymonth=(1,3),
590 byweekday=(TU(3),TH(-3)),
591 dtstart=parse("19970902T090000"))),
592 [datetime(1998, 1, 15, 9, 0),
593 datetime(1998, 1, 20, 9, 0),
594 datetime(1998, 3, 12, 9, 0)])
595
596 def testMonthlyByMonthDayAndWeekDay(self):
597 self.assertEqual(list(rrule(FREQ_MONTHLY,
598 count=3,
599 bymonthday=(1,3),
600 byweekday=(TU,TH),
601 dtstart=parse("19970902T090000"))),
602 [datetime(1998, 1, 1, 9, 0),
603 datetime(1998, 2, 3, 9, 0),
604 datetime(1998, 3, 3, 9, 0)])
605
606 def testMonthlyByMonthAndMonthDayAndWeekDay(self):
607 self.assertEqual(list(rrule(FREQ_MONTHLY,
608 count=3,
609 bymonth=(1,3),
610 bymonthday=(1,3),
611 byweekday=(TU,TH),
612 dtstart=parse("19970902T090000"))),
613 [datetime(1998, 1, 1, 9, 0),
614 datetime(1998, 3, 3, 9, 0),
615 datetime(2001, 3, 1, 9, 0)])
616
617 def testMonthlyByYearDay(self):
618 self.assertEqual(list(rrule(FREQ_MONTHLY,
619 count=3,
620 byyearday=(1,100,200),
621 dtstart=parse("19970902T090000"))),
622 [datetime(1998, 1, 1, 9, 0),
623 datetime(1998, 4, 10, 9, 0),
624 datetime(1998, 7, 19, 9, 0)])
625
626 def testMonthlyByMonthAndYearDay(self):
627 self.assertEqual(list(rrule(FREQ_MONTHLY,
628 count=3,
629 bymonth=(4,7),
630 byyearday=(1,100,200),
631 dtstart=parse("19970902T090000"))),
632 [datetime(1998, 4, 10, 9, 0),
633 datetime(1998, 7, 19, 9, 0),
634 datetime(1999, 4, 10, 9, 0)])
635
636 def testMonthlyByWeekNo(self):
637 self.assertEqual(list(rrule(FREQ_MONTHLY,
638 count=3,
639 byweekno=20,
640 dtstart=parse("19970902T090000"))),
641 [datetime(1998, 5, 11, 9, 0),
642 datetime(1998, 5, 12, 9, 0),
643 datetime(1998, 5, 13, 9, 0)])
644
645 def testMonthlyByWeekNoAndWeekDay(self):
646 # That's a nice one. The first days of week number one
647 # may be in the last year.
648 self.assertEqual(list(rrule(FREQ_MONTHLY,
649 count=3,
650 byweekno=1,
651 byweekday=MO,
652 dtstart=parse("19970902T090000"))),
653 [datetime(1997, 12, 29, 9, 0),
654 datetime(1999, 1, 4, 9, 0),
655 datetime(2000, 1, 3, 9, 0)])
656
657 def testMonthlyByWeekNoAndWeekDayLarge(self):
658 # Another nice test. The last days of week number 52/53
659 # may be in the next year.
660 self.assertEqual(list(rrule(FREQ_MONTHLY,
661 count=3,
662 byweekno=52,
663 byweekday=SU,
664 dtstart=parse("19970902T090000"))),
665 [datetime(1997, 12, 28, 9, 0),
666 datetime(1998, 12, 27, 9, 0),
667 datetime(2000, 1, 2, 9, 0)])
668
669 def testMonthlyByWeekNoAndWeekDayLast(self):
670 self.assertEqual(list(rrule(FREQ_MONTHLY,
671 count=3,
672 byweekno=-1,
673 byweekday=SU,
674 dtstart=parse("19970902T090000"))),
675 [datetime(1997, 12, 28, 9, 0),
676 datetime(1999, 1, 3, 9, 0),
677 datetime(2000, 1, 2, 9, 0)])
678
679 def testMonthlyByWeekNoAndWeekDay53(self):
680 self.assertEqual(list(rrule(FREQ_MONTHLY,
681 count=3,
682 byweekno=53,
683 byweekday=MO,
684 dtstart=parse("19970902T090000"))),
685 [datetime(1998, 12, 28, 9, 0),
686 datetime(2004, 12, 27, 9, 0),
687 datetime(2009, 12, 28, 9, 0)])
688
689 def testMonthlyByEaster(self):
690 self.assertEqual(list(rrule(FREQ_MONTHLY,
691 count=3,
692 byeaster=0,
693 dtstart=parse("19970902T090000"))),
694 [datetime(1998, 4, 12, 9, 0),
695 datetime(1999, 4, 4, 9, 0),
696 datetime(2000, 4, 23, 9, 0)])
697
698 def testMonthlyByEasterPos(self):
699 self.assertEqual(list(rrule(FREQ_MONTHLY,
700 count=3,
701 byeaster=1,
702 dtstart=parse("19970902T090000"))),
703 [datetime(1998, 4, 13, 9, 0),
704 datetime(1999, 4, 5, 9, 0),
705 datetime(2000, 4, 24, 9, 0)])
706
707 def testMonthlyByEasterNeg(self):
708 self.assertEqual(list(rrule(FREQ_MONTHLY,
709 count=3,
710 byeaster=-1,
711 dtstart=parse("19970902T090000"))),
712 [datetime(1998, 4, 11, 9, 0),
713 datetime(1999, 4, 3, 9, 0),
714 datetime(2000, 4, 22, 9, 0)])
715
716 def testMonthlyByHour(self):
717 self.assertEqual(list(rrule(FREQ_MONTHLY,
718 count=3,
719 byhour=(6,18),
720 dtstart=parse("19970902T090000"))),
721 [datetime(1997, 9, 2, 18, 0),
722 datetime(1997, 10, 2, 6, 0),
723 datetime(1997, 10, 2, 18, 0)])
724
725 def testMonthlyByMinute(self):
726 self.assertEqual(list(rrule(FREQ_MONTHLY,
727 count=3,
728 byminute=(6,18),
729 dtstart=parse("19970902T090000"))),
730 [datetime(1997, 9, 2, 9, 6),
731 datetime(1997, 9, 2, 9, 18),
732 datetime(1997, 10, 2, 9, 6)])
733
734 def testMonthlyBySecond(self):
735 self.assertEqual(list(rrule(FREQ_MONTHLY,
736 count=3,
737 bysecond=(6,18),
738 dtstart=parse("19970902T090000"))),
739 [datetime(1997, 9, 2, 9, 0, 6),
740 datetime(1997, 9, 2, 9, 0, 18),
741 datetime(1997, 10, 2, 9, 0, 6)])
742
743 def testMonthlyByHourAndMinute(self):
744 self.assertEqual(list(rrule(FREQ_MONTHLY,
745 count=3,
746 byhour=(6,18),
747 byminute=(6,18),
748 dtstart=parse("19970902T090000"))),
749 [datetime(1997, 9, 2, 18, 6),
750 datetime(1997, 9, 2, 18, 18),
751 datetime(1997, 10, 2, 6, 6)])
752
753 def testMonthlyByHourAndSecond(self):
754 self.assertEqual(list(rrule(FREQ_MONTHLY,
755 count=3,
756 byhour=(6,18),
757 bysecond=(6,18),
758 dtstart=parse("19970902T090000"))),
759 [datetime(1997, 9, 2, 18, 0, 6),
760 datetime(1997, 9, 2, 18, 0, 18),
761 datetime(1997, 10, 2, 6, 0, 6)])
762
763 def testMonthlyByMinuteAndSecond(self):
764 self.assertEqual(list(rrule(FREQ_MONTHLY,
765 count=3,
766 byminute=(6,18),
767 bysecond=(6,18),
768 dtstart=parse("19970902T090000"))),
769 [datetime(1997, 9, 2, 9, 6, 6),
770 datetime(1997, 9, 2, 9, 6, 18),
771 datetime(1997, 9, 2, 9, 18, 6)])
772
773 def testMonthlyByHourAndMinuteAndSecond(self):
774 self.assertEqual(list(rrule(FREQ_MONTHLY,
775 count=3,
776 byhour=(6,18),
777 byminute=(6,18),
778 bysecond=(6,18),
779 dtstart=parse("19970902T090000"))),
780 [datetime(1997, 9, 2, 18, 6, 6),
781 datetime(1997, 9, 2, 18, 6, 18),
782 datetime(1997, 9, 2, 18, 18, 6)])
783
784 def testMonthlyBySetPos(self):
785 self.assertEqual(list(rrule(FREQ_MONTHLY,
786 count=3,
787 bymonthday=(13,17),
788 byhour=(6,18),
789 bysetpos=(3,-3),
790 dtstart=parse("19970902T090000"))),
791 [datetime(1997, 9, 13, 18, 0),
792 datetime(1997, 9, 17, 6, 0),
793 datetime(1997, 10, 13, 18, 0)])
794
niemeyercb08a352003-10-08 06:02:06 +0000795 def testWeekly(self):
796 self.assertEqual(list(rrule(FREQ_WEEKLY,
797 count=3,
798 dtstart=parse("19970902T090000"))),
799 [datetime(1997, 9, 2, 9, 0),
800 datetime(1997, 9, 9, 9, 0),
801 datetime(1997, 9, 16, 9, 0)])
802
803 def testStrWeekly(self):
804 self.assertEqual(list(rrulestr("""
805 DTSTART:19970902T090000
806 RRULE:FREQ=WEEKLY;COUNT=3
807 """)),
808 [datetime(1997, 9, 2, 9, 0),
809 datetime(1997, 9, 9, 9, 0),
810 datetime(1997, 9, 16, 9, 0)])
811
812 def testWeeklyInterval(self):
813 self.assertEqual(list(rrule(FREQ_WEEKLY,
814 count=3,
815 interval=2,
816 dtstart=parse("19970902T090000"))),
817 [datetime(1997, 9, 2, 9, 0),
818 datetime(1997, 9, 16, 9, 0),
819 datetime(1997, 9, 30, 9, 0)])
820
821 def testWeeklyIntervalLarge(self):
822 self.assertEqual(list(rrule(FREQ_WEEKLY,
823 count=3,
824 interval=20,
825 dtstart=parse("19970902T090000"))),
826 [datetime(1997, 9, 2, 9, 0),
827 datetime(1998, 1, 20, 9, 0),
828 datetime(1998, 6, 9, 9, 0)])
829
830 def testWeeklyByMonth(self):
831 self.assertEqual(list(rrule(FREQ_WEEKLY,
832 count=3,
833 bymonth=(1,3),
834 dtstart=parse("19970902T090000"))),
835 [datetime(1998, 1, 6, 9, 0),
836 datetime(1998, 1, 13, 9, 0),
837 datetime(1998, 1, 20, 9, 0)])
838
839 def testWeeklyByMonthDay(self):
840 self.assertEqual(list(rrule(FREQ_WEEKLY,
841 count=3,
842 bymonthday=(1,3),
843 dtstart=parse("19970902T090000"))),
844 [datetime(1997, 9, 3, 9, 0),
845 datetime(1997, 10, 1, 9, 0),
846 datetime(1997, 10, 3, 9, 0)])
847
848 def testWeeklyByMonthAndMonthDay(self):
849 self.assertEqual(list(rrule(FREQ_WEEKLY,
850 count=3,
851 bymonth=(1,3),
852 bymonthday=(5,7),
853 dtstart=parse("19970902T090000"))),
854 [datetime(1998, 1, 5, 9, 0),
855 datetime(1998, 1, 7, 9, 0),
856 datetime(1998, 3, 5, 9, 0)])
857
858 def testWeeklyByWeekDay(self):
859 self.assertEqual(list(rrule(FREQ_WEEKLY,
860 count=3,
861 byweekday=(TU,TH),
862 dtstart=parse("19970902T090000"))),
863 [datetime(1997, 9, 2, 9, 0),
864 datetime(1997, 9, 4, 9, 0),
865 datetime(1997, 9, 9, 9, 0)])
866
niemeyer7d8be1a2003-10-09 01:09:42 +0000867 def testWeeklyByNWeekDay(self):
868 self.assertEqual(list(rrule(FREQ_WEEKLY,
869 count=3,
870 byweekday=(TU(1),TH(-1)),
871 dtstart=parse("19970902T090000"))),
872 [datetime(1997, 9, 2, 9, 0),
873 datetime(1997, 9, 4, 9, 0),
874 datetime(1997, 9, 9, 9, 0)])
875
niemeyercb08a352003-10-08 06:02:06 +0000876 def testWeeklyByMonthAndWeekDay(self):
877 # This test is interesting, because it crosses the year
878 # boundary in a weekly period to find day '1' as a
879 # valid recurrence.
880 self.assertEqual(list(rrule(FREQ_WEEKLY,
881 count=3,
882 bymonth=(1,3),
883 byweekday=(TU,TH),
884 dtstart=parse("19970902T090000"))),
885 [datetime(1998, 1, 1, 9, 0),
886 datetime(1998, 1, 6, 9, 0),
887 datetime(1998, 1, 8, 9, 0)])
888
niemeyer7d8be1a2003-10-09 01:09:42 +0000889 def testWeeklyByMonthAndNWeekDay(self):
890 self.assertEqual(list(rrule(FREQ_WEEKLY,
891 count=3,
892 bymonth=(1,3),
893 byweekday=(TU(1),TH(-1)),
894 dtstart=parse("19970902T090000"))),
895 [datetime(1998, 1, 1, 9, 0),
896 datetime(1998, 1, 6, 9, 0),
897 datetime(1998, 1, 8, 9, 0)])
898
899 def testWeeklyByMonthDayAndWeekDay(self):
900 self.assertEqual(list(rrule(FREQ_WEEKLY,
901 count=3,
902 bymonthday=(1,3),
903 byweekday=(TU,TH),
904 dtstart=parse("19970902T090000"))),
905 [datetime(1998, 1, 1, 9, 0),
906 datetime(1998, 2, 3, 9, 0),
907 datetime(1998, 3, 3, 9, 0)])
908
909 def testWeeklyByMonthAndMonthDayAndWeekDay(self):
910 self.assertEqual(list(rrule(FREQ_WEEKLY,
911 count=3,
912 bymonth=(1,3),
913 bymonthday=(1,3),
914 byweekday=(TU,TH),
915 dtstart=parse("19970902T090000"))),
916 [datetime(1998, 1, 1, 9, 0),
917 datetime(1998, 3, 3, 9, 0),
918 datetime(2001, 3, 1, 9, 0)])
919
920 def testWeeklyByYearDay(self):
921 self.assertEqual(list(rrule(FREQ_WEEKLY,
922 count=3,
923 byyearday=(1,100,200),
924 dtstart=parse("19970902T090000"))),
925 [datetime(1998, 1, 1, 9, 0),
926 datetime(1998, 4, 10, 9, 0),
927 datetime(1998, 7, 19, 9, 0)])
928
929 def testWeeklyByMonthAndYearDay(self):
930 self.assertEqual(list(rrule(FREQ_WEEKLY,
931 count=3,
932 bymonth=(1,7),
933 byyearday=(1,100,200),
934 dtstart=parse("19970902T090000"))),
935 [datetime(1998, 1, 1, 9, 0),
936 datetime(1998, 7, 19, 9, 0),
937 datetime(1999, 1, 1, 9, 0)])
938
939 def testWeeklyByWeekNo(self):
940 self.assertEqual(list(rrule(FREQ_WEEKLY,
941 count=3,
942 byweekno=20,
943 dtstart=parse("19970902T090000"))),
944 [datetime(1998, 5, 11, 9, 0),
945 datetime(1998, 5, 12, 9, 0),
946 datetime(1998, 5, 13, 9, 0)])
947
948 def testWeeklyByWeekNoAndWeekDay(self):
949 # That's a nice one. The first days of week number one
950 # may be in the last year.
951 self.assertEqual(list(rrule(FREQ_WEEKLY,
952 count=3,
953 byweekno=1,
954 byweekday=MO,
955 dtstart=parse("19970902T090000"))),
956 [datetime(1997, 12, 29, 9, 0),
957 datetime(1999, 1, 4, 9, 0),
958 datetime(2000, 1, 3, 9, 0)])
959
960 def testWeeklyByWeekNoAndWeekDayLarge(self):
961 # Another nice test. The last days of week number 52/53
962 # may be in the next year.
963 self.assertEqual(list(rrule(FREQ_WEEKLY,
964 count=3,
965 byweekno=52,
966 byweekday=SU,
967 dtstart=parse("19970902T090000"))),
968 [datetime(1997, 12, 28, 9, 0),
969 datetime(1998, 12, 27, 9, 0),
970 datetime(2000, 1, 2, 9, 0)])
971
972 def testWeeklyByWeekNoAndWeekDayLast(self):
973 self.assertEqual(list(rrule(FREQ_WEEKLY,
974 count=3,
975 byweekno=-1,
976 byweekday=SU,
977 dtstart=parse("19970902T090000"))),
978 [datetime(1997, 12, 28, 9, 0),
979 datetime(1999, 1, 3, 9, 0),
980 datetime(2000, 1, 2, 9, 0)])
981
982 def testWeeklyByWeekNoAndWeekDay53(self):
983 self.assertEqual(list(rrule(FREQ_WEEKLY,
984 count=3,
985 byweekno=53,
986 byweekday=MO,
987 dtstart=parse("19970902T090000"))),
988 [datetime(1998, 12, 28, 9, 0),
989 datetime(2004, 12, 27, 9, 0),
990 datetime(2009, 12, 28, 9, 0)])
991
992 def testWeeklyByEaster(self):
993 self.assertEqual(list(rrule(FREQ_WEEKLY,
994 count=3,
995 byeaster=0,
996 dtstart=parse("19970902T090000"))),
997 [datetime(1998, 4, 12, 9, 0),
998 datetime(1999, 4, 4, 9, 0),
999 datetime(2000, 4, 23, 9, 0)])
1000
1001 def testWeeklyByEasterPos(self):
1002 self.assertEqual(list(rrule(FREQ_WEEKLY,
1003 count=3,
1004 byeaster=1,
1005 dtstart=parse("19970902T090000"))),
1006 [datetime(1998, 4, 13, 9, 0),
1007 datetime(1999, 4, 5, 9, 0),
1008 datetime(2000, 4, 24, 9, 0)])
1009
1010 def testWeeklyByEasterNeg(self):
1011 self.assertEqual(list(rrule(FREQ_WEEKLY,
1012 count=3,
1013 byeaster=-1,
1014 dtstart=parse("19970902T090000"))),
1015 [datetime(1998, 4, 11, 9, 0),
1016 datetime(1999, 4, 3, 9, 0),
1017 datetime(2000, 4, 22, 9, 0)])
1018
1019 def testWeeklyByHour(self):
1020 self.assertEqual(list(rrule(FREQ_WEEKLY,
1021 count=3,
1022 byhour=(6,18),
1023 dtstart=parse("19970902T090000"))),
1024 [datetime(1997, 9, 2, 18, 0),
1025 datetime(1997, 9, 9, 6, 0),
1026 datetime(1997, 9, 9, 18, 0)])
1027
1028 def testWeeklyByMinute(self):
1029 self.assertEqual(list(rrule(FREQ_WEEKLY,
1030 count=3,
1031 byminute=(6,18),
1032 dtstart=parse("19970902T090000"))),
1033 [datetime(1997, 9, 2, 9, 6),
1034 datetime(1997, 9, 2, 9, 18),
1035 datetime(1997, 9, 9, 9, 6)])
1036
1037 def testWeeklyBySecond(self):
1038 self.assertEqual(list(rrule(FREQ_WEEKLY,
1039 count=3,
1040 bysecond=(6,18),
1041 dtstart=parse("19970902T090000"))),
1042 [datetime(1997, 9, 2, 9, 0, 6),
1043 datetime(1997, 9, 2, 9, 0, 18),
1044 datetime(1997, 9, 9, 9, 0, 6)])
1045
1046 def testWeeklyByHourAndMinute(self):
1047 self.assertEqual(list(rrule(FREQ_WEEKLY,
1048 count=3,
1049 byhour=(6,18),
1050 byminute=(6,18),
1051 dtstart=parse("19970902T090000"))),
1052 [datetime(1997, 9, 2, 18, 6),
1053 datetime(1997, 9, 2, 18, 18),
1054 datetime(1997, 9, 9, 6, 6)])
1055
1056 def testWeeklyByHourAndSecond(self):
1057 self.assertEqual(list(rrule(FREQ_WEEKLY,
1058 count=3,
1059 byhour=(6,18),
1060 bysecond=(6,18),
1061 dtstart=parse("19970902T090000"))),
1062 [datetime(1997, 9, 2, 18, 0, 6),
1063 datetime(1997, 9, 2, 18, 0, 18),
1064 datetime(1997, 9, 9, 6, 0, 6)])
1065
1066 def testWeeklyByMinuteAndSecond(self):
1067 self.assertEqual(list(rrule(FREQ_WEEKLY,
1068 count=3,
1069 byminute=(6,18),
1070 bysecond=(6,18),
1071 dtstart=parse("19970902T090000"))),
1072 [datetime(1997, 9, 2, 9, 6, 6),
1073 datetime(1997, 9, 2, 9, 6, 18),
1074 datetime(1997, 9, 2, 9, 18, 6)])
1075
1076 def testWeeklyByHourAndMinuteAndSecond(self):
1077 self.assertEqual(list(rrule(FREQ_WEEKLY,
1078 count=3,
1079 byhour=(6,18),
1080 byminute=(6,18),
1081 bysecond=(6,18),
1082 dtstart=parse("19970902T090000"))),
1083 [datetime(1997, 9, 2, 18, 6, 6),
1084 datetime(1997, 9, 2, 18, 6, 18),
1085 datetime(1997, 9, 2, 18, 18, 6)])
1086
1087 def testWeeklyBySetPos(self):
1088 self.assertEqual(list(rrule(FREQ_WEEKLY,
1089 count=3,
1090 byweekday=(TU,TH),
1091 byhour=(6,18),
1092 bysetpos=(3,-3),
1093 dtstart=parse("19970902T090000"))),
1094 [datetime(1997, 9, 2, 18, 0),
1095 datetime(1997, 9, 4, 6, 0),
1096 datetime(1997, 9, 9, 18, 0)])
1097
niemeyercb08a352003-10-08 06:02:06 +00001098 def testDaily(self):
1099 self.assertEqual(list(rrule(FREQ_DAILY,
1100 count=3,
1101 dtstart=parse("19970902T090000"))),
1102 [datetime(1997, 9, 2, 9, 0),
1103 datetime(1997, 9, 3, 9, 0),
1104 datetime(1997, 9, 4, 9, 0)])
1105
1106 def testStrDaily(self):
1107 self.assertEqual(list(rrulestr("""
1108 DTSTART:19970902T090000
1109 RRULE:FREQ=DAILY;COUNT=3
1110 """)),
1111 [datetime(1997, 9, 2, 9, 0),
1112 datetime(1997, 9, 3, 9, 0),
1113 datetime(1997, 9, 4, 9, 0)])
1114
1115 def testDailyInterval(self):
1116 self.assertEqual(list(rrule(FREQ_DAILY,
1117 count=3,
1118 interval=2,
1119 dtstart=parse("19970902T090000"))),
1120 [datetime(1997, 9, 2, 9, 0),
1121 datetime(1997, 9, 4, 9, 0),
1122 datetime(1997, 9, 6, 9, 0)])
1123
1124 def testDailyIntervalLarge(self):
1125 self.assertEqual(list(rrule(FREQ_DAILY,
1126 count=3,
1127 interval=92,
1128 dtstart=parse("19970902T090000"))),
1129 [datetime(1997, 9, 2, 9, 0),
1130 datetime(1997, 12, 3, 9, 0),
1131 datetime(1998, 3, 5, 9, 0)])
1132
1133 def testDailyByMonth(self):
1134 self.assertEqual(list(rrule(FREQ_DAILY,
1135 count=3,
1136 bymonth=(1,3),
1137 dtstart=parse("19970902T090000"))),
1138 [datetime(1998, 1, 1, 9, 0),
1139 datetime(1998, 1, 2, 9, 0),
1140 datetime(1998, 1, 3, 9, 0)])
1141
1142 def testDailyByMonthDay(self):
1143 self.assertEqual(list(rrule(FREQ_DAILY,
1144 count=3,
1145 bymonthday=(1,3),
1146 dtstart=parse("19970902T090000"))),
1147 [datetime(1997, 9, 3, 9, 0),
1148 datetime(1997, 10, 1, 9, 0),
1149 datetime(1997, 10, 3, 9, 0)])
1150
1151 def testDailyByMonthAndMonthDay(self):
1152 self.assertEqual(list(rrule(FREQ_DAILY,
1153 count=3,
1154 bymonth=(1,3),
1155 bymonthday=(5,7),
1156 dtstart=parse("19970902T090000"))),
1157 [datetime(1998, 1, 5, 9, 0),
1158 datetime(1998, 1, 7, 9, 0),
1159 datetime(1998, 3, 5, 9, 0)])
1160
1161 def testDailyByWeekDay(self):
1162 self.assertEqual(list(rrule(FREQ_DAILY,
1163 count=3,
1164 byweekday=(TU,TH),
1165 dtstart=parse("19970902T090000"))),
1166 [datetime(1997, 9, 2, 9, 0),
1167 datetime(1997, 9, 4, 9, 0),
1168 datetime(1997, 9, 9, 9, 0)])
1169
niemeyer7d8be1a2003-10-09 01:09:42 +00001170 def testDailyByNWeekDay(self):
1171 self.assertEqual(list(rrule(FREQ_DAILY,
1172 count=3,
1173 byweekday=(TU(1),TH(-1)),
1174 dtstart=parse("19970902T090000"))),
1175 [datetime(1997, 9, 2, 9, 0),
1176 datetime(1997, 9, 4, 9, 0),
1177 datetime(1997, 9, 9, 9, 0)])
1178
niemeyercb08a352003-10-08 06:02:06 +00001179 def testDailyByMonthAndWeekDay(self):
1180 self.assertEqual(list(rrule(FREQ_DAILY,
1181 count=3,
1182 bymonth=(1,3),
1183 byweekday=(TU,TH),
1184 dtstart=parse("19970902T090000"))),
1185 [datetime(1998, 1, 1, 9, 0),
1186 datetime(1998, 1, 6, 9, 0),
1187 datetime(1998, 1, 8, 9, 0)])
1188
niemeyer7d8be1a2003-10-09 01:09:42 +00001189 def testDailyByMonthAndNWeekDay(self):
1190 self.assertEqual(list(rrule(FREQ_DAILY,
1191 count=3,
1192 bymonth=(1,3),
1193 byweekday=(TU(1),TH(-1)),
1194 dtstart=parse("19970902T090000"))),
1195 [datetime(1998, 1, 1, 9, 0),
1196 datetime(1998, 1, 6, 9, 0),
1197 datetime(1998, 1, 8, 9, 0)])
1198
1199 def testDailyByMonthDayAndWeekDay(self):
1200 self.assertEqual(list(rrule(FREQ_DAILY,
1201 count=3,
1202 bymonthday=(1,3),
1203 byweekday=(TU,TH),
1204 dtstart=parse("19970902T090000"))),
1205 [datetime(1998, 1, 1, 9, 0),
1206 datetime(1998, 2, 3, 9, 0),
1207 datetime(1998, 3, 3, 9, 0)])
1208
1209 def testDailyByMonthAndMonthDayAndWeekDay(self):
1210 self.assertEqual(list(rrule(FREQ_DAILY,
1211 count=3,
1212 bymonth=(1,3),
1213 bymonthday=(1,3),
1214 byweekday=(TU,TH),
1215 dtstart=parse("19970902T090000"))),
1216 [datetime(1998, 1, 1, 9, 0),
1217 datetime(1998, 3, 3, 9, 0),
1218 datetime(2001, 3, 1, 9, 0)])
1219
1220 def testDailyByYearDay(self):
1221 self.assertEqual(list(rrule(FREQ_DAILY,
1222 count=3,
1223 byyearday=(1,100,200),
1224 dtstart=parse("19970902T090000"))),
1225 [datetime(1998, 1, 1, 9, 0),
1226 datetime(1998, 4, 10, 9, 0),
1227 datetime(1998, 7, 19, 9, 0)])
1228
1229 def testDailyByMonthAndYearDay(self):
1230 self.assertEqual(list(rrule(FREQ_DAILY,
1231 count=3,
1232 bymonth=(1,7),
1233 byyearday=(1,100,200),
1234 dtstart=parse("19970902T090000"))),
1235 [datetime(1998, 1, 1, 9, 0),
1236 datetime(1998, 7, 19, 9, 0),
1237 datetime(1999, 1, 1, 9, 0)])
1238
1239 def testDailyByWeekNo(self):
1240 self.assertEqual(list(rrule(FREQ_DAILY,
1241 count=3,
1242 byweekno=20,
1243 dtstart=parse("19970902T090000"))),
1244 [datetime(1998, 5, 11, 9, 0),
1245 datetime(1998, 5, 12, 9, 0),
1246 datetime(1998, 5, 13, 9, 0)])
1247
1248 def testDailyByWeekNoAndWeekDay(self):
1249 # That's a nice one. The first days of week number one
1250 # may be in the last year.
1251 self.assertEqual(list(rrule(FREQ_DAILY,
1252 count=3,
1253 byweekno=1,
1254 byweekday=MO,
1255 dtstart=parse("19970902T090000"))),
1256 [datetime(1997, 12, 29, 9, 0),
1257 datetime(1999, 1, 4, 9, 0),
1258 datetime(2000, 1, 3, 9, 0)])
1259
1260 def testDailyByWeekNoAndWeekDayLarge(self):
1261 # Another nice test. The last days of week number 52/53
1262 # may be in the next year.
1263 self.assertEqual(list(rrule(FREQ_DAILY,
1264 count=3,
1265 byweekno=52,
1266 byweekday=SU,
1267 dtstart=parse("19970902T090000"))),
1268 [datetime(1997, 12, 28, 9, 0),
1269 datetime(1998, 12, 27, 9, 0),
1270 datetime(2000, 1, 2, 9, 0)])
1271
1272 def testDailyByWeekNoAndWeekDayLast(self):
1273 self.assertEqual(list(rrule(FREQ_DAILY,
1274 count=3,
1275 byweekno=-1,
1276 byweekday=SU,
1277 dtstart=parse("19970902T090000"))),
1278 [datetime(1997, 12, 28, 9, 0),
1279 datetime(1999, 1, 3, 9, 0),
1280 datetime(2000, 1, 2, 9, 0)])
1281
1282 def testDailyByWeekNoAndWeekDay53(self):
1283 self.assertEqual(list(rrule(FREQ_DAILY,
1284 count=3,
1285 byweekno=53,
1286 byweekday=MO,
1287 dtstart=parse("19970902T090000"))),
1288 [datetime(1998, 12, 28, 9, 0),
1289 datetime(2004, 12, 27, 9, 0),
1290 datetime(2009, 12, 28, 9, 0)])
1291
1292 def testDailyByEaster(self):
1293 self.assertEqual(list(rrule(FREQ_DAILY,
1294 count=3,
1295 byeaster=0,
1296 dtstart=parse("19970902T090000"))),
1297 [datetime(1998, 4, 12, 9, 0),
1298 datetime(1999, 4, 4, 9, 0),
1299 datetime(2000, 4, 23, 9, 0)])
1300
1301 def testDailyByEasterPos(self):
1302 self.assertEqual(list(rrule(FREQ_DAILY,
1303 count=3,
1304 byeaster=1,
1305 dtstart=parse("19970902T090000"))),
1306 [datetime(1998, 4, 13, 9, 0),
1307 datetime(1999, 4, 5, 9, 0),
1308 datetime(2000, 4, 24, 9, 0)])
1309
1310 def testDailyByEasterNeg(self):
1311 self.assertEqual(list(rrule(FREQ_DAILY,
1312 count=3,
1313 byeaster=-1,
1314 dtstart=parse("19970902T090000"))),
1315 [datetime(1998, 4, 11, 9, 0),
1316 datetime(1999, 4, 3, 9, 0),
1317 datetime(2000, 4, 22, 9, 0)])
1318
1319 def testDailyByHour(self):
1320 self.assertEqual(list(rrule(FREQ_DAILY,
1321 count=3,
1322 byhour=(6,18),
1323 dtstart=parse("19970902T090000"))),
1324 [datetime(1997, 9, 2, 18, 0),
1325 datetime(1997, 9, 3, 6, 0),
1326 datetime(1997, 9, 3, 18, 0)])
1327
1328 def testDailyByMinute(self):
1329 self.assertEqual(list(rrule(FREQ_DAILY,
1330 count=3,
1331 byminute=(6,18),
1332 dtstart=parse("19970902T090000"))),
1333 [datetime(1997, 9, 2, 9, 6),
1334 datetime(1997, 9, 2, 9, 18),
1335 datetime(1997, 9, 3, 9, 6)])
1336
1337 def testDailyBySecond(self):
1338 self.assertEqual(list(rrule(FREQ_DAILY,
1339 count=3,
1340 bysecond=(6,18),
1341 dtstart=parse("19970902T090000"))),
1342 [datetime(1997, 9, 2, 9, 0, 6),
1343 datetime(1997, 9, 2, 9, 0, 18),
1344 datetime(1997, 9, 3, 9, 0, 6)])
1345
1346 def testDailyByHourAndMinute(self):
1347 self.assertEqual(list(rrule(FREQ_DAILY,
1348 count=3,
1349 byhour=(6,18),
1350 byminute=(6,18),
1351 dtstart=parse("19970902T090000"))),
1352 [datetime(1997, 9, 2, 18, 6),
1353 datetime(1997, 9, 2, 18, 18),
1354 datetime(1997, 9, 3, 6, 6)])
1355
1356 def testDailyByHourAndSecond(self):
1357 self.assertEqual(list(rrule(FREQ_DAILY,
1358 count=3,
1359 byhour=(6,18),
1360 bysecond=(6,18),
1361 dtstart=parse("19970902T090000"))),
1362 [datetime(1997, 9, 2, 18, 0, 6),
1363 datetime(1997, 9, 2, 18, 0, 18),
1364 datetime(1997, 9, 3, 6, 0, 6)])
1365
1366 def testDailyByMinuteAndSecond(self):
1367 self.assertEqual(list(rrule(FREQ_DAILY,
1368 count=3,
1369 byminute=(6,18),
1370 bysecond=(6,18),
1371 dtstart=parse("19970902T090000"))),
1372 [datetime(1997, 9, 2, 9, 6, 6),
1373 datetime(1997, 9, 2, 9, 6, 18),
1374 datetime(1997, 9, 2, 9, 18, 6)])
1375
1376 def testDailyByHourAndMinuteAndSecond(self):
1377 self.assertEqual(list(rrule(FREQ_DAILY,
1378 count=3,
1379 byhour=(6,18),
1380 byminute=(6,18),
1381 bysecond=(6,18),
1382 dtstart=parse("19970902T090000"))),
1383 [datetime(1997, 9, 2, 18, 6, 6),
1384 datetime(1997, 9, 2, 18, 6, 18),
1385 datetime(1997, 9, 2, 18, 18, 6)])
1386
1387 def testDailyBySetPos(self):
1388 self.assertEqual(list(rrule(FREQ_DAILY,
1389 count=3,
1390 byhour=(6,18),
1391 byminute=(15,45),
1392 bysetpos=(3,-3),
1393 dtstart=parse("19970902T090000"))),
1394 [datetime(1997, 9, 2, 18, 15),
1395 datetime(1997, 9, 3, 6, 45),
1396 datetime(1997, 9, 3, 18, 15)])
1397
niemeyercb08a352003-10-08 06:02:06 +00001398 def testHourly(self):
1399 self.assertEqual(list(rrule(FREQ_HOURLY,
1400 count=3,
1401 dtstart=parse("19970902T090000"))),
1402 [datetime(1997, 9, 2, 9, 0),
1403 datetime(1997, 9, 2, 10, 0),
1404 datetime(1997, 9, 2, 11, 0)])
1405
1406 def testStrHourly(self):
1407 self.assertEqual(list(rrulestr("""
1408 DTSTART:19970902T090000
1409 RRULE:FREQ=HOURLY;COUNT=3
1410 """)),
1411 [datetime(1997, 9, 2, 9, 0),
1412 datetime(1997, 9, 2, 10, 0),
1413 datetime(1997, 9, 2, 11, 0)])
1414
1415 def testHourlyInterval(self):
1416 self.assertEqual(list(rrule(FREQ_HOURLY,
1417 count=3,
1418 interval=2,
1419 dtstart=parse("19970902T090000"))),
1420 [datetime(1997, 9, 2, 9, 0),
1421 datetime(1997, 9, 2, 11, 0),
1422 datetime(1997, 9, 2, 13, 0)])
1423
1424 def testHourlyIntervalLarge(self):
1425 self.assertEqual(list(rrule(FREQ_HOURLY,
1426 count=3,
1427 interval=769,
1428 dtstart=parse("19970902T090000"))),
1429 [datetime(1997, 9, 2, 9, 0),
1430 datetime(1997, 10, 4, 10, 0),
1431 datetime(1997, 11, 5, 11, 0)])
1432
1433 def testHourlyByMonth(self):
1434 self.assertEqual(list(rrule(FREQ_HOURLY,
1435 count=3,
1436 bymonth=(1,3),
1437 dtstart=parse("19970902T090000"))),
1438 [datetime(1998, 1, 1, 0, 0),
1439 datetime(1998, 1, 1, 1, 0),
1440 datetime(1998, 1, 1, 2, 0)])
1441
1442 def testHourlyByMonthDay(self):
1443 self.assertEqual(list(rrule(FREQ_HOURLY,
1444 count=3,
1445 bymonthday=(1,3),
1446 dtstart=parse("19970902T090000"))),
1447 [datetime(1997, 9, 3, 0, 0),
1448 datetime(1997, 9, 3, 1, 0),
1449 datetime(1997, 9, 3, 2, 0)])
1450
1451 def testHourlyByMonthAndMonthDay(self):
1452 self.assertEqual(list(rrule(FREQ_HOURLY,
1453 count=3,
1454 bymonth=(1,3),
1455 bymonthday=(5,7),
1456 dtstart=parse("19970902T090000"))),
1457 [datetime(1998, 1, 5, 0, 0),
1458 datetime(1998, 1, 5, 1, 0),
1459 datetime(1998, 1, 5, 2, 0)])
1460
1461 def testHourlyByWeekDay(self):
1462 self.assertEqual(list(rrule(FREQ_HOURLY,
1463 count=3,
1464 byweekday=(TU,TH),
1465 dtstart=parse("19970902T090000"))),
1466 [datetime(1997, 9, 2, 9, 0),
1467 datetime(1997, 9, 2, 10, 0),
1468 datetime(1997, 9, 2, 11, 0)])
1469
niemeyer7d8be1a2003-10-09 01:09:42 +00001470 def testHourlyByNWeekDay(self):
1471 self.assertEqual(list(rrule(FREQ_HOURLY,
1472 count=3,
1473 byweekday=(TU(1),TH(-1)),
1474 dtstart=parse("19970902T090000"))),
1475 [datetime(1997, 9, 2, 9, 0),
1476 datetime(1997, 9, 2, 10, 0),
1477 datetime(1997, 9, 2, 11, 0)])
1478
niemeyercb08a352003-10-08 06:02:06 +00001479 def testHourlyByMonthAndWeekDay(self):
1480 self.assertEqual(list(rrule(FREQ_HOURLY,
1481 count=3,
1482 bymonth=(1,3),
1483 byweekday=(TU,TH),
1484 dtstart=parse("19970902T090000"))),
1485 [datetime(1998, 1, 1, 0, 0),
1486 datetime(1998, 1, 1, 1, 0),
1487 datetime(1998, 1, 1, 2, 0)])
1488
niemeyer7d8be1a2003-10-09 01:09:42 +00001489 def testHourlyByMonthAndNWeekDay(self):
1490 self.assertEqual(list(rrule(FREQ_HOURLY,
1491 count=3,
1492 bymonth=(1,3),
1493 byweekday=(TU(1),TH(-1)),
1494 dtstart=parse("19970902T090000"))),
1495 [datetime(1998, 1, 1, 0, 0),
1496 datetime(1998, 1, 1, 1, 0),
1497 datetime(1998, 1, 1, 2, 0)])
1498
1499 def testHourlyByMonthDayAndWeekDay(self):
1500 self.assertEqual(list(rrule(FREQ_HOURLY,
1501 count=3,
1502 bymonthday=(1,3),
1503 byweekday=(TU,TH),
1504 dtstart=parse("19970902T090000"))),
1505 [datetime(1998, 1, 1, 0, 0),
1506 datetime(1998, 1, 1, 1, 0),
1507 datetime(1998, 1, 1, 2, 0)])
1508
1509 def testHourlyByMonthAndMonthDayAndWeekDay(self):
1510 self.assertEqual(list(rrule(FREQ_HOURLY,
1511 count=3,
1512 bymonth=(1,3),
1513 bymonthday=(1,3),
1514 byweekday=(TU,TH),
1515 dtstart=parse("19970902T090000"))),
1516 [datetime(1998, 1, 1, 0, 0),
1517 datetime(1998, 1, 1, 1, 0),
1518 datetime(1998, 1, 1, 2, 0)])
1519
1520 def testHourlyByYearDay(self):
1521 self.assertEqual(list(rrule(FREQ_HOURLY,
1522 count=3,
1523 byyearday=(1,100,200),
1524 dtstart=parse("19970902T090000"))),
1525 [datetime(1998, 1, 1, 0, 0),
1526 datetime(1998, 1, 1, 1, 0),
1527 datetime(1998, 1, 1, 2, 0)])
1528
1529 def testHourlyByMonthAndYearDay(self):
1530 self.assertEqual(list(rrule(FREQ_HOURLY,
1531 count=3,
1532 bymonth=(4,7),
1533 byyearday=(1,100,200),
1534 dtstart=parse("19970902T090000"))),
1535 [datetime(1998, 4, 10, 0, 0),
1536 datetime(1998, 4, 10, 1, 0),
1537 datetime(1998, 4, 10, 2, 0)])
1538
1539 def testHourlyByWeekNo(self):
1540 self.assertEqual(list(rrule(FREQ_HOURLY,
1541 count=3,
1542 byweekno=20,
1543 dtstart=parse("19970902T090000"))),
1544 [datetime(1998, 5, 11, 0, 0),
1545 datetime(1998, 5, 11, 1, 0),
1546 datetime(1998, 5, 11, 2, 0)])
1547
1548 def testHourlyByWeekNoAndWeekDay(self):
1549 self.assertEqual(list(rrule(FREQ_HOURLY,
1550 count=3,
1551 byweekno=1,
1552 byweekday=MO,
1553 dtstart=parse("19970902T090000"))),
1554 [datetime(1997, 12, 29, 0, 0),
1555 datetime(1997, 12, 29, 1, 0),
1556 datetime(1997, 12, 29, 2, 0)])
1557
1558 def testHourlyByWeekNoAndWeekDayLarge(self):
1559 self.assertEqual(list(rrule(FREQ_HOURLY,
1560 count=3,
1561 byweekno=52,
1562 byweekday=SU,
1563 dtstart=parse("19970902T090000"))),
1564 [datetime(1997, 12, 28, 0, 0),
1565 datetime(1997, 12, 28, 1, 0),
1566 datetime(1997, 12, 28, 2, 0)])
1567
1568 def testHourlyByWeekNoAndWeekDayLast(self):
1569 self.assertEqual(list(rrule(FREQ_HOURLY,
1570 count=3,
1571 byweekno=-1,
1572 byweekday=SU,
1573 dtstart=parse("19970902T090000"))),
1574 [datetime(1997, 12, 28, 0, 0),
1575 datetime(1997, 12, 28, 1, 0),
1576 datetime(1997, 12, 28, 2, 0)])
1577
1578 def testHourlyByWeekNoAndWeekDay53(self):
1579 self.assertEqual(list(rrule(FREQ_HOURLY,
1580 count=3,
1581 byweekno=53,
1582 byweekday=MO,
1583 dtstart=parse("19970902T090000"))),
1584 [datetime(1998, 12, 28, 0, 0),
1585 datetime(1998, 12, 28, 1, 0),
1586 datetime(1998, 12, 28, 2, 0)])
1587
1588 def testHourlyByEaster(self):
1589 self.assertEqual(list(rrule(FREQ_HOURLY,
1590 count=3,
1591 byeaster=0,
1592 dtstart=parse("19970902T090000"))),
1593 [datetime(1998, 4, 12, 0, 0),
1594 datetime(1998, 4, 12, 1, 0),
1595 datetime(1998, 4, 12, 2, 0)])
1596
1597 def testHourlyByEasterPos(self):
1598 self.assertEqual(list(rrule(FREQ_HOURLY,
1599 count=3,
1600 byeaster=1,
1601 dtstart=parse("19970902T090000"))),
1602 [datetime(1998, 4, 13, 0, 0),
1603 datetime(1998, 4, 13, 1, 0),
1604 datetime(1998, 4, 13, 2, 0)])
1605
1606 def testHourlyByEasterNeg(self):
1607 self.assertEqual(list(rrule(FREQ_HOURLY,
1608 count=3,
1609 byeaster=-1,
1610 dtstart=parse("19970902T090000"))),
1611 [datetime(1998, 4, 11, 0, 0),
1612 datetime(1998, 4, 11, 1, 0),
1613 datetime(1998, 4, 11, 2, 0)])
1614
1615 def testHourlyByHour(self):
1616 self.assertEqual(list(rrule(FREQ_HOURLY,
1617 count=3,
1618 byhour=(6,18),
1619 dtstart=parse("19970902T090000"))),
1620 [datetime(1997, 9, 2, 18, 0),
1621 datetime(1997, 9, 3, 6, 0),
1622 datetime(1997, 9, 3, 18, 0)])
1623
1624 def testHourlyByMinute(self):
1625 self.assertEqual(list(rrule(FREQ_HOURLY,
1626 count=3,
1627 byminute=(6,18),
1628 dtstart=parse("19970902T090000"))),
1629 [datetime(1997, 9, 2, 9, 6),
1630 datetime(1997, 9, 2, 9, 18),
1631 datetime(1997, 9, 2, 10, 6)])
1632
1633 def testHourlyBySecond(self):
1634 self.assertEqual(list(rrule(FREQ_HOURLY,
1635 count=3,
1636 bysecond=(6,18),
1637 dtstart=parse("19970902T090000"))),
1638 [datetime(1997, 9, 2, 9, 0, 6),
1639 datetime(1997, 9, 2, 9, 0, 18),
1640 datetime(1997, 9, 2, 10, 0, 6)])
1641
1642 def testHourlyByHourAndMinute(self):
1643 self.assertEqual(list(rrule(FREQ_HOURLY,
1644 count=3,
1645 byhour=(6,18),
1646 byminute=(6,18),
1647 dtstart=parse("19970902T090000"))),
1648 [datetime(1997, 9, 2, 18, 6),
1649 datetime(1997, 9, 2, 18, 18),
1650 datetime(1997, 9, 3, 6, 6)])
1651
1652 def testHourlyByHourAndSecond(self):
1653 self.assertEqual(list(rrule(FREQ_HOURLY,
1654 count=3,
1655 byhour=(6,18),
1656 bysecond=(6,18),
1657 dtstart=parse("19970902T090000"))),
1658 [datetime(1997, 9, 2, 18, 0, 6),
1659 datetime(1997, 9, 2, 18, 0, 18),
1660 datetime(1997, 9, 3, 6, 0, 6)])
1661
1662 def testHourlyByMinuteAndSecond(self):
1663 self.assertEqual(list(rrule(FREQ_HOURLY,
1664 count=3,
1665 byminute=(6,18),
1666 bysecond=(6,18),
1667 dtstart=parse("19970902T090000"))),
1668 [datetime(1997, 9, 2, 9, 6, 6),
1669 datetime(1997, 9, 2, 9, 6, 18),
1670 datetime(1997, 9, 2, 9, 18, 6)])
1671
1672 def testHourlyByHourAndMinuteAndSecond(self):
1673 self.assertEqual(list(rrule(FREQ_HOURLY,
1674 count=3,
1675 byhour=(6,18),
1676 byminute=(6,18),
1677 bysecond=(6,18),
1678 dtstart=parse("19970902T090000"))),
1679 [datetime(1997, 9, 2, 18, 6, 6),
1680 datetime(1997, 9, 2, 18, 6, 18),
1681 datetime(1997, 9, 2, 18, 18, 6)])
1682
1683 def testHourlyBySetPos(self):
1684 self.assertEqual(list(rrule(FREQ_HOURLY,
1685 count=3,
1686 byminute=(15,45),
1687 bysecond=(15,45),
1688 bysetpos=(3,-3),
1689 dtstart=parse("19970902T090000"))),
1690 [datetime(1997, 9, 2, 9, 15, 45),
1691 datetime(1997, 9, 2, 9, 45, 15),
1692 datetime(1997, 9, 2, 10, 15, 45)])
1693
niemeyercb08a352003-10-08 06:02:06 +00001694 def testMinutely(self):
1695 self.assertEqual(list(rrule(FREQ_MINUTELY,
1696 count=3,
1697 dtstart=parse("19970902T090000"))),
1698 [datetime(1997, 9, 2, 9, 0),
1699 datetime(1997, 9, 2, 9, 1),
1700 datetime(1997, 9, 2, 9, 2)])
1701
1702 def testStrMinutely(self):
1703 self.assertEqual(list(rrulestr("""
1704 DTSTART:19970902T090000
1705 RRULE:FREQ=MINUTELY;COUNT=3
1706 """)),
1707 [datetime(1997, 9, 2, 9, 0),
1708 datetime(1997, 9, 2, 9, 1),
1709 datetime(1997, 9, 2, 9, 2)])
1710
1711 def testMinutelyInterval(self):
1712 self.assertEqual(list(rrule(FREQ_MINUTELY,
1713 count=3,
1714 interval=2,
1715 dtstart=parse("19970902T090000"))),
1716 [datetime(1997, 9, 2, 9, 0),
1717 datetime(1997, 9, 2, 9, 2),
1718 datetime(1997, 9, 2, 9, 4)])
1719
1720 def testMinutelyIntervalLarge(self):
1721 self.assertEqual(list(rrule(FREQ_MINUTELY,
1722 count=3,
1723 interval=1501,
1724 dtstart=parse("19970902T090000"))),
1725 [datetime(1997, 9, 2, 9, 0),
1726 datetime(1997, 9, 3, 10, 1),
1727 datetime(1997, 9, 4, 11, 2)])
1728
1729 def testMinutelyByMonth(self):
1730 self.assertEqual(list(rrule(FREQ_MINUTELY,
1731 count=3,
1732 bymonth=(1,3),
1733 dtstart=parse("19970902T090000"))),
1734 [datetime(1998, 1, 1, 0, 0),
1735 datetime(1998, 1, 1, 0, 1),
1736 datetime(1998, 1, 1, 0, 2)])
1737
1738 def testMinutelyByMonthDay(self):
1739 self.assertEqual(list(rrule(FREQ_MINUTELY,
1740 count=3,
1741 bymonthday=(1,3),
1742 dtstart=parse("19970902T090000"))),
1743 [datetime(1997, 9, 3, 0, 0),
1744 datetime(1997, 9, 3, 0, 1),
1745 datetime(1997, 9, 3, 0, 2)])
1746
1747 def testMinutelyByMonthAndMonthDay(self):
1748 self.assertEqual(list(rrule(FREQ_MINUTELY,
1749 count=3,
1750 bymonth=(1,3),
1751 bymonthday=(5,7),
1752 dtstart=parse("19970902T090000"))),
1753 [datetime(1998, 1, 5, 0, 0),
1754 datetime(1998, 1, 5, 0, 1),
1755 datetime(1998, 1, 5, 0, 2)])
1756
1757 def testMinutelyByWeekDay(self):
1758 self.assertEqual(list(rrule(FREQ_MINUTELY,
1759 count=3,
1760 byweekday=(TU,TH),
1761 dtstart=parse("19970902T090000"))),
1762 [datetime(1997, 9, 2, 9, 0),
1763 datetime(1997, 9, 2, 9, 1),
1764 datetime(1997, 9, 2, 9, 2)])
1765
niemeyer7d8be1a2003-10-09 01:09:42 +00001766 def testMinutelyByNWeekDay(self):
1767 self.assertEqual(list(rrule(FREQ_MINUTELY,
1768 count=3,
1769 byweekday=(TU(1),TH(-1)),
1770 dtstart=parse("19970902T090000"))),
1771 [datetime(1997, 9, 2, 9, 0),
1772 datetime(1997, 9, 2, 9, 1),
1773 datetime(1997, 9, 2, 9, 2)])
1774
niemeyercb08a352003-10-08 06:02:06 +00001775 def testMinutelyByMonthAndWeekDay(self):
1776 self.assertEqual(list(rrule(FREQ_MINUTELY,
1777 count=3,
1778 bymonth=(1,3),
1779 byweekday=(TU,TH),
1780 dtstart=parse("19970902T090000"))),
1781 [datetime(1998, 1, 1, 0, 0),
1782 datetime(1998, 1, 1, 0, 1),
1783 datetime(1998, 1, 1, 0, 2)])
1784
niemeyer7d8be1a2003-10-09 01:09:42 +00001785 def testMinutelyByMonthAndNWeekDay(self):
1786 self.assertEqual(list(rrule(FREQ_MINUTELY,
1787 count=3,
1788 bymonth=(1,3),
1789 byweekday=(TU(1),TH(-1)),
1790 dtstart=parse("19970902T090000"))),
1791 [datetime(1998, 1, 1, 0, 0),
1792 datetime(1998, 1, 1, 0, 1),
1793 datetime(1998, 1, 1, 0, 2)])
1794
1795 def testMinutelyByMonthDayAndWeekDay(self):
1796 self.assertEqual(list(rrule(FREQ_MINUTELY,
1797 count=3,
1798 bymonthday=(1,3),
1799 byweekday=(TU,TH),
1800 dtstart=parse("19970902T090000"))),
1801 [datetime(1998, 1, 1, 0, 0),
1802 datetime(1998, 1, 1, 0, 1),
1803 datetime(1998, 1, 1, 0, 2)])
1804
1805 def testMinutelyByMonthAndMonthDayAndWeekDay(self):
1806 self.assertEqual(list(rrule(FREQ_MINUTELY,
1807 count=3,
1808 bymonth=(1,3),
1809 bymonthday=(1,3),
1810 byweekday=(TU,TH),
1811 dtstart=parse("19970902T090000"))),
1812 [datetime(1998, 1, 1, 0, 0),
1813 datetime(1998, 1, 1, 0, 1),
1814 datetime(1998, 1, 1, 0, 2)])
1815
1816 def testMinutelyByYearDay(self):
1817 self.assertEqual(list(rrule(FREQ_MINUTELY,
1818 count=3,
1819 byyearday=(1,100,200),
1820 dtstart=parse("19970902T090000"))),
1821 [datetime(1998, 1, 1, 0, 0),
1822 datetime(1998, 1, 1, 0, 1),
1823 datetime(1998, 1, 1, 0, 2)])
1824
1825 def testMinutelyByMonthAndYearDay(self):
1826 self.assertEqual(list(rrule(FREQ_MINUTELY,
1827 count=3,
1828 bymonth=(4,7),
1829 byyearday=(1,100,200),
1830 dtstart=parse("19970902T090000"))),
1831 [datetime(1998, 4, 10, 0, 0),
1832 datetime(1998, 4, 10, 0, 1),
1833 datetime(1998, 4, 10, 0, 2)])
1834
1835 def testMinutelyByWeekNo(self):
1836 self.assertEqual(list(rrule(FREQ_MINUTELY,
1837 count=3,
1838 byweekno=20,
1839 dtstart=parse("19970902T090000"))),
1840 [datetime(1998, 5, 11, 0, 0),
1841 datetime(1998, 5, 11, 0, 1),
1842 datetime(1998, 5, 11, 0, 2)])
1843
1844 def testMinutelyByWeekNoAndWeekDay(self):
1845 self.assertEqual(list(rrule(FREQ_MINUTELY,
1846 count=3,
1847 byweekno=1,
1848 byweekday=MO,
1849 dtstart=parse("19970902T090000"))),
1850 [datetime(1997, 12, 29, 0, 0),
1851 datetime(1997, 12, 29, 0, 1),
1852 datetime(1997, 12, 29, 0, 2)])
1853
1854 def testMinutelyByWeekNoAndWeekDayLarge(self):
1855 self.assertEqual(list(rrule(FREQ_MINUTELY,
1856 count=3,
1857 byweekno=52,
1858 byweekday=SU,
1859 dtstart=parse("19970902T090000"))),
1860 [datetime(1997, 12, 28, 0, 0),
1861 datetime(1997, 12, 28, 0, 1),
1862 datetime(1997, 12, 28, 0, 2)])
1863
1864 def testMinutelyByWeekNoAndWeekDayLast(self):
1865 self.assertEqual(list(rrule(FREQ_MINUTELY,
1866 count=3,
1867 byweekno=-1,
1868 byweekday=SU,
1869 dtstart=parse("19970902T090000"))),
1870 [datetime(1997, 12, 28, 0, 0),
1871 datetime(1997, 12, 28, 0, 1),
1872 datetime(1997, 12, 28, 0, 2)])
1873
1874 def testMinutelyByWeekNoAndWeekDay53(self):
1875 self.assertEqual(list(rrule(FREQ_MINUTELY,
1876 count=3,
1877 byweekno=53,
1878 byweekday=MO,
1879 dtstart=parse("19970902T090000"))),
1880 [datetime(1998, 12, 28, 0, 0),
1881 datetime(1998, 12, 28, 0, 1),
1882 datetime(1998, 12, 28, 0, 2)])
1883
1884 def testMinutelyByEaster(self):
1885 self.assertEqual(list(rrule(FREQ_MINUTELY,
1886 count=3,
1887 byeaster=0,
1888 dtstart=parse("19970902T090000"))),
1889 [datetime(1998, 4, 12, 0, 0),
1890 datetime(1998, 4, 12, 0, 1),
1891 datetime(1998, 4, 12, 0, 2)])
1892
1893 def testMinutelyByEasterPos(self):
1894 self.assertEqual(list(rrule(FREQ_MINUTELY,
1895 count=3,
1896 byeaster=1,
1897 dtstart=parse("19970902T090000"))),
1898 [datetime(1998, 4, 13, 0, 0),
1899 datetime(1998, 4, 13, 0, 1),
1900 datetime(1998, 4, 13, 0, 2)])
1901
1902 def testMinutelyByEasterNeg(self):
1903 self.assertEqual(list(rrule(FREQ_MINUTELY,
1904 count=3,
1905 byeaster=-1,
1906 dtstart=parse("19970902T090000"))),
1907 [datetime(1998, 4, 11, 0, 0),
1908 datetime(1998, 4, 11, 0, 1),
1909 datetime(1998, 4, 11, 0, 2)])
1910
1911 def testMinutelyByHour(self):
1912 self.assertEqual(list(rrule(FREQ_MINUTELY,
1913 count=3,
1914 byhour=(6,18),
1915 dtstart=parse("19970902T090000"))),
1916 [datetime(1997, 9, 2, 18, 0),
1917 datetime(1997, 9, 2, 18, 1),
1918 datetime(1997, 9, 2, 18, 2)])
1919
1920 def testMinutelyByMinute(self):
1921 self.assertEqual(list(rrule(FREQ_MINUTELY,
1922 count=3,
1923 byminute=(6,18),
1924 dtstart=parse("19970902T090000"))),
1925 [datetime(1997, 9, 2, 9, 6),
1926 datetime(1997, 9, 2, 9, 18),
1927 datetime(1997, 9, 2, 10, 6)])
1928
1929 def testMinutelyBySecond(self):
1930 self.assertEqual(list(rrule(FREQ_MINUTELY,
1931 count=3,
1932 bysecond=(6,18),
1933 dtstart=parse("19970902T090000"))),
1934 [datetime(1997, 9, 2, 9, 0, 6),
1935 datetime(1997, 9, 2, 9, 0, 18),
1936 datetime(1997, 9, 2, 9, 1, 6)])
1937
1938 def testMinutelyByHourAndMinute(self):
1939 self.assertEqual(list(rrule(FREQ_MINUTELY,
1940 count=3,
1941 byhour=(6,18),
1942 byminute=(6,18),
1943 dtstart=parse("19970902T090000"))),
1944 [datetime(1997, 9, 2, 18, 6),
1945 datetime(1997, 9, 2, 18, 18),
1946 datetime(1997, 9, 3, 6, 6)])
1947
1948 def testMinutelyByHourAndSecond(self):
1949 self.assertEqual(list(rrule(FREQ_MINUTELY,
1950 count=3,
1951 byhour=(6,18),
1952 bysecond=(6,18),
1953 dtstart=parse("19970902T090000"))),
1954 [datetime(1997, 9, 2, 18, 0, 6),
1955 datetime(1997, 9, 2, 18, 0, 18),
1956 datetime(1997, 9, 2, 18, 1, 6)])
1957
1958 def testMinutelyByMinuteAndSecond(self):
1959 self.assertEqual(list(rrule(FREQ_MINUTELY,
1960 count=3,
1961 byminute=(6,18),
1962 bysecond=(6,18),
1963 dtstart=parse("19970902T090000"))),
1964 [datetime(1997, 9, 2, 9, 6, 6),
1965 datetime(1997, 9, 2, 9, 6, 18),
1966 datetime(1997, 9, 2, 9, 18, 6)])
1967
1968 def testMinutelyByHourAndMinuteAndSecond(self):
1969 self.assertEqual(list(rrule(FREQ_MINUTELY,
1970 count=3,
1971 byhour=(6,18),
1972 byminute=(6,18),
1973 bysecond=(6,18),
1974 dtstart=parse("19970902T090000"))),
1975 [datetime(1997, 9, 2, 18, 6, 6),
1976 datetime(1997, 9, 2, 18, 6, 18),
1977 datetime(1997, 9, 2, 18, 18, 6)])
1978
1979 def testMinutelyBySetPos(self):
1980 self.assertEqual(list(rrule(FREQ_MINUTELY,
1981 count=3,
1982 bysecond=(15,30,45),
1983 bysetpos=(3,-3),
1984 dtstart=parse("19970902T090000"))),
1985 [datetime(1997, 9, 2, 9, 0, 15),
1986 datetime(1997, 9, 2, 9, 0, 45),
1987 datetime(1997, 9, 2, 9, 1, 15)])
1988
niemeyercb08a352003-10-08 06:02:06 +00001989 def testSecondly(self):
1990 self.assertEqual(list(rrule(FREQ_SECONDLY,
1991 count=3,
1992 dtstart=parse("19970902T090000"))),
1993 [datetime(1997, 9, 2, 9, 0, 0),
1994 datetime(1997, 9, 2, 9, 0, 1),
1995 datetime(1997, 9, 2, 9, 0, 2)])
1996
1997 def testStrSecondly(self):
1998 self.assertEqual(list(rrulestr("""
1999 DTSTART:19970902T090000
2000 RRULE:FREQ=SECONDLY;COUNT=3
2001 """)),
2002 [datetime(1997, 9, 2, 9, 0, 0),
2003 datetime(1997, 9, 2, 9, 0, 1),
2004 datetime(1997, 9, 2, 9, 0, 2)])
2005
2006 def testSecondlyInterval(self):
2007 self.assertEqual(list(rrule(FREQ_SECONDLY,
2008 count=3,
2009 interval=2,
2010 dtstart=parse("19970902T090000"))),
2011 [datetime(1997, 9, 2, 9, 0, 0),
2012 datetime(1997, 9, 2, 9, 0, 2),
2013 datetime(1997, 9, 2, 9, 0, 4)])
2014
2015 def testSecondlyIntervalLarge(self):
2016 self.assertEqual(list(rrule(FREQ_SECONDLY,
2017 count=3,
2018 interval=90061,
2019 dtstart=parse("19970902T090000"))),
2020 [datetime(1997, 9, 2, 9, 0, 0),
2021 datetime(1997, 9, 3, 10, 1, 1),
2022 datetime(1997, 9, 4, 11, 2, 2)])
2023
2024 def testSecondlyByMonth(self):
2025 self.assertEqual(list(rrule(FREQ_SECONDLY,
2026 count=3,
2027 bymonth=(1,3),
2028 dtstart=parse("19970902T090000"))),
2029 [datetime(1998, 1, 1, 0, 0, 0),
2030 datetime(1998, 1, 1, 0, 0, 1),
2031 datetime(1998, 1, 1, 0, 0, 2)])
2032
2033 def testSecondlyByMonthDay(self):
2034 self.assertEqual(list(rrule(FREQ_SECONDLY,
2035 count=3,
2036 bymonthday=(1,3),
2037 dtstart=parse("19970902T090000"))),
2038 [datetime(1997, 9, 3, 0, 0, 0),
2039 datetime(1997, 9, 3, 0, 0, 1),
2040 datetime(1997, 9, 3, 0, 0, 2)])
2041
2042 def testSecondlyByMonthAndMonthDay(self):
2043 self.assertEqual(list(rrule(FREQ_SECONDLY,
2044 count=3,
2045 bymonth=(1,3),
2046 bymonthday=(5,7),
2047 dtstart=parse("19970902T090000"))),
2048 [datetime(1998, 1, 5, 0, 0, 0),
2049 datetime(1998, 1, 5, 0, 0, 1),
2050 datetime(1998, 1, 5, 0, 0, 2)])
2051
2052 def testSecondlyByWeekDay(self):
2053 self.assertEqual(list(rrule(FREQ_SECONDLY,
2054 count=3,
2055 byweekday=(TU,TH),
2056 dtstart=parse("19970902T090000"))),
2057 [datetime(1997, 9, 2, 9, 0, 0),
2058 datetime(1997, 9, 2, 9, 0, 1),
2059 datetime(1997, 9, 2, 9, 0, 2)])
2060
niemeyer7d8be1a2003-10-09 01:09:42 +00002061 def testSecondlyByNWeekDay(self):
2062 self.assertEqual(list(rrule(FREQ_SECONDLY,
2063 count=3,
2064 byweekday=(TU(1),TH(-1)),
2065 dtstart=parse("19970902T090000"))),
2066 [datetime(1997, 9, 2, 9, 0, 0),
2067 datetime(1997, 9, 2, 9, 0, 1),
2068 datetime(1997, 9, 2, 9, 0, 2)])
2069
niemeyercb08a352003-10-08 06:02:06 +00002070 def testSecondlyByMonthAndWeekDay(self):
2071 self.assertEqual(list(rrule(FREQ_SECONDLY,
2072 count=3,
2073 bymonth=(1,3),
2074 byweekday=(TU,TH),
2075 dtstart=parse("19970902T090000"))),
2076 [datetime(1998, 1, 1, 0, 0, 0),
2077 datetime(1998, 1, 1, 0, 0, 1),
2078 datetime(1998, 1, 1, 0, 0, 2)])
2079
niemeyer7d8be1a2003-10-09 01:09:42 +00002080 def testSecondlyByMonthAndNWeekDay(self):
2081 self.assertEqual(list(rrule(FREQ_SECONDLY,
2082 count=3,
2083 bymonth=(1,3),
2084 byweekday=(TU(1),TH(-1)),
2085 dtstart=parse("19970902T090000"))),
2086 [datetime(1998, 1, 1, 0, 0, 0),
2087 datetime(1998, 1, 1, 0, 0, 1),
2088 datetime(1998, 1, 1, 0, 0, 2)])
2089
2090 def testSecondlyByMonthDayAndWeekDay(self):
2091 self.assertEqual(list(rrule(FREQ_SECONDLY,
2092 count=3,
2093 bymonthday=(1,3),
2094 byweekday=(TU,TH),
2095 dtstart=parse("19970902T090000"))),
2096 [datetime(1998, 1, 1, 0, 0, 0),
2097 datetime(1998, 1, 1, 0, 0, 1),
2098 datetime(1998, 1, 1, 0, 0, 2)])
2099
2100 def testSecondlyByMonthAndMonthDayAndWeekDay(self):
2101 self.assertEqual(list(rrule(FREQ_SECONDLY,
2102 count=3,
2103 bymonth=(1,3),
2104 bymonthday=(1,3),
2105 byweekday=(TU,TH),
2106 dtstart=parse("19970902T090000"))),
2107 [datetime(1998, 1, 1, 0, 0, 0),
2108 datetime(1998, 1, 1, 0, 0, 1),
2109 datetime(1998, 1, 1, 0, 0, 2)])
2110
2111 def testSecondlyByYearDay(self):
2112 self.assertEqual(list(rrule(FREQ_SECONDLY,
2113 count=3,
2114 byyearday=(1,100,200),
2115 dtstart=parse("19970902T090000"))),
2116 [datetime(1998, 1, 1, 0, 0, 0),
2117 datetime(1998, 1, 1, 0, 0, 1),
2118 datetime(1998, 1, 1, 0, 0, 2)])
2119
2120 def testSecondlyByMonthAndYearDay(self):
2121 self.assertEqual(list(rrule(FREQ_SECONDLY,
2122 count=3,
2123 bymonth=(4,7),
2124 byyearday=(1,100,200),
2125 dtstart=parse("19970902T090000"))),
2126 [datetime(1998, 4, 10, 0, 0, 0),
2127 datetime(1998, 4, 10, 0, 0, 1),
2128 datetime(1998, 4, 10, 0, 0, 2)])
2129
2130 def testSecondlyByWeekNo(self):
2131 self.assertEqual(list(rrule(FREQ_SECONDLY,
2132 count=3,
2133 byweekno=20,
2134 dtstart=parse("19970902T090000"))),
2135 [datetime(1998, 5, 11, 0, 0, 0),
2136 datetime(1998, 5, 11, 0, 0, 1),
2137 datetime(1998, 5, 11, 0, 0, 2)])
2138
2139 def testSecondlyByWeekNoAndWeekDay(self):
2140 self.assertEqual(list(rrule(FREQ_SECONDLY,
2141 count=3,
2142 byweekno=1,
2143 byweekday=MO,
2144 dtstart=parse("19970902T090000"))),
2145 [datetime(1997, 12, 29, 0, 0, 0),
2146 datetime(1997, 12, 29, 0, 0, 1),
2147 datetime(1997, 12, 29, 0, 0, 2)])
2148
2149 def testSecondlyByWeekNoAndWeekDayLarge(self):
2150 self.assertEqual(list(rrule(FREQ_SECONDLY,
2151 count=3,
2152 byweekno=52,
2153 byweekday=SU,
2154 dtstart=parse("19970902T090000"))),
2155 [datetime(1997, 12, 28, 0, 0, 0),
2156 datetime(1997, 12, 28, 0, 0, 1),
2157 datetime(1997, 12, 28, 0, 0, 2)])
2158
2159 def testSecondlyByWeekNoAndWeekDayLast(self):
2160 self.assertEqual(list(rrule(FREQ_SECONDLY,
2161 count=3,
2162 byweekno=-1,
2163 byweekday=SU,
2164 dtstart=parse("19970902T090000"))),
2165 [datetime(1997, 12, 28, 0, 0, 0),
2166 datetime(1997, 12, 28, 0, 0, 1),
2167 datetime(1997, 12, 28, 0, 0, 2)])
2168
2169 def testSecondlyByWeekNoAndWeekDay53(self):
2170 self.assertEqual(list(rrule(FREQ_SECONDLY,
2171 count=3,
2172 byweekno=53,
2173 byweekday=MO,
2174 dtstart=parse("19970902T090000"))),
2175 [datetime(1998, 12, 28, 0, 0, 0),
2176 datetime(1998, 12, 28, 0, 0, 1),
2177 datetime(1998, 12, 28, 0, 0, 2)])
2178
2179 def testSecondlyByEaster(self):
2180 self.assertEqual(list(rrule(FREQ_SECONDLY,
2181 count=3,
2182 byeaster=0,
2183 dtstart=parse("19970902T090000"))),
2184 [datetime(1998, 4, 12, 0, 0, 0),
2185 datetime(1998, 4, 12, 0, 0, 1),
2186 datetime(1998, 4, 12, 0, 0, 2)])
2187
2188 def testSecondlyByEasterPos(self):
2189 self.assertEqual(list(rrule(FREQ_SECONDLY,
2190 count=3,
2191 byeaster=1,
2192 dtstart=parse("19970902T090000"))),
2193 [datetime(1998, 4, 13, 0, 0, 0),
2194 datetime(1998, 4, 13, 0, 0, 1),
2195 datetime(1998, 4, 13, 0, 0, 2)])
2196
2197 def testSecondlyByEasterNeg(self):
2198 self.assertEqual(list(rrule(FREQ_SECONDLY,
2199 count=3,
2200 byeaster=-1,
2201 dtstart=parse("19970902T090000"))),
2202 [datetime(1998, 4, 11, 0, 0, 0),
2203 datetime(1998, 4, 11, 0, 0, 1),
2204 datetime(1998, 4, 11, 0, 0, 2)])
2205
2206 def testSecondlyByHour(self):
2207 self.assertEqual(list(rrule(FREQ_SECONDLY,
2208 count=3,
2209 byhour=(6,18),
2210 dtstart=parse("19970902T090000"))),
2211 [datetime(1997, 9, 2, 18, 0, 0),
2212 datetime(1997, 9, 2, 18, 0, 1),
2213 datetime(1997, 9, 2, 18, 0, 2)])
2214
2215 def testSecondlyByMinute(self):
2216 self.assertEqual(list(rrule(FREQ_SECONDLY,
2217 count=3,
2218 byminute=(6,18),
2219 dtstart=parse("19970902T090000"))),
2220 [datetime(1997, 9, 2, 9, 6, 0),
2221 datetime(1997, 9, 2, 9, 6, 1),
2222 datetime(1997, 9, 2, 9, 6, 2)])
2223
2224 def testSecondlyBySecond(self):
2225 self.assertEqual(list(rrule(FREQ_SECONDLY,
2226 count=3,
2227 bysecond=(6,18),
2228 dtstart=parse("19970902T090000"))),
2229 [datetime(1997, 9, 2, 9, 0, 6),
2230 datetime(1997, 9, 2, 9, 0, 18),
2231 datetime(1997, 9, 2, 9, 1, 6)])
2232
2233 def testSecondlyByHourAndMinute(self):
2234 self.assertEqual(list(rrule(FREQ_SECONDLY,
2235 count=3,
2236 byhour=(6,18),
2237 byminute=(6,18),
2238 dtstart=parse("19970902T090000"))),
2239 [datetime(1997, 9, 2, 18, 6, 0),
2240 datetime(1997, 9, 2, 18, 6, 1),
2241 datetime(1997, 9, 2, 18, 6, 2)])
2242
2243 def testSecondlyByHourAndSecond(self):
2244 self.assertEqual(list(rrule(FREQ_SECONDLY,
2245 count=3,
2246 byhour=(6,18),
2247 bysecond=(6,18),
2248 dtstart=parse("19970902T090000"))),
2249 [datetime(1997, 9, 2, 18, 0, 6),
2250 datetime(1997, 9, 2, 18, 0, 18),
2251 datetime(1997, 9, 2, 18, 1, 6)])
2252
2253 def testSecondlyByMinuteAndSecond(self):
2254 self.assertEqual(list(rrule(FREQ_SECONDLY,
2255 count=3,
2256 byminute=(6,18),
2257 bysecond=(6,18),
2258 dtstart=parse("19970902T090000"))),
2259 [datetime(1997, 9, 2, 9, 6, 6),
2260 datetime(1997, 9, 2, 9, 6, 18),
2261 datetime(1997, 9, 2, 9, 18, 6)])
2262
2263 def testSecondlyByHourAndMinuteAndSecond(self):
2264 self.assertEqual(list(rrule(FREQ_SECONDLY,
2265 count=3,
2266 byhour=(6,18),
2267 byminute=(6,18),
2268 bysecond=(6,18),
2269 dtstart=parse("19970902T090000"))),
2270 [datetime(1997, 9, 2, 18, 6, 6),
2271 datetime(1997, 9, 2, 18, 6, 18),
2272 datetime(1997, 9, 2, 18, 18, 6)])
2273
niemeyercb08a352003-10-08 06:02:06 +00002274 def testUntilNotMatching(self):
2275 self.assertEqual(list(rrule(FREQ_DAILY,
2276 count=3,
2277 dtstart=parse("19970902T090000"),
2278 until=parse("19970905T080000"))),
2279 [datetime(1997, 9, 2, 9, 0),
2280 datetime(1997, 9, 3, 9, 0),
2281 datetime(1997, 9, 4, 9, 0)])
2282
2283 def testUntilMatching(self):
2284 self.assertEqual(list(rrule(FREQ_DAILY,
2285 count=3,
2286 dtstart=parse("19970902T090000"),
2287 until=parse("19970904T090000"))),
2288 [datetime(1997, 9, 2, 9, 0),
2289 datetime(1997, 9, 3, 9, 0),
2290 datetime(1997, 9, 4, 9, 0)])
2291
2292 def testUntilSingle(self):
2293 self.assertEqual(list(rrule(FREQ_DAILY,
2294 count=3,
2295 dtstart=parse("19970902T090000"),
2296 until=parse("19970902T090000"))),
2297 [datetime(1997, 9, 2, 9, 0)])
2298
2299 def testUntilEmpty(self):
2300 self.assertEqual(list(rrule(FREQ_DAILY,
2301 count=3,
2302 dtstart=parse("19970902T090000"),
2303 until=parse("19970901T090000"))),
2304 [])
2305
niemeyercee1a1b2003-10-09 01:39:15 +00002306 def testWkStIntervalMO(self):
2307 self.assertEqual(list(rrule(FREQ_WEEKLY,
2308 count=3,
2309 interval=2,
2310 byweekday=(TU,SU),
2311 wkst=MO,
2312 dtstart=parse("19970902T090000"))),
2313 [datetime(1997, 9, 2, 9, 0),
2314 datetime(1997, 9, 7, 9, 0),
2315 datetime(1997, 9, 16, 9, 0)])
2316
2317 def testWkStIntervalSU(self):
2318 self.assertEqual(list(rrule(FREQ_WEEKLY,
2319 count=3,
2320 interval=2,
2321 byweekday=(TU,SU),
2322 wkst=SU,
2323 dtstart=parse("19970902T090000"))),
2324 [datetime(1997, 9, 2, 9, 0),
2325 datetime(1997, 9, 14, 9, 0),
2326 datetime(1997, 9, 16, 9, 0)])
2327
niemeyer68ae2752003-09-28 01:20:02 +00002328class ParserTest(unittest.TestCase):
2329 def setUp(self):
niemeyer97e19252003-10-06 05:52:04 +00002330 self.tzinfos = {"BRST": -10800}
niemeyer68ae2752003-09-28 01:20:02 +00002331 self.brsttz = tzoffset("BRST", -10800)
2332 self.default = datetime(2003, 9, 25)
2333
2334 def testDateCommandFormat(self):
2335 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
niemeyer97e19252003-10-06 05:52:04 +00002336 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002337 datetime(2003, 9, 25, 10, 36, 28,
2338 tzinfo=self.brsttz))
2339
2340 def testDateCommandFormatReversed(self):
2341 self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
niemeyer97e19252003-10-06 05:52:04 +00002342 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002343 datetime(2003, 9, 25, 10, 36, 28,
2344 tzinfo=self.brsttz))
2345
2346 def testDateCommandFormatIgnoreTz(self):
2347 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
2348 ignoretz=True),
2349 datetime(2003, 9, 25, 10, 36, 28))
2350
2351 def testDateCommandFormatStrip1(self):
2352 self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
2353 datetime(2003, 9, 25, 10, 36, 28))
2354
2355 def testDateCommandFormatStrip2(self):
2356 self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
2357 datetime(2003, 9, 25, 10, 36, 28))
2358
2359 def testDateCommandFormatStrip3(self):
2360 self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
2361 datetime(2003, 9, 25, 10, 36, 28))
2362
2363 def testDateCommandFormatStrip4(self):
2364 self.assertEqual(parse("Thu 10:36:28", default=self.default),
2365 datetime(2003, 9, 25, 10, 36, 28))
2366
2367 def testDateCommandFormatStrip5(self):
2368 self.assertEqual(parse("Sep 10:36:28", default=self.default),
2369 datetime(2003, 9, 25, 10, 36, 28))
2370
2371 def testDateCommandFormatStrip6(self):
2372 self.assertEqual(parse("10:36:28", default=self.default),
2373 datetime(2003, 9, 25, 10, 36, 28))
2374
2375 def testDateCommandFormatStrip7(self):
2376 self.assertEqual(parse("10:36", default=self.default),
2377 datetime(2003, 9, 25, 10, 36))
2378
2379 def testDateCommandFormatStrip8(self):
2380 self.assertEqual(parse("Thu Sep 25 2003"),
2381 datetime(2003, 9, 25))
2382
2383 def testDateCommandFormatStrip9(self):
2384 self.assertEqual(parse("Sep 25 2003"),
2385 datetime(2003, 9, 25))
2386
2387 def testDateCommandFormatStrip9(self):
2388 self.assertEqual(parse("Sep 2003", default=self.default),
2389 datetime(2003, 9, 25))
2390
2391 def testDateCommandFormatStrip10(self):
2392 self.assertEqual(parse("Sep", default=self.default),
2393 datetime(2003, 9, 25))
2394
2395 def testDateCommandFormatStrip11(self):
2396 self.assertEqual(parse("2003", default=self.default),
2397 datetime(2003, 9, 25))
2398
2399 def testDateRCommandFormat(self):
2400 self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
2401 datetime(2003, 9, 25, 10, 49, 41,
2402 tzinfo=self.brsttz))
2403
2404 def testISOFormat(self):
2405 self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
2406 datetime(2003, 9, 25, 10, 49, 41, 500000,
2407 tzinfo=self.brsttz))
2408
2409 def testISOFormatStrip1(self):
2410 self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
2411 datetime(2003, 9, 25, 10, 49, 41,
2412 tzinfo=self.brsttz))
2413
2414 def testISOFormatStrip2(self):
2415 self.assertEqual(parse("2003-09-25T10:49:41"),
2416 datetime(2003, 9, 25, 10, 49, 41))
2417
2418 def testISOFormatStrip3(self):
2419 self.assertEqual(parse("2003-09-25T10:49"),
2420 datetime(2003, 9, 25, 10, 49))
2421
2422 def testISOFormatStrip4(self):
2423 self.assertEqual(parse("2003-09-25T10"),
2424 datetime(2003, 9, 25, 10))
2425
2426 def testISOFormatStrip5(self):
2427 self.assertEqual(parse("2003-09-25"),
2428 datetime(2003, 9, 25))
2429
2430 def testISOStrippedFormat(self):
2431 self.assertEqual(parse("20030925T104941.5-0300"),
2432 datetime(2003, 9, 25, 10, 49, 41, 500000,
2433 tzinfo=self.brsttz))
2434
2435 def testISOStrippedFormatStrip1(self):
2436 self.assertEqual(parse("20030925T104941-0300"),
2437 datetime(2003, 9, 25, 10, 49, 41,
2438 tzinfo=self.brsttz))
2439
2440 def testISOStrippedFormatStrip2(self):
2441 self.assertEqual(parse("20030925T104941"),
2442 datetime(2003, 9, 25, 10, 49, 41))
2443
2444 def testISOStrippedFormatStrip3(self):
2445 self.assertEqual(parse("20030925T1049"),
2446 datetime(2003, 9, 25, 10, 49, 0))
2447
2448 def testISOStrippedFormatStrip4(self):
2449 self.assertEqual(parse("20030925T10"),
2450 datetime(2003, 9, 25, 10))
2451
2452 def testISOStrippedFormatStrip5(self):
2453 self.assertEqual(parse("20030925"),
2454 datetime(2003, 9, 25))
2455
2456 def testDateWithDash1(self):
2457 self.assertEqual(parse("2003-09-25"),
2458 datetime(2003, 9, 25))
2459
2460 def testDateWithDash2(self):
2461 self.assertEqual(parse("2003-Sep-25"),
2462 datetime(2003, 9, 25))
2463
2464 def testDateWithDash3(self):
2465 self.assertEqual(parse("25-Sep-2003"),
2466 datetime(2003, 9, 25))
2467
2468 def testDateWithDash4(self):
2469 self.assertEqual(parse("25-Sep-2003"),
2470 datetime(2003, 9, 25))
2471
2472 def testDateWithDash5(self):
2473 self.assertEqual(parse("Sep-25-2003"),
2474 datetime(2003, 9, 25))
2475
2476 def testDateWithDash6(self):
2477 self.assertEqual(parse("09-25-2003"),
2478 datetime(2003, 9, 25))
2479
2480 def testDateWithDash7(self):
2481 self.assertEqual(parse("25-09-2003"),
2482 datetime(2003, 9, 25))
2483
2484 def testDateWithDash8(self):
2485 self.assertEqual(parse("10-09-2003", dayfirst=True),
2486 datetime(2003, 9, 10))
2487
2488 def testDateWithDash9(self):
2489 self.assertEqual(parse("10-09-2003"),
2490 datetime(2003, 10, 9))
2491
2492 def testDateWithDash10(self):
2493 self.assertEqual(parse("10-09-03"),
2494 datetime(2003, 10, 9))
2495
2496 def testDateWithDash11(self):
2497 self.assertEqual(parse("10-09-03", yearfirst=True),
2498 datetime(2010, 9, 3))
2499
2500 def testDateWithDot1(self):
2501 self.assertEqual(parse("2003.09.25"),
2502 datetime(2003, 9, 25))
2503
2504 def testDateWithDot2(self):
2505 self.assertEqual(parse("2003.Sep.25"),
2506 datetime(2003, 9, 25))
2507
2508 def testDateWithDot3(self):
2509 self.assertEqual(parse("25.Sep.2003"),
2510 datetime(2003, 9, 25))
2511
2512 def testDateWithDot4(self):
2513 self.assertEqual(parse("25.Sep.2003"),
2514 datetime(2003, 9, 25))
2515
2516 def testDateWithDot5(self):
2517 self.assertEqual(parse("Sep.25.2003"),
2518 datetime(2003, 9, 25))
2519
2520 def testDateWithDot6(self):
2521 self.assertEqual(parse("09.25.2003"),
2522 datetime(2003, 9, 25))
2523
2524 def testDateWithDot7(self):
2525 self.assertEqual(parse("25.09.2003"),
2526 datetime(2003, 9, 25))
2527
2528 def testDateWithDot8(self):
2529 self.assertEqual(parse("10.09.2003", dayfirst=True),
2530 datetime(2003, 9, 10))
2531
2532 def testDateWithDot9(self):
2533 self.assertEqual(parse("10.09.2003"),
2534 datetime(2003, 10, 9))
2535
2536 def testDateWithDot10(self):
2537 self.assertEqual(parse("10.09.03"),
2538 datetime(2003, 10, 9))
2539
2540 def testDateWithDot11(self):
2541 self.assertEqual(parse("10.09.03", yearfirst=True),
2542 datetime(2010, 9, 3))
2543
2544 def testDateWithSlash1(self):
2545 self.assertEqual(parse("2003/09/25"),
2546 datetime(2003, 9, 25))
2547
2548 def testDateWithSlash2(self):
2549 self.assertEqual(parse("2003/Sep/25"),
2550 datetime(2003, 9, 25))
2551
2552 def testDateWithSlash3(self):
2553 self.assertEqual(parse("25/Sep/2003"),
2554 datetime(2003, 9, 25))
2555
2556 def testDateWithSlash4(self):
2557 self.assertEqual(parse("25/Sep/2003"),
2558 datetime(2003, 9, 25))
2559
2560 def testDateWithSlash5(self):
2561 self.assertEqual(parse("Sep/25/2003"),
2562 datetime(2003, 9, 25))
2563
2564 def testDateWithSlash6(self):
2565 self.assertEqual(parse("09/25/2003"),
2566 datetime(2003, 9, 25))
2567
2568 def testDateWithSlash7(self):
2569 self.assertEqual(parse("25/09/2003"),
2570 datetime(2003, 9, 25))
2571
2572 def testDateWithSlash8(self):
2573 self.assertEqual(parse("10/09/2003", dayfirst=True),
2574 datetime(2003, 9, 10))
2575
2576 def testDateWithSlash9(self):
2577 self.assertEqual(parse("10/09/2003"),
2578 datetime(2003, 10, 9))
2579
2580 def testDateWithSlash10(self):
2581 self.assertEqual(parse("10/09/03"),
2582 datetime(2003, 10, 9))
2583
2584 def testDateWithSlash11(self):
2585 self.assertEqual(parse("10/09/03", yearfirst=True),
2586 datetime(2010, 9, 3))
2587
2588 def testDateWithSpace12(self):
2589 self.assertEqual(parse("25 09 03"),
2590 datetime(2003, 9, 25))
2591
2592 def testDateWithSpace13(self):
2593 self.assertEqual(parse("25 09 03"),
2594 datetime(2003, 9, 25))
2595
2596 def testDateWithSpace1(self):
2597 self.assertEqual(parse("2003 09 25"),
2598 datetime(2003, 9, 25))
2599
2600 def testDateWithSpace2(self):
2601 self.assertEqual(parse("2003 Sep 25"),
2602 datetime(2003, 9, 25))
2603
2604 def testDateWithSpace3(self):
2605 self.assertEqual(parse("25 Sep 2003"),
2606 datetime(2003, 9, 25))
2607
2608 def testDateWithSpace4(self):
2609 self.assertEqual(parse("25 Sep 2003"),
2610 datetime(2003, 9, 25))
2611
2612 def testDateWithSpace5(self):
2613 self.assertEqual(parse("Sep 25 2003"),
2614 datetime(2003, 9, 25))
2615
2616 def testDateWithSpace6(self):
2617 self.assertEqual(parse("09 25 2003"),
2618 datetime(2003, 9, 25))
2619
2620 def testDateWithSpace7(self):
2621 self.assertEqual(parse("25 09 2003"),
2622 datetime(2003, 9, 25))
2623
2624 def testDateWithSpace8(self):
2625 self.assertEqual(parse("10 09 2003", dayfirst=True),
2626 datetime(2003, 9, 10))
2627
2628 def testDateWithSpace9(self):
2629 self.assertEqual(parse("10 09 2003"),
2630 datetime(2003, 10, 9))
2631
2632 def testDateWithSpace10(self):
2633 self.assertEqual(parse("10 09 03"),
2634 datetime(2003, 10, 9))
2635
2636 def testDateWithSpace11(self):
2637 self.assertEqual(parse("10 09 03", yearfirst=True),
2638 datetime(2010, 9, 3))
2639
2640 def testDateWithSpace12(self):
2641 self.assertEqual(parse("25 09 03"),
2642 datetime(2003, 9, 25))
2643
2644 def testDateWithSpace13(self):
2645 self.assertEqual(parse("25 09 03"),
2646 datetime(2003, 9, 25))
2647
2648 def testStrangelyOrderedDate1(self):
2649 self.assertEqual(parse("03 25 Sep"),
2650 datetime(2003, 9, 25))
2651
2652 def testStrangelyOrderedDate2(self):
2653 self.assertEqual(parse("2003 25 Sep"),
2654 datetime(2003, 9, 25))
2655
2656 def testStrangelyOrderedDate3(self):
2657 self.assertEqual(parse("25 03 Sep"),
2658 datetime(2025, 9, 3))
2659
2660 def testHourWithLetters(self):
2661 self.assertEqual(parse("10h36m28.5s", default=self.default),
2662 datetime(2003, 9, 25, 10, 36, 28, 500000))
2663
2664 def testHourWithLettersStrip1(self):
2665 self.assertEqual(parse("10h36m28s", default=self.default),
2666 datetime(2003, 9, 25, 10, 36, 28))
2667
2668 def testHourWithLettersStrip1(self):
2669 self.assertEqual(parse("10h36m", default=self.default),
2670 datetime(2003, 9, 25, 10, 36))
2671
2672 def testHourWithLettersStrip2(self):
2673 self.assertEqual(parse("10h", default=self.default),
2674 datetime(2003, 9, 25, 10))
2675
2676 def testHourAmPm1(self):
2677 self.assertEqual(parse("10h am", default=self.default),
2678 datetime(2003, 9, 25, 10))
2679
2680 def testHourAmPm2(self):
2681 self.assertEqual(parse("10h pm", default=self.default),
2682 datetime(2003, 9, 25, 22))
2683
2684 def testHourAmPm3(self):
2685 self.assertEqual(parse("10am", default=self.default),
2686 datetime(2003, 9, 25, 10))
2687
2688 def testHourAmPm4(self):
2689 self.assertEqual(parse("10pm", default=self.default),
2690 datetime(2003, 9, 25, 22))
2691
2692 def testHourAmPm5(self):
2693 self.assertEqual(parse("10:00 am", default=self.default),
2694 datetime(2003, 9, 25, 10))
2695
2696 def testHourAmPm6(self):
2697 self.assertEqual(parse("10:00 pm", default=self.default),
2698 datetime(2003, 9, 25, 22))
2699
2700 def testHourAmPm7(self):
2701 self.assertEqual(parse("10:00am", default=self.default),
2702 datetime(2003, 9, 25, 10))
2703
2704 def testHourAmPm8(self):
2705 self.assertEqual(parse("10:00pm", default=self.default),
2706 datetime(2003, 9, 25, 22))
2707
2708 def testHourAmPm9(self):
2709 self.assertEqual(parse("10:00a.m", default=self.default),
2710 datetime(2003, 9, 25, 10))
2711
2712 def testHourAmPm10(self):
2713 self.assertEqual(parse("10:00p.m", default=self.default),
2714 datetime(2003, 9, 25, 22))
2715
2716 def testHourAmPm11(self):
2717 self.assertEqual(parse("10:00a.m.", default=self.default),
2718 datetime(2003, 9, 25, 10))
2719
2720 def testHourAmPm12(self):
2721 self.assertEqual(parse("10:00p.m.", default=self.default),
2722 datetime(2003, 9, 25, 22))
2723
2724 def testPertain(self):
2725 self.assertEqual(parse("Sep 03", default=self.default),
2726 datetime(2003, 9, 3))
2727 self.assertEqual(parse("Sep of 03", default=self.default),
2728 datetime(2003, 9, 25))
2729
2730 def testWeekdayAlone(self):
2731 self.assertEqual(parse("Wed", default=self.default),
2732 datetime(2003, 10, 1))
2733
2734 def testLongWeekday(self):
2735 self.assertEqual(parse("Wednesday", default=self.default),
2736 datetime(2003, 10, 1))
2737
2738 def testLongMonth(self):
2739 self.assertEqual(parse("October", default=self.default),
2740 datetime(2003, 10, 25))
2741
2742 def testFuzzy(self):
2743 s = "Today is 25 of September of 2003, exactly " \
2744 "at 10:49:41 with timezone -03:00."
2745 self.assertEqual(parse(s, fuzzy=True),
2746 datetime(2003, 9, 25, 10, 49, 41,
2747 tzinfo=self.brsttz))
2748
2749 def testExtraSpace(self):
2750 self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
2751 datetime(1976, 7, 4, 0, 1, 2))
2752
2753 def testRandomFormat1(self):
2754 self.assertEqual(parse("Wed, July 10, '96"),
2755 datetime(1996, 7, 10, 0, 0))
2756
2757 def testRandomFormat2(self):
2758 self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
2759 ignoretz=True),
2760 datetime(1996, 7, 10, 15, 8, 56))
2761
2762 def testRandomFormat3(self):
2763 self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
2764 datetime(1996, 7, 10, 12, 8))
2765
2766 def testRandomFormat4(self):
2767 self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
2768 ignoretz=True),
2769 datetime(1952, 4, 12, 15, 30, 42))
2770
2771 def testRandomFormat5(self):
2772 self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
2773 ignoretz=True),
2774 datetime(1994, 11, 5, 8, 15, 30))
2775
2776 def testRandomFormat6(self):
2777 self.assertEqual(parse("1994-11-05T08:15:30-05:00",
2778 ignoretz=True),
2779 datetime(1994, 11, 5, 8, 15, 30))
2780
2781 def testRandomFormat7(self):
2782 self.assertEqual(parse("1994-11-05T08:15:30Z",
2783 ignoretz=True),
2784 datetime(1994, 11, 5, 8, 15, 30))
2785
2786 def testRandomFormat8(self):
2787 self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
2788
2789 def testRandomFormat9(self):
2790 self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
2791
2792 def testRandomFormat10(self):
2793 self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
2794
2795 def testRandomFormat11(self):
2796 self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
2797
2798 def testRandomFormat12(self):
2799 self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
2800
2801 def testRandomFormat13(self):
2802 self.assertEqual(parse("0:01:02", default=self.default),
2803 datetime(2003, 9, 25, 0, 1, 2))
2804
2805 def testRandomFormat14(self):
2806 self.assertEqual(parse("12h 01m02s am", default=self.default),
2807 datetime(2003, 9, 25, 0, 1, 2))
2808
2809 def testRandomFormat15(self):
2810 self.assertEqual(parse("0:01:02 on July 4, 1976"),
2811 datetime(1976, 7, 4, 0, 1, 2))
2812
2813 def testRandomFormat16(self):
2814 self.assertEqual(parse("0:01:02 on July 4, 1976"),
2815 datetime(1976, 7, 4, 0, 1, 2))
2816
2817 def testRandomFormat17(self):
2818 self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
2819 datetime(1976, 7, 4, 0, 1, 2))
2820
2821 def testRandomFormat18(self):
2822 self.assertEqual(parse("July 4, 1976 12:01:02 am"),
2823 datetime(1976, 7, 4, 0, 1, 2))
2824
2825 def testRandomFormat19(self):
2826 self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
2827 datetime(1995, 1, 2, 4, 24, 27))
2828
2829 def testRandomFormat20(self):
2830 self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
2831 datetime(1995, 4, 4, 0, 22, 12))
2832
2833 def testRandomFormat21(self):
2834 self.assertEqual(parse("04.04.95 00:22"),
2835 datetime(1995, 4, 4, 0, 22))
2836
2837 def testRandomFormat22(self):
2838 self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
2839 datetime(1999, 1, 1, 11, 23, 34, 578000))
2840
2841 def testRandomFormat23(self):
2842 self.assertEqual(parse("950404 122212"),
2843 datetime(1995, 4, 4, 12, 22, 12))
2844
2845 def testRandomFormat24(self):
2846 self.assertEqual(parse("0:00 PM, PST", default=self.default,
2847 ignoretz=True),
2848 datetime(2003, 9, 25, 12, 0))
2849
2850 def testRandomFormat25(self):
2851 self.assertEqual(parse("12:08 PM", default=self.default),
2852 datetime(2003, 9, 25, 12, 8))
2853
2854 def testRandomFormat26(self):
2855 self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
2856 datetime(1990, 6, 13, 5, 50))
2857
2858 def testRandomFormat27(self):
2859 self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
2860
2861 def testRandomFormat28(self):
2862 self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
2863
2864 def testRandomFormat29(self):
2865 self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
2866
2867 def testRandomFormat30(self):
2868 self.assertEqual(parse("01h02m03", default=self.default),
2869 datetime(2003, 9, 25, 1, 2, 3))
2870
2871 def testRandomFormat31(self):
2872 self.assertEqual(parse("01h02", default=self.default),
2873 datetime(2003, 9, 25, 1, 2))
2874
2875 def testRandomFormat32(self):
2876 self.assertEqual(parse("01h02s", default=self.default),
2877 datetime(2003, 9, 25, 1, 0, 2))
2878
2879 def testRandomFormat33(self):
2880 self.assertEqual(parse("01m02", default=self.default),
2881 datetime(2003, 9, 25, 0, 1, 2))
2882
2883 def testRandomFormat34(self):
2884 self.assertEqual(parse("01m02h", default=self.default),
2885 datetime(2003, 9, 25, 2, 1))
2886
2887class EasterTest(unittest.TestCase):
2888 easterlist = [
2889 # WESTERN ORTHODOX
2890 (date(1990, 4, 15), date(1990, 4, 15)),
2891 (date(1991, 3, 31), date(1991, 4, 7)),
2892 (date(1992, 4, 19), date(1992, 4, 26)),
2893 (date(1993, 4, 11), date(1993, 4, 18)),
2894 (date(1994, 4, 3), date(1994, 5, 1)),
2895 (date(1995, 4, 16), date(1995, 4, 23)),
2896 (date(1996, 4, 7), date(1996, 4, 14)),
2897 (date(1997, 3, 30), date(1997, 4, 27)),
2898 (date(1998, 4, 12), date(1998, 4, 19)),
2899 (date(1999, 4, 4), date(1999, 4, 11)),
2900
2901 (date(2000, 4, 23), date(2000, 4, 30)),
2902 (date(2001, 4, 15), date(2001, 4, 15)),
2903 (date(2002, 3, 31), date(2002, 5, 5)),
2904 (date(2003, 4, 20), date(2003, 4, 27)),
2905 (date(2004, 4, 11), date(2004, 4, 11)),
2906 (date(2005, 3, 27), date(2005, 5, 1)),
2907 (date(2006, 4, 16), date(2006, 4, 23)),
2908 (date(2007, 4, 8), date(2007, 4, 8)),
2909 (date(2008, 3, 23), date(2008, 4, 27)),
2910 (date(2009, 4, 12), date(2009, 4, 19)),
2911
2912 (date(2010, 4, 4), date(2010, 4, 4)),
2913 (date(2011, 4, 24), date(2011, 4, 24)),
2914 (date(2012, 4, 8), date(2012, 4, 15)),
2915 (date(2013, 3, 31), date(2013, 5, 5)),
2916 (date(2014, 4, 20), date(2014, 4, 20)),
2917 (date(2015, 4, 5), date(2015, 4, 12)),
2918 (date(2016, 3, 27), date(2016, 5, 1)),
2919 (date(2017, 4, 16), date(2017, 4, 16)),
2920 (date(2018, 4, 1), date(2018, 4, 8)),
2921 (date(2019, 4, 21), date(2019, 4, 28)),
2922
2923 (date(2020, 4, 12), date(2020, 4, 19)),
2924 (date(2021, 4, 4), date(2021, 5, 2)),
2925 (date(2022, 4, 17), date(2022, 4, 24)),
2926 (date(2023, 4, 9), date(2023, 4, 16)),
2927 (date(2024, 3, 31), date(2024, 5, 5)),
2928 (date(2025, 4, 20), date(2025, 4, 20)),
2929 (date(2026, 4, 5), date(2026, 4, 12)),
2930 (date(2027, 3, 28), date(2027, 5, 2)),
2931 (date(2028, 4, 16), date(2028, 4, 16)),
2932 (date(2029, 4, 1), date(2029, 4, 8)),
2933
2934 (date(2030, 4, 21), date(2030, 4, 28)),
2935 (date(2031, 4, 13), date(2031, 4, 13)),
2936 (date(2032, 3, 28), date(2032, 5, 2)),
2937 (date(2033, 4, 17), date(2033, 4, 24)),
2938 (date(2034, 4, 9), date(2034, 4, 9)),
2939 (date(2035, 3, 25), date(2035, 4, 29)),
2940 (date(2036, 4, 13), date(2036, 4, 20)),
2941 (date(2037, 4, 5), date(2037, 4, 5)),
2942 (date(2038, 4, 25), date(2038, 4, 25)),
2943 (date(2039, 4, 10), date(2039, 4, 17)),
2944
2945 (date(2040, 4, 1), date(2040, 5, 6)),
2946 (date(2041, 4, 21), date(2041, 4, 21)),
2947 (date(2042, 4, 6), date(2042, 4, 13)),
2948 (date(2043, 3, 29), date(2043, 5, 3)),
2949 (date(2044, 4, 17), date(2044, 4, 24)),
2950 (date(2045, 4, 9), date(2045, 4, 9)),
2951 (date(2046, 3, 25), date(2046, 4, 29)),
2952 (date(2047, 4, 14), date(2047, 4, 21)),
2953 (date(2048, 4, 5), date(2048, 4, 5)),
2954 (date(2049, 4, 18), date(2049, 4, 25)),
2955
2956 (date(2050, 4, 10), date(2050, 4, 17)),
2957 ]
2958
2959 def testEaster(self):
2960 for western, orthodox in self.easterlist:
2961 self.assertEqual(western, easter(western.year, EASTER_WESTERN))
2962 self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
2963
2964class TZTest(unittest.TestCase):
2965
niemeyer36139372003-10-07 01:48:15 +00002966 TZFILE_EST5EDT = """
niemeyer68ae2752003-09-28 01:20:02 +00002967VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
2968ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
2969S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
2970YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
2971yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
2972wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
29738uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
2974YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
2975BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
2976iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
2977znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
2978cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
2979Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
2980JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
2981jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
29824GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
2983b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
2984o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2985AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2986AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
2987AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2988AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
2989AEVQVAAAAAABAAAAAQ==
2990 """
2991
niemeyer36139372003-10-07 01:48:15 +00002992 TZICAL_EST5EDT = """
2993BEGIN:VTIMEZONE
2994TZID:US-Eastern
2995LAST-MODIFIED:19870101T000000Z
2996TZURL:http://zones.stds_r_us.net/tz/US-Eastern
2997BEGIN:STANDARD
2998DTSTART:19671029T020000
2999RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
3000TZOFFSETFROM:-0400
3001TZOFFSETTO:-0500
3002TZNAME:EST
3003END:STANDARD
3004BEGIN:DAYLIGHT
3005DTSTART:19870405T020000
3006RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
3007TZOFFSETFROM:-0500
3008TZOFFSETTO:-0400
3009TZNAME:EDT
3010END:DAYLIGHT
3011END:VTIMEZONE
3012 """
3013
niemeyer68ae2752003-09-28 01:20:02 +00003014 def testStrStart1(self):
3015 self.assertEqual(datetime(2003,4,6,1,59,
3016 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3017 self.assertEqual(datetime(2003,4,6,2,00,
3018 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3019
3020 def testStrEnd1(self):
3021 self.assertEqual(datetime(2003,10,26,0,59,
3022 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3023 self.assertEqual(datetime(2003,10,26,1,00,
3024 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3025
3026 def testStrStart2(self):
3027 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3028 self.assertEqual(datetime(2003,4,6,1,59,
3029 tzinfo=tzstr(s)).tzname(), "EST")
3030 self.assertEqual(datetime(2003,4,6,2,00,
3031 tzinfo=tzstr(s)).tzname(), "EDT")
3032
3033 def testStrEnd2(self):
3034 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3035 self.assertEqual(datetime(2003,10,26,0,59,
3036 tzinfo=tzstr(s)).tzname(), "EDT")
3037 self.assertEqual(datetime(2003,10,26,1,00,
3038 tzinfo=tzstr(s)).tzname(), "EST")
3039
3040 def testStrStart3(self):
3041 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3042 self.assertEqual(datetime(2003,4,6,1,59,
3043 tzinfo=tzstr(s)).tzname(), "EST")
3044 self.assertEqual(datetime(2003,4,6,2,00,
3045 tzinfo=tzstr(s)).tzname(), "EDT")
3046
3047 def testStrEnd3(self):
3048 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3049 self.assertEqual(datetime(2003,10,26,0,59,
3050 tzinfo=tzstr(s)).tzname(), "EDT")
3051 self.assertEqual(datetime(2003,10,26,1,00,
3052 tzinfo=tzstr(s)).tzname(), "EST")
3053
3054 def testStrStart4(self):
3055 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3056 self.assertEqual(datetime(2003,4,6,1,59,
3057 tzinfo=tzstr(s)).tzname(), "EST")
3058 self.assertEqual(datetime(2003,4,6,2,00,
3059 tzinfo=tzstr(s)).tzname(), "EDT")
3060
3061 def testStrEnd4(self):
3062 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3063 self.assertEqual(datetime(2003,10,26,0,59,
3064 tzinfo=tzstr(s)).tzname(), "EDT")
3065 self.assertEqual(datetime(2003,10,26,1,00,
3066 tzinfo=tzstr(s)).tzname(), "EST")
3067
3068 def testStrStart5(self):
3069 s = "EST5EDT4,95/02:00:00,298/02:00"
3070 self.assertEqual(datetime(2003,4,6,1,59,
3071 tzinfo=tzstr(s)).tzname(), "EST")
3072 self.assertEqual(datetime(2003,4,6,2,00,
3073 tzinfo=tzstr(s)).tzname(), "EDT")
3074
3075 def testStrEnd5(self):
3076 s = "EST5EDT4,95/02:00:00,298/02"
3077 self.assertEqual(datetime(2003,10,26,0,59,
3078 tzinfo=tzstr(s)).tzname(), "EDT")
3079 self.assertEqual(datetime(2003,10,26,1,00,
3080 tzinfo=tzstr(s)).tzname(), "EST")
3081
3082 def testStrStart6(self):
3083 s = "EST5EDT4,J96/02:00:00,J299/02:00"
3084 self.assertEqual(datetime(2003,4,6,1,59,
3085 tzinfo=tzstr(s)).tzname(), "EST")
3086 self.assertEqual(datetime(2003,4,6,2,00,
3087 tzinfo=tzstr(s)).tzname(), "EDT")
3088
3089 def testStrEnd6(self):
3090 s = "EST5EDT4,J96/02:00:00,J299/02"
3091 self.assertEqual(datetime(2003,10,26,0,59,
3092 tzinfo=tzstr(s)).tzname(), "EDT")
3093 self.assertEqual(datetime(2003,10,26,1,00,
3094 tzinfo=tzstr(s)).tzname(), "EST")
3095
3096 def testStrCmp1(self):
3097 self.assertEqual(tzstr("EST5EDT"),
3098 tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
3099
3100 def testStrCmp2(self):
3101 self.assertEqual(tzstr("EST5EDT"),
3102 tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
3103
3104 def testRangeCmp1(self):
3105 self.assertEqual(tzstr("EST5EDT"),
3106 tzrange("EST", -18000, "EDT", -14400,
3107 relativedelta(hours=+2,
3108 month=4, day=1,
niemeyerb47d12a2003-09-29 20:00:21 +00003109 weekday=SU(+1)),
niemeyer68ae2752003-09-28 01:20:02 +00003110 relativedelta(hours=+1,
3111 month=10, day=31,
niemeyerb47d12a2003-09-29 20:00:21 +00003112 weekday=SU(-1))))
niemeyer68ae2752003-09-28 01:20:02 +00003113
3114 def testRangeCmp2(self):
3115 self.assertEqual(tzstr("EST5EDT"),
3116 tzrange("EST", -18000, "EDT"))
3117
3118 def testFileStart1(self):
niemeyer36139372003-10-07 01:48:15 +00003119 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
niemeyer68ae2752003-09-28 01:20:02 +00003120 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3121 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3122
3123 def testFileEnd1(self):
niemeyer36139372003-10-07 01:48:15 +00003124 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
3125 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3126 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3127
3128 def testICalStart1(self):
3129 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
3130 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3131 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3132
3133 def testICalEnd1(self):
3134 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
niemeyer68ae2752003-09-28 01:20:02 +00003135 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3136 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3137
3138if __name__ == "__main__":
3139 unittest.main()
3140
3141# vim:ts=4:sw=4