blob: d28a9ca58a9ecdef5ed7aaa76e2034b284ddc3e1 [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):
niemeyer4da06a42004-07-16 21:21:22 +0000145 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000146 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
niemeyercb08a352003-10-08 06:02:06 +0000152 def testYearlyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +0000153 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000154 count=3,
155 interval=2,
156 dtstart=parse("19970902T090000"))),
157 [datetime(1997, 9, 2, 9, 0),
158 datetime(1999, 9, 2, 9, 0),
159 datetime(2001, 9, 2, 9, 0)])
160
161 def testYearlyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000162 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000163 count=3,
164 interval=100,
165 dtstart=parse("19970902T090000"))),
166 [datetime(1997, 9, 2, 9, 0),
167 datetime(2097, 9, 2, 9, 0),
168 datetime(2197, 9, 2, 9, 0)])
169
170 def testYearlyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +0000171 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000172 count=3,
173 bymonth=(1,3),
174 dtstart=parse("19970902T090000"))),
175 [datetime(1998, 1, 2, 9, 0),
176 datetime(1998, 3, 2, 9, 0),
177 datetime(1999, 1, 2, 9, 0)])
178
179 def testYearlyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000180 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000181 count=3,
182 bymonthday=(1,3),
183 dtstart=parse("19970902T090000"))),
184 [datetime(1997, 9, 3, 9, 0),
185 datetime(1997, 10, 1, 9, 0),
186 datetime(1997, 10, 3, 9, 0)])
187
188 def testYearlyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000189 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000190 count=3,
191 bymonth=(1,3),
192 bymonthday=(5,7),
193 dtstart=parse("19970902T090000"))),
194 [datetime(1998, 1, 5, 9, 0),
195 datetime(1998, 1, 7, 9, 0),
196 datetime(1998, 3, 5, 9, 0)])
197
198 def testYearlyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000199 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000200 count=3,
201 byweekday=(TU,TH),
202 dtstart=parse("19970902T090000"))),
203 [datetime(1997, 9, 2, 9, 0),
204 datetime(1997, 9, 4, 9, 0),
205 datetime(1997, 9, 9, 9, 0)])
206
niemeyer7d8be1a2003-10-09 01:09:42 +0000207 def testYearlyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000208 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000209 count=3,
210 byweekday=(TU(1),TH(-1)),
211 dtstart=parse("19970902T090000"))),
212 [datetime(1997, 12, 25, 9, 0),
213 datetime(1998, 1, 6, 9, 0),
214 datetime(1998, 12, 31, 9, 0)])
215
216 def testYearlyByNWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000217 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000218 count=3,
219 byweekday=(TU(3),TH(-3)),
220 dtstart=parse("19970902T090000"))),
221 [datetime(1997, 12, 11, 9, 0),
222 datetime(1998, 1, 20, 9, 0),
223 datetime(1998, 12, 17, 9, 0)])
224
niemeyercb08a352003-10-08 06:02:06 +0000225 def testYearlyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000226 self.assertEqual(list(rrule(YEARLY,
niemeyercb08a352003-10-08 06:02:06 +0000227 count=3,
228 bymonth=(1,3),
229 byweekday=(TU,TH),
230 dtstart=parse("19970902T090000"))),
231 [datetime(1998, 1, 1, 9, 0),
232 datetime(1998, 1, 6, 9, 0),
233 datetime(1998, 1, 8, 9, 0)])
234
niemeyer7d8be1a2003-10-09 01:09:42 +0000235 def testYearlyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000236 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000237 count=3,
238 bymonth=(1,3),
239 byweekday=(TU(1),TH(-1)),
240 dtstart=parse("19970902T090000"))),
241 [datetime(1998, 1, 6, 9, 0),
242 datetime(1998, 1, 29, 9, 0),
243 datetime(1998, 3, 3, 9, 0)])
244
245 def testYearlyByMonthAndNWeekDayLarge(self):
246 # This is interesting because the TH(-3) ends up before
247 # the TU(3).
niemeyer4da06a42004-07-16 21:21:22 +0000248 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000249 count=3,
250 bymonth=(1,3),
251 byweekday=(TU(3),TH(-3)),
252 dtstart=parse("19970902T090000"))),
253 [datetime(1998, 1, 15, 9, 0),
254 datetime(1998, 1, 20, 9, 0),
255 datetime(1998, 3, 12, 9, 0)])
256
257 def testYearlyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000258 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000259 count=3,
260 bymonthday=(1,3),
261 byweekday=(TU,TH),
262 dtstart=parse("19970902T090000"))),
263 [datetime(1998, 1, 1, 9, 0),
264 datetime(1998, 2, 3, 9, 0),
265 datetime(1998, 3, 3, 9, 0)])
266
267 def testYearlyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000268 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000269 count=3,
270 bymonth=(1,3),
271 bymonthday=(1,3),
272 byweekday=(TU,TH),
273 dtstart=parse("19970902T090000"))),
274 [datetime(1998, 1, 1, 9, 0),
275 datetime(1998, 3, 3, 9, 0),
276 datetime(2001, 3, 1, 9, 0)])
277
278 def testYearlyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000279 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000280 count=3,
281 byyearday=(1,100,200),
282 dtstart=parse("19970902T090000"))),
283 [datetime(1998, 1, 1, 9, 0),
284 datetime(1998, 4, 10, 9, 0),
285 datetime(1998, 7, 19, 9, 0)])
286
287 def testYearlyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000288 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000289 count=3,
290 bymonth=(4,7),
291 byyearday=(1,100,200),
292 dtstart=parse("19970902T090000"))),
293 [datetime(1998, 4, 10, 9, 0),
294 datetime(1998, 7, 19, 9, 0),
295 datetime(1999, 4, 10, 9, 0)])
296
297 def testYearlyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +0000298 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000299 count=3,
300 byweekno=20,
301 dtstart=parse("19970902T090000"))),
302 [datetime(1998, 5, 11, 9, 0),
303 datetime(1998, 5, 12, 9, 0),
304 datetime(1998, 5, 13, 9, 0)])
305
306 def testYearlyByWeekNoAndWeekDay(self):
307 # That's a nice one. The first days of week number one
308 # may be in the last year.
niemeyer4da06a42004-07-16 21:21:22 +0000309 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000310 count=3,
311 byweekno=1,
312 byweekday=MO,
313 dtstart=parse("19970902T090000"))),
314 [datetime(1997, 12, 29, 9, 0),
315 datetime(1999, 1, 4, 9, 0),
316 datetime(2000, 1, 3, 9, 0)])
317
318 def testYearlyByWeekNoAndWeekDayLarge(self):
319 # Another nice test. The last days of week number 52/53
320 # may be in the next year.
niemeyer4da06a42004-07-16 21:21:22 +0000321 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000322 count=3,
323 byweekno=52,
324 byweekday=SU,
325 dtstart=parse("19970902T090000"))),
326 [datetime(1997, 12, 28, 9, 0),
327 datetime(1998, 12, 27, 9, 0),
328 datetime(2000, 1, 2, 9, 0)])
329
330 def testYearlyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +0000331 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000332 count=3,
333 byweekno=-1,
334 byweekday=SU,
335 dtstart=parse("19970902T090000"))),
336 [datetime(1997, 12, 28, 9, 0),
337 datetime(1999, 1, 3, 9, 0),
338 datetime(2000, 1, 2, 9, 0)])
339
340 def testYearlyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +0000341 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000342 count=3,
343 byeaster=0,
344 dtstart=parse("19970902T090000"))),
345 [datetime(1998, 4, 12, 9, 0),
346 datetime(1999, 4, 4, 9, 0),
347 datetime(2000, 4, 23, 9, 0)])
348
349 def testYearlyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +0000350 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000351 count=3,
352 byeaster=1,
353 dtstart=parse("19970902T090000"))),
354 [datetime(1998, 4, 13, 9, 0),
355 datetime(1999, 4, 5, 9, 0),
356 datetime(2000, 4, 24, 9, 0)])
357
358 def testYearlyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +0000359 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000360 count=3,
361 byeaster=-1,
362 dtstart=parse("19970902T090000"))),
363 [datetime(1998, 4, 11, 9, 0),
364 datetime(1999, 4, 3, 9, 0),
365 datetime(2000, 4, 22, 9, 0)])
366
367 def testYearlyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +0000368 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000369 count=3,
370 byweekno=53,
371 byweekday=MO,
372 dtstart=parse("19970902T090000"))),
373 [datetime(1998, 12, 28, 9, 0),
374 datetime(2004, 12, 27, 9, 0),
375 datetime(2009, 12, 28, 9, 0)])
376
377 def testYearlyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +0000378 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000379 count=3,
380 byweekno=53,
381 byweekday=MO,
382 dtstart=parse("19970902T090000"))),
383 [datetime(1998, 12, 28, 9, 0),
384 datetime(2004, 12, 27, 9, 0),
385 datetime(2009, 12, 28, 9, 0)])
386
387 def testYearlyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +0000388 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000389 count=3,
390 byhour=(6,18),
391 dtstart=parse("19970902T090000"))),
392 [datetime(1997, 9, 2, 18, 0),
393 datetime(1998, 9, 2, 6, 0),
394 datetime(1998, 9, 2, 18, 0)])
395
396 def testYearlyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +0000397 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000398 count=3,
399 byminute=(6,18),
400 dtstart=parse("19970902T090000"))),
401 [datetime(1997, 9, 2, 9, 6),
402 datetime(1997, 9, 2, 9, 18),
403 datetime(1998, 9, 2, 9, 6)])
404
405 def testYearlyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000406 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000407 count=3,
408 bysecond=(6,18),
409 dtstart=parse("19970902T090000"))),
410 [datetime(1997, 9, 2, 9, 0, 6),
411 datetime(1997, 9, 2, 9, 0, 18),
412 datetime(1998, 9, 2, 9, 0, 6)])
413
414 def testYearlyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +0000415 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000416 count=3,
417 byhour=(6,18),
418 byminute=(6,18),
419 dtstart=parse("19970902T090000"))),
420 [datetime(1997, 9, 2, 18, 6),
421 datetime(1997, 9, 2, 18, 18),
422 datetime(1998, 9, 2, 6, 6)])
423
424 def testYearlyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000425 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000426 count=3,
427 byhour=(6,18),
428 bysecond=(6,18),
429 dtstart=parse("19970902T090000"))),
430 [datetime(1997, 9, 2, 18, 0, 6),
431 datetime(1997, 9, 2, 18, 0, 18),
432 datetime(1998, 9, 2, 6, 0, 6)])
433
434 def testYearlyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000435 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000436 count=3,
437 byminute=(6,18),
438 bysecond=(6,18),
439 dtstart=parse("19970902T090000"))),
440 [datetime(1997, 9, 2, 9, 6, 6),
441 datetime(1997, 9, 2, 9, 6, 18),
442 datetime(1997, 9, 2, 9, 18, 6)])
443
444 def testYearlyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000445 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000446 count=3,
447 byhour=(6,18),
448 byminute=(6,18),
449 bysecond=(6,18),
450 dtstart=parse("19970902T090000"))),
451 [datetime(1997, 9, 2, 18, 6, 6),
452 datetime(1997, 9, 2, 18, 6, 18),
453 datetime(1997, 9, 2, 18, 18, 6)])
454
455 def testYearlyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +0000456 self.assertEqual(list(rrule(YEARLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000457 count=3,
458 bymonthday=15,
459 byhour=(6,18),
460 bysetpos=(3,-3),
461 dtstart=parse("19970902T090000"))),
462 [datetime(1997, 11, 15, 18, 0),
463 datetime(1998, 2, 15, 6, 0),
464 datetime(1998, 11, 15, 18, 0)])
465
niemeyercb08a352003-10-08 06:02:06 +0000466 def testMonthly(self):
niemeyer4da06a42004-07-16 21:21:22 +0000467 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000468 count=3,
469 dtstart=parse("19970902T090000"))),
470 [datetime(1997, 9, 2, 9, 0),
471 datetime(1997, 10, 2, 9, 0),
472 datetime(1997, 11, 2, 9, 0)])
473
niemeyercb08a352003-10-08 06:02:06 +0000474 def testMonthlyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +0000475 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000476 count=3,
477 interval=2,
478 dtstart=parse("19970902T090000"))),
479 [datetime(1997, 9, 2, 9, 0),
480 datetime(1997, 11, 2, 9, 0),
481 datetime(1998, 1, 2, 9, 0)])
482
483 def testMonthlyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000484 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000485 count=3,
486 interval=18,
487 dtstart=parse("19970902T090000"))),
488 [datetime(1997, 9, 2, 9, 0),
489 datetime(1999, 3, 2, 9, 0),
490 datetime(2000, 9, 2, 9, 0)])
491
492 def testMonthlyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +0000493 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000494 count=3,
495 bymonth=(1,3),
496 dtstart=parse("19970902T090000"))),
497 [datetime(1998, 1, 2, 9, 0),
498 datetime(1998, 3, 2, 9, 0),
499 datetime(1999, 1, 2, 9, 0)])
500
501
502 def testMonthlyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000503 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000504 count=3,
505 bymonthday=(1,3),
506 dtstart=parse("19970902T090000"))),
507 [datetime(1997, 9, 3, 9, 0),
508 datetime(1997, 10, 1, 9, 0),
509 datetime(1997, 10, 3, 9, 0)])
510
511 def testMonthlyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000512 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000513 count=3,
514 bymonth=(1,3),
515 bymonthday=(5,7),
516 dtstart=parse("19970902T090000"))),
517 [datetime(1998, 1, 5, 9, 0),
518 datetime(1998, 1, 7, 9, 0),
519 datetime(1998, 3, 5, 9, 0)])
520
521 def testMonthlyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000522 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000523 count=3,
524 byweekday=(TU,TH),
525 dtstart=parse("19970902T090000"))),
526 [datetime(1997, 9, 2, 9, 0),
527 datetime(1997, 9, 4, 9, 0),
528 datetime(1997, 9, 9, 9, 0)])
529
niemeyer7d8be1a2003-10-09 01:09:42 +0000530 def testMonthlyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000531 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000532 count=3,
533 byweekday=(TU(1),TH(-1)),
534 dtstart=parse("19970902T090000"))),
535 [datetime(1997, 9, 2, 9, 0),
536 datetime(1997, 9, 25, 9, 0),
537 datetime(1997, 10, 7, 9, 0)])
538
539 def testMonthlyByNWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000540 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000541 count=3,
542 byweekday=(TU(3),TH(-3)),
543 dtstart=parse("19970902T090000"))),
544 [datetime(1997, 9, 11, 9, 0),
545 datetime(1997, 9, 16, 9, 0),
546 datetime(1997, 10, 16, 9, 0)])
547
niemeyercb08a352003-10-08 06:02:06 +0000548 def testMonthlyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000549 self.assertEqual(list(rrule(MONTHLY,
niemeyercb08a352003-10-08 06:02:06 +0000550 count=3,
551 bymonth=(1,3),
552 byweekday=(TU,TH),
553 dtstart=parse("19970902T090000"))),
554 [datetime(1998, 1, 1, 9, 0),
555 datetime(1998, 1, 6, 9, 0),
556 datetime(1998, 1, 8, 9, 0)])
557
niemeyer7d8be1a2003-10-09 01:09:42 +0000558 def testMonthlyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000559 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000560 count=3,
561 bymonth=(1,3),
562 byweekday=(TU(1),TH(-1)),
563 dtstart=parse("19970902T090000"))),
564 [datetime(1998, 1, 6, 9, 0),
565 datetime(1998, 1, 29, 9, 0),
566 datetime(1998, 3, 3, 9, 0)])
567
568 def testMonthlyByMonthAndNWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000569 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000570 count=3,
571 bymonth=(1,3),
572 byweekday=(TU(3),TH(-3)),
573 dtstart=parse("19970902T090000"))),
574 [datetime(1998, 1, 15, 9, 0),
575 datetime(1998, 1, 20, 9, 0),
576 datetime(1998, 3, 12, 9, 0)])
577
578 def testMonthlyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000579 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000580 count=3,
581 bymonthday=(1,3),
582 byweekday=(TU,TH),
583 dtstart=parse("19970902T090000"))),
584 [datetime(1998, 1, 1, 9, 0),
585 datetime(1998, 2, 3, 9, 0),
586 datetime(1998, 3, 3, 9, 0)])
587
588 def testMonthlyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000589 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000590 count=3,
591 bymonth=(1,3),
592 bymonthday=(1,3),
593 byweekday=(TU,TH),
594 dtstart=parse("19970902T090000"))),
595 [datetime(1998, 1, 1, 9, 0),
596 datetime(1998, 3, 3, 9, 0),
597 datetime(2001, 3, 1, 9, 0)])
598
599 def testMonthlyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000600 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000601 count=3,
602 byyearday=(1,100,200),
603 dtstart=parse("19970902T090000"))),
604 [datetime(1998, 1, 1, 9, 0),
605 datetime(1998, 4, 10, 9, 0),
606 datetime(1998, 7, 19, 9, 0)])
607
608 def testMonthlyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000609 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000610 count=3,
611 bymonth=(4,7),
612 byyearday=(1,100,200),
613 dtstart=parse("19970902T090000"))),
614 [datetime(1998, 4, 10, 9, 0),
615 datetime(1998, 7, 19, 9, 0),
616 datetime(1999, 4, 10, 9, 0)])
617
618 def testMonthlyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +0000619 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000620 count=3,
621 byweekno=20,
622 dtstart=parse("19970902T090000"))),
623 [datetime(1998, 5, 11, 9, 0),
624 datetime(1998, 5, 12, 9, 0),
625 datetime(1998, 5, 13, 9, 0)])
626
627 def testMonthlyByWeekNoAndWeekDay(self):
628 # That's a nice one. The first days of week number one
629 # may be in the last year.
niemeyer4da06a42004-07-16 21:21:22 +0000630 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000631 count=3,
632 byweekno=1,
633 byweekday=MO,
634 dtstart=parse("19970902T090000"))),
635 [datetime(1997, 12, 29, 9, 0),
636 datetime(1999, 1, 4, 9, 0),
637 datetime(2000, 1, 3, 9, 0)])
638
639 def testMonthlyByWeekNoAndWeekDayLarge(self):
640 # Another nice test. The last days of week number 52/53
641 # may be in the next year.
niemeyer4da06a42004-07-16 21:21:22 +0000642 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000643 count=3,
644 byweekno=52,
645 byweekday=SU,
646 dtstart=parse("19970902T090000"))),
647 [datetime(1997, 12, 28, 9, 0),
648 datetime(1998, 12, 27, 9, 0),
649 datetime(2000, 1, 2, 9, 0)])
650
651 def testMonthlyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +0000652 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000653 count=3,
654 byweekno=-1,
655 byweekday=SU,
656 dtstart=parse("19970902T090000"))),
657 [datetime(1997, 12, 28, 9, 0),
658 datetime(1999, 1, 3, 9, 0),
659 datetime(2000, 1, 2, 9, 0)])
660
661 def testMonthlyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +0000662 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000663 count=3,
664 byweekno=53,
665 byweekday=MO,
666 dtstart=parse("19970902T090000"))),
667 [datetime(1998, 12, 28, 9, 0),
668 datetime(2004, 12, 27, 9, 0),
669 datetime(2009, 12, 28, 9, 0)])
670
671 def testMonthlyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +0000672 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000673 count=3,
674 byeaster=0,
675 dtstart=parse("19970902T090000"))),
676 [datetime(1998, 4, 12, 9, 0),
677 datetime(1999, 4, 4, 9, 0),
678 datetime(2000, 4, 23, 9, 0)])
679
680 def testMonthlyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +0000681 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000682 count=3,
683 byeaster=1,
684 dtstart=parse("19970902T090000"))),
685 [datetime(1998, 4, 13, 9, 0),
686 datetime(1999, 4, 5, 9, 0),
687 datetime(2000, 4, 24, 9, 0)])
688
689 def testMonthlyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +0000690 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000691 count=3,
692 byeaster=-1,
693 dtstart=parse("19970902T090000"))),
694 [datetime(1998, 4, 11, 9, 0),
695 datetime(1999, 4, 3, 9, 0),
696 datetime(2000, 4, 22, 9, 0)])
697
698 def testMonthlyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +0000699 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000700 count=3,
701 byhour=(6,18),
702 dtstart=parse("19970902T090000"))),
703 [datetime(1997, 9, 2, 18, 0),
704 datetime(1997, 10, 2, 6, 0),
705 datetime(1997, 10, 2, 18, 0)])
706
707 def testMonthlyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +0000708 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000709 count=3,
710 byminute=(6,18),
711 dtstart=parse("19970902T090000"))),
712 [datetime(1997, 9, 2, 9, 6),
713 datetime(1997, 9, 2, 9, 18),
714 datetime(1997, 10, 2, 9, 6)])
715
716 def testMonthlyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000717 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000718 count=3,
719 bysecond=(6,18),
720 dtstart=parse("19970902T090000"))),
721 [datetime(1997, 9, 2, 9, 0, 6),
722 datetime(1997, 9, 2, 9, 0, 18),
723 datetime(1997, 10, 2, 9, 0, 6)])
724
725 def testMonthlyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +0000726 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000727 count=3,
728 byhour=(6,18),
729 byminute=(6,18),
730 dtstart=parse("19970902T090000"))),
731 [datetime(1997, 9, 2, 18, 6),
732 datetime(1997, 9, 2, 18, 18),
733 datetime(1997, 10, 2, 6, 6)])
734
735 def testMonthlyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000736 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000737 count=3,
738 byhour=(6,18),
739 bysecond=(6,18),
740 dtstart=parse("19970902T090000"))),
741 [datetime(1997, 9, 2, 18, 0, 6),
742 datetime(1997, 9, 2, 18, 0, 18),
743 datetime(1997, 10, 2, 6, 0, 6)])
744
745 def testMonthlyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000746 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000747 count=3,
748 byminute=(6,18),
749 bysecond=(6,18),
750 dtstart=parse("19970902T090000"))),
751 [datetime(1997, 9, 2, 9, 6, 6),
752 datetime(1997, 9, 2, 9, 6, 18),
753 datetime(1997, 9, 2, 9, 18, 6)])
754
755 def testMonthlyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +0000756 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000757 count=3,
758 byhour=(6,18),
759 byminute=(6,18),
760 bysecond=(6,18),
761 dtstart=parse("19970902T090000"))),
762 [datetime(1997, 9, 2, 18, 6, 6),
763 datetime(1997, 9, 2, 18, 6, 18),
764 datetime(1997, 9, 2, 18, 18, 6)])
765
766 def testMonthlyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +0000767 self.assertEqual(list(rrule(MONTHLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000768 count=3,
769 bymonthday=(13,17),
770 byhour=(6,18),
771 bysetpos=(3,-3),
772 dtstart=parse("19970902T090000"))),
773 [datetime(1997, 9, 13, 18, 0),
774 datetime(1997, 9, 17, 6, 0),
775 datetime(1997, 10, 13, 18, 0)])
776
niemeyercb08a352003-10-08 06:02:06 +0000777 def testWeekly(self):
niemeyer4da06a42004-07-16 21:21:22 +0000778 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000779 count=3,
780 dtstart=parse("19970902T090000"))),
781 [datetime(1997, 9, 2, 9, 0),
782 datetime(1997, 9, 9, 9, 0),
783 datetime(1997, 9, 16, 9, 0)])
784
niemeyercb08a352003-10-08 06:02:06 +0000785 def testWeeklyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +0000786 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000787 count=3,
788 interval=2,
789 dtstart=parse("19970902T090000"))),
790 [datetime(1997, 9, 2, 9, 0),
791 datetime(1997, 9, 16, 9, 0),
792 datetime(1997, 9, 30, 9, 0)])
793
794 def testWeeklyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +0000795 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000796 count=3,
797 interval=20,
798 dtstart=parse("19970902T090000"))),
799 [datetime(1997, 9, 2, 9, 0),
800 datetime(1998, 1, 20, 9, 0),
801 datetime(1998, 6, 9, 9, 0)])
802
803 def testWeeklyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +0000804 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000805 count=3,
806 bymonth=(1,3),
807 dtstart=parse("19970902T090000"))),
808 [datetime(1998, 1, 6, 9, 0),
809 datetime(1998, 1, 13, 9, 0),
810 datetime(1998, 1, 20, 9, 0)])
811
812 def testWeeklyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000813 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000814 count=3,
815 bymonthday=(1,3),
816 dtstart=parse("19970902T090000"))),
817 [datetime(1997, 9, 3, 9, 0),
818 datetime(1997, 10, 1, 9, 0),
819 datetime(1997, 10, 3, 9, 0)])
820
821 def testWeeklyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000822 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000823 count=3,
824 bymonth=(1,3),
825 bymonthday=(5,7),
826 dtstart=parse("19970902T090000"))),
827 [datetime(1998, 1, 5, 9, 0),
828 datetime(1998, 1, 7, 9, 0),
829 datetime(1998, 3, 5, 9, 0)])
830
831 def testWeeklyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000832 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000833 count=3,
834 byweekday=(TU,TH),
835 dtstart=parse("19970902T090000"))),
836 [datetime(1997, 9, 2, 9, 0),
837 datetime(1997, 9, 4, 9, 0),
838 datetime(1997, 9, 9, 9, 0)])
839
niemeyer7d8be1a2003-10-09 01:09:42 +0000840 def testWeeklyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000841 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000842 count=3,
843 byweekday=(TU(1),TH(-1)),
844 dtstart=parse("19970902T090000"))),
845 [datetime(1997, 9, 2, 9, 0),
846 datetime(1997, 9, 4, 9, 0),
847 datetime(1997, 9, 9, 9, 0)])
848
niemeyercb08a352003-10-08 06:02:06 +0000849 def testWeeklyByMonthAndWeekDay(self):
850 # This test is interesting, because it crosses the year
851 # boundary in a weekly period to find day '1' as a
852 # valid recurrence.
niemeyer4da06a42004-07-16 21:21:22 +0000853 self.assertEqual(list(rrule(WEEKLY,
niemeyercb08a352003-10-08 06:02:06 +0000854 count=3,
855 bymonth=(1,3),
856 byweekday=(TU,TH),
857 dtstart=parse("19970902T090000"))),
858 [datetime(1998, 1, 1, 9, 0),
859 datetime(1998, 1, 6, 9, 0),
860 datetime(1998, 1, 8, 9, 0)])
861
niemeyer7d8be1a2003-10-09 01:09:42 +0000862 def testWeeklyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000863 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000864 count=3,
865 bymonth=(1,3),
866 byweekday=(TU(1),TH(-1)),
867 dtstart=parse("19970902T090000"))),
868 [datetime(1998, 1, 1, 9, 0),
869 datetime(1998, 1, 6, 9, 0),
870 datetime(1998, 1, 8, 9, 0)])
871
872 def testWeeklyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000873 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000874 count=3,
875 bymonthday=(1,3),
876 byweekday=(TU,TH),
877 dtstart=parse("19970902T090000"))),
878 [datetime(1998, 1, 1, 9, 0),
879 datetime(1998, 2, 3, 9, 0),
880 datetime(1998, 3, 3, 9, 0)])
881
882 def testWeeklyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000883 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000884 count=3,
885 bymonth=(1,3),
886 bymonthday=(1,3),
887 byweekday=(TU,TH),
888 dtstart=parse("19970902T090000"))),
889 [datetime(1998, 1, 1, 9, 0),
890 datetime(1998, 3, 3, 9, 0),
891 datetime(2001, 3, 1, 9, 0)])
892
893 def testWeeklyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000894 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000895 count=3,
896 byyearday=(1,100,200),
897 dtstart=parse("19970902T090000"))),
898 [datetime(1998, 1, 1, 9, 0),
899 datetime(1998, 4, 10, 9, 0),
900 datetime(1998, 7, 19, 9, 0)])
901
902 def testWeeklyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +0000903 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000904 count=3,
905 bymonth=(1,7),
906 byyearday=(1,100,200),
907 dtstart=parse("19970902T090000"))),
908 [datetime(1998, 1, 1, 9, 0),
909 datetime(1998, 7, 19, 9, 0),
910 datetime(1999, 1, 1, 9, 0)])
911
912 def testWeeklyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +0000913 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000914 count=3,
915 byweekno=20,
916 dtstart=parse("19970902T090000"))),
917 [datetime(1998, 5, 11, 9, 0),
918 datetime(1998, 5, 12, 9, 0),
919 datetime(1998, 5, 13, 9, 0)])
920
921 def testWeeklyByWeekNoAndWeekDay(self):
922 # That's a nice one. The first days of week number one
923 # may be in the last year.
niemeyer4da06a42004-07-16 21:21:22 +0000924 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000925 count=3,
926 byweekno=1,
927 byweekday=MO,
928 dtstart=parse("19970902T090000"))),
929 [datetime(1997, 12, 29, 9, 0),
930 datetime(1999, 1, 4, 9, 0),
931 datetime(2000, 1, 3, 9, 0)])
932
933 def testWeeklyByWeekNoAndWeekDayLarge(self):
934 # Another nice test. The last days of week number 52/53
935 # may be in the next year.
niemeyer4da06a42004-07-16 21:21:22 +0000936 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000937 count=3,
938 byweekno=52,
939 byweekday=SU,
940 dtstart=parse("19970902T090000"))),
941 [datetime(1997, 12, 28, 9, 0),
942 datetime(1998, 12, 27, 9, 0),
943 datetime(2000, 1, 2, 9, 0)])
944
945 def testWeeklyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +0000946 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000947 count=3,
948 byweekno=-1,
949 byweekday=SU,
950 dtstart=parse("19970902T090000"))),
951 [datetime(1997, 12, 28, 9, 0),
952 datetime(1999, 1, 3, 9, 0),
953 datetime(2000, 1, 2, 9, 0)])
954
955 def testWeeklyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +0000956 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000957 count=3,
958 byweekno=53,
959 byweekday=MO,
960 dtstart=parse("19970902T090000"))),
961 [datetime(1998, 12, 28, 9, 0),
962 datetime(2004, 12, 27, 9, 0),
963 datetime(2009, 12, 28, 9, 0)])
964
965 def testWeeklyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +0000966 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000967 count=3,
968 byeaster=0,
969 dtstart=parse("19970902T090000"))),
970 [datetime(1998, 4, 12, 9, 0),
971 datetime(1999, 4, 4, 9, 0),
972 datetime(2000, 4, 23, 9, 0)])
973
974 def testWeeklyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +0000975 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000976 count=3,
977 byeaster=1,
978 dtstart=parse("19970902T090000"))),
979 [datetime(1998, 4, 13, 9, 0),
980 datetime(1999, 4, 5, 9, 0),
981 datetime(2000, 4, 24, 9, 0)])
982
983 def testWeeklyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +0000984 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000985 count=3,
986 byeaster=-1,
987 dtstart=parse("19970902T090000"))),
988 [datetime(1998, 4, 11, 9, 0),
989 datetime(1999, 4, 3, 9, 0),
990 datetime(2000, 4, 22, 9, 0)])
991
992 def testWeeklyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +0000993 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +0000994 count=3,
995 byhour=(6,18),
996 dtstart=parse("19970902T090000"))),
997 [datetime(1997, 9, 2, 18, 0),
998 datetime(1997, 9, 9, 6, 0),
999 datetime(1997, 9, 9, 18, 0)])
1000
1001 def testWeeklyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001002 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001003 count=3,
1004 byminute=(6,18),
1005 dtstart=parse("19970902T090000"))),
1006 [datetime(1997, 9, 2, 9, 6),
1007 datetime(1997, 9, 2, 9, 18),
1008 datetime(1997, 9, 9, 9, 6)])
1009
1010 def testWeeklyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001011 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001012 count=3,
1013 bysecond=(6,18),
1014 dtstart=parse("19970902T090000"))),
1015 [datetime(1997, 9, 2, 9, 0, 6),
1016 datetime(1997, 9, 2, 9, 0, 18),
1017 datetime(1997, 9, 9, 9, 0, 6)])
1018
1019 def testWeeklyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001020 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001021 count=3,
1022 byhour=(6,18),
1023 byminute=(6,18),
1024 dtstart=parse("19970902T090000"))),
1025 [datetime(1997, 9, 2, 18, 6),
1026 datetime(1997, 9, 2, 18, 18),
1027 datetime(1997, 9, 9, 6, 6)])
1028
1029 def testWeeklyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001030 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001031 count=3,
1032 byhour=(6,18),
1033 bysecond=(6,18),
1034 dtstart=parse("19970902T090000"))),
1035 [datetime(1997, 9, 2, 18, 0, 6),
1036 datetime(1997, 9, 2, 18, 0, 18),
1037 datetime(1997, 9, 9, 6, 0, 6)])
1038
1039 def testWeeklyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001040 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001041 count=3,
1042 byminute=(6,18),
1043 bysecond=(6,18),
1044 dtstart=parse("19970902T090000"))),
1045 [datetime(1997, 9, 2, 9, 6, 6),
1046 datetime(1997, 9, 2, 9, 6, 18),
1047 datetime(1997, 9, 2, 9, 18, 6)])
1048
1049 def testWeeklyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001050 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001051 count=3,
1052 byhour=(6,18),
1053 byminute=(6,18),
1054 bysecond=(6,18),
1055 dtstart=parse("19970902T090000"))),
1056 [datetime(1997, 9, 2, 18, 6, 6),
1057 datetime(1997, 9, 2, 18, 6, 18),
1058 datetime(1997, 9, 2, 18, 18, 6)])
1059
1060 def testWeeklyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001061 self.assertEqual(list(rrule(WEEKLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001062 count=3,
1063 byweekday=(TU,TH),
1064 byhour=(6,18),
1065 bysetpos=(3,-3),
1066 dtstart=parse("19970902T090000"))),
1067 [datetime(1997, 9, 2, 18, 0),
1068 datetime(1997, 9, 4, 6, 0),
1069 datetime(1997, 9, 9, 18, 0)])
1070
niemeyercb08a352003-10-08 06:02:06 +00001071 def testDaily(self):
niemeyer4da06a42004-07-16 21:21:22 +00001072 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001073 count=3,
1074 dtstart=parse("19970902T090000"))),
1075 [datetime(1997, 9, 2, 9, 0),
1076 datetime(1997, 9, 3, 9, 0),
1077 datetime(1997, 9, 4, 9, 0)])
1078
niemeyercb08a352003-10-08 06:02:06 +00001079 def testDailyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +00001080 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001081 count=3,
1082 interval=2,
1083 dtstart=parse("19970902T090000"))),
1084 [datetime(1997, 9, 2, 9, 0),
1085 datetime(1997, 9, 4, 9, 0),
1086 datetime(1997, 9, 6, 9, 0)])
1087
1088 def testDailyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001089 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001090 count=3,
1091 interval=92,
1092 dtstart=parse("19970902T090000"))),
1093 [datetime(1997, 9, 2, 9, 0),
1094 datetime(1997, 12, 3, 9, 0),
1095 datetime(1998, 3, 5, 9, 0)])
1096
1097 def testDailyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +00001098 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001099 count=3,
1100 bymonth=(1,3),
1101 dtstart=parse("19970902T090000"))),
1102 [datetime(1998, 1, 1, 9, 0),
1103 datetime(1998, 1, 2, 9, 0),
1104 datetime(1998, 1, 3, 9, 0)])
1105
1106 def testDailyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001107 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001108 count=3,
1109 bymonthday=(1,3),
1110 dtstart=parse("19970902T090000"))),
1111 [datetime(1997, 9, 3, 9, 0),
1112 datetime(1997, 10, 1, 9, 0),
1113 datetime(1997, 10, 3, 9, 0)])
1114
1115 def testDailyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001116 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001117 count=3,
1118 bymonth=(1,3),
1119 bymonthday=(5,7),
1120 dtstart=parse("19970902T090000"))),
1121 [datetime(1998, 1, 5, 9, 0),
1122 datetime(1998, 1, 7, 9, 0),
1123 datetime(1998, 3, 5, 9, 0)])
1124
1125 def testDailyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001126 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001127 count=3,
1128 byweekday=(TU,TH),
1129 dtstart=parse("19970902T090000"))),
1130 [datetime(1997, 9, 2, 9, 0),
1131 datetime(1997, 9, 4, 9, 0),
1132 datetime(1997, 9, 9, 9, 0)])
1133
niemeyer7d8be1a2003-10-09 01:09:42 +00001134 def testDailyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001135 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001136 count=3,
1137 byweekday=(TU(1),TH(-1)),
1138 dtstart=parse("19970902T090000"))),
1139 [datetime(1997, 9, 2, 9, 0),
1140 datetime(1997, 9, 4, 9, 0),
1141 datetime(1997, 9, 9, 9, 0)])
1142
niemeyercb08a352003-10-08 06:02:06 +00001143 def testDailyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001144 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00001145 count=3,
1146 bymonth=(1,3),
1147 byweekday=(TU,TH),
1148 dtstart=parse("19970902T090000"))),
1149 [datetime(1998, 1, 1, 9, 0),
1150 datetime(1998, 1, 6, 9, 0),
1151 datetime(1998, 1, 8, 9, 0)])
1152
niemeyer7d8be1a2003-10-09 01:09:42 +00001153 def testDailyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001154 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001155 count=3,
1156 bymonth=(1,3),
1157 byweekday=(TU(1),TH(-1)),
1158 dtstart=parse("19970902T090000"))),
1159 [datetime(1998, 1, 1, 9, 0),
1160 datetime(1998, 1, 6, 9, 0),
1161 datetime(1998, 1, 8, 9, 0)])
1162
1163 def testDailyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001164 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001165 count=3,
1166 bymonthday=(1,3),
1167 byweekday=(TU,TH),
1168 dtstart=parse("19970902T090000"))),
1169 [datetime(1998, 1, 1, 9, 0),
1170 datetime(1998, 2, 3, 9, 0),
1171 datetime(1998, 3, 3, 9, 0)])
1172
1173 def testDailyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001174 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001175 count=3,
1176 bymonth=(1,3),
1177 bymonthday=(1,3),
1178 byweekday=(TU,TH),
1179 dtstart=parse("19970902T090000"))),
1180 [datetime(1998, 1, 1, 9, 0),
1181 datetime(1998, 3, 3, 9, 0),
1182 datetime(2001, 3, 1, 9, 0)])
1183
1184 def testDailyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001185 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001186 count=3,
1187 byyearday=(1,100,200),
1188 dtstart=parse("19970902T090000"))),
1189 [datetime(1998, 1, 1, 9, 0),
1190 datetime(1998, 4, 10, 9, 0),
1191 datetime(1998, 7, 19, 9, 0)])
1192
1193 def testDailyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001194 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001195 count=3,
1196 bymonth=(1,7),
1197 byyearday=(1,100,200),
1198 dtstart=parse("19970902T090000"))),
1199 [datetime(1998, 1, 1, 9, 0),
1200 datetime(1998, 7, 19, 9, 0),
1201 datetime(1999, 1, 1, 9, 0)])
1202
1203 def testDailyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +00001204 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001205 count=3,
1206 byweekno=20,
1207 dtstart=parse("19970902T090000"))),
1208 [datetime(1998, 5, 11, 9, 0),
1209 datetime(1998, 5, 12, 9, 0),
1210 datetime(1998, 5, 13, 9, 0)])
1211
1212 def testDailyByWeekNoAndWeekDay(self):
1213 # That's a nice one. The first days of week number one
1214 # may be in the last year.
niemeyer4da06a42004-07-16 21:21:22 +00001215 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001216 count=3,
1217 byweekno=1,
1218 byweekday=MO,
1219 dtstart=parse("19970902T090000"))),
1220 [datetime(1997, 12, 29, 9, 0),
1221 datetime(1999, 1, 4, 9, 0),
1222 datetime(2000, 1, 3, 9, 0)])
1223
1224 def testDailyByWeekNoAndWeekDayLarge(self):
1225 # Another nice test. The last days of week number 52/53
1226 # may be in the next year.
niemeyer4da06a42004-07-16 21:21:22 +00001227 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001228 count=3,
1229 byweekno=52,
1230 byweekday=SU,
1231 dtstart=parse("19970902T090000"))),
1232 [datetime(1997, 12, 28, 9, 0),
1233 datetime(1998, 12, 27, 9, 0),
1234 datetime(2000, 1, 2, 9, 0)])
1235
1236 def testDailyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +00001237 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001238 count=3,
1239 byweekno=-1,
1240 byweekday=SU,
1241 dtstart=parse("19970902T090000"))),
1242 [datetime(1997, 12, 28, 9, 0),
1243 datetime(1999, 1, 3, 9, 0),
1244 datetime(2000, 1, 2, 9, 0)])
1245
1246 def testDailyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +00001247 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001248 count=3,
1249 byweekno=53,
1250 byweekday=MO,
1251 dtstart=parse("19970902T090000"))),
1252 [datetime(1998, 12, 28, 9, 0),
1253 datetime(2004, 12, 27, 9, 0),
1254 datetime(2009, 12, 28, 9, 0)])
1255
1256 def testDailyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +00001257 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001258 count=3,
1259 byeaster=0,
1260 dtstart=parse("19970902T090000"))),
1261 [datetime(1998, 4, 12, 9, 0),
1262 datetime(1999, 4, 4, 9, 0),
1263 datetime(2000, 4, 23, 9, 0)])
1264
1265 def testDailyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001266 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001267 count=3,
1268 byeaster=1,
1269 dtstart=parse("19970902T090000"))),
1270 [datetime(1998, 4, 13, 9, 0),
1271 datetime(1999, 4, 5, 9, 0),
1272 datetime(2000, 4, 24, 9, 0)])
1273
1274 def testDailyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +00001275 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001276 count=3,
1277 byeaster=-1,
1278 dtstart=parse("19970902T090000"))),
1279 [datetime(1998, 4, 11, 9, 0),
1280 datetime(1999, 4, 3, 9, 0),
1281 datetime(2000, 4, 22, 9, 0)])
1282
1283 def testDailyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +00001284 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001285 count=3,
1286 byhour=(6,18),
1287 dtstart=parse("19970902T090000"))),
1288 [datetime(1997, 9, 2, 18, 0),
1289 datetime(1997, 9, 3, 6, 0),
1290 datetime(1997, 9, 3, 18, 0)])
1291
1292 def testDailyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001293 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001294 count=3,
1295 byminute=(6,18),
1296 dtstart=parse("19970902T090000"))),
1297 [datetime(1997, 9, 2, 9, 6),
1298 datetime(1997, 9, 2, 9, 18),
1299 datetime(1997, 9, 3, 9, 6)])
1300
1301 def testDailyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001302 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001303 count=3,
1304 bysecond=(6,18),
1305 dtstart=parse("19970902T090000"))),
1306 [datetime(1997, 9, 2, 9, 0, 6),
1307 datetime(1997, 9, 2, 9, 0, 18),
1308 datetime(1997, 9, 3, 9, 0, 6)])
1309
1310 def testDailyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001311 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001312 count=3,
1313 byhour=(6,18),
1314 byminute=(6,18),
1315 dtstart=parse("19970902T090000"))),
1316 [datetime(1997, 9, 2, 18, 6),
1317 datetime(1997, 9, 2, 18, 18),
1318 datetime(1997, 9, 3, 6, 6)])
1319
1320 def testDailyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001321 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001322 count=3,
1323 byhour=(6,18),
1324 bysecond=(6,18),
1325 dtstart=parse("19970902T090000"))),
1326 [datetime(1997, 9, 2, 18, 0, 6),
1327 datetime(1997, 9, 2, 18, 0, 18),
1328 datetime(1997, 9, 3, 6, 0, 6)])
1329
1330 def testDailyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001331 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001332 count=3,
1333 byminute=(6,18),
1334 bysecond=(6,18),
1335 dtstart=parse("19970902T090000"))),
1336 [datetime(1997, 9, 2, 9, 6, 6),
1337 datetime(1997, 9, 2, 9, 6, 18),
1338 datetime(1997, 9, 2, 9, 18, 6)])
1339
1340 def testDailyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001341 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001342 count=3,
1343 byhour=(6,18),
1344 byminute=(6,18),
1345 bysecond=(6,18),
1346 dtstart=parse("19970902T090000"))),
1347 [datetime(1997, 9, 2, 18, 6, 6),
1348 datetime(1997, 9, 2, 18, 6, 18),
1349 datetime(1997, 9, 2, 18, 18, 6)])
1350
1351 def testDailyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001352 self.assertEqual(list(rrule(DAILY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001353 count=3,
1354 byhour=(6,18),
1355 byminute=(15,45),
1356 bysetpos=(3,-3),
1357 dtstart=parse("19970902T090000"))),
1358 [datetime(1997, 9, 2, 18, 15),
1359 datetime(1997, 9, 3, 6, 45),
1360 datetime(1997, 9, 3, 18, 15)])
1361
niemeyercb08a352003-10-08 06:02:06 +00001362 def testHourly(self):
niemeyer4da06a42004-07-16 21:21:22 +00001363 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001364 count=3,
1365 dtstart=parse("19970902T090000"))),
1366 [datetime(1997, 9, 2, 9, 0),
1367 datetime(1997, 9, 2, 10, 0),
1368 datetime(1997, 9, 2, 11, 0)])
1369
niemeyercb08a352003-10-08 06:02:06 +00001370 def testHourlyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +00001371 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001372 count=3,
1373 interval=2,
1374 dtstart=parse("19970902T090000"))),
1375 [datetime(1997, 9, 2, 9, 0),
1376 datetime(1997, 9, 2, 11, 0),
1377 datetime(1997, 9, 2, 13, 0)])
1378
1379 def testHourlyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001380 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001381 count=3,
1382 interval=769,
1383 dtstart=parse("19970902T090000"))),
1384 [datetime(1997, 9, 2, 9, 0),
1385 datetime(1997, 10, 4, 10, 0),
1386 datetime(1997, 11, 5, 11, 0)])
1387
1388 def testHourlyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +00001389 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001390 count=3,
1391 bymonth=(1,3),
1392 dtstart=parse("19970902T090000"))),
1393 [datetime(1998, 1, 1, 0, 0),
1394 datetime(1998, 1, 1, 1, 0),
1395 datetime(1998, 1, 1, 2, 0)])
1396
1397 def testHourlyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001398 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001399 count=3,
1400 bymonthday=(1,3),
1401 dtstart=parse("19970902T090000"))),
1402 [datetime(1997, 9, 3, 0, 0),
1403 datetime(1997, 9, 3, 1, 0),
1404 datetime(1997, 9, 3, 2, 0)])
1405
1406 def testHourlyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001407 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001408 count=3,
1409 bymonth=(1,3),
1410 bymonthday=(5,7),
1411 dtstart=parse("19970902T090000"))),
1412 [datetime(1998, 1, 5, 0, 0),
1413 datetime(1998, 1, 5, 1, 0),
1414 datetime(1998, 1, 5, 2, 0)])
1415
1416 def testHourlyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001417 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001418 count=3,
1419 byweekday=(TU,TH),
1420 dtstart=parse("19970902T090000"))),
1421 [datetime(1997, 9, 2, 9, 0),
1422 datetime(1997, 9, 2, 10, 0),
1423 datetime(1997, 9, 2, 11, 0)])
1424
niemeyer7d8be1a2003-10-09 01:09:42 +00001425 def testHourlyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001426 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001427 count=3,
1428 byweekday=(TU(1),TH(-1)),
1429 dtstart=parse("19970902T090000"))),
1430 [datetime(1997, 9, 2, 9, 0),
1431 datetime(1997, 9, 2, 10, 0),
1432 datetime(1997, 9, 2, 11, 0)])
1433
niemeyercb08a352003-10-08 06:02:06 +00001434 def testHourlyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001435 self.assertEqual(list(rrule(HOURLY,
niemeyercb08a352003-10-08 06:02:06 +00001436 count=3,
1437 bymonth=(1,3),
1438 byweekday=(TU,TH),
1439 dtstart=parse("19970902T090000"))),
1440 [datetime(1998, 1, 1, 0, 0),
1441 datetime(1998, 1, 1, 1, 0),
1442 datetime(1998, 1, 1, 2, 0)])
1443
niemeyer7d8be1a2003-10-09 01:09:42 +00001444 def testHourlyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001445 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001446 count=3,
1447 bymonth=(1,3),
1448 byweekday=(TU(1),TH(-1)),
1449 dtstart=parse("19970902T090000"))),
1450 [datetime(1998, 1, 1, 0, 0),
1451 datetime(1998, 1, 1, 1, 0),
1452 datetime(1998, 1, 1, 2, 0)])
1453
1454 def testHourlyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001455 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001456 count=3,
1457 bymonthday=(1,3),
1458 byweekday=(TU,TH),
1459 dtstart=parse("19970902T090000"))),
1460 [datetime(1998, 1, 1, 0, 0),
1461 datetime(1998, 1, 1, 1, 0),
1462 datetime(1998, 1, 1, 2, 0)])
1463
1464 def testHourlyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001465 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001466 count=3,
1467 bymonth=(1,3),
1468 bymonthday=(1,3),
1469 byweekday=(TU,TH),
1470 dtstart=parse("19970902T090000"))),
1471 [datetime(1998, 1, 1, 0, 0),
1472 datetime(1998, 1, 1, 1, 0),
1473 datetime(1998, 1, 1, 2, 0)])
1474
1475 def testHourlyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001476 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001477 count=3,
1478 byyearday=(1,100,200),
1479 dtstart=parse("19970902T090000"))),
1480 [datetime(1998, 1, 1, 0, 0),
1481 datetime(1998, 1, 1, 1, 0),
1482 datetime(1998, 1, 1, 2, 0)])
1483
1484 def testHourlyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001485 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001486 count=3,
1487 bymonth=(4,7),
1488 byyearday=(1,100,200),
1489 dtstart=parse("19970902T090000"))),
1490 [datetime(1998, 4, 10, 0, 0),
1491 datetime(1998, 4, 10, 1, 0),
1492 datetime(1998, 4, 10, 2, 0)])
1493
1494 def testHourlyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +00001495 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001496 count=3,
1497 byweekno=20,
1498 dtstart=parse("19970902T090000"))),
1499 [datetime(1998, 5, 11, 0, 0),
1500 datetime(1998, 5, 11, 1, 0),
1501 datetime(1998, 5, 11, 2, 0)])
1502
1503 def testHourlyByWeekNoAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001504 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001505 count=3,
1506 byweekno=1,
1507 byweekday=MO,
1508 dtstart=parse("19970902T090000"))),
1509 [datetime(1997, 12, 29, 0, 0),
1510 datetime(1997, 12, 29, 1, 0),
1511 datetime(1997, 12, 29, 2, 0)])
1512
1513 def testHourlyByWeekNoAndWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001514 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001515 count=3,
1516 byweekno=52,
1517 byweekday=SU,
1518 dtstart=parse("19970902T090000"))),
1519 [datetime(1997, 12, 28, 0, 0),
1520 datetime(1997, 12, 28, 1, 0),
1521 datetime(1997, 12, 28, 2, 0)])
1522
1523 def testHourlyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +00001524 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001525 count=3,
1526 byweekno=-1,
1527 byweekday=SU,
1528 dtstart=parse("19970902T090000"))),
1529 [datetime(1997, 12, 28, 0, 0),
1530 datetime(1997, 12, 28, 1, 0),
1531 datetime(1997, 12, 28, 2, 0)])
1532
1533 def testHourlyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +00001534 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001535 count=3,
1536 byweekno=53,
1537 byweekday=MO,
1538 dtstart=parse("19970902T090000"))),
1539 [datetime(1998, 12, 28, 0, 0),
1540 datetime(1998, 12, 28, 1, 0),
1541 datetime(1998, 12, 28, 2, 0)])
1542
1543 def testHourlyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +00001544 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001545 count=3,
1546 byeaster=0,
1547 dtstart=parse("19970902T090000"))),
1548 [datetime(1998, 4, 12, 0, 0),
1549 datetime(1998, 4, 12, 1, 0),
1550 datetime(1998, 4, 12, 2, 0)])
1551
1552 def testHourlyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001553 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001554 count=3,
1555 byeaster=1,
1556 dtstart=parse("19970902T090000"))),
1557 [datetime(1998, 4, 13, 0, 0),
1558 datetime(1998, 4, 13, 1, 0),
1559 datetime(1998, 4, 13, 2, 0)])
1560
1561 def testHourlyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +00001562 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001563 count=3,
1564 byeaster=-1,
1565 dtstart=parse("19970902T090000"))),
1566 [datetime(1998, 4, 11, 0, 0),
1567 datetime(1998, 4, 11, 1, 0),
1568 datetime(1998, 4, 11, 2, 0)])
1569
1570 def testHourlyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +00001571 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001572 count=3,
1573 byhour=(6,18),
1574 dtstart=parse("19970902T090000"))),
1575 [datetime(1997, 9, 2, 18, 0),
1576 datetime(1997, 9, 3, 6, 0),
1577 datetime(1997, 9, 3, 18, 0)])
1578
1579 def testHourlyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001580 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001581 count=3,
1582 byminute=(6,18),
1583 dtstart=parse("19970902T090000"))),
1584 [datetime(1997, 9, 2, 9, 6),
1585 datetime(1997, 9, 2, 9, 18),
1586 datetime(1997, 9, 2, 10, 6)])
1587
1588 def testHourlyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001589 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001590 count=3,
1591 bysecond=(6,18),
1592 dtstart=parse("19970902T090000"))),
1593 [datetime(1997, 9, 2, 9, 0, 6),
1594 datetime(1997, 9, 2, 9, 0, 18),
1595 datetime(1997, 9, 2, 10, 0, 6)])
1596
1597 def testHourlyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001598 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001599 count=3,
1600 byhour=(6,18),
1601 byminute=(6,18),
1602 dtstart=parse("19970902T090000"))),
1603 [datetime(1997, 9, 2, 18, 6),
1604 datetime(1997, 9, 2, 18, 18),
1605 datetime(1997, 9, 3, 6, 6)])
1606
1607 def testHourlyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001608 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001609 count=3,
1610 byhour=(6,18),
1611 bysecond=(6,18),
1612 dtstart=parse("19970902T090000"))),
1613 [datetime(1997, 9, 2, 18, 0, 6),
1614 datetime(1997, 9, 2, 18, 0, 18),
1615 datetime(1997, 9, 3, 6, 0, 6)])
1616
1617 def testHourlyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001618 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001619 count=3,
1620 byminute=(6,18),
1621 bysecond=(6,18),
1622 dtstart=parse("19970902T090000"))),
1623 [datetime(1997, 9, 2, 9, 6, 6),
1624 datetime(1997, 9, 2, 9, 6, 18),
1625 datetime(1997, 9, 2, 9, 18, 6)])
1626
1627 def testHourlyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001628 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001629 count=3,
1630 byhour=(6,18),
1631 byminute=(6,18),
1632 bysecond=(6,18),
1633 dtstart=parse("19970902T090000"))),
1634 [datetime(1997, 9, 2, 18, 6, 6),
1635 datetime(1997, 9, 2, 18, 6, 18),
1636 datetime(1997, 9, 2, 18, 18, 6)])
1637
1638 def testHourlyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001639 self.assertEqual(list(rrule(HOURLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001640 count=3,
1641 byminute=(15,45),
1642 bysecond=(15,45),
1643 bysetpos=(3,-3),
1644 dtstart=parse("19970902T090000"))),
1645 [datetime(1997, 9, 2, 9, 15, 45),
1646 datetime(1997, 9, 2, 9, 45, 15),
1647 datetime(1997, 9, 2, 10, 15, 45)])
1648
niemeyercb08a352003-10-08 06:02:06 +00001649 def testMinutely(self):
niemeyer4da06a42004-07-16 21:21:22 +00001650 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001651 count=3,
1652 dtstart=parse("19970902T090000"))),
1653 [datetime(1997, 9, 2, 9, 0),
1654 datetime(1997, 9, 2, 9, 1),
1655 datetime(1997, 9, 2, 9, 2)])
1656
niemeyercb08a352003-10-08 06:02:06 +00001657 def testMinutelyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +00001658 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001659 count=3,
1660 interval=2,
1661 dtstart=parse("19970902T090000"))),
1662 [datetime(1997, 9, 2, 9, 0),
1663 datetime(1997, 9, 2, 9, 2),
1664 datetime(1997, 9, 2, 9, 4)])
1665
1666 def testMinutelyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001667 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001668 count=3,
1669 interval=1501,
1670 dtstart=parse("19970902T090000"))),
1671 [datetime(1997, 9, 2, 9, 0),
1672 datetime(1997, 9, 3, 10, 1),
1673 datetime(1997, 9, 4, 11, 2)])
1674
1675 def testMinutelyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +00001676 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001677 count=3,
1678 bymonth=(1,3),
1679 dtstart=parse("19970902T090000"))),
1680 [datetime(1998, 1, 1, 0, 0),
1681 datetime(1998, 1, 1, 0, 1),
1682 datetime(1998, 1, 1, 0, 2)])
1683
1684 def testMinutelyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001685 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001686 count=3,
1687 bymonthday=(1,3),
1688 dtstart=parse("19970902T090000"))),
1689 [datetime(1997, 9, 3, 0, 0),
1690 datetime(1997, 9, 3, 0, 1),
1691 datetime(1997, 9, 3, 0, 2)])
1692
1693 def testMinutelyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001694 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001695 count=3,
1696 bymonth=(1,3),
1697 bymonthday=(5,7),
1698 dtstart=parse("19970902T090000"))),
1699 [datetime(1998, 1, 5, 0, 0),
1700 datetime(1998, 1, 5, 0, 1),
1701 datetime(1998, 1, 5, 0, 2)])
1702
1703 def testMinutelyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001704 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001705 count=3,
1706 byweekday=(TU,TH),
1707 dtstart=parse("19970902T090000"))),
1708 [datetime(1997, 9, 2, 9, 0),
1709 datetime(1997, 9, 2, 9, 1),
1710 datetime(1997, 9, 2, 9, 2)])
1711
niemeyer7d8be1a2003-10-09 01:09:42 +00001712 def testMinutelyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001713 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001714 count=3,
1715 byweekday=(TU(1),TH(-1)),
1716 dtstart=parse("19970902T090000"))),
1717 [datetime(1997, 9, 2, 9, 0),
1718 datetime(1997, 9, 2, 9, 1),
1719 datetime(1997, 9, 2, 9, 2)])
1720
niemeyercb08a352003-10-08 06:02:06 +00001721 def testMinutelyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001722 self.assertEqual(list(rrule(MINUTELY,
niemeyercb08a352003-10-08 06:02:06 +00001723 count=3,
1724 bymonth=(1,3),
1725 byweekday=(TU,TH),
1726 dtstart=parse("19970902T090000"))),
1727 [datetime(1998, 1, 1, 0, 0),
1728 datetime(1998, 1, 1, 0, 1),
1729 datetime(1998, 1, 1, 0, 2)])
1730
niemeyer7d8be1a2003-10-09 01:09:42 +00001731 def testMinutelyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001732 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001733 count=3,
1734 bymonth=(1,3),
1735 byweekday=(TU(1),TH(-1)),
1736 dtstart=parse("19970902T090000"))),
1737 [datetime(1998, 1, 1, 0, 0),
1738 datetime(1998, 1, 1, 0, 1),
1739 datetime(1998, 1, 1, 0, 2)])
1740
1741 def testMinutelyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001742 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001743 count=3,
1744 bymonthday=(1,3),
1745 byweekday=(TU,TH),
1746 dtstart=parse("19970902T090000"))),
1747 [datetime(1998, 1, 1, 0, 0),
1748 datetime(1998, 1, 1, 0, 1),
1749 datetime(1998, 1, 1, 0, 2)])
1750
1751 def testMinutelyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001752 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001753 count=3,
1754 bymonth=(1,3),
1755 bymonthday=(1,3),
1756 byweekday=(TU,TH),
1757 dtstart=parse("19970902T090000"))),
1758 [datetime(1998, 1, 1, 0, 0),
1759 datetime(1998, 1, 1, 0, 1),
1760 datetime(1998, 1, 1, 0, 2)])
1761
1762 def testMinutelyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001763 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001764 count=3,
1765 byyearday=(1,100,200),
1766 dtstart=parse("19970902T090000"))),
1767 [datetime(1998, 1, 1, 0, 0),
1768 datetime(1998, 1, 1, 0, 1),
1769 datetime(1998, 1, 1, 0, 2)])
1770
1771 def testMinutelyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001772 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001773 count=3,
1774 bymonth=(4,7),
1775 byyearday=(1,100,200),
1776 dtstart=parse("19970902T090000"))),
1777 [datetime(1998, 4, 10, 0, 0),
1778 datetime(1998, 4, 10, 0, 1),
1779 datetime(1998, 4, 10, 0, 2)])
1780
1781 def testMinutelyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +00001782 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001783 count=3,
1784 byweekno=20,
1785 dtstart=parse("19970902T090000"))),
1786 [datetime(1998, 5, 11, 0, 0),
1787 datetime(1998, 5, 11, 0, 1),
1788 datetime(1998, 5, 11, 0, 2)])
1789
1790 def testMinutelyByWeekNoAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001791 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001792 count=3,
1793 byweekno=1,
1794 byweekday=MO,
1795 dtstart=parse("19970902T090000"))),
1796 [datetime(1997, 12, 29, 0, 0),
1797 datetime(1997, 12, 29, 0, 1),
1798 datetime(1997, 12, 29, 0, 2)])
1799
1800 def testMinutelyByWeekNoAndWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001801 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001802 count=3,
1803 byweekno=52,
1804 byweekday=SU,
1805 dtstart=parse("19970902T090000"))),
1806 [datetime(1997, 12, 28, 0, 0),
1807 datetime(1997, 12, 28, 0, 1),
1808 datetime(1997, 12, 28, 0, 2)])
1809
1810 def testMinutelyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +00001811 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001812 count=3,
1813 byweekno=-1,
1814 byweekday=SU,
1815 dtstart=parse("19970902T090000"))),
1816 [datetime(1997, 12, 28, 0, 0),
1817 datetime(1997, 12, 28, 0, 1),
1818 datetime(1997, 12, 28, 0, 2)])
1819
1820 def testMinutelyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +00001821 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001822 count=3,
1823 byweekno=53,
1824 byweekday=MO,
1825 dtstart=parse("19970902T090000"))),
1826 [datetime(1998, 12, 28, 0, 0),
1827 datetime(1998, 12, 28, 0, 1),
1828 datetime(1998, 12, 28, 0, 2)])
1829
1830 def testMinutelyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +00001831 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001832 count=3,
1833 byeaster=0,
1834 dtstart=parse("19970902T090000"))),
1835 [datetime(1998, 4, 12, 0, 0),
1836 datetime(1998, 4, 12, 0, 1),
1837 datetime(1998, 4, 12, 0, 2)])
1838
1839 def testMinutelyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001840 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001841 count=3,
1842 byeaster=1,
1843 dtstart=parse("19970902T090000"))),
1844 [datetime(1998, 4, 13, 0, 0),
1845 datetime(1998, 4, 13, 0, 1),
1846 datetime(1998, 4, 13, 0, 2)])
1847
1848 def testMinutelyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +00001849 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001850 count=3,
1851 byeaster=-1,
1852 dtstart=parse("19970902T090000"))),
1853 [datetime(1998, 4, 11, 0, 0),
1854 datetime(1998, 4, 11, 0, 1),
1855 datetime(1998, 4, 11, 0, 2)])
1856
1857 def testMinutelyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +00001858 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001859 count=3,
1860 byhour=(6,18),
1861 dtstart=parse("19970902T090000"))),
1862 [datetime(1997, 9, 2, 18, 0),
1863 datetime(1997, 9, 2, 18, 1),
1864 datetime(1997, 9, 2, 18, 2)])
1865
1866 def testMinutelyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001867 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001868 count=3,
1869 byminute=(6,18),
1870 dtstart=parse("19970902T090000"))),
1871 [datetime(1997, 9, 2, 9, 6),
1872 datetime(1997, 9, 2, 9, 18),
1873 datetime(1997, 9, 2, 10, 6)])
1874
1875 def testMinutelyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001876 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001877 count=3,
1878 bysecond=(6,18),
1879 dtstart=parse("19970902T090000"))),
1880 [datetime(1997, 9, 2, 9, 0, 6),
1881 datetime(1997, 9, 2, 9, 0, 18),
1882 datetime(1997, 9, 2, 9, 1, 6)])
1883
1884 def testMinutelyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00001885 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001886 count=3,
1887 byhour=(6,18),
1888 byminute=(6,18),
1889 dtstart=parse("19970902T090000"))),
1890 [datetime(1997, 9, 2, 18, 6),
1891 datetime(1997, 9, 2, 18, 18),
1892 datetime(1997, 9, 3, 6, 6)])
1893
1894 def testMinutelyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001895 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001896 count=3,
1897 byhour=(6,18),
1898 bysecond=(6,18),
1899 dtstart=parse("19970902T090000"))),
1900 [datetime(1997, 9, 2, 18, 0, 6),
1901 datetime(1997, 9, 2, 18, 0, 18),
1902 datetime(1997, 9, 2, 18, 1, 6)])
1903
1904 def testMinutelyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001905 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001906 count=3,
1907 byminute=(6,18),
1908 bysecond=(6,18),
1909 dtstart=parse("19970902T090000"))),
1910 [datetime(1997, 9, 2, 9, 6, 6),
1911 datetime(1997, 9, 2, 9, 6, 18),
1912 datetime(1997, 9, 2, 9, 18, 6)])
1913
1914 def testMinutelyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00001915 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001916 count=3,
1917 byhour=(6,18),
1918 byminute=(6,18),
1919 bysecond=(6,18),
1920 dtstart=parse("19970902T090000"))),
1921 [datetime(1997, 9, 2, 18, 6, 6),
1922 datetime(1997, 9, 2, 18, 6, 18),
1923 datetime(1997, 9, 2, 18, 18, 6)])
1924
1925 def testMinutelyBySetPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00001926 self.assertEqual(list(rrule(MINUTELY,
niemeyer7d8be1a2003-10-09 01:09:42 +00001927 count=3,
1928 bysecond=(15,30,45),
1929 bysetpos=(3,-3),
1930 dtstart=parse("19970902T090000"))),
1931 [datetime(1997, 9, 2, 9, 0, 15),
1932 datetime(1997, 9, 2, 9, 0, 45),
1933 datetime(1997, 9, 2, 9, 1, 15)])
1934
niemeyercb08a352003-10-08 06:02:06 +00001935 def testSecondly(self):
niemeyer4da06a42004-07-16 21:21:22 +00001936 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001937 count=3,
1938 dtstart=parse("19970902T090000"))),
1939 [datetime(1997, 9, 2, 9, 0, 0),
1940 datetime(1997, 9, 2, 9, 0, 1),
1941 datetime(1997, 9, 2, 9, 0, 2)])
1942
niemeyercb08a352003-10-08 06:02:06 +00001943 def testSecondlyInterval(self):
niemeyer4da06a42004-07-16 21:21:22 +00001944 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001945 count=3,
1946 interval=2,
1947 dtstart=parse("19970902T090000"))),
1948 [datetime(1997, 9, 2, 9, 0, 0),
1949 datetime(1997, 9, 2, 9, 0, 2),
1950 datetime(1997, 9, 2, 9, 0, 4)])
1951
1952 def testSecondlyIntervalLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00001953 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001954 count=3,
1955 interval=90061,
1956 dtstart=parse("19970902T090000"))),
1957 [datetime(1997, 9, 2, 9, 0, 0),
1958 datetime(1997, 9, 3, 10, 1, 1),
1959 datetime(1997, 9, 4, 11, 2, 2)])
1960
1961 def testSecondlyByMonth(self):
niemeyer4da06a42004-07-16 21:21:22 +00001962 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001963 count=3,
1964 bymonth=(1,3),
1965 dtstart=parse("19970902T090000"))),
1966 [datetime(1998, 1, 1, 0, 0, 0),
1967 datetime(1998, 1, 1, 0, 0, 1),
1968 datetime(1998, 1, 1, 0, 0, 2)])
1969
1970 def testSecondlyByMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001971 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001972 count=3,
1973 bymonthday=(1,3),
1974 dtstart=parse("19970902T090000"))),
1975 [datetime(1997, 9, 3, 0, 0, 0),
1976 datetime(1997, 9, 3, 0, 0, 1),
1977 datetime(1997, 9, 3, 0, 0, 2)])
1978
1979 def testSecondlyByMonthAndMonthDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001980 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001981 count=3,
1982 bymonth=(1,3),
1983 bymonthday=(5,7),
1984 dtstart=parse("19970902T090000"))),
1985 [datetime(1998, 1, 5, 0, 0, 0),
1986 datetime(1998, 1, 5, 0, 0, 1),
1987 datetime(1998, 1, 5, 0, 0, 2)])
1988
1989 def testSecondlyByWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001990 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00001991 count=3,
1992 byweekday=(TU,TH),
1993 dtstart=parse("19970902T090000"))),
1994 [datetime(1997, 9, 2, 9, 0, 0),
1995 datetime(1997, 9, 2, 9, 0, 1),
1996 datetime(1997, 9, 2, 9, 0, 2)])
1997
niemeyer7d8be1a2003-10-09 01:09:42 +00001998 def testSecondlyByNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00001999 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002000 count=3,
2001 byweekday=(TU(1),TH(-1)),
2002 dtstart=parse("19970902T090000"))),
2003 [datetime(1997, 9, 2, 9, 0, 0),
2004 datetime(1997, 9, 2, 9, 0, 1),
2005 datetime(1997, 9, 2, 9, 0, 2)])
2006
niemeyercb08a352003-10-08 06:02:06 +00002007 def testSecondlyByMonthAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002008 self.assertEqual(list(rrule(SECONDLY,
niemeyercb08a352003-10-08 06:02:06 +00002009 count=3,
2010 bymonth=(1,3),
2011 byweekday=(TU,TH),
2012 dtstart=parse("19970902T090000"))),
2013 [datetime(1998, 1, 1, 0, 0, 0),
2014 datetime(1998, 1, 1, 0, 0, 1),
2015 datetime(1998, 1, 1, 0, 0, 2)])
2016
niemeyer7d8be1a2003-10-09 01:09:42 +00002017 def testSecondlyByMonthAndNWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002018 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002019 count=3,
2020 bymonth=(1,3),
2021 byweekday=(TU(1),TH(-1)),
2022 dtstart=parse("19970902T090000"))),
2023 [datetime(1998, 1, 1, 0, 0, 0),
2024 datetime(1998, 1, 1, 0, 0, 1),
2025 datetime(1998, 1, 1, 0, 0, 2)])
2026
2027 def testSecondlyByMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002028 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002029 count=3,
2030 bymonthday=(1,3),
2031 byweekday=(TU,TH),
2032 dtstart=parse("19970902T090000"))),
2033 [datetime(1998, 1, 1, 0, 0, 0),
2034 datetime(1998, 1, 1, 0, 0, 1),
2035 datetime(1998, 1, 1, 0, 0, 2)])
2036
2037 def testSecondlyByMonthAndMonthDayAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002038 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002039 count=3,
2040 bymonth=(1,3),
2041 bymonthday=(1,3),
2042 byweekday=(TU,TH),
2043 dtstart=parse("19970902T090000"))),
2044 [datetime(1998, 1, 1, 0, 0, 0),
2045 datetime(1998, 1, 1, 0, 0, 1),
2046 datetime(1998, 1, 1, 0, 0, 2)])
2047
2048 def testSecondlyByYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002049 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002050 count=3,
2051 byyearday=(1,100,200),
2052 dtstart=parse("19970902T090000"))),
2053 [datetime(1998, 1, 1, 0, 0, 0),
2054 datetime(1998, 1, 1, 0, 0, 1),
2055 datetime(1998, 1, 1, 0, 0, 2)])
2056
2057 def testSecondlyByMonthAndYearDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002058 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002059 count=3,
2060 bymonth=(4,7),
2061 byyearday=(1,100,200),
2062 dtstart=parse("19970902T090000"))),
2063 [datetime(1998, 4, 10, 0, 0, 0),
2064 datetime(1998, 4, 10, 0, 0, 1),
2065 datetime(1998, 4, 10, 0, 0, 2)])
2066
2067 def testSecondlyByWeekNo(self):
niemeyer4da06a42004-07-16 21:21:22 +00002068 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002069 count=3,
2070 byweekno=20,
2071 dtstart=parse("19970902T090000"))),
2072 [datetime(1998, 5, 11, 0, 0, 0),
2073 datetime(1998, 5, 11, 0, 0, 1),
2074 datetime(1998, 5, 11, 0, 0, 2)])
2075
2076 def testSecondlyByWeekNoAndWeekDay(self):
niemeyer4da06a42004-07-16 21:21:22 +00002077 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002078 count=3,
2079 byweekno=1,
2080 byweekday=MO,
2081 dtstart=parse("19970902T090000"))),
2082 [datetime(1997, 12, 29, 0, 0, 0),
2083 datetime(1997, 12, 29, 0, 0, 1),
2084 datetime(1997, 12, 29, 0, 0, 2)])
2085
2086 def testSecondlyByWeekNoAndWeekDayLarge(self):
niemeyer4da06a42004-07-16 21:21:22 +00002087 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002088 count=3,
2089 byweekno=52,
2090 byweekday=SU,
2091 dtstart=parse("19970902T090000"))),
2092 [datetime(1997, 12, 28, 0, 0, 0),
2093 datetime(1997, 12, 28, 0, 0, 1),
2094 datetime(1997, 12, 28, 0, 0, 2)])
2095
2096 def testSecondlyByWeekNoAndWeekDayLast(self):
niemeyer4da06a42004-07-16 21:21:22 +00002097 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002098 count=3,
2099 byweekno=-1,
2100 byweekday=SU,
2101 dtstart=parse("19970902T090000"))),
2102 [datetime(1997, 12, 28, 0, 0, 0),
2103 datetime(1997, 12, 28, 0, 0, 1),
2104 datetime(1997, 12, 28, 0, 0, 2)])
2105
2106 def testSecondlyByWeekNoAndWeekDay53(self):
niemeyer4da06a42004-07-16 21:21:22 +00002107 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002108 count=3,
2109 byweekno=53,
2110 byweekday=MO,
2111 dtstart=parse("19970902T090000"))),
2112 [datetime(1998, 12, 28, 0, 0, 0),
2113 datetime(1998, 12, 28, 0, 0, 1),
2114 datetime(1998, 12, 28, 0, 0, 2)])
2115
2116 def testSecondlyByEaster(self):
niemeyer4da06a42004-07-16 21:21:22 +00002117 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002118 count=3,
2119 byeaster=0,
2120 dtstart=parse("19970902T090000"))),
2121 [datetime(1998, 4, 12, 0, 0, 0),
2122 datetime(1998, 4, 12, 0, 0, 1),
2123 datetime(1998, 4, 12, 0, 0, 2)])
2124
2125 def testSecondlyByEasterPos(self):
niemeyer4da06a42004-07-16 21:21:22 +00002126 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002127 count=3,
2128 byeaster=1,
2129 dtstart=parse("19970902T090000"))),
2130 [datetime(1998, 4, 13, 0, 0, 0),
2131 datetime(1998, 4, 13, 0, 0, 1),
2132 datetime(1998, 4, 13, 0, 0, 2)])
2133
2134 def testSecondlyByEasterNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +00002135 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002136 count=3,
2137 byeaster=-1,
2138 dtstart=parse("19970902T090000"))),
2139 [datetime(1998, 4, 11, 0, 0, 0),
2140 datetime(1998, 4, 11, 0, 0, 1),
2141 datetime(1998, 4, 11, 0, 0, 2)])
2142
2143 def testSecondlyByHour(self):
niemeyer4da06a42004-07-16 21:21:22 +00002144 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002145 count=3,
2146 byhour=(6,18),
2147 dtstart=parse("19970902T090000"))),
2148 [datetime(1997, 9, 2, 18, 0, 0),
2149 datetime(1997, 9, 2, 18, 0, 1),
2150 datetime(1997, 9, 2, 18, 0, 2)])
2151
2152 def testSecondlyByMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00002153 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002154 count=3,
2155 byminute=(6,18),
2156 dtstart=parse("19970902T090000"))),
2157 [datetime(1997, 9, 2, 9, 6, 0),
2158 datetime(1997, 9, 2, 9, 6, 1),
2159 datetime(1997, 9, 2, 9, 6, 2)])
2160
2161 def testSecondlyBySecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00002162 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002163 count=3,
2164 bysecond=(6,18),
2165 dtstart=parse("19970902T090000"))),
2166 [datetime(1997, 9, 2, 9, 0, 6),
2167 datetime(1997, 9, 2, 9, 0, 18),
2168 datetime(1997, 9, 2, 9, 1, 6)])
2169
2170 def testSecondlyByHourAndMinute(self):
niemeyer4da06a42004-07-16 21:21:22 +00002171 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002172 count=3,
2173 byhour=(6,18),
2174 byminute=(6,18),
2175 dtstart=parse("19970902T090000"))),
2176 [datetime(1997, 9, 2, 18, 6, 0),
2177 datetime(1997, 9, 2, 18, 6, 1),
2178 datetime(1997, 9, 2, 18, 6, 2)])
2179
2180 def testSecondlyByHourAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00002181 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002182 count=3,
2183 byhour=(6,18),
2184 bysecond=(6,18),
2185 dtstart=parse("19970902T090000"))),
2186 [datetime(1997, 9, 2, 18, 0, 6),
2187 datetime(1997, 9, 2, 18, 0, 18),
2188 datetime(1997, 9, 2, 18, 1, 6)])
2189
2190 def testSecondlyByMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00002191 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002192 count=3,
2193 byminute=(6,18),
2194 bysecond=(6,18),
2195 dtstart=parse("19970902T090000"))),
2196 [datetime(1997, 9, 2, 9, 6, 6),
2197 datetime(1997, 9, 2, 9, 6, 18),
2198 datetime(1997, 9, 2, 9, 18, 6)])
2199
2200 def testSecondlyByHourAndMinuteAndSecond(self):
niemeyer4da06a42004-07-16 21:21:22 +00002201 self.assertEqual(list(rrule(SECONDLY,
niemeyer7d8be1a2003-10-09 01:09:42 +00002202 count=3,
2203 byhour=(6,18),
2204 byminute=(6,18),
2205 bysecond=(6,18),
2206 dtstart=parse("19970902T090000"))),
2207 [datetime(1997, 9, 2, 18, 6, 6),
2208 datetime(1997, 9, 2, 18, 6, 18),
2209 datetime(1997, 9, 2, 18, 18, 6)])
2210
niemeyercb08a352003-10-08 06:02:06 +00002211 def testUntilNotMatching(self):
niemeyer4da06a42004-07-16 21:21:22 +00002212 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00002213 count=3,
2214 dtstart=parse("19970902T090000"),
2215 until=parse("19970905T080000"))),
2216 [datetime(1997, 9, 2, 9, 0),
2217 datetime(1997, 9, 3, 9, 0),
2218 datetime(1997, 9, 4, 9, 0)])
2219
2220 def testUntilMatching(self):
niemeyer4da06a42004-07-16 21:21:22 +00002221 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00002222 count=3,
2223 dtstart=parse("19970902T090000"),
2224 until=parse("19970904T090000"))),
2225 [datetime(1997, 9, 2, 9, 0),
2226 datetime(1997, 9, 3, 9, 0),
2227 datetime(1997, 9, 4, 9, 0)])
2228
2229 def testUntilSingle(self):
niemeyer4da06a42004-07-16 21:21:22 +00002230 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00002231 count=3,
2232 dtstart=parse("19970902T090000"),
2233 until=parse("19970902T090000"))),
2234 [datetime(1997, 9, 2, 9, 0)])
2235
2236 def testUntilEmpty(self):
niemeyer4da06a42004-07-16 21:21:22 +00002237 self.assertEqual(list(rrule(DAILY,
niemeyercb08a352003-10-08 06:02:06 +00002238 count=3,
2239 dtstart=parse("19970902T090000"),
2240 until=parse("19970901T090000"))),
2241 [])
2242
niemeyer8d468492003-10-09 16:49:35 +00002243 def testUntilWithDate(self):
niemeyer4da06a42004-07-16 21:21:22 +00002244 self.assertEqual(list(rrule(DAILY,
niemeyer8d468492003-10-09 16:49:35 +00002245 count=3,
2246 dtstart=parse("19970902T090000"),
2247 until=date(1997, 9, 5))),
2248 [datetime(1997, 9, 2, 9, 0),
2249 datetime(1997, 9, 3, 9, 0),
2250 datetime(1997, 9, 4, 9, 0)])
2251
niemeyercee1a1b2003-10-09 01:39:15 +00002252 def testWkStIntervalMO(self):
niemeyer4da06a42004-07-16 21:21:22 +00002253 self.assertEqual(list(rrule(WEEKLY,
niemeyercee1a1b2003-10-09 01:39:15 +00002254 count=3,
2255 interval=2,
2256 byweekday=(TU,SU),
2257 wkst=MO,
2258 dtstart=parse("19970902T090000"))),
2259 [datetime(1997, 9, 2, 9, 0),
2260 datetime(1997, 9, 7, 9, 0),
2261 datetime(1997, 9, 16, 9, 0)])
2262
2263 def testWkStIntervalSU(self):
niemeyer4da06a42004-07-16 21:21:22 +00002264 self.assertEqual(list(rrule(WEEKLY,
niemeyercee1a1b2003-10-09 01:39:15 +00002265 count=3,
2266 interval=2,
2267 byweekday=(TU,SU),
2268 wkst=SU,
2269 dtstart=parse("19970902T090000"))),
2270 [datetime(1997, 9, 2, 9, 0),
2271 datetime(1997, 9, 14, 9, 0),
2272 datetime(1997, 9, 16, 9, 0)])
2273
niemeyer46c89302003-10-09 16:23:36 +00002274 def testDTStartIsDate(self):
niemeyer4da06a42004-07-16 21:21:22 +00002275 self.assertEqual(list(rrule(DAILY,
niemeyer46c89302003-10-09 16:23:36 +00002276 count=3,
2277 dtstart=date(1997, 9, 2))),
2278 [datetime(1997, 9, 2, 0, 0),
2279 datetime(1997, 9, 3, 0, 0),
2280 datetime(1997, 9, 4, 0, 0)])
2281
2282 def testDTStartWithMicroseconds(self):
niemeyer4da06a42004-07-16 21:21:22 +00002283 self.assertEqual(list(rrule(DAILY,
niemeyer46c89302003-10-09 16:23:36 +00002284 count=3,
2285 dtstart=parse("19970902T090000.5"))),
2286 [datetime(1997, 9, 2, 9, 0),
2287 datetime(1997, 9, 3, 9, 0),
2288 datetime(1997, 9, 4, 9, 0)])
2289
niemeyer7ac367e2003-10-10 19:16:28 +00002290 def testMaxYear(self):
niemeyer4da06a42004-07-16 21:21:22 +00002291 self.assertEqual(list(rrule(YEARLY,
niemeyer7ac367e2003-10-10 19:16:28 +00002292 count=3,
2293 bymonth=2,
2294 bymonthday=31,
2295 dtstart=parse("99970902T090000"))),
2296 [])
2297
2298 def testGetItem(self):
niemeyer4da06a42004-07-16 21:21:22 +00002299 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002300 count=3,
2301 dtstart=parse("19970902T090000"))[0],
2302 datetime(1997, 9, 2, 9, 0))
2303
2304 def testGetItemNeg(self):
niemeyer4da06a42004-07-16 21:21:22 +00002305 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002306 count=3,
2307 dtstart=parse("19970902T090000"))[-1],
2308 datetime(1997, 9, 4, 9, 0))
2309
2310 def testGetItemSlice(self):
niemeyer4da06a42004-07-16 21:21:22 +00002311 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002312 #count=3,
2313 dtstart=parse("19970902T090000"))[1:2],
2314 [datetime(1997, 9, 3, 9, 0)])
2315
2316 def testGetItemSliceEmpty(self):
niemeyer4da06a42004-07-16 21:21:22 +00002317 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002318 count=3,
2319 dtstart=parse("19970902T090000"))[:],
2320 [datetime(1997, 9, 2, 9, 0),
2321 datetime(1997, 9, 3, 9, 0),
2322 datetime(1997, 9, 4, 9, 0)])
2323
2324 def testGetItemSliceStep(self):
niemeyer4da06a42004-07-16 21:21:22 +00002325 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002326 count=3,
2327 dtstart=parse("19970902T090000"))[::-2],
2328 [datetime(1997, 9, 4, 9, 0),
2329 datetime(1997, 9, 2, 9, 0)])
2330
2331 def testCount(self):
niemeyer4da06a42004-07-16 21:21:22 +00002332 self.assertEqual(rrule(DAILY,
niemeyer7ac367e2003-10-10 19:16:28 +00002333 count=3,
2334 dtstart=parse("19970902T090000")).count(),
2335 3)
2336
niemeyer61faaf32003-10-10 19:31:00 +00002337 def testContains(self):
niemeyer4da06a42004-07-16 21:21:22 +00002338 rr = rrule(DAILY, count=3, dtstart=parse("19970902T090000"))
niemeyer61faaf32003-10-10 19:31:00 +00002339 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2340
2341 def testContainsNot(self):
niemeyer4da06a42004-07-16 21:21:22 +00002342 rr = rrule(DAILY, count=3, dtstart=parse("19970902T090000"))
niemeyer61faaf32003-10-10 19:31:00 +00002343 self.assertEqual(datetime(1997, 9, 3, 9, 0) not in rr, False)
2344
2345 def testBefore(self):
niemeyer4da06a42004-07-16 21:21:22 +00002346 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002347 #count=5,
2348 dtstart=parse("19970902T090000"))
2349 .before(parse("19970905T090000")),
2350 datetime(1997, 9, 4, 9, 0))
2351
2352 def testBeforeInc(self):
niemeyer4da06a42004-07-16 21:21:22 +00002353 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002354 #count=5,
2355 dtstart=parse("19970902T090000"))
2356 .before(parse("19970905T090000"), inc=True),
2357 datetime(1997, 9, 5, 9, 0))
2358
2359 def testAfter(self):
niemeyer4da06a42004-07-16 21:21:22 +00002360 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002361 #count=5,
2362 dtstart=parse("19970902T090000"))
2363 .after(parse("19970904T090000")),
2364 datetime(1997, 9, 5, 9, 0))
2365
2366 def testAfterInc(self):
niemeyer4da06a42004-07-16 21:21:22 +00002367 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002368 #count=5,
2369 dtstart=parse("19970902T090000"))
2370 .after(parse("19970904T090000"), inc=True),
2371 datetime(1997, 9, 4, 9, 0))
2372
2373 def testBetween(self):
niemeyer4da06a42004-07-16 21:21:22 +00002374 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002375 #count=5,
2376 dtstart=parse("19970902T090000"))
2377 .between(parse("19970902T090000"),
2378 parse("19970906T090000")),
2379 [datetime(1997, 9, 3, 9, 0),
2380 datetime(1997, 9, 4, 9, 0),
2381 datetime(1997, 9, 5, 9, 0)])
2382
2383 def testBetweenInc(self):
niemeyer4da06a42004-07-16 21:21:22 +00002384 self.assertEqual(rrule(DAILY,
niemeyer61faaf32003-10-10 19:31:00 +00002385 #count=5,
2386 dtstart=parse("19970902T090000"))
2387 .between(parse("19970902T090000"),
2388 parse("19970906T090000"), inc=True),
2389 [datetime(1997, 9, 2, 9, 0),
2390 datetime(1997, 9, 3, 9, 0),
2391 datetime(1997, 9, 4, 9, 0),
2392 datetime(1997, 9, 5, 9, 0),
2393 datetime(1997, 9, 6, 9, 0)])
2394
niemeyer7ac367e2003-10-10 19:16:28 +00002395 def testCachePre(self):
niemeyer4da06a42004-07-16 21:21:22 +00002396 rr = rrule(DAILY, count=15, cache=True,
niemeyer7ac367e2003-10-10 19:16:28 +00002397 dtstart=parse("19970902T090000"))
2398 self.assertEqual(list(rr),
2399 [datetime(1997, 9, 2, 9, 0),
2400 datetime(1997, 9, 3, 9, 0),
2401 datetime(1997, 9, 4, 9, 0),
2402 datetime(1997, 9, 5, 9, 0),
2403 datetime(1997, 9, 6, 9, 0),
2404 datetime(1997, 9, 7, 9, 0),
2405 datetime(1997, 9, 8, 9, 0),
2406 datetime(1997, 9, 9, 9, 0),
2407 datetime(1997, 9, 10, 9, 0),
2408 datetime(1997, 9, 11, 9, 0),
2409 datetime(1997, 9, 12, 9, 0),
2410 datetime(1997, 9, 13, 9, 0),
2411 datetime(1997, 9, 14, 9, 0),
2412 datetime(1997, 9, 15, 9, 0),
2413 datetime(1997, 9, 16, 9, 0)])
2414
2415 def testCachePost(self):
niemeyer4da06a42004-07-16 21:21:22 +00002416 rr = rrule(DAILY, count=15, cache=True,
niemeyer7ac367e2003-10-10 19:16:28 +00002417 dtstart=parse("19970902T090000"))
2418 for x in rr: pass
2419 self.assertEqual(list(rr),
2420 [datetime(1997, 9, 2, 9, 0),
2421 datetime(1997, 9, 3, 9, 0),
2422 datetime(1997, 9, 4, 9, 0),
2423 datetime(1997, 9, 5, 9, 0),
2424 datetime(1997, 9, 6, 9, 0),
2425 datetime(1997, 9, 7, 9, 0),
2426 datetime(1997, 9, 8, 9, 0),
2427 datetime(1997, 9, 9, 9, 0),
2428 datetime(1997, 9, 10, 9, 0),
2429 datetime(1997, 9, 11, 9, 0),
2430 datetime(1997, 9, 12, 9, 0),
2431 datetime(1997, 9, 13, 9, 0),
2432 datetime(1997, 9, 14, 9, 0),
2433 datetime(1997, 9, 15, 9, 0),
2434 datetime(1997, 9, 16, 9, 0)])
2435
2436 def testCachePostInternal(self):
niemeyer4da06a42004-07-16 21:21:22 +00002437 rr = rrule(DAILY, count=15, cache=True,
niemeyer7ac367e2003-10-10 19:16:28 +00002438 dtstart=parse("19970902T090000"))
2439 for x in rr: pass
2440 self.assertEqual(rr._cache,
2441 [datetime(1997, 9, 2, 9, 0),
2442 datetime(1997, 9, 3, 9, 0),
2443 datetime(1997, 9, 4, 9, 0),
2444 datetime(1997, 9, 5, 9, 0),
2445 datetime(1997, 9, 6, 9, 0),
2446 datetime(1997, 9, 7, 9, 0),
2447 datetime(1997, 9, 8, 9, 0),
2448 datetime(1997, 9, 9, 9, 0),
2449 datetime(1997, 9, 10, 9, 0),
2450 datetime(1997, 9, 11, 9, 0),
2451 datetime(1997, 9, 12, 9, 0),
2452 datetime(1997, 9, 13, 9, 0),
2453 datetime(1997, 9, 14, 9, 0),
2454 datetime(1997, 9, 15, 9, 0),
2455 datetime(1997, 9, 16, 9, 0)])
2456
niemeyer61faaf32003-10-10 19:31:00 +00002457 def testCachePreContains(self):
niemeyer4da06a42004-07-16 21:21:22 +00002458 rr = rrule(DAILY, count=3, cache=True,
niemeyer61faaf32003-10-10 19:31:00 +00002459 dtstart=parse("19970902T090000"))
2460 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2461
2462 def testCachePostContains(self):
niemeyer4da06a42004-07-16 21:21:22 +00002463 rr = rrule(DAILY, count=3, cache=True,
niemeyer61faaf32003-10-10 19:31:00 +00002464 dtstart=parse("19970902T090000"))
2465 for x in rr: pass
2466 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2467
niemeyerdcad96c2003-10-09 02:47:09 +00002468 def testSet(self):
2469 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002470 set.rrule(rrule(YEARLY, count=2, byweekday=TU,
niemeyerdcad96c2003-10-09 02:47:09 +00002471 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002472 set.rrule(rrule(YEARLY, count=1, byweekday=TH,
niemeyerdcad96c2003-10-09 02:47:09 +00002473 dtstart=parse("19970902T090000")))
2474 self.assertEqual(list(set),
2475 [datetime(1997, 9, 2, 9, 0),
2476 datetime(1997, 9, 4, 9, 0),
2477 datetime(1997, 9, 9, 9, 0)])
2478
2479 def testSetDate(self):
2480 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002481 set.rrule(rrule(YEARLY, count=1, byweekday=TU,
niemeyerdcad96c2003-10-09 02:47:09 +00002482 dtstart=parse("19970902T090000")))
2483 set.rdate(datetime(1997, 9, 4, 9))
2484 set.rdate(datetime(1997, 9, 9, 9))
2485 self.assertEqual(list(set),
2486 [datetime(1997, 9, 2, 9, 0),
2487 datetime(1997, 9, 4, 9, 0),
2488 datetime(1997, 9, 9, 9, 0)])
2489
2490 def testSetExRule(self):
2491 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002492 set.rrule(rrule(YEARLY, count=6, byweekday=(TU,TH),
niemeyerdcad96c2003-10-09 02:47:09 +00002493 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002494 set.exrule(rrule(YEARLY, count=3, byweekday=TH,
niemeyerdcad96c2003-10-09 02:47:09 +00002495 dtstart=parse("19970902T090000")))
2496 self.assertEqual(list(set),
2497 [datetime(1997, 9, 2, 9, 0),
2498 datetime(1997, 9, 9, 9, 0),
2499 datetime(1997, 9, 16, 9, 0)])
2500
2501 def testSetExDate(self):
2502 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002503 set.rrule(rrule(YEARLY, count=6, byweekday=(TU,TH),
niemeyerdcad96c2003-10-09 02:47:09 +00002504 dtstart=parse("19970902T090000")))
2505 set.exdate(datetime(1997, 9, 4, 9))
2506 set.exdate(datetime(1997, 9, 11, 9))
2507 set.exdate(datetime(1997, 9, 18, 9))
2508 self.assertEqual(list(set),
2509 [datetime(1997, 9, 2, 9, 0),
2510 datetime(1997, 9, 9, 9, 0),
2511 datetime(1997, 9, 16, 9, 0)])
2512
niemeyer4da06a42004-07-16 21:21:22 +00002513 def testSetExDateRevOrder(self):
2514 set = rruleset()
2515 set.rrule(rrule(MONTHLY, count=5, bymonthday=10,
2516 dtstart=parse("20040101T090000")))
2517 set.exdate(datetime(2004, 4, 10, 9, 0))
2518 set.exdate(datetime(2004, 2, 10, 9, 0))
2519 self.assertEqual(list(set),
2520 [datetime(2004, 1, 10, 9, 0),
2521 datetime(2004, 3, 10, 9, 0),
2522 datetime(2004, 5, 10, 9, 0)])
2523
niemeyerdcad96c2003-10-09 02:47:09 +00002524 def testSetDateAndExDate(self):
2525 set = rruleset()
2526 set.rdate(datetime(1997, 9, 2, 9))
2527 set.rdate(datetime(1997, 9, 4, 9))
2528 set.rdate(datetime(1997, 9, 9, 9))
2529 set.rdate(datetime(1997, 9, 11, 9))
2530 set.rdate(datetime(1997, 9, 16, 9))
2531 set.rdate(datetime(1997, 9, 18, 9))
2532 set.exdate(datetime(1997, 9, 4, 9))
2533 set.exdate(datetime(1997, 9, 11, 9))
2534 set.exdate(datetime(1997, 9, 18, 9))
2535 self.assertEqual(list(set),
2536 [datetime(1997, 9, 2, 9, 0),
2537 datetime(1997, 9, 9, 9, 0),
2538 datetime(1997, 9, 16, 9, 0)])
2539
2540 def testSetDateAndExRule(self):
2541 set = rruleset()
2542 set.rdate(datetime(1997, 9, 2, 9))
2543 set.rdate(datetime(1997, 9, 4, 9))
2544 set.rdate(datetime(1997, 9, 9, 9))
2545 set.rdate(datetime(1997, 9, 11, 9))
2546 set.rdate(datetime(1997, 9, 16, 9))
2547 set.rdate(datetime(1997, 9, 18, 9))
niemeyer4da06a42004-07-16 21:21:22 +00002548 set.exrule(rrule(YEARLY, count=3, byweekday=TH,
niemeyerdcad96c2003-10-09 02:47:09 +00002549 dtstart=parse("19970902T090000")))
2550 self.assertEqual(list(set),
2551 [datetime(1997, 9, 2, 9, 0),
2552 datetime(1997, 9, 9, 9, 0),
2553 datetime(1997, 9, 16, 9, 0)])
2554
niemeyer7ac367e2003-10-10 19:16:28 +00002555 def testSetCount(self):
2556 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002557 set.rrule(rrule(YEARLY, count=6, byweekday=(TU,TH),
niemeyer7ac367e2003-10-10 19:16:28 +00002558 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002559 set.exrule(rrule(YEARLY, count=3, byweekday=TH,
niemeyer7ac367e2003-10-10 19:16:28 +00002560 dtstart=parse("19970902T090000")))
2561 self.assertEqual(set.count(), 3)
2562
2563 def testSetCachePre(self):
2564 set = rruleset()
niemeyer4da06a42004-07-16 21:21:22 +00002565 set.rrule(rrule(YEARLY, count=2, byweekday=TU,
niemeyer7ac367e2003-10-10 19:16:28 +00002566 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002567 set.rrule(rrule(YEARLY, count=1, byweekday=TH,
niemeyer7ac367e2003-10-10 19:16:28 +00002568 dtstart=parse("19970902T090000")))
2569 self.assertEqual(list(set),
2570 [datetime(1997, 9, 2, 9, 0),
2571 datetime(1997, 9, 4, 9, 0),
2572 datetime(1997, 9, 9, 9, 0)])
2573
2574 def testSetCachePost(self):
2575 set = rruleset(cache=True)
niemeyer4da06a42004-07-16 21:21:22 +00002576 set.rrule(rrule(YEARLY, count=2, byweekday=TU,
niemeyer7ac367e2003-10-10 19:16:28 +00002577 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002578 set.rrule(rrule(YEARLY, count=1, byweekday=TH,
niemeyer7ac367e2003-10-10 19:16:28 +00002579 dtstart=parse("19970902T090000")))
2580 for x in set: pass
2581 self.assertEqual(list(set),
2582 [datetime(1997, 9, 2, 9, 0),
2583 datetime(1997, 9, 4, 9, 0),
2584 datetime(1997, 9, 9, 9, 0)])
2585
2586 def testSetCachePostInternal(self):
2587 set = rruleset(cache=True)
niemeyer4da06a42004-07-16 21:21:22 +00002588 set.rrule(rrule(YEARLY, count=2, byweekday=TU,
niemeyer7ac367e2003-10-10 19:16:28 +00002589 dtstart=parse("19970902T090000")))
niemeyer4da06a42004-07-16 21:21:22 +00002590 set.rrule(rrule(YEARLY, count=1, byweekday=TH,
niemeyer7ac367e2003-10-10 19:16:28 +00002591 dtstart=parse("19970902T090000")))
2592 for x in set: pass
2593 self.assertEqual(list(set._cache),
2594 [datetime(1997, 9, 2, 9, 0),
2595 datetime(1997, 9, 4, 9, 0),
2596 datetime(1997, 9, 9, 9, 0)])
2597
niemeyerdcad96c2003-10-09 02:47:09 +00002598 def testStr(self):
2599 self.assertEqual(list(rrulestr(
2600 "DTSTART:19970902T090000\n"
2601 "RRULE:FREQ=YEARLY;COUNT=3\n"
2602 )),
2603 [datetime(1997, 9, 2, 9, 0),
2604 datetime(1998, 9, 2, 9, 0),
2605 datetime(1999, 9, 2, 9, 0)])
2606
2607 def testStrType(self):
2608 self.assertEqual(isinstance(rrulestr(
2609 "DTSTART:19970902T090000\n"
2610 "RRULE:FREQ=YEARLY;COUNT=3\n"
2611 ), rrule), True)
2612
2613 def testStrForceSetType(self):
2614 self.assertEqual(isinstance(rrulestr(
2615 "DTSTART:19970902T090000\n"
2616 "RRULE:FREQ=YEARLY;COUNT=3\n"
2617 , forceset=True), rruleset), True)
2618
2619 def testStrSetType(self):
2620 self.assertEqual(isinstance(rrulestr(
2621 "DTSTART:19970902T090000\n"
2622 "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2623 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2624 ), rruleset), True)
2625
2626 def testStrCase(self):
2627 self.assertEqual(list(rrulestr(
2628 "dtstart:19970902T090000\n"
2629 "rrule:freq=yearly;count=3\n"
2630 )),
2631 [datetime(1997, 9, 2, 9, 0),
2632 datetime(1998, 9, 2, 9, 0),
2633 datetime(1999, 9, 2, 9, 0)])
2634
2635 def testStrSpaces(self):
2636 self.assertEqual(list(rrulestr(
2637 " DTSTART:19970902T090000 "
2638 " RRULE:FREQ=YEARLY;COUNT=3 "
2639 )),
2640 [datetime(1997, 9, 2, 9, 0),
2641 datetime(1998, 9, 2, 9, 0),
2642 datetime(1999, 9, 2, 9, 0)])
2643
2644 def testStrSpacesAndLines(self):
2645 self.assertEqual(list(rrulestr(
2646 " DTSTART:19970902T090000 \n"
2647 " \n"
2648 " RRULE:FREQ=YEARLY;COUNT=3 \n"
2649 )),
2650 [datetime(1997, 9, 2, 9, 0),
2651 datetime(1998, 9, 2, 9, 0),
2652 datetime(1999, 9, 2, 9, 0)])
2653
2654 def testStrNoDTStart(self):
2655 self.assertEqual(list(rrulestr(
2656 "RRULE:FREQ=YEARLY;COUNT=3\n"
2657 , dtstart=parse("19970902T090000"))),
2658 [datetime(1997, 9, 2, 9, 0),
2659 datetime(1998, 9, 2, 9, 0),
2660 datetime(1999, 9, 2, 9, 0)])
2661
2662 def testStrValueOnly(self):
2663 self.assertEqual(list(rrulestr(
2664 "FREQ=YEARLY;COUNT=3\n"
2665 , dtstart=parse("19970902T090000"))),
2666 [datetime(1997, 9, 2, 9, 0),
2667 datetime(1998, 9, 2, 9, 0),
2668 datetime(1999, 9, 2, 9, 0)])
2669
2670 def testStrUnfold(self):
2671 self.assertEqual(list(rrulestr(
2672 "FREQ=YEA\n RLY;COUNT=3\n", unfold=True,
2673 dtstart=parse("19970902T090000"))),
2674 [datetime(1997, 9, 2, 9, 0),
2675 datetime(1998, 9, 2, 9, 0),
2676 datetime(1999, 9, 2, 9, 0)])
2677
2678 def testStrSet(self):
2679 self.assertEqual(list(rrulestr(
2680 "DTSTART:19970902T090000\n"
2681 "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2682 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2683 )),
2684 [datetime(1997, 9, 2, 9, 0),
2685 datetime(1997, 9, 4, 9, 0),
2686 datetime(1997, 9, 9, 9, 0)])
2687
2688 def testStrSetDate(self):
2689 self.assertEqual(list(rrulestr(
2690 "DTSTART:19970902T090000\n"
2691 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n"
2692 "RDATE:19970904T090000\n"
2693 "RDATE:19970909T090000\n"
2694 )),
2695 [datetime(1997, 9, 2, 9, 0),
2696 datetime(1997, 9, 4, 9, 0),
2697 datetime(1997, 9, 9, 9, 0)])
2698
2699 def testStrSetExRule(self):
2700 self.assertEqual(list(rrulestr(
2701 "DTSTART:19970902T090000\n"
2702 "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
2703 "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
2704 )),
2705 [datetime(1997, 9, 2, 9, 0),
2706 datetime(1997, 9, 9, 9, 0),
2707 datetime(1997, 9, 16, 9, 0)])
2708
2709 def testStrSetExDate(self):
2710 self.assertEqual(list(rrulestr(
2711 "DTSTART:19970902T090000\n"
2712 "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
2713 "EXDATE:19970904T090000\n"
2714 "EXDATE:19970911T090000\n"
2715 "EXDATE:19970918T090000\n"
2716 )),
2717 [datetime(1997, 9, 2, 9, 0),
2718 datetime(1997, 9, 9, 9, 0),
2719 datetime(1997, 9, 16, 9, 0)])
2720
2721 def testStrSetDateAndExDate(self):
2722 self.assertEqual(list(rrulestr(
2723 "DTSTART:19970902T090000\n"
2724 "RDATE:19970902T090000\n"
2725 "RDATE:19970904T090000\n"
2726 "RDATE:19970909T090000\n"
2727 "RDATE:19970911T090000\n"
2728 "RDATE:19970916T090000\n"
2729 "RDATE:19970918T090000\n"
2730 "EXDATE:19970904T090000\n"
2731 "EXDATE:19970911T090000\n"
2732 "EXDATE:19970918T090000\n"
2733 )),
2734 [datetime(1997, 9, 2, 9, 0),
2735 datetime(1997, 9, 9, 9, 0),
2736 datetime(1997, 9, 16, 9, 0)])
2737
2738 def testStrSetDateAndExRule(self):
2739 self.assertEqual(list(rrulestr(
2740 "DTSTART:19970902T090000\n"
2741 "RDATE:19970902T090000\n"
2742 "RDATE:19970904T090000\n"
2743 "RDATE:19970909T090000\n"
2744 "RDATE:19970911T090000\n"
2745 "RDATE:19970916T090000\n"
2746 "RDATE:19970918T090000\n"
2747 "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
2748 )),
2749 [datetime(1997, 9, 2, 9, 0),
2750 datetime(1997, 9, 9, 9, 0),
2751 datetime(1997, 9, 16, 9, 0)])
2752
2753 def testStrKeywords(self):
2754 self.assertEqual(list(rrulestr(
2755 "DTSTART:19970902T090000\n"
2756 "RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;"
2757 "BYMONTH=3;BYWEEKDAY=TH;BYMONTHDAY=3;"
2758 "BYHOUR=3;BYMINUTE=3;BYSECOND=3\n"
2759 )),
2760 [datetime(2033, 3, 3, 3, 3, 3),
2761 datetime(2039, 3, 3, 3, 3, 3),
2762 datetime(2072, 3, 3, 3, 3, 3)])
2763
2764 def testStrNWeekDay(self):
2765 self.assertEqual(list(rrulestr(
2766 "DTSTART:19970902T090000\n"
2767 "RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n"
2768 )),
2769 [datetime(1997, 12, 25, 9, 0),
2770 datetime(1998, 1, 6, 9, 0),
2771 datetime(1998, 12, 31, 9, 0)])
2772
2773
2774
niemeyer68ae2752003-09-28 01:20:02 +00002775class ParserTest(unittest.TestCase):
2776 def setUp(self):
niemeyer97e19252003-10-06 05:52:04 +00002777 self.tzinfos = {"BRST": -10800}
niemeyer68ae2752003-09-28 01:20:02 +00002778 self.brsttz = tzoffset("BRST", -10800)
2779 self.default = datetime(2003, 9, 25)
2780
2781 def testDateCommandFormat(self):
2782 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
niemeyer97e19252003-10-06 05:52:04 +00002783 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002784 datetime(2003, 9, 25, 10, 36, 28,
2785 tzinfo=self.brsttz))
2786
niemeyer672e2eb2005-02-23 00:04:12 +00002787 def testDateCommandFormatUnicode(self):
2788 self.assertEqual(parse(u"Thu Sep 25 10:36:28 BRST 2003",
2789 tzinfos=self.tzinfos),
2790 datetime(2003, 9, 25, 10, 36, 28,
2791 tzinfo=self.brsttz))
2792
2793
niemeyer68ae2752003-09-28 01:20:02 +00002794 def testDateCommandFormatReversed(self):
2795 self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
niemeyer97e19252003-10-06 05:52:04 +00002796 tzinfos=self.tzinfos),
niemeyer68ae2752003-09-28 01:20:02 +00002797 datetime(2003, 9, 25, 10, 36, 28,
2798 tzinfo=self.brsttz))
2799
2800 def testDateCommandFormatIgnoreTz(self):
2801 self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
2802 ignoretz=True),
2803 datetime(2003, 9, 25, 10, 36, 28))
2804
2805 def testDateCommandFormatStrip1(self):
2806 self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
2807 datetime(2003, 9, 25, 10, 36, 28))
2808
2809 def testDateCommandFormatStrip2(self):
2810 self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
2811 datetime(2003, 9, 25, 10, 36, 28))
2812
2813 def testDateCommandFormatStrip3(self):
2814 self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
2815 datetime(2003, 9, 25, 10, 36, 28))
2816
2817 def testDateCommandFormatStrip4(self):
2818 self.assertEqual(parse("Thu 10:36:28", default=self.default),
2819 datetime(2003, 9, 25, 10, 36, 28))
2820
2821 def testDateCommandFormatStrip5(self):
2822 self.assertEqual(parse("Sep 10:36:28", default=self.default),
2823 datetime(2003, 9, 25, 10, 36, 28))
2824
2825 def testDateCommandFormatStrip6(self):
2826 self.assertEqual(parse("10:36:28", default=self.default),
2827 datetime(2003, 9, 25, 10, 36, 28))
2828
2829 def testDateCommandFormatStrip7(self):
2830 self.assertEqual(parse("10:36", default=self.default),
2831 datetime(2003, 9, 25, 10, 36))
2832
2833 def testDateCommandFormatStrip8(self):
2834 self.assertEqual(parse("Thu Sep 25 2003"),
2835 datetime(2003, 9, 25))
2836
2837 def testDateCommandFormatStrip9(self):
2838 self.assertEqual(parse("Sep 25 2003"),
2839 datetime(2003, 9, 25))
2840
2841 def testDateCommandFormatStrip9(self):
2842 self.assertEqual(parse("Sep 2003", default=self.default),
2843 datetime(2003, 9, 25))
2844
2845 def testDateCommandFormatStrip10(self):
2846 self.assertEqual(parse("Sep", default=self.default),
2847 datetime(2003, 9, 25))
2848
2849 def testDateCommandFormatStrip11(self):
2850 self.assertEqual(parse("2003", default=self.default),
2851 datetime(2003, 9, 25))
2852
2853 def testDateRCommandFormat(self):
2854 self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
2855 datetime(2003, 9, 25, 10, 49, 41,
2856 tzinfo=self.brsttz))
2857
2858 def testISOFormat(self):
2859 self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
2860 datetime(2003, 9, 25, 10, 49, 41, 500000,
2861 tzinfo=self.brsttz))
2862
2863 def testISOFormatStrip1(self):
2864 self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
2865 datetime(2003, 9, 25, 10, 49, 41,
2866 tzinfo=self.brsttz))
2867
2868 def testISOFormatStrip2(self):
2869 self.assertEqual(parse("2003-09-25T10:49:41"),
2870 datetime(2003, 9, 25, 10, 49, 41))
2871
2872 def testISOFormatStrip3(self):
2873 self.assertEqual(parse("2003-09-25T10:49"),
2874 datetime(2003, 9, 25, 10, 49))
2875
2876 def testISOFormatStrip4(self):
2877 self.assertEqual(parse("2003-09-25T10"),
2878 datetime(2003, 9, 25, 10))
2879
2880 def testISOFormatStrip5(self):
2881 self.assertEqual(parse("2003-09-25"),
2882 datetime(2003, 9, 25))
2883
2884 def testISOStrippedFormat(self):
2885 self.assertEqual(parse("20030925T104941.5-0300"),
2886 datetime(2003, 9, 25, 10, 49, 41, 500000,
2887 tzinfo=self.brsttz))
2888
2889 def testISOStrippedFormatStrip1(self):
2890 self.assertEqual(parse("20030925T104941-0300"),
2891 datetime(2003, 9, 25, 10, 49, 41,
2892 tzinfo=self.brsttz))
2893
2894 def testISOStrippedFormatStrip2(self):
2895 self.assertEqual(parse("20030925T104941"),
2896 datetime(2003, 9, 25, 10, 49, 41))
2897
2898 def testISOStrippedFormatStrip3(self):
2899 self.assertEqual(parse("20030925T1049"),
2900 datetime(2003, 9, 25, 10, 49, 0))
2901
2902 def testISOStrippedFormatStrip4(self):
2903 self.assertEqual(parse("20030925T10"),
2904 datetime(2003, 9, 25, 10))
2905
2906 def testISOStrippedFormatStrip5(self):
2907 self.assertEqual(parse("20030925"),
2908 datetime(2003, 9, 25))
2909
niemeyer6c067e02003-10-09 02:54:58 +00002910 def testNoSeparator1(self):
2911 self.assertEqual(parse("199709020908"),
2912 datetime(1997, 9, 2, 9, 8))
2913
2914 def testNoSeparator2(self):
2915 self.assertEqual(parse("19970902090807"),
2916 datetime(1997, 9, 2, 9, 8, 7))
2917
niemeyer68ae2752003-09-28 01:20:02 +00002918 def testDateWithDash1(self):
2919 self.assertEqual(parse("2003-09-25"),
2920 datetime(2003, 9, 25))
2921
2922 def testDateWithDash2(self):
2923 self.assertEqual(parse("2003-Sep-25"),
2924 datetime(2003, 9, 25))
2925
2926 def testDateWithDash3(self):
2927 self.assertEqual(parse("25-Sep-2003"),
2928 datetime(2003, 9, 25))
2929
2930 def testDateWithDash4(self):
2931 self.assertEqual(parse("25-Sep-2003"),
2932 datetime(2003, 9, 25))
2933
2934 def testDateWithDash5(self):
2935 self.assertEqual(parse("Sep-25-2003"),
2936 datetime(2003, 9, 25))
2937
2938 def testDateWithDash6(self):
2939 self.assertEqual(parse("09-25-2003"),
2940 datetime(2003, 9, 25))
2941
2942 def testDateWithDash7(self):
2943 self.assertEqual(parse("25-09-2003"),
2944 datetime(2003, 9, 25))
2945
2946 def testDateWithDash8(self):
2947 self.assertEqual(parse("10-09-2003", dayfirst=True),
2948 datetime(2003, 9, 10))
2949
2950 def testDateWithDash9(self):
2951 self.assertEqual(parse("10-09-2003"),
2952 datetime(2003, 10, 9))
2953
2954 def testDateWithDash10(self):
2955 self.assertEqual(parse("10-09-03"),
2956 datetime(2003, 10, 9))
2957
2958 def testDateWithDash11(self):
2959 self.assertEqual(parse("10-09-03", yearfirst=True),
2960 datetime(2010, 9, 3))
2961
2962 def testDateWithDot1(self):
2963 self.assertEqual(parse("2003.09.25"),
2964 datetime(2003, 9, 25))
2965
2966 def testDateWithDot2(self):
2967 self.assertEqual(parse("2003.Sep.25"),
2968 datetime(2003, 9, 25))
2969
2970 def testDateWithDot3(self):
2971 self.assertEqual(parse("25.Sep.2003"),
2972 datetime(2003, 9, 25))
2973
2974 def testDateWithDot4(self):
2975 self.assertEqual(parse("25.Sep.2003"),
2976 datetime(2003, 9, 25))
2977
2978 def testDateWithDot5(self):
2979 self.assertEqual(parse("Sep.25.2003"),
2980 datetime(2003, 9, 25))
2981
2982 def testDateWithDot6(self):
2983 self.assertEqual(parse("09.25.2003"),
2984 datetime(2003, 9, 25))
2985
2986 def testDateWithDot7(self):
2987 self.assertEqual(parse("25.09.2003"),
2988 datetime(2003, 9, 25))
2989
2990 def testDateWithDot8(self):
2991 self.assertEqual(parse("10.09.2003", dayfirst=True),
2992 datetime(2003, 9, 10))
2993
2994 def testDateWithDot9(self):
2995 self.assertEqual(parse("10.09.2003"),
2996 datetime(2003, 10, 9))
2997
2998 def testDateWithDot10(self):
2999 self.assertEqual(parse("10.09.03"),
3000 datetime(2003, 10, 9))
3001
3002 def testDateWithDot11(self):
3003 self.assertEqual(parse("10.09.03", yearfirst=True),
3004 datetime(2010, 9, 3))
3005
3006 def testDateWithSlash1(self):
3007 self.assertEqual(parse("2003/09/25"),
3008 datetime(2003, 9, 25))
3009
3010 def testDateWithSlash2(self):
3011 self.assertEqual(parse("2003/Sep/25"),
3012 datetime(2003, 9, 25))
3013
3014 def testDateWithSlash3(self):
3015 self.assertEqual(parse("25/Sep/2003"),
3016 datetime(2003, 9, 25))
3017
3018 def testDateWithSlash4(self):
3019 self.assertEqual(parse("25/Sep/2003"),
3020 datetime(2003, 9, 25))
3021
3022 def testDateWithSlash5(self):
3023 self.assertEqual(parse("Sep/25/2003"),
3024 datetime(2003, 9, 25))
3025
3026 def testDateWithSlash6(self):
3027 self.assertEqual(parse("09/25/2003"),
3028 datetime(2003, 9, 25))
3029
3030 def testDateWithSlash7(self):
3031 self.assertEqual(parse("25/09/2003"),
3032 datetime(2003, 9, 25))
3033
3034 def testDateWithSlash8(self):
3035 self.assertEqual(parse("10/09/2003", dayfirst=True),
3036 datetime(2003, 9, 10))
3037
3038 def testDateWithSlash9(self):
3039 self.assertEqual(parse("10/09/2003"),
3040 datetime(2003, 10, 9))
3041
3042 def testDateWithSlash10(self):
3043 self.assertEqual(parse("10/09/03"),
3044 datetime(2003, 10, 9))
3045
3046 def testDateWithSlash11(self):
3047 self.assertEqual(parse("10/09/03", yearfirst=True),
3048 datetime(2010, 9, 3))
3049
3050 def testDateWithSpace12(self):
3051 self.assertEqual(parse("25 09 03"),
3052 datetime(2003, 9, 25))
3053
3054 def testDateWithSpace13(self):
3055 self.assertEqual(parse("25 09 03"),
3056 datetime(2003, 9, 25))
3057
3058 def testDateWithSpace1(self):
3059 self.assertEqual(parse("2003 09 25"),
3060 datetime(2003, 9, 25))
3061
3062 def testDateWithSpace2(self):
3063 self.assertEqual(parse("2003 Sep 25"),
3064 datetime(2003, 9, 25))
3065
3066 def testDateWithSpace3(self):
3067 self.assertEqual(parse("25 Sep 2003"),
3068 datetime(2003, 9, 25))
3069
3070 def testDateWithSpace4(self):
3071 self.assertEqual(parse("25 Sep 2003"),
3072 datetime(2003, 9, 25))
3073
3074 def testDateWithSpace5(self):
3075 self.assertEqual(parse("Sep 25 2003"),
3076 datetime(2003, 9, 25))
3077
3078 def testDateWithSpace6(self):
3079 self.assertEqual(parse("09 25 2003"),
3080 datetime(2003, 9, 25))
3081
3082 def testDateWithSpace7(self):
3083 self.assertEqual(parse("25 09 2003"),
3084 datetime(2003, 9, 25))
3085
3086 def testDateWithSpace8(self):
3087 self.assertEqual(parse("10 09 2003", dayfirst=True),
3088 datetime(2003, 9, 10))
3089
3090 def testDateWithSpace9(self):
3091 self.assertEqual(parse("10 09 2003"),
3092 datetime(2003, 10, 9))
3093
3094 def testDateWithSpace10(self):
3095 self.assertEqual(parse("10 09 03"),
3096 datetime(2003, 10, 9))
3097
3098 def testDateWithSpace11(self):
3099 self.assertEqual(parse("10 09 03", yearfirst=True),
3100 datetime(2010, 9, 3))
3101
3102 def testDateWithSpace12(self):
3103 self.assertEqual(parse("25 09 03"),
3104 datetime(2003, 9, 25))
3105
3106 def testDateWithSpace13(self):
3107 self.assertEqual(parse("25 09 03"),
3108 datetime(2003, 9, 25))
3109
3110 def testStrangelyOrderedDate1(self):
3111 self.assertEqual(parse("03 25 Sep"),
3112 datetime(2003, 9, 25))
3113
3114 def testStrangelyOrderedDate2(self):
3115 self.assertEqual(parse("2003 25 Sep"),
3116 datetime(2003, 9, 25))
3117
3118 def testStrangelyOrderedDate3(self):
3119 self.assertEqual(parse("25 03 Sep"),
3120 datetime(2025, 9, 3))
3121
3122 def testHourWithLetters(self):
3123 self.assertEqual(parse("10h36m28.5s", default=self.default),
3124 datetime(2003, 9, 25, 10, 36, 28, 500000))
3125
3126 def testHourWithLettersStrip1(self):
3127 self.assertEqual(parse("10h36m28s", default=self.default),
3128 datetime(2003, 9, 25, 10, 36, 28))
3129
3130 def testHourWithLettersStrip1(self):
3131 self.assertEqual(parse("10h36m", default=self.default),
3132 datetime(2003, 9, 25, 10, 36))
3133
3134 def testHourWithLettersStrip2(self):
3135 self.assertEqual(parse("10h", default=self.default),
3136 datetime(2003, 9, 25, 10))
3137
3138 def testHourAmPm1(self):
3139 self.assertEqual(parse("10h am", default=self.default),
3140 datetime(2003, 9, 25, 10))
3141
3142 def testHourAmPm2(self):
3143 self.assertEqual(parse("10h pm", default=self.default),
3144 datetime(2003, 9, 25, 22))
3145
3146 def testHourAmPm3(self):
3147 self.assertEqual(parse("10am", default=self.default),
3148 datetime(2003, 9, 25, 10))
3149
3150 def testHourAmPm4(self):
3151 self.assertEqual(parse("10pm", default=self.default),
3152 datetime(2003, 9, 25, 22))
3153
3154 def testHourAmPm5(self):
3155 self.assertEqual(parse("10:00 am", default=self.default),
3156 datetime(2003, 9, 25, 10))
3157
3158 def testHourAmPm6(self):
3159 self.assertEqual(parse("10:00 pm", default=self.default),
3160 datetime(2003, 9, 25, 22))
3161
3162 def testHourAmPm7(self):
3163 self.assertEqual(parse("10:00am", default=self.default),
3164 datetime(2003, 9, 25, 10))
3165
3166 def testHourAmPm8(self):
3167 self.assertEqual(parse("10:00pm", default=self.default),
3168 datetime(2003, 9, 25, 22))
3169
3170 def testHourAmPm9(self):
3171 self.assertEqual(parse("10:00a.m", default=self.default),
3172 datetime(2003, 9, 25, 10))
3173
3174 def testHourAmPm10(self):
3175 self.assertEqual(parse("10:00p.m", default=self.default),
3176 datetime(2003, 9, 25, 22))
3177
3178 def testHourAmPm11(self):
3179 self.assertEqual(parse("10:00a.m.", default=self.default),
3180 datetime(2003, 9, 25, 10))
3181
3182 def testHourAmPm12(self):
3183 self.assertEqual(parse("10:00p.m.", default=self.default),
3184 datetime(2003, 9, 25, 22))
3185
3186 def testPertain(self):
3187 self.assertEqual(parse("Sep 03", default=self.default),
3188 datetime(2003, 9, 3))
3189 self.assertEqual(parse("Sep of 03", default=self.default),
3190 datetime(2003, 9, 25))
3191
3192 def testWeekdayAlone(self):
3193 self.assertEqual(parse("Wed", default=self.default),
3194 datetime(2003, 10, 1))
3195
3196 def testLongWeekday(self):
3197 self.assertEqual(parse("Wednesday", default=self.default),
3198 datetime(2003, 10, 1))
3199
3200 def testLongMonth(self):
3201 self.assertEqual(parse("October", default=self.default),
3202 datetime(2003, 10, 25))
niemeyer075fba22004-07-16 20:50:19 +00003203
3204 def testZeroYear(self):
3205 self.assertEqual(parse("31-Dec-00", default=self.default),
3206 datetime(2000, 12, 31))
niemeyer68ae2752003-09-28 01:20:02 +00003207
3208 def testFuzzy(self):
3209 s = "Today is 25 of September of 2003, exactly " \
3210 "at 10:49:41 with timezone -03:00."
3211 self.assertEqual(parse(s, fuzzy=True),
3212 datetime(2003, 9, 25, 10, 49, 41,
3213 tzinfo=self.brsttz))
3214
3215 def testExtraSpace(self):
3216 self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
3217 datetime(1976, 7, 4, 0, 1, 2))
3218
3219 def testRandomFormat1(self):
3220 self.assertEqual(parse("Wed, July 10, '96"),
3221 datetime(1996, 7, 10, 0, 0))
3222
3223 def testRandomFormat2(self):
3224 self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
3225 ignoretz=True),
3226 datetime(1996, 7, 10, 15, 8, 56))
3227
3228 def testRandomFormat3(self):
3229 self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
3230 datetime(1996, 7, 10, 12, 8))
3231
3232 def testRandomFormat4(self):
3233 self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
3234 ignoretz=True),
3235 datetime(1952, 4, 12, 15, 30, 42))
3236
3237 def testRandomFormat5(self):
3238 self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
3239 ignoretz=True),
3240 datetime(1994, 11, 5, 8, 15, 30))
3241
3242 def testRandomFormat6(self):
3243 self.assertEqual(parse("1994-11-05T08:15:30-05:00",
3244 ignoretz=True),
3245 datetime(1994, 11, 5, 8, 15, 30))
3246
3247 def testRandomFormat7(self):
3248 self.assertEqual(parse("1994-11-05T08:15:30Z",
3249 ignoretz=True),
3250 datetime(1994, 11, 5, 8, 15, 30))
3251
3252 def testRandomFormat8(self):
3253 self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
3254
3255 def testRandomFormat9(self):
3256 self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
3257
3258 def testRandomFormat10(self):
3259 self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
3260
3261 def testRandomFormat11(self):
3262 self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
3263
3264 def testRandomFormat12(self):
3265 self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
3266
3267 def testRandomFormat13(self):
3268 self.assertEqual(parse("0:01:02", default=self.default),
3269 datetime(2003, 9, 25, 0, 1, 2))
3270
3271 def testRandomFormat14(self):
3272 self.assertEqual(parse("12h 01m02s am", default=self.default),
3273 datetime(2003, 9, 25, 0, 1, 2))
3274
3275 def testRandomFormat15(self):
3276 self.assertEqual(parse("0:01:02 on July 4, 1976"),
3277 datetime(1976, 7, 4, 0, 1, 2))
3278
3279 def testRandomFormat16(self):
3280 self.assertEqual(parse("0:01:02 on July 4, 1976"),
3281 datetime(1976, 7, 4, 0, 1, 2))
3282
3283 def testRandomFormat17(self):
3284 self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
3285 datetime(1976, 7, 4, 0, 1, 2))
3286
3287 def testRandomFormat18(self):
3288 self.assertEqual(parse("July 4, 1976 12:01:02 am"),
3289 datetime(1976, 7, 4, 0, 1, 2))
3290
3291 def testRandomFormat19(self):
3292 self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
3293 datetime(1995, 1, 2, 4, 24, 27))
3294
3295 def testRandomFormat20(self):
3296 self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
3297 datetime(1995, 4, 4, 0, 22, 12))
3298
3299 def testRandomFormat21(self):
3300 self.assertEqual(parse("04.04.95 00:22"),
3301 datetime(1995, 4, 4, 0, 22))
3302
3303 def testRandomFormat22(self):
3304 self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
3305 datetime(1999, 1, 1, 11, 23, 34, 578000))
3306
3307 def testRandomFormat23(self):
3308 self.assertEqual(parse("950404 122212"),
3309 datetime(1995, 4, 4, 12, 22, 12))
3310
3311 def testRandomFormat24(self):
3312 self.assertEqual(parse("0:00 PM, PST", default=self.default,
3313 ignoretz=True),
3314 datetime(2003, 9, 25, 12, 0))
3315
3316 def testRandomFormat25(self):
3317 self.assertEqual(parse("12:08 PM", default=self.default),
3318 datetime(2003, 9, 25, 12, 8))
3319
3320 def testRandomFormat26(self):
3321 self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
3322 datetime(1990, 6, 13, 5, 50))
3323
3324 def testRandomFormat27(self):
3325 self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
3326
3327 def testRandomFormat28(self):
3328 self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
3329
3330 def testRandomFormat29(self):
3331 self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
3332
3333 def testRandomFormat30(self):
3334 self.assertEqual(parse("01h02m03", default=self.default),
3335 datetime(2003, 9, 25, 1, 2, 3))
3336
3337 def testRandomFormat31(self):
3338 self.assertEqual(parse("01h02", default=self.default),
3339 datetime(2003, 9, 25, 1, 2))
3340
3341 def testRandomFormat32(self):
3342 self.assertEqual(parse("01h02s", default=self.default),
3343 datetime(2003, 9, 25, 1, 0, 2))
3344
3345 def testRandomFormat33(self):
3346 self.assertEqual(parse("01m02", default=self.default),
3347 datetime(2003, 9, 25, 0, 1, 2))
3348
3349 def testRandomFormat34(self):
3350 self.assertEqual(parse("01m02h", default=self.default),
3351 datetime(2003, 9, 25, 2, 1))
3352
niemeyer091722d2003-10-10 20:37:11 +00003353 def testIncreasingCTime(self):
3354 # This test will check 200 different years, every month, every day,
niemeyer075fba22004-07-16 20:50:19 +00003355 # every hour, every minute, every second, and every weekday, using
niemeyer091722d2003-10-10 20:37:11 +00003356 # a delta of more or less 1 year, 1 month, 1 day, 1 minute and
3357 # 1 second.
3358 delta = timedelta(days=365+31+1, seconds=1+60+60*60)
3359 dt = datetime(1900, 1, 1, 0, 0, 0, 0)
3360 for i in range(200):
3361 self.assertEqual(parse(dt.ctime()), dt)
3362 dt += delta
3363
3364 def testIncreasingISOFormat(self):
3365 delta = timedelta(days=365+31+1, seconds=1+60+60*60)
3366 dt = datetime(1900, 1, 1, 0, 0, 0, 0)
3367 for i in range(200):
3368 self.assertEqual(parse(dt.isoformat()), dt)
3369 dt += delta
3370
niemeyer68ae2752003-09-28 01:20:02 +00003371class EasterTest(unittest.TestCase):
3372 easterlist = [
3373 # WESTERN ORTHODOX
3374 (date(1990, 4, 15), date(1990, 4, 15)),
3375 (date(1991, 3, 31), date(1991, 4, 7)),
3376 (date(1992, 4, 19), date(1992, 4, 26)),
3377 (date(1993, 4, 11), date(1993, 4, 18)),
3378 (date(1994, 4, 3), date(1994, 5, 1)),
3379 (date(1995, 4, 16), date(1995, 4, 23)),
3380 (date(1996, 4, 7), date(1996, 4, 14)),
3381 (date(1997, 3, 30), date(1997, 4, 27)),
3382 (date(1998, 4, 12), date(1998, 4, 19)),
3383 (date(1999, 4, 4), date(1999, 4, 11)),
3384
3385 (date(2000, 4, 23), date(2000, 4, 30)),
3386 (date(2001, 4, 15), date(2001, 4, 15)),
3387 (date(2002, 3, 31), date(2002, 5, 5)),
3388 (date(2003, 4, 20), date(2003, 4, 27)),
3389 (date(2004, 4, 11), date(2004, 4, 11)),
3390 (date(2005, 3, 27), date(2005, 5, 1)),
3391 (date(2006, 4, 16), date(2006, 4, 23)),
3392 (date(2007, 4, 8), date(2007, 4, 8)),
3393 (date(2008, 3, 23), date(2008, 4, 27)),
3394 (date(2009, 4, 12), date(2009, 4, 19)),
3395
3396 (date(2010, 4, 4), date(2010, 4, 4)),
3397 (date(2011, 4, 24), date(2011, 4, 24)),
3398 (date(2012, 4, 8), date(2012, 4, 15)),
3399 (date(2013, 3, 31), date(2013, 5, 5)),
3400 (date(2014, 4, 20), date(2014, 4, 20)),
3401 (date(2015, 4, 5), date(2015, 4, 12)),
3402 (date(2016, 3, 27), date(2016, 5, 1)),
3403 (date(2017, 4, 16), date(2017, 4, 16)),
3404 (date(2018, 4, 1), date(2018, 4, 8)),
3405 (date(2019, 4, 21), date(2019, 4, 28)),
3406
3407 (date(2020, 4, 12), date(2020, 4, 19)),
3408 (date(2021, 4, 4), date(2021, 5, 2)),
3409 (date(2022, 4, 17), date(2022, 4, 24)),
3410 (date(2023, 4, 9), date(2023, 4, 16)),
3411 (date(2024, 3, 31), date(2024, 5, 5)),
3412 (date(2025, 4, 20), date(2025, 4, 20)),
3413 (date(2026, 4, 5), date(2026, 4, 12)),
3414 (date(2027, 3, 28), date(2027, 5, 2)),
3415 (date(2028, 4, 16), date(2028, 4, 16)),
3416 (date(2029, 4, 1), date(2029, 4, 8)),
3417
3418 (date(2030, 4, 21), date(2030, 4, 28)),
3419 (date(2031, 4, 13), date(2031, 4, 13)),
3420 (date(2032, 3, 28), date(2032, 5, 2)),
3421 (date(2033, 4, 17), date(2033, 4, 24)),
3422 (date(2034, 4, 9), date(2034, 4, 9)),
3423 (date(2035, 3, 25), date(2035, 4, 29)),
3424 (date(2036, 4, 13), date(2036, 4, 20)),
3425 (date(2037, 4, 5), date(2037, 4, 5)),
3426 (date(2038, 4, 25), date(2038, 4, 25)),
3427 (date(2039, 4, 10), date(2039, 4, 17)),
3428
3429 (date(2040, 4, 1), date(2040, 5, 6)),
3430 (date(2041, 4, 21), date(2041, 4, 21)),
3431 (date(2042, 4, 6), date(2042, 4, 13)),
3432 (date(2043, 3, 29), date(2043, 5, 3)),
3433 (date(2044, 4, 17), date(2044, 4, 24)),
3434 (date(2045, 4, 9), date(2045, 4, 9)),
3435 (date(2046, 3, 25), date(2046, 4, 29)),
3436 (date(2047, 4, 14), date(2047, 4, 21)),
3437 (date(2048, 4, 5), date(2048, 4, 5)),
3438 (date(2049, 4, 18), date(2049, 4, 25)),
3439
3440 (date(2050, 4, 10), date(2050, 4, 17)),
3441 ]
3442
3443 def testEaster(self):
3444 for western, orthodox in self.easterlist:
3445 self.assertEqual(western, easter(western.year, EASTER_WESTERN))
3446 self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
3447
3448class TZTest(unittest.TestCase):
3449
niemeyer36139372003-10-07 01:48:15 +00003450 TZFILE_EST5EDT = """
niemeyer68ae2752003-09-28 01:20:02 +00003451VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
3452ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
3453S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
3454YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
3455yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
3456wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
34578uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
3458YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
3459BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
3460iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
3461znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
3462cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
3463Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
3464JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
3465jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
34664GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
3467b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
3468o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3469AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3470AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
3471AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3472AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
3473AEVQVAAAAAABAAAAAQ==
3474 """
3475
niemeyer36139372003-10-07 01:48:15 +00003476 TZICAL_EST5EDT = """
3477BEGIN:VTIMEZONE
3478TZID:US-Eastern
3479LAST-MODIFIED:19870101T000000Z
3480TZURL:http://zones.stds_r_us.net/tz/US-Eastern
3481BEGIN:STANDARD
3482DTSTART:19671029T020000
3483RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
3484TZOFFSETFROM:-0400
3485TZOFFSETTO:-0500
3486TZNAME:EST
3487END:STANDARD
3488BEGIN:DAYLIGHT
3489DTSTART:19870405T020000
3490RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
3491TZOFFSETFROM:-0500
3492TZOFFSETTO:-0400
3493TZNAME:EDT
3494END:DAYLIGHT
3495END:VTIMEZONE
3496 """
3497
niemeyer68ae2752003-09-28 01:20:02 +00003498 def testStrStart1(self):
3499 self.assertEqual(datetime(2003,4,6,1,59,
3500 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3501 self.assertEqual(datetime(2003,4,6,2,00,
3502 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3503
3504 def testStrEnd1(self):
3505 self.assertEqual(datetime(2003,10,26,0,59,
3506 tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3507 self.assertEqual(datetime(2003,10,26,1,00,
3508 tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3509
3510 def testStrStart2(self):
3511 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3512 self.assertEqual(datetime(2003,4,6,1,59,
3513 tzinfo=tzstr(s)).tzname(), "EST")
3514 self.assertEqual(datetime(2003,4,6,2,00,
3515 tzinfo=tzstr(s)).tzname(), "EDT")
3516
3517 def testStrEnd2(self):
3518 s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3519 self.assertEqual(datetime(2003,10,26,0,59,
3520 tzinfo=tzstr(s)).tzname(), "EDT")
3521 self.assertEqual(datetime(2003,10,26,1,00,
3522 tzinfo=tzstr(s)).tzname(), "EST")
3523
3524 def testStrStart3(self):
3525 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3526 self.assertEqual(datetime(2003,4,6,1,59,
3527 tzinfo=tzstr(s)).tzname(), "EST")
3528 self.assertEqual(datetime(2003,4,6,2,00,
3529 tzinfo=tzstr(s)).tzname(), "EDT")
3530
3531 def testStrEnd3(self):
3532 s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3533 self.assertEqual(datetime(2003,10,26,0,59,
3534 tzinfo=tzstr(s)).tzname(), "EDT")
3535 self.assertEqual(datetime(2003,10,26,1,00,
3536 tzinfo=tzstr(s)).tzname(), "EST")
3537
3538 def testStrStart4(self):
3539 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3540 self.assertEqual(datetime(2003,4,6,1,59,
3541 tzinfo=tzstr(s)).tzname(), "EST")
3542 self.assertEqual(datetime(2003,4,6,2,00,
3543 tzinfo=tzstr(s)).tzname(), "EDT")
3544
3545 def testStrEnd4(self):
3546 s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3547 self.assertEqual(datetime(2003,10,26,0,59,
3548 tzinfo=tzstr(s)).tzname(), "EDT")
3549 self.assertEqual(datetime(2003,10,26,1,00,
3550 tzinfo=tzstr(s)).tzname(), "EST")
3551
3552 def testStrStart5(self):
3553 s = "EST5EDT4,95/02:00:00,298/02:00"
3554 self.assertEqual(datetime(2003,4,6,1,59,
3555 tzinfo=tzstr(s)).tzname(), "EST")
3556 self.assertEqual(datetime(2003,4,6,2,00,
3557 tzinfo=tzstr(s)).tzname(), "EDT")
3558
3559 def testStrEnd5(self):
3560 s = "EST5EDT4,95/02:00:00,298/02"
3561 self.assertEqual(datetime(2003,10,26,0,59,
3562 tzinfo=tzstr(s)).tzname(), "EDT")
3563 self.assertEqual(datetime(2003,10,26,1,00,
3564 tzinfo=tzstr(s)).tzname(), "EST")
3565
3566 def testStrStart6(self):
3567 s = "EST5EDT4,J96/02:00:00,J299/02:00"
3568 self.assertEqual(datetime(2003,4,6,1,59,
3569 tzinfo=tzstr(s)).tzname(), "EST")
3570 self.assertEqual(datetime(2003,4,6,2,00,
3571 tzinfo=tzstr(s)).tzname(), "EDT")
3572
3573 def testStrEnd6(self):
3574 s = "EST5EDT4,J96/02:00:00,J299/02"
3575 self.assertEqual(datetime(2003,10,26,0,59,
3576 tzinfo=tzstr(s)).tzname(), "EDT")
3577 self.assertEqual(datetime(2003,10,26,1,00,
3578 tzinfo=tzstr(s)).tzname(), "EST")
3579
3580 def testStrCmp1(self):
3581 self.assertEqual(tzstr("EST5EDT"),
3582 tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
3583
3584 def testStrCmp2(self):
3585 self.assertEqual(tzstr("EST5EDT"),
3586 tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
3587
3588 def testRangeCmp1(self):
3589 self.assertEqual(tzstr("EST5EDT"),
3590 tzrange("EST", -18000, "EDT", -14400,
3591 relativedelta(hours=+2,
3592 month=4, day=1,
niemeyerb47d12a2003-09-29 20:00:21 +00003593 weekday=SU(+1)),
niemeyer68ae2752003-09-28 01:20:02 +00003594 relativedelta(hours=+1,
3595 month=10, day=31,
niemeyerb47d12a2003-09-29 20:00:21 +00003596 weekday=SU(-1))))
niemeyer68ae2752003-09-28 01:20:02 +00003597
3598 def testRangeCmp2(self):
3599 self.assertEqual(tzstr("EST5EDT"),
3600 tzrange("EST", -18000, "EDT"))
3601
3602 def testFileStart1(self):
niemeyer36139372003-10-07 01:48:15 +00003603 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
niemeyer68ae2752003-09-28 01:20:02 +00003604 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3605 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3606
3607 def testFileEnd1(self):
niemeyer36139372003-10-07 01:48:15 +00003608 tz = tzfile(StringIO(base64.decodestring(self.TZFILE_EST5EDT)))
3609 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3610 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3611
3612 def testICalStart1(self):
3613 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
3614 self.assertEqual(datetime(2003,4,6,1,59,tzinfo=tz).tzname(), "EST")
3615 self.assertEqual(datetime(2003,4,6,2,00,tzinfo=tz).tzname(), "EDT")
3616
3617 def testICalEnd1(self):
3618 tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
niemeyer68ae2752003-09-28 01:20:02 +00003619 self.assertEqual(datetime(2003,10,26,0,59,tzinfo=tz).tzname(), "EDT")
3620 self.assertEqual(datetime(2003,10,26,1,00,tzinfo=tz).tzname(), "EST")
3621
3622if __name__ == "__main__":
3623 unittest.main()
3624
3625# vim:ts=4:sw=4