blob: 4903756102097b9b6fcb5df40b1abb136df385cc [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
niemeyer68ae2752003-09-28 01:20:02 +00002306class ParserTest(unittest.TestCase):
2307 def setUp(self):
niemeyer97e19252003-10-06 05:52:04 +00002308 self.tzinfos = {"BRST": -10800}
niemeyer68ae2752003-09-28 01:20:02 +00002309 self.brsttz = tzoffset("BRST", -10800)
2310 self.default = datetime(2003, 9, 25)
2311
2312 def testDateCommandFormat(self):
2313 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
niemeyer97e19252003-10-06 05:52:04 +00002314 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002315 datetime(2003, 9, 25, 10, 36, 28,
2316 tzinfo=self.brsttz))
2317
2318 def testDateCommandFormatReversed(self):
2319 self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
niemeyer97e19252003-10-06 05:52:04 +00002320 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002321 datetime(2003, 9, 25, 10, 36, 28,
2322 tzinfo=self.brsttz))
2323
2324 def testDateCommandFormatIgnoreTz(self):
2325 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
2326 ignoretz=True),
2327 datetime(2003, 9, 25, 10, 36, 28))
2328
2329 def testDateCommandFormatStrip1(self):
2330 self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
2331 datetime(2003, 9, 25, 10, 36, 28))
2332
2333 def testDateCommandFormatStrip2(self):
2334 self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
2335 datetime(2003, 9, 25, 10, 36, 28))
2336
2337 def testDateCommandFormatStrip3(self):
2338 self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
2339 datetime(2003, 9, 25, 10, 36, 28))
2340
2341 def testDateCommandFormatStrip4(self):
2342 self.assertEqual(parse("Thu 10:36:28", default=self.default),
2343 datetime(2003, 9, 25, 10, 36, 28))
2344
2345 def testDateCommandFormatStrip5(self):
2346 self.assertEqual(parse("Sep 10:36:28", default=self.default),
2347 datetime(2003, 9, 25, 10, 36, 28))
2348
2349 def testDateCommandFormatStrip6(self):
2350 self.assertEqual(parse("10:36:28", default=self.default),
2351 datetime(2003, 9, 25, 10, 36, 28))
2352
2353 def testDateCommandFormatStrip7(self):
2354 self.assertEqual(parse("10:36", default=self.default),
2355 datetime(2003, 9, 25, 10, 36))
2356
2357 def testDateCommandFormatStrip8(self):
2358 self.assertEqual(parse("Thu Sep 25 2003"),
2359 datetime(2003, 9, 25))
2360
2361 def testDateCommandFormatStrip9(self):
2362 self.assertEqual(parse("Sep 25 2003"),
2363 datetime(2003, 9, 25))
2364
2365 def testDateCommandFormatStrip9(self):
2366 self.assertEqual(parse("Sep 2003", default=self.default),
2367 datetime(2003, 9, 25))
2368
2369 def testDateCommandFormatStrip10(self):
2370 self.assertEqual(parse("Sep", default=self.default),
2371 datetime(2003, 9, 25))
2372
2373 def testDateCommandFormatStrip11(self):
2374 self.assertEqual(parse("2003", default=self.default),
2375 datetime(2003, 9, 25))
2376
2377 def testDateRCommandFormat(self):
2378 self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
2379 datetime(2003, 9, 25, 10, 49, 41,
2380 tzinfo=self.brsttz))
2381
2382 def testISOFormat(self):
2383 self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
2384 datetime(2003, 9, 25, 10, 49, 41, 500000,
2385 tzinfo=self.brsttz))
2386
2387 def testISOFormatStrip1(self):
2388 self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
2389 datetime(2003, 9, 25, 10, 49, 41,
2390 tzinfo=self.brsttz))
2391
2392 def testISOFormatStrip2(self):
2393 self.assertEqual(parse("2003-09-25T10:49:41"),
2394 datetime(2003, 9, 25, 10, 49, 41))
2395
2396 def testISOFormatStrip3(self):
2397 self.assertEqual(parse("2003-09-25T10:49"),
2398 datetime(2003, 9, 25, 10, 49))
2399
2400 def testISOFormatStrip4(self):
2401 self.assertEqual(parse("2003-09-25T10"),
2402 datetime(2003, 9, 25, 10))
2403
2404 def testISOFormatStrip5(self):
2405 self.assertEqual(parse("2003-09-25"),
2406 datetime(2003, 9, 25))
2407
2408 def testISOStrippedFormat(self):
2409 self.assertEqual(parse("20030925T104941.5-0300"),
2410 datetime(2003, 9, 25, 10, 49, 41, 500000,
2411 tzinfo=self.brsttz))
2412
2413 def testISOStrippedFormatStrip1(self):
2414 self.assertEqual(parse("20030925T104941-0300"),
2415 datetime(2003, 9, 25, 10, 49, 41,
2416 tzinfo=self.brsttz))
2417
2418 def testISOStrippedFormatStrip2(self):
2419 self.assertEqual(parse("20030925T104941"),
2420 datetime(2003, 9, 25, 10, 49, 41))
2421
2422 def testISOStrippedFormatStrip3(self):
2423 self.assertEqual(parse("20030925T1049"),
2424 datetime(2003, 9, 25, 10, 49, 0))
2425
2426 def testISOStrippedFormatStrip4(self):
2427 self.assertEqual(parse("20030925T10"),
2428 datetime(2003, 9, 25, 10))
2429
2430 def testISOStrippedFormatStrip5(self):
2431 self.assertEqual(parse("20030925"),
2432 datetime(2003, 9, 25))
2433
2434 def testDateWithDash1(self):
2435 self.assertEqual(parse("2003-09-25"),
2436 datetime(2003, 9, 25))
2437
2438 def testDateWithDash2(self):
2439 self.assertEqual(parse("2003-Sep-25"),
2440 datetime(2003, 9, 25))
2441
2442 def testDateWithDash3(self):
2443 self.assertEqual(parse("25-Sep-2003"),
2444 datetime(2003, 9, 25))
2445
2446 def testDateWithDash4(self):
2447 self.assertEqual(parse("25-Sep-2003"),
2448 datetime(2003, 9, 25))
2449
2450 def testDateWithDash5(self):
2451 self.assertEqual(parse("Sep-25-2003"),
2452 datetime(2003, 9, 25))
2453
2454 def testDateWithDash6(self):
2455 self.assertEqual(parse("09-25-2003"),
2456 datetime(2003, 9, 25))
2457
2458 def testDateWithDash7(self):
2459 self.assertEqual(parse("25-09-2003"),
2460 datetime(2003, 9, 25))
2461
2462 def testDateWithDash8(self):
2463 self.assertEqual(parse("10-09-2003", dayfirst=True),
2464 datetime(2003, 9, 10))
2465
2466 def testDateWithDash9(self):
2467 self.assertEqual(parse("10-09-2003"),
2468 datetime(2003, 10, 9))
2469
2470 def testDateWithDash10(self):
2471 self.assertEqual(parse("10-09-03"),
2472 datetime(2003, 10, 9))
2473
2474 def testDateWithDash11(self):
2475 self.assertEqual(parse("10-09-03", yearfirst=True),
2476 datetime(2010, 9, 3))
2477
2478 def testDateWithDot1(self):
2479 self.assertEqual(parse("2003.09.25"),
2480 datetime(2003, 9, 25))
2481
2482 def testDateWithDot2(self):
2483 self.assertEqual(parse("2003.Sep.25"),
2484 datetime(2003, 9, 25))
2485
2486 def testDateWithDot3(self):
2487 self.assertEqual(parse("25.Sep.2003"),
2488 datetime(2003, 9, 25))
2489
2490 def testDateWithDot4(self):
2491 self.assertEqual(parse("25.Sep.2003"),
2492 datetime(2003, 9, 25))
2493
2494 def testDateWithDot5(self):
2495 self.assertEqual(parse("Sep.25.2003"),
2496 datetime(2003, 9, 25))
2497
2498 def testDateWithDot6(self):
2499 self.assertEqual(parse("09.25.2003"),
2500 datetime(2003, 9, 25))
2501
2502 def testDateWithDot7(self):
2503 self.assertEqual(parse("25.09.2003"),
2504 datetime(2003, 9, 25))
2505
2506 def testDateWithDot8(self):
2507 self.assertEqual(parse("10.09.2003", dayfirst=True),
2508 datetime(2003, 9, 10))
2509
2510 def testDateWithDot9(self):
2511 self.assertEqual(parse("10.09.2003"),
2512 datetime(2003, 10, 9))
2513
2514 def testDateWithDot10(self):
2515 self.assertEqual(parse("10.09.03"),
2516 datetime(2003, 10, 9))
2517
2518 def testDateWithDot11(self):
2519 self.assertEqual(parse("10.09.03", yearfirst=True),
2520 datetime(2010, 9, 3))
2521
2522 def testDateWithSlash1(self):
2523 self.assertEqual(parse("2003/09/25"),
2524 datetime(2003, 9, 25))
2525
2526 def testDateWithSlash2(self):
2527 self.assertEqual(parse("2003/Sep/25"),
2528 datetime(2003, 9, 25))
2529
2530 def testDateWithSlash3(self):
2531 self.assertEqual(parse("25/Sep/2003"),
2532 datetime(2003, 9, 25))
2533
2534 def testDateWithSlash4(self):
2535 self.assertEqual(parse("25/Sep/2003"),
2536 datetime(2003, 9, 25))
2537
2538 def testDateWithSlash5(self):
2539 self.assertEqual(parse("Sep/25/2003"),
2540 datetime(2003, 9, 25))
2541
2542 def testDateWithSlash6(self):
2543 self.assertEqual(parse("09/25/2003"),
2544 datetime(2003, 9, 25))
2545
2546 def testDateWithSlash7(self):
2547 self.assertEqual(parse("25/09/2003"),
2548 datetime(2003, 9, 25))
2549
2550 def testDateWithSlash8(self):
2551 self.assertEqual(parse("10/09/2003", dayfirst=True),
2552 datetime(2003, 9, 10))
2553
2554 def testDateWithSlash9(self):
2555 self.assertEqual(parse("10/09/2003"),
2556 datetime(2003, 10, 9))
2557
2558 def testDateWithSlash10(self):
2559 self.assertEqual(parse("10/09/03"),
2560 datetime(2003, 10, 9))
2561
2562 def testDateWithSlash11(self):
2563 self.assertEqual(parse("10/09/03", yearfirst=True),
2564 datetime(2010, 9, 3))
2565
2566 def testDateWithSpace12(self):
2567 self.assertEqual(parse("25 09 03"),
2568 datetime(2003, 9, 25))
2569
2570 def testDateWithSpace13(self):
2571 self.assertEqual(parse("25 09 03"),
2572 datetime(2003, 9, 25))
2573
2574 def testDateWithSpace1(self):
2575 self.assertEqual(parse("2003 09 25"),
2576 datetime(2003, 9, 25))
2577
2578 def testDateWithSpace2(self):
2579 self.assertEqual(parse("2003 Sep 25"),
2580 datetime(2003, 9, 25))
2581
2582 def testDateWithSpace3(self):
2583 self.assertEqual(parse("25 Sep 2003"),
2584 datetime(2003, 9, 25))
2585
2586 def testDateWithSpace4(self):
2587 self.assertEqual(parse("25 Sep 2003"),
2588 datetime(2003, 9, 25))
2589
2590 def testDateWithSpace5(self):
2591 self.assertEqual(parse("Sep 25 2003"),
2592 datetime(2003, 9, 25))
2593
2594 def testDateWithSpace6(self):
2595 self.assertEqual(parse("09 25 2003"),
2596 datetime(2003, 9, 25))
2597
2598 def testDateWithSpace7(self):
2599 self.assertEqual(parse("25 09 2003"),
2600 datetime(2003, 9, 25))
2601
2602 def testDateWithSpace8(self):
2603 self.assertEqual(parse("10 09 2003", dayfirst=True),
2604 datetime(2003, 9, 10))
2605
2606 def testDateWithSpace9(self):
2607 self.assertEqual(parse("10 09 2003"),
2608 datetime(2003, 10, 9))
2609
2610 def testDateWithSpace10(self):
2611 self.assertEqual(parse("10 09 03"),
2612 datetime(2003, 10, 9))
2613
2614 def testDateWithSpace11(self):
2615 self.assertEqual(parse("10 09 03", yearfirst=True),
2616 datetime(2010, 9, 3))
2617
2618 def testDateWithSpace12(self):
2619 self.assertEqual(parse("25 09 03"),
2620 datetime(2003, 9, 25))
2621
2622 def testDateWithSpace13(self):
2623 self.assertEqual(parse("25 09 03"),
2624 datetime(2003, 9, 25))
2625
2626 def testStrangelyOrderedDate1(self):
2627 self.assertEqual(parse("03 25 Sep"),
2628 datetime(2003, 9, 25))
2629
2630 def testStrangelyOrderedDate2(self):
2631 self.assertEqual(parse("2003 25 Sep"),
2632 datetime(2003, 9, 25))
2633
2634 def testStrangelyOrderedDate3(self):
2635 self.assertEqual(parse("25 03 Sep"),
2636 datetime(2025, 9, 3))
2637
2638 def testHourWithLetters(self):
2639 self.assertEqual(parse("10h36m28.5s", default=self.default),
2640 datetime(2003, 9, 25, 10, 36, 28, 500000))
2641
2642 def testHourWithLettersStrip1(self):
2643 self.assertEqual(parse("10h36m28s", default=self.default),
2644 datetime(2003, 9, 25, 10, 36, 28))
2645
2646 def testHourWithLettersStrip1(self):
2647 self.assertEqual(parse("10h36m", default=self.default),
2648 datetime(2003, 9, 25, 10, 36))
2649
2650 def testHourWithLettersStrip2(self):
2651 self.assertEqual(parse("10h", default=self.default),
2652 datetime(2003, 9, 25, 10))
2653
2654 def testHourAmPm1(self):
2655 self.assertEqual(parse("10h am", default=self.default),
2656 datetime(2003, 9, 25, 10))
2657
2658 def testHourAmPm2(self):
2659 self.assertEqual(parse("10h pm", default=self.default),
2660 datetime(2003, 9, 25, 22))
2661
2662 def testHourAmPm3(self):
2663 self.assertEqual(parse("10am", default=self.default),
2664 datetime(2003, 9, 25, 10))
2665
2666 def testHourAmPm4(self):
2667 self.assertEqual(parse("10pm", default=self.default),
2668 datetime(2003, 9, 25, 22))
2669
2670 def testHourAmPm5(self):
2671 self.assertEqual(parse("10:00 am", default=self.default),
2672 datetime(2003, 9, 25, 10))
2673
2674 def testHourAmPm6(self):
2675 self.assertEqual(parse("10:00 pm", default=self.default),
2676 datetime(2003, 9, 25, 22))
2677
2678 def testHourAmPm7(self):
2679 self.assertEqual(parse("10:00am", default=self.default),
2680 datetime(2003, 9, 25, 10))
2681
2682 def testHourAmPm8(self):
2683 self.assertEqual(parse("10:00pm", default=self.default),
2684 datetime(2003, 9, 25, 22))
2685
2686 def testHourAmPm9(self):
2687 self.assertEqual(parse("10:00a.m", default=self.default),
2688 datetime(2003, 9, 25, 10))
2689
2690 def testHourAmPm10(self):
2691 self.assertEqual(parse("10:00p.m", default=self.default),
2692 datetime(2003, 9, 25, 22))
2693
2694 def testHourAmPm11(self):
2695 self.assertEqual(parse("10:00a.m.", default=self.default),
2696 datetime(2003, 9, 25, 10))
2697
2698 def testHourAmPm12(self):
2699 self.assertEqual(parse("10:00p.m.", default=self.default),
2700 datetime(2003, 9, 25, 22))
2701
2702 def testPertain(self):
2703 self.assertEqual(parse("Sep 03", default=self.default),
2704 datetime(2003, 9, 3))
2705 self.assertEqual(parse("Sep of 03", default=self.default),
2706 datetime(2003, 9, 25))
2707
2708 def testWeekdayAlone(self):
2709 self.assertEqual(parse("Wed", default=self.default),
2710 datetime(2003, 10, 1))
2711
2712 def testLongWeekday(self):
2713 self.assertEqual(parse("Wednesday", default=self.default),
2714 datetime(2003, 10, 1))
2715
2716 def testLongMonth(self):
2717 self.assertEqual(parse("October", default=self.default),
2718 datetime(2003, 10, 25))
2719
2720 def testFuzzy(self):
2721 s = "Today is 25 of September of 2003, exactly " \
2722 "at 10:49:41 with timezone -03:00."
2723 self.assertEqual(parse(s, fuzzy=True),
2724 datetime(2003, 9, 25, 10, 49, 41,
2725 tzinfo=self.brsttz))
2726
2727 def testExtraSpace(self):
2728 self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
2729 datetime(1976, 7, 4, 0, 1, 2))
2730
2731 def testRandomFormat1(self):
2732 self.assertEqual(parse("Wed, July 10, '96"),
2733 datetime(1996, 7, 10, 0, 0))
2734
2735 def testRandomFormat2(self):
2736 self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
2737 ignoretz=True),
2738 datetime(1996, 7, 10, 15, 8, 56))
2739
2740 def testRandomFormat3(self):
2741 self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
2742 datetime(1996, 7, 10, 12, 8))
2743
2744 def testRandomFormat4(self):
2745 self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
2746 ignoretz=True),
2747 datetime(1952, 4, 12, 15, 30, 42))
2748
2749 def testRandomFormat5(self):
2750 self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
2751 ignoretz=True),
2752 datetime(1994, 11, 5, 8, 15, 30))
2753
2754 def testRandomFormat6(self):
2755 self.assertEqual(parse("1994-11-05T08:15:30-05:00",
2756 ignoretz=True),
2757 datetime(1994, 11, 5, 8, 15, 30))
2758
2759 def testRandomFormat7(self):
2760 self.assertEqual(parse("1994-11-05T08:15:30Z",
2761 ignoretz=True),
2762 datetime(1994, 11, 5, 8, 15, 30))
2763
2764 def testRandomFormat8(self):
2765 self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
2766
2767 def testRandomFormat9(self):
2768 self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
2769
2770 def testRandomFormat10(self):
2771 self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
2772
2773 def testRandomFormat11(self):
2774 self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
2775
2776 def testRandomFormat12(self):
2777 self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
2778
2779 def testRandomFormat13(self):
2780 self.assertEqual(parse("0:01:02", default=self.default),
2781 datetime(2003, 9, 25, 0, 1, 2))
2782
2783 def testRandomFormat14(self):
2784 self.assertEqual(parse("12h 01m02s am", default=self.default),
2785 datetime(2003, 9, 25, 0, 1, 2))
2786
2787 def testRandomFormat15(self):
2788 self.assertEqual(parse("0:01:02 on July 4, 1976"),
2789 datetime(1976, 7, 4, 0, 1, 2))
2790
2791 def testRandomFormat16(self):
2792 self.assertEqual(parse("0:01:02 on July 4, 1976"),
2793 datetime(1976, 7, 4, 0, 1, 2))
2794
2795 def testRandomFormat17(self):
2796 self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
2797 datetime(1976, 7, 4, 0, 1, 2))
2798
2799 def testRandomFormat18(self):
2800 self.assertEqual(parse("July 4, 1976 12:01:02 am"),
2801 datetime(1976, 7, 4, 0, 1, 2))
2802
2803 def testRandomFormat19(self):
2804 self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
2805 datetime(1995, 1, 2, 4, 24, 27))
2806
2807 def testRandomFormat20(self):
2808 self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
2809 datetime(1995, 4, 4, 0, 22, 12))
2810
2811 def testRandomFormat21(self):
2812 self.assertEqual(parse("04.04.95 00:22"),
2813 datetime(1995, 4, 4, 0, 22))
2814
2815 def testRandomFormat22(self):
2816 self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
2817 datetime(1999, 1, 1, 11, 23, 34, 578000))
2818
2819 def testRandomFormat23(self):
2820 self.assertEqual(parse("950404 122212"),
2821 datetime(1995, 4, 4, 12, 22, 12))
2822
2823 def testRandomFormat24(self):
2824 self.assertEqual(parse("0:00 PM, PST", default=self.default,
2825 ignoretz=True),
2826 datetime(2003, 9, 25, 12, 0))
2827
2828 def testRandomFormat25(self):
2829 self.assertEqual(parse("12:08 PM", default=self.default),
2830 datetime(2003, 9, 25, 12, 8))
2831
2832 def testRandomFormat26(self):
2833 self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
2834 datetime(1990, 6, 13, 5, 50))
2835
2836 def testRandomFormat27(self):
2837 self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
2838
2839 def testRandomFormat28(self):
2840 self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
2841
2842 def testRandomFormat29(self):
2843 self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
2844
2845 def testRandomFormat30(self):
2846 self.assertEqual(parse("01h02m03", default=self.default),
2847 datetime(2003, 9, 25, 1, 2, 3))
2848
2849 def testRandomFormat31(self):
2850 self.assertEqual(parse("01h02", default=self.default),
2851 datetime(2003, 9, 25, 1, 2))
2852
2853 def testRandomFormat32(self):
2854 self.assertEqual(parse("01h02s", default=self.default),
2855 datetime(2003, 9, 25, 1, 0, 2))
2856
2857 def testRandomFormat33(self):
2858 self.assertEqual(parse("01m02", default=self.default),
2859 datetime(2003, 9, 25, 0, 1, 2))
2860
2861 def testRandomFormat34(self):
2862 self.assertEqual(parse("01m02h", default=self.default),
2863 datetime(2003, 9, 25, 2, 1))
2864
2865class EasterTest(unittest.TestCase):
2866 easterlist = [
2867 # WESTERN ORTHODOX
2868 (date(1990, 4, 15), date(1990, 4, 15)),
2869 (date(1991, 3, 31), date(1991, 4, 7)),
2870 (date(1992, 4, 19), date(1992, 4, 26)),
2871 (date(1993, 4, 11), date(1993, 4, 18)),
2872 (date(1994, 4, 3), date(1994, 5, 1)),
2873 (date(1995, 4, 16), date(1995, 4, 23)),
2874 (date(1996, 4, 7), date(1996, 4, 14)),
2875 (date(1997, 3, 30), date(1997, 4, 27)),
2876 (date(1998, 4, 12), date(1998, 4, 19)),
2877 (date(1999, 4, 4), date(1999, 4, 11)),
2878
2879 (date(2000, 4, 23), date(2000, 4, 30)),
2880 (date(2001, 4, 15), date(2001, 4, 15)),
2881 (date(2002, 3, 31), date(2002, 5, 5)),
2882 (date(2003, 4, 20), date(2003, 4, 27)),
2883 (date(2004, 4, 11), date(2004, 4, 11)),
2884 (date(2005, 3, 27), date(2005, 5, 1)),
2885 (date(2006, 4, 16), date(2006, 4, 23)),
2886 (date(2007, 4, 8), date(2007, 4, 8)),
2887 (date(2008, 3, 23), date(2008, 4, 27)),
2888 (date(2009, 4, 12), date(2009, 4, 19)),
2889
2890 (date(2010, 4, 4), date(2010, 4, 4)),
2891 (date(2011, 4, 24), date(2011, 4, 24)),
2892 (date(2012, 4, 8), date(2012, 4, 15)),
2893 (date(2013, 3, 31), date(2013, 5, 5)),
2894 (date(2014, 4, 20), date(2014, 4, 20)),
2895 (date(2015, 4, 5), date(2015, 4, 12)),
2896 (date(2016, 3, 27), date(2016, 5, 1)),
2897 (date(2017, 4, 16), date(2017, 4, 16)),
2898 (date(2018, 4, 1), date(2018, 4, 8)),
2899 (date(2019, 4, 21), date(2019, 4, 28)),
2900
2901 (date(2020, 4, 12), date(2020, 4, 19)),
2902 (date(2021, 4, 4), date(2021, 5, 2)),
2903 (date(2022, 4, 17), date(2022, 4, 24)),
2904 (date(2023, 4, 9), date(2023, 4, 16)),
2905 (date(2024, 3, 31), date(2024, 5, 5)),
2906 (date(2025, 4, 20), date(2025, 4, 20)),
2907 (date(2026, 4, 5), date(2026, 4, 12)),
2908 (date(2027, 3, 28), date(2027, 5, 2)),
2909 (date(2028, 4, 16), date(2028, 4, 16)),
2910 (date(2029, 4, 1), date(2029, 4, 8)),
2911
2912 (date(2030, 4, 21), date(2030, 4, 28)),
2913 (date(2031, 4, 13), date(2031, 4, 13)),
2914 (date(2032, 3, 28), date(2032, 5, 2)),
2915 (date(2033, 4, 17), date(2033, 4, 24)),
2916 (date(2034, 4, 9), date(2034, 4, 9)),
2917 (date(2035, 3, 25), date(2035, 4, 29)),
2918 (date(2036, 4, 13), date(2036, 4, 20)),
2919 (date(2037, 4, 5), date(2037, 4, 5)),
2920 (date(2038, 4, 25), date(2038, 4, 25)),
2921 (date(2039, 4, 10), date(2039, 4, 17)),
2922
2923 (date(2040, 4, 1), date(2040, 5, 6)),
2924 (date(2041, 4, 21), date(2041, 4, 21)),
2925 (date(2042, 4, 6), date(2042, 4, 13)),
2926 (date(2043, 3, 29), date(2043, 5, 3)),
2927 (date(2044, 4, 17), date(2044, 4, 24)),
2928 (date(2045, 4, 9), date(2045, 4, 9)),
2929 (date(2046, 3, 25), date(2046, 4, 29)),
2930 (date(2047, 4, 14), date(2047, 4, 21)),
2931 (date(2048, 4, 5), date(2048, 4, 5)),
2932 (date(2049, 4, 18), date(2049, 4, 25)),
2933
2934 (date(2050, 4, 10), date(2050, 4, 17)),
2935 ]
2936
2937 def testEaster(self):
2938 for western, orthodox in self.easterlist:
2939 self.assertEqual(western, easter(western.year, EASTER_WESTERN))
2940 self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
2941
2942class TZTest(unittest.TestCase):
2943
niemeyer36139372003-10-07 01:48:15 +00002944 TZFILE_EST5EDT = """
niemeyer68ae2752003-09-28 01:20:02 +00002945VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
2946ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
2947S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
2948YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
2949yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
2950wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
29518uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
2952YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
2953BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
2954iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
2955znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
2956cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
2957Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
2958JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
2959jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
29604GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
2961b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
2962o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2963AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2964AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
2965AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
2966AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
2967AEVQVAAAAAABAAAAAQ==
2968 """
2969
niemeyer36139372003-10-07 01:48:15 +00002970 TZICAL_EST5EDT = """
2971BEGIN:VTIMEZONE
2972TZID:US-Eastern
2973LAST-MODIFIED:19870101T000000Z
2974TZURL:http://zones.stds_r_us.net/tz/US-Eastern
2975BEGIN:STANDARD
2976DTSTART:19671029T020000
2977RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
2978TZOFFSETFROM:-0400
2979TZOFFSETTO:-0500
2980TZNAME:EST
2981END:STANDARD
2982BEGIN:DAYLIGHT
2983DTSTART:19870405T020000
2984RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
2985TZOFFSETFROM:-0500
2986TZOFFSETTO:-0400
2987TZNAME:EDT
2988END:DAYLIGHT
2989END:VTIMEZONE
2990 """
2991
niemeyer68ae2752003-09-28 01:20:02 +00002992 def testStrStart1(self):
2993 self.assertEqual(datetime(2003,4,6,1,59,
2994 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
2995 self.assertEqual(datetime(2003,4,6,2,00,
2996 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
2997
2998 def testStrEnd1(self):
2999 self.assertEqual(datetime(2003,10,26,0,59,
3000 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3001 self.assertEqual(datetime(2003,10,26,1,00,
3002 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3003
3004 def testStrStart2(self):
3005 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3006 self.assertEqual(datetime(2003,4,6,1,59,
3007 tzinfo=tzstr(s)).tzname(), "EST")
3008 self.assertEqual(datetime(2003,4,6,2,00,
3009 tzinfo=tzstr(s)).tzname(), "EDT")
3010
3011 def testStrEnd2(self):
3012 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3013 self.assertEqual(datetime(2003,10,26,0,59,
3014 tzinfo=tzstr(s)).tzname(), "EDT")
3015 self.assertEqual(datetime(2003,10,26,1,00,
3016 tzinfo=tzstr(s)).tzname(), "EST")
3017
3018 def testStrStart3(self):
3019 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3020 self.assertEqual(datetime(2003,4,6,1,59,
3021 tzinfo=tzstr(s)).tzname(), "EST")
3022 self.assertEqual(datetime(2003,4,6,2,00,
3023 tzinfo=tzstr(s)).tzname(), "EDT")
3024
3025 def testStrEnd3(self):
3026 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3027 self.assertEqual(datetime(2003,10,26,0,59,
3028 tzinfo=tzstr(s)).tzname(), "EDT")
3029 self.assertEqual(datetime(2003,10,26,1,00,
3030 tzinfo=tzstr(s)).tzname(), "EST")
3031
3032 def testStrStart4(self):
3033 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3034 self.assertEqual(datetime(2003,4,6,1,59,
3035 tzinfo=tzstr(s)).tzname(), "EST")
3036 self.assertEqual(datetime(2003,4,6,2,00,
3037 tzinfo=tzstr(s)).tzname(), "EDT")
3038
3039 def testStrEnd4(self):
3040 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3041 self.assertEqual(datetime(2003,10,26,0,59,
3042 tzinfo=tzstr(s)).tzname(), "EDT")
3043 self.assertEqual(datetime(2003,10,26,1,00,
3044 tzinfo=tzstr(s)).tzname(), "EST")
3045
3046 def testStrStart5(self):
3047 s = "EST5EDT4,95/02:00:00,298/02:00"
3048 self.assertEqual(datetime(2003,4,6,1,59,
3049 tzinfo=tzstr(s)).tzname(), "EST")
3050 self.assertEqual(datetime(2003,4,6,2,00,
3051 tzinfo=tzstr(s)).tzname(), "EDT")
3052
3053 def testStrEnd5(self):
3054 s = "EST5EDT4,95/02:00:00,298/02"
3055 self.assertEqual(datetime(2003,10,26,0,59,
3056 tzinfo=tzstr(s)).tzname(), "EDT")
3057 self.assertEqual(datetime(2003,10,26,1,00,
3058 tzinfo=tzstr(s)).tzname(), "EST")
3059
3060 def testStrStart6(self):
3061 s = "EST5EDT4,J96/02:00:00,J299/02:00"
3062 self.assertEqual(datetime(2003,4,6,1,59,
3063 tzinfo=tzstr(s)).tzname(), "EST")
3064 self.assertEqual(datetime(2003,4,6,2,00,
3065 tzinfo=tzstr(s)).tzname(), "EDT")
3066
3067 def testStrEnd6(self):
3068 s = "EST5EDT4,J96/02:00:00,J299/02"
3069 self.assertEqual(datetime(2003,10,26,0,59,
3070 tzinfo=tzstr(s)).tzname(), "EDT")
3071 self.assertEqual(datetime(2003,10,26,1,00,
3072 tzinfo=tzstr(s)).tzname(), "EST")
3073
3074 def testStrCmp1(self):
3075 self.assertEqual(tzstr("EST5EDT"),
3076 tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
3077
3078 def testStrCmp2(self):
3079 self.assertEqual(tzstr("EST5EDT"),
3080 tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
3081
3082 def testRangeCmp1(self):
3083 self.assertEqual(tzstr("EST5EDT"),
3084 tzrange("EST", -18000, "EDT", -14400,
3085 relativedelta(hours=+2,
3086 month=4, day=1,
niemeyerb47d12a2003-09-29 20:00:21 +00003087 weekday=SU(+1)),
niemeyer68ae2752003-09-28 01:20:02 +00003088 relativedelta(hours=+1,
3089 month=10, day=31,
niemeyerb47d12a2003-09-29 20:00:21 +00003090 weekday=SU(-1))))
niemeyer68ae2752003-09-28 01:20:02 +00003091
3092 def testRangeCmp2(self):
3093 self.assertEqual(tzstr("EST5EDT"),
3094 tzrange("EST", -18000, "EDT"))
3095
3096 def testFileStart1(self):
niemeyer36139372003-10-07 01:48:15 +00003097 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
niemeyer68ae2752003-09-28 01:20:02 +00003098 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3099 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3100
3101 def testFileEnd1(self):
niemeyer36139372003-10-07 01:48:15 +00003102 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
3103 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3104 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3105
3106 def testICalStart1(self):
3107 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
3108 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3109 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3110
3111 def testICalEnd1(self):
3112 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
niemeyer68ae2752003-09-28 01:20:02 +00003113 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3114 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3115
3116if __name__ == "__main__":
3117 unittest.main()
3118
3119# vim:ts=4:sw=4