python-dateutil 2.4.1__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4108 @@
1
+ # -*- coding: utf-8 -*-
2
+ from __future__ import unicode_literals
3
+
4
+ import calendar
5
+ import base64
6
+ import sys
7
+
8
+ from six import StringIO, BytesIO, PY3
9
+
10
+ try:
11
+ # python2.6 unittest has no skipUnless. So we use unittest2.
12
+ # if you have python >= 2.7, you don't need unittest2, but it won't harm
13
+ import unittest2 as unittest
14
+ except ImportError:
15
+ import unittest
16
+
17
+ MISSING_TARBALL = ("This test fails if you don't have the dateutil "
18
+ "timezone file installed. Please read the README")
19
+
20
+ from datetime import *
21
+
22
+ from dateutil.relativedelta import *
23
+ from dateutil.parser import *
24
+ from dateutil.easter import *
25
+ from dateutil.rrule import *
26
+ from dateutil.tz import *
27
+ from dateutil import zoneinfo
28
+
29
+ try:
30
+ from dateutil import tzwin
31
+ except ImportError:
32
+ pass
33
+
34
+
35
+ class RelativeDeltaTest(unittest.TestCase):
36
+ now = datetime(2003, 9, 17, 20, 54, 47, 282310)
37
+ today = date(2003, 9, 17)
38
+
39
+ def testNextMonth(self):
40
+ self.assertEqual(self.now+relativedelta(months=+1),
41
+ datetime(2003, 10, 17, 20, 54, 47, 282310))
42
+
43
+ def testNextMonthPlusOneWeek(self):
44
+ self.assertEqual(self.now+relativedelta(months=+1, weeks=+1),
45
+ datetime(2003, 10, 24, 20, 54, 47, 282310))
46
+
47
+ def testNextMonthPlusOneWeek10am(self):
48
+ self.assertEqual(self.today +
49
+ relativedelta(months=+1, weeks=+1, hour=10),
50
+ datetime(2003, 10, 24, 10, 0))
51
+
52
+ def testNextMonthPlusOneWeek10amDiff(self):
53
+ self.assertEqual(relativedelta(datetime(2003, 10, 24, 10, 0),
54
+ self.today),
55
+ relativedelta(months=+1, days=+7, hours=+10))
56
+
57
+ def testOneMonthBeforeOneYear(self):
58
+ self.assertEqual(self.now+relativedelta(years=+1, months=-1),
59
+ datetime(2004, 8, 17, 20, 54, 47, 282310))
60
+
61
+ def testMonthsOfDiffNumOfDays(self):
62
+ self.assertEqual(date(2003, 1, 27)+relativedelta(months=+1),
63
+ date(2003, 2, 27))
64
+ self.assertEqual(date(2003, 1, 31)+relativedelta(months=+1),
65
+ date(2003, 2, 28))
66
+ self.assertEqual(date(2003, 1, 31)+relativedelta(months=+2),
67
+ date(2003, 3, 31))
68
+
69
+ def testMonthsOfDiffNumOfDaysWithYears(self):
70
+ self.assertEqual(date(2000, 2, 28)+relativedelta(years=+1),
71
+ date(2001, 2, 28))
72
+ self.assertEqual(date(2000, 2, 29)+relativedelta(years=+1),
73
+ date(2001, 2, 28))
74
+
75
+ self.assertEqual(date(1999, 2, 28)+relativedelta(years=+1),
76
+ date(2000, 2, 28))
77
+ self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
78
+ date(2000, 3, 1))
79
+ self.assertEqual(date(1999, 3, 1)+relativedelta(years=+1),
80
+ date(2000, 3, 1))
81
+
82
+ self.assertEqual(date(2001, 2, 28)+relativedelta(years=-1),
83
+ date(2000, 2, 28))
84
+ self.assertEqual(date(2001, 3, 1)+relativedelta(years=-1),
85
+ date(2000, 3, 1))
86
+
87
+ def testNextFriday(self):
88
+ self.assertEqual(self.today+relativedelta(weekday=FR),
89
+ date(2003, 9, 19))
90
+
91
+ def testNextFridayInt(self):
92
+ self.assertEqual(self.today+relativedelta(weekday=calendar.FRIDAY),
93
+ date(2003, 9, 19))
94
+
95
+ def testLastFridayInThisMonth(self):
96
+ self.assertEqual(self.today+relativedelta(day=31, weekday=FR(-1)),
97
+ date(2003, 9, 26))
98
+
99
+ def testNextWednesdayIsToday(self):
100
+ self.assertEqual(self.today+relativedelta(weekday=WE),
101
+ date(2003, 9, 17))
102
+
103
+ def testNextWenesdayNotToday(self):
104
+ self.assertEqual(self.today+relativedelta(days=+1, weekday=WE),
105
+ date(2003, 9, 24))
106
+
107
+ def test15thISOYearWeek(self):
108
+ self.assertEqual(date(2003, 1, 1) +
109
+ relativedelta(day=4, weeks=+14, weekday=MO(-1)),
110
+ date(2003, 4, 7))
111
+
112
+ def testMillenniumAge(self):
113
+ self.assertEqual(relativedelta(self.now, date(2001, 1, 1)),
114
+ relativedelta(years=+2, months=+8, days=+16,
115
+ hours=+20, minutes=+54, seconds=+47,
116
+ microseconds=+282310))
117
+
118
+ def testJohnAge(self):
119
+ self.assertEqual(relativedelta(self.now,
120
+ datetime(1978, 4, 5, 12, 0)),
121
+ relativedelta(years=+25, months=+5, days=+12,
122
+ hours=+8, minutes=+54, seconds=+47,
123
+ microseconds=+282310))
124
+
125
+ def testJohnAgeWithDate(self):
126
+ self.assertEqual(relativedelta(self.today,
127
+ datetime(1978, 4, 5, 12, 0)),
128
+ relativedelta(years=+25, months=+5, days=+11,
129
+ hours=+12))
130
+
131
+ def testYearDay(self):
132
+ self.assertEqual(date(2003, 1, 1)+relativedelta(yearday=260),
133
+ date(2003, 9, 17))
134
+ self.assertEqual(date(2002, 1, 1)+relativedelta(yearday=260),
135
+ date(2002, 9, 17))
136
+ self.assertEqual(date(2000, 1, 1)+relativedelta(yearday=260),
137
+ date(2000, 9, 16))
138
+ self.assertEqual(self.today+relativedelta(yearday=261),
139
+ date(2003, 9, 18))
140
+
141
+ def testYearDayBug(self):
142
+ # Tests a problem reported by Adam Ryan.
143
+ self.assertEqual(date(2010, 1, 1)+relativedelta(yearday=15),
144
+ date(2010, 1, 15))
145
+
146
+ def testNonLeapYearDay(self):
147
+ self.assertEqual(date(2003, 1, 1)+relativedelta(nlyearday=260),
148
+ date(2003, 9, 17))
149
+ self.assertEqual(date(2002, 1, 1)+relativedelta(nlyearday=260),
150
+ date(2002, 9, 17))
151
+ self.assertEqual(date(2000, 1, 1)+relativedelta(nlyearday=260),
152
+ date(2000, 9, 17))
153
+ self.assertEqual(self.today+relativedelta(yearday=261),
154
+ date(2003, 9, 18))
155
+
156
+ def testAddition(self):
157
+ self.assertEqual(relativedelta(days=10) +
158
+ relativedelta(years=1, months=2, days=3, hours=4,
159
+ minutes=5, microseconds=6),
160
+ relativedelta(years=1, months=2, days=13, hours=4,
161
+ minutes=5, microseconds=6))
162
+
163
+ def testAdditionToDatetime(self):
164
+ self.assertEqual(datetime(2000, 1, 1) + relativedelta(days=1),
165
+ datetime(2000, 1, 2))
166
+
167
+ def testRightAdditionToDatetime(self):
168
+ self.assertEqual(relativedelta(days=1) + datetime(2000, 1, 1),
169
+ datetime(2000, 1, 2))
170
+
171
+ def testSubtraction(self):
172
+ self.assertEqual(relativedelta(days=10) -
173
+ relativedelta(years=1, months=2, days=3, hours=4,
174
+ minutes=5, microseconds=6),
175
+ relativedelta(years=-1, months=-2, days=7, hours=-4,
176
+ minutes=-5, microseconds=-6))
177
+
178
+ def testRightSubtractionFromDatetime(self):
179
+ self.assertEqual(datetime(2000, 1, 2) - relativedelta(days=1),
180
+ datetime(2000, 1, 1))
181
+
182
+ def testSubractionWithDatetime(self):
183
+ self.assertRaises(TypeError, lambda x, y: x - y,
184
+ (relativedelta(days=1), datetime(2000, 1, 1)))
185
+
186
+ def testMultiplication(self):
187
+ self.assertEqual(datetime(2000, 1, 1) + relativedelta(days=1) * 28,
188
+ datetime(2000, 1, 29))
189
+ self.assertEqual(datetime(2000, 1, 1) + 28 * relativedelta(days=1),
190
+ datetime(2000, 1, 29))
191
+
192
+ def testDivision(self):
193
+ self.assertEqual(datetime(2000, 1, 1) + relativedelta(days=28) / 28,
194
+ datetime(2000, 1, 2))
195
+
196
+ def testBoolean(self):
197
+ self.assertFalse(relativedelta(days=0))
198
+ self.assertTrue(relativedelta(days=1))
199
+
200
+
201
+ class RRuleTest(unittest.TestCase):
202
+ def testYearly(self):
203
+ self.assertEqual(list(rrule(YEARLY,
204
+ count=3,
205
+ dtstart=datetime(1997, 9, 2, 9, 0))),
206
+ [datetime(1997, 9, 2, 9, 0),
207
+ datetime(1998, 9, 2, 9, 0),
208
+ datetime(1999, 9, 2, 9, 0)])
209
+
210
+ def testYearlyInterval(self):
211
+ self.assertEqual(list(rrule(YEARLY,
212
+ count=3,
213
+ interval=2,
214
+ dtstart=datetime(1997, 9, 2, 9, 0))),
215
+ [datetime(1997, 9, 2, 9, 0),
216
+ datetime(1999, 9, 2, 9, 0),
217
+ datetime(2001, 9, 2, 9, 0)])
218
+
219
+ def testYearlyIntervalLarge(self):
220
+ self.assertEqual(list(rrule(YEARLY,
221
+ count=3,
222
+ interval=100,
223
+ dtstart=datetime(1997, 9, 2, 9, 0))),
224
+ [datetime(1997, 9, 2, 9, 0),
225
+ datetime(2097, 9, 2, 9, 0),
226
+ datetime(2197, 9, 2, 9, 0)])
227
+
228
+ def testYearlyByMonth(self):
229
+ self.assertEqual(list(rrule(YEARLY,
230
+ count=3,
231
+ bymonth=(1, 3),
232
+ dtstart=datetime(1997, 9, 2, 9, 0))),
233
+ [datetime(1998, 1, 2, 9, 0),
234
+ datetime(1998, 3, 2, 9, 0),
235
+ datetime(1999, 1, 2, 9, 0)])
236
+
237
+ def testYearlyByMonthDay(self):
238
+ self.assertEqual(list(rrule(YEARLY,
239
+ count=3,
240
+ bymonthday=(1, 3),
241
+ dtstart=datetime(1997, 9, 2, 9, 0))),
242
+ [datetime(1997, 9, 3, 9, 0),
243
+ datetime(1997, 10, 1, 9, 0),
244
+ datetime(1997, 10, 3, 9, 0)])
245
+
246
+ def testYearlyByMonthAndMonthDay(self):
247
+ self.assertEqual(list(rrule(YEARLY,
248
+ count=3,
249
+ bymonth=(1, 3),
250
+ bymonthday=(5, 7),
251
+ dtstart=datetime(1997, 9, 2, 9, 0))),
252
+ [datetime(1998, 1, 5, 9, 0),
253
+ datetime(1998, 1, 7, 9, 0),
254
+ datetime(1998, 3, 5, 9, 0)])
255
+
256
+ def testYearlyByWeekDay(self):
257
+ self.assertEqual(list(rrule(YEARLY,
258
+ count=3,
259
+ byweekday=(TU, TH),
260
+ dtstart=datetime(1997, 9, 2, 9, 0))),
261
+ [datetime(1997, 9, 2, 9, 0),
262
+ datetime(1997, 9, 4, 9, 0),
263
+ datetime(1997, 9, 9, 9, 0)])
264
+
265
+ def testYearlyByNWeekDay(self):
266
+ self.assertEqual(list(rrule(YEARLY,
267
+ count=3,
268
+ byweekday=(TU(1), TH(-1)),
269
+ dtstart=datetime(1997, 9, 2, 9, 0))),
270
+ [datetime(1997, 12, 25, 9, 0),
271
+ datetime(1998, 1, 6, 9, 0),
272
+ datetime(1998, 12, 31, 9, 0)])
273
+
274
+ def testYearlyByNWeekDayLarge(self):
275
+ self.assertEqual(list(rrule(YEARLY,
276
+ count=3,
277
+ byweekday=(TU(3), TH(-3)),
278
+ dtstart=datetime(1997, 9, 2, 9, 0))),
279
+ [datetime(1997, 12, 11, 9, 0),
280
+ datetime(1998, 1, 20, 9, 0),
281
+ datetime(1998, 12, 17, 9, 0)])
282
+
283
+ def testYearlyByMonthAndWeekDay(self):
284
+ self.assertEqual(list(rrule(YEARLY,
285
+ count=3,
286
+ bymonth=(1, 3),
287
+ byweekday=(TU, TH),
288
+ dtstart=datetime(1997, 9, 2, 9, 0))),
289
+ [datetime(1998, 1, 1, 9, 0),
290
+ datetime(1998, 1, 6, 9, 0),
291
+ datetime(1998, 1, 8, 9, 0)])
292
+
293
+ def testYearlyByMonthAndNWeekDay(self):
294
+ self.assertEqual(list(rrule(YEARLY,
295
+ count=3,
296
+ bymonth=(1, 3),
297
+ byweekday=(TU(1), TH(-1)),
298
+ dtstart=datetime(1997, 9, 2, 9, 0))),
299
+ [datetime(1998, 1, 6, 9, 0),
300
+ datetime(1998, 1, 29, 9, 0),
301
+ datetime(1998, 3, 3, 9, 0)])
302
+
303
+ def testYearlyByMonthAndNWeekDayLarge(self):
304
+ # This is interesting because the TH(-3) ends up before
305
+ # the TU(3).
306
+ self.assertEqual(list(rrule(YEARLY,
307
+ count=3,
308
+ bymonth=(1, 3),
309
+ byweekday=(TU(3), TH(-3)),
310
+ dtstart=datetime(1997, 9, 2, 9, 0))),
311
+ [datetime(1998, 1, 15, 9, 0),
312
+ datetime(1998, 1, 20, 9, 0),
313
+ datetime(1998, 3, 12, 9, 0)])
314
+
315
+ def testYearlyByMonthDayAndWeekDay(self):
316
+ self.assertEqual(list(rrule(YEARLY,
317
+ count=3,
318
+ bymonthday=(1, 3),
319
+ byweekday=(TU, TH),
320
+ dtstart=datetime(1997, 9, 2, 9, 0))),
321
+ [datetime(1998, 1, 1, 9, 0),
322
+ datetime(1998, 2, 3, 9, 0),
323
+ datetime(1998, 3, 3, 9, 0)])
324
+
325
+ def testYearlyByMonthAndMonthDayAndWeekDay(self):
326
+ self.assertEqual(list(rrule(YEARLY,
327
+ count=3,
328
+ bymonth=(1, 3),
329
+ bymonthday=(1, 3),
330
+ byweekday=(TU, TH),
331
+ dtstart=datetime(1997, 9, 2, 9, 0))),
332
+ [datetime(1998, 1, 1, 9, 0),
333
+ datetime(1998, 3, 3, 9, 0),
334
+ datetime(2001, 3, 1, 9, 0)])
335
+
336
+ def testYearlyByYearDay(self):
337
+ self.assertEqual(list(rrule(YEARLY,
338
+ count=4,
339
+ byyearday=(1, 100, 200, 365),
340
+ dtstart=datetime(1997, 9, 2, 9, 0))),
341
+ [datetime(1997, 12, 31, 9, 0),
342
+ datetime(1998, 1, 1, 9, 0),
343
+ datetime(1998, 4, 10, 9, 0),
344
+ datetime(1998, 7, 19, 9, 0)])
345
+
346
+ def testYearlyByYearDayNeg(self):
347
+ self.assertEqual(list(rrule(YEARLY,
348
+ count=4,
349
+ byyearday=(-365, -266, -166, -1),
350
+ dtstart=datetime(1997, 9, 2, 9, 0))),
351
+ [datetime(1997, 12, 31, 9, 0),
352
+ datetime(1998, 1, 1, 9, 0),
353
+ datetime(1998, 4, 10, 9, 0),
354
+ datetime(1998, 7, 19, 9, 0)])
355
+
356
+ def testYearlyByMonthAndYearDay(self):
357
+ self.assertEqual(list(rrule(YEARLY,
358
+ count=4,
359
+ bymonth=(4, 7),
360
+ byyearday=(1, 100, 200, 365),
361
+ dtstart=datetime(1997, 9, 2, 9, 0))),
362
+ [datetime(1998, 4, 10, 9, 0),
363
+ datetime(1998, 7, 19, 9, 0),
364
+ datetime(1999, 4, 10, 9, 0),
365
+ datetime(1999, 7, 19, 9, 0)])
366
+
367
+ def testYearlyByMonthAndYearDayNeg(self):
368
+ self.assertEqual(list(rrule(YEARLY,
369
+ count=4,
370
+ bymonth=(4, 7),
371
+ byyearday=(-365, -266, -166, -1),
372
+ dtstart=datetime(1997, 9, 2, 9, 0))),
373
+ [datetime(1998, 4, 10, 9, 0),
374
+ datetime(1998, 7, 19, 9, 0),
375
+ datetime(1999, 4, 10, 9, 0),
376
+ datetime(1999, 7, 19, 9, 0)])
377
+
378
+ def testYearlyByWeekNo(self):
379
+ self.assertEqual(list(rrule(YEARLY,
380
+ count=3,
381
+ byweekno=20,
382
+ dtstart=datetime(1997, 9, 2, 9, 0))),
383
+ [datetime(1998, 5, 11, 9, 0),
384
+ datetime(1998, 5, 12, 9, 0),
385
+ datetime(1998, 5, 13, 9, 0)])
386
+
387
+ def testYearlyByWeekNoAndWeekDay(self):
388
+ # That's a nice one. The first days of week number one
389
+ # may be in the last year.
390
+ self.assertEqual(list(rrule(YEARLY,
391
+ count=3,
392
+ byweekno=1,
393
+ byweekday=MO,
394
+ dtstart=datetime(1997, 9, 2, 9, 0))),
395
+ [datetime(1997, 12, 29, 9, 0),
396
+ datetime(1999, 1, 4, 9, 0),
397
+ datetime(2000, 1, 3, 9, 0)])
398
+
399
+ def testYearlyByWeekNoAndWeekDayLarge(self):
400
+ # Another nice test. The last days of week number 52/53
401
+ # may be in the next year.
402
+ self.assertEqual(list(rrule(YEARLY,
403
+ count=3,
404
+ byweekno=52,
405
+ byweekday=SU,
406
+ dtstart=datetime(1997, 9, 2, 9, 0))),
407
+ [datetime(1997, 12, 28, 9, 0),
408
+ datetime(1998, 12, 27, 9, 0),
409
+ datetime(2000, 1, 2, 9, 0)])
410
+
411
+ def testYearlyByWeekNoAndWeekDayLast(self):
412
+ self.assertEqual(list(rrule(YEARLY,
413
+ count=3,
414
+ byweekno=-1,
415
+ byweekday=SU,
416
+ dtstart=datetime(1997, 9, 2, 9, 0))),
417
+ [datetime(1997, 12, 28, 9, 0),
418
+ datetime(1999, 1, 3, 9, 0),
419
+ datetime(2000, 1, 2, 9, 0)])
420
+
421
+ def testYearlyByEaster(self):
422
+ self.assertEqual(list(rrule(YEARLY,
423
+ count=3,
424
+ byeaster=0,
425
+ dtstart=datetime(1997, 9, 2, 9, 0))),
426
+ [datetime(1998, 4, 12, 9, 0),
427
+ datetime(1999, 4, 4, 9, 0),
428
+ datetime(2000, 4, 23, 9, 0)])
429
+
430
+ def testYearlyByEasterPos(self):
431
+ self.assertEqual(list(rrule(YEARLY,
432
+ count=3,
433
+ byeaster=1,
434
+ dtstart=datetime(1997, 9, 2, 9, 0))),
435
+ [datetime(1998, 4, 13, 9, 0),
436
+ datetime(1999, 4, 5, 9, 0),
437
+ datetime(2000, 4, 24, 9, 0)])
438
+
439
+ def testYearlyByEasterNeg(self):
440
+ self.assertEqual(list(rrule(YEARLY,
441
+ count=3,
442
+ byeaster=-1,
443
+ dtstart=datetime(1997, 9, 2, 9, 0))),
444
+ [datetime(1998, 4, 11, 9, 0),
445
+ datetime(1999, 4, 3, 9, 0),
446
+ datetime(2000, 4, 22, 9, 0)])
447
+
448
+ def testYearlyByWeekNoAndWeekDay53(self):
449
+ self.assertEqual(list(rrule(YEARLY,
450
+ count=3,
451
+ byweekno=53,
452
+ byweekday=MO,
453
+ dtstart=datetime(1997, 9, 2, 9, 0))),
454
+ [datetime(1998, 12, 28, 9, 0),
455
+ datetime(2004, 12, 27, 9, 0),
456
+ datetime(2009, 12, 28, 9, 0)])
457
+
458
+ def testYearlyByHour(self):
459
+ self.assertEqual(list(rrule(YEARLY,
460
+ count=3,
461
+ byhour=(6, 18),
462
+ dtstart=datetime(1997, 9, 2, 9, 0))),
463
+ [datetime(1997, 9, 2, 18, 0),
464
+ datetime(1998, 9, 2, 6, 0),
465
+ datetime(1998, 9, 2, 18, 0)])
466
+
467
+ def testYearlyByMinute(self):
468
+ self.assertEqual(list(rrule(YEARLY,
469
+ count=3,
470
+ byminute=(6, 18),
471
+ dtstart=datetime(1997, 9, 2, 9, 0))),
472
+ [datetime(1997, 9, 2, 9, 6),
473
+ datetime(1997, 9, 2, 9, 18),
474
+ datetime(1998, 9, 2, 9, 6)])
475
+
476
+ def testYearlyBySecond(self):
477
+ self.assertEqual(list(rrule(YEARLY,
478
+ count=3,
479
+ bysecond=(6, 18),
480
+ dtstart=datetime(1997, 9, 2, 9, 0))),
481
+ [datetime(1997, 9, 2, 9, 0, 6),
482
+ datetime(1997, 9, 2, 9, 0, 18),
483
+ datetime(1998, 9, 2, 9, 0, 6)])
484
+
485
+ def testYearlyByHourAndMinute(self):
486
+ self.assertEqual(list(rrule(YEARLY,
487
+ count=3,
488
+ byhour=(6, 18),
489
+ byminute=(6, 18),
490
+ dtstart=datetime(1997, 9, 2, 9, 0))),
491
+ [datetime(1997, 9, 2, 18, 6),
492
+ datetime(1997, 9, 2, 18, 18),
493
+ datetime(1998, 9, 2, 6, 6)])
494
+
495
+ def testYearlyByHourAndSecond(self):
496
+ self.assertEqual(list(rrule(YEARLY,
497
+ count=3,
498
+ byhour=(6, 18),
499
+ bysecond=(6, 18),
500
+ dtstart=datetime(1997, 9, 2, 9, 0))),
501
+ [datetime(1997, 9, 2, 18, 0, 6),
502
+ datetime(1997, 9, 2, 18, 0, 18),
503
+ datetime(1998, 9, 2, 6, 0, 6)])
504
+
505
+ def testYearlyByMinuteAndSecond(self):
506
+ self.assertEqual(list(rrule(YEARLY,
507
+ count=3,
508
+ byminute=(6, 18),
509
+ bysecond=(6, 18),
510
+ dtstart=datetime(1997, 9, 2, 9, 0))),
511
+ [datetime(1997, 9, 2, 9, 6, 6),
512
+ datetime(1997, 9, 2, 9, 6, 18),
513
+ datetime(1997, 9, 2, 9, 18, 6)])
514
+
515
+ def testYearlyByHourAndMinuteAndSecond(self):
516
+ self.assertEqual(list(rrule(YEARLY,
517
+ count=3,
518
+ byhour=(6, 18),
519
+ byminute=(6, 18),
520
+ bysecond=(6, 18),
521
+ dtstart=datetime(1997, 9, 2, 9, 0))),
522
+ [datetime(1997, 9, 2, 18, 6, 6),
523
+ datetime(1997, 9, 2, 18, 6, 18),
524
+ datetime(1997, 9, 2, 18, 18, 6)])
525
+
526
+ def testYearlyBySetPos(self):
527
+ self.assertEqual(list(rrule(YEARLY,
528
+ count=3,
529
+ bymonthday=15,
530
+ byhour=(6, 18),
531
+ bysetpos=(3, -3),
532
+ dtstart=datetime(1997, 9, 2, 9, 0))),
533
+ [datetime(1997, 11, 15, 18, 0),
534
+ datetime(1998, 2, 15, 6, 0),
535
+ datetime(1998, 11, 15, 18, 0)])
536
+
537
+ def testMonthly(self):
538
+ self.assertEqual(list(rrule(MONTHLY,
539
+ count=3,
540
+ dtstart=datetime(1997, 9, 2, 9, 0))),
541
+ [datetime(1997, 9, 2, 9, 0),
542
+ datetime(1997, 10, 2, 9, 0),
543
+ datetime(1997, 11, 2, 9, 0)])
544
+
545
+ def testMonthlyInterval(self):
546
+ self.assertEqual(list(rrule(MONTHLY,
547
+ count=3,
548
+ interval=2,
549
+ dtstart=datetime(1997, 9, 2, 9, 0))),
550
+ [datetime(1997, 9, 2, 9, 0),
551
+ datetime(1997, 11, 2, 9, 0),
552
+ datetime(1998, 1, 2, 9, 0)])
553
+
554
+ def testMonthlyIntervalLarge(self):
555
+ self.assertEqual(list(rrule(MONTHLY,
556
+ count=3,
557
+ interval=18,
558
+ dtstart=datetime(1997, 9, 2, 9, 0))),
559
+ [datetime(1997, 9, 2, 9, 0),
560
+ datetime(1999, 3, 2, 9, 0),
561
+ datetime(2000, 9, 2, 9, 0)])
562
+
563
+ def testMonthlyByMonth(self):
564
+ self.assertEqual(list(rrule(MONTHLY,
565
+ count=3,
566
+ bymonth=(1, 3),
567
+ dtstart=datetime(1997, 9, 2, 9, 0))),
568
+ [datetime(1998, 1, 2, 9, 0),
569
+ datetime(1998, 3, 2, 9, 0),
570
+ datetime(1999, 1, 2, 9, 0)])
571
+
572
+ def testMonthlyByMonthDay(self):
573
+ self.assertEqual(list(rrule(MONTHLY,
574
+ count=3,
575
+ bymonthday=(1, 3),
576
+ dtstart=datetime(1997, 9, 2, 9, 0))),
577
+ [datetime(1997, 9, 3, 9, 0),
578
+ datetime(1997, 10, 1, 9, 0),
579
+ datetime(1997, 10, 3, 9, 0)])
580
+
581
+ def testMonthlyByMonthAndMonthDay(self):
582
+ self.assertEqual(list(rrule(MONTHLY,
583
+ count=3,
584
+ bymonth=(1, 3),
585
+ bymonthday=(5, 7),
586
+ dtstart=datetime(1997, 9, 2, 9, 0))),
587
+ [datetime(1998, 1, 5, 9, 0),
588
+ datetime(1998, 1, 7, 9, 0),
589
+ datetime(1998, 3, 5, 9, 0)])
590
+
591
+ def testMonthlyByWeekDay(self):
592
+ self.assertEqual(list(rrule(MONTHLY,
593
+ count=3,
594
+ byweekday=(TU, TH),
595
+ dtstart=datetime(1997, 9, 2, 9, 0))),
596
+ [datetime(1997, 9, 2, 9, 0),
597
+ datetime(1997, 9, 4, 9, 0),
598
+ datetime(1997, 9, 9, 9, 0)])
599
+
600
+ # Third Monday of the month
601
+ self.assertEqual(rrule(MONTHLY,
602
+ byweekday=(MO(+3)),
603
+ dtstart=datetime(1997, 9, 1)).between(datetime(1997, 9, 1),
604
+ datetime(1997, 12, 1)),
605
+ [datetime(1997, 9, 15, 0, 0),
606
+ datetime(1997, 10, 20, 0, 0),
607
+ datetime(1997, 11, 17, 0, 0)])
608
+
609
+ def testMonthlyByNWeekDay(self):
610
+ self.assertEqual(list(rrule(MONTHLY,
611
+ count=3,
612
+ byweekday=(TU(1), TH(-1)),
613
+ dtstart=datetime(1997, 9, 2, 9, 0))),
614
+ [datetime(1997, 9, 2, 9, 0),
615
+ datetime(1997, 9, 25, 9, 0),
616
+ datetime(1997, 10, 7, 9, 0)])
617
+
618
+ def testMonthlyByNWeekDayLarge(self):
619
+ self.assertEqual(list(rrule(MONTHLY,
620
+ count=3,
621
+ byweekday=(TU(3), TH(-3)),
622
+ dtstart=datetime(1997, 9, 2, 9, 0))),
623
+ [datetime(1997, 9, 11, 9, 0),
624
+ datetime(1997, 9, 16, 9, 0),
625
+ datetime(1997, 10, 16, 9, 0)])
626
+
627
+ def testMonthlyByMonthAndWeekDay(self):
628
+ self.assertEqual(list(rrule(MONTHLY,
629
+ count=3,
630
+ bymonth=(1, 3),
631
+ byweekday=(TU, TH),
632
+ dtstart=datetime(1997, 9, 2, 9, 0))),
633
+ [datetime(1998, 1, 1, 9, 0),
634
+ datetime(1998, 1, 6, 9, 0),
635
+ datetime(1998, 1, 8, 9, 0)])
636
+
637
+ def testMonthlyByMonthAndNWeekDay(self):
638
+ self.assertEqual(list(rrule(MONTHLY,
639
+ count=3,
640
+ bymonth=(1, 3),
641
+ byweekday=(TU(1), TH(-1)),
642
+ dtstart=datetime(1997, 9, 2, 9, 0))),
643
+ [datetime(1998, 1, 6, 9, 0),
644
+ datetime(1998, 1, 29, 9, 0),
645
+ datetime(1998, 3, 3, 9, 0)])
646
+
647
+ def testMonthlyByMonthAndNWeekDayLarge(self):
648
+ self.assertEqual(list(rrule(MONTHLY,
649
+ count=3,
650
+ bymonth=(1, 3),
651
+ byweekday=(TU(3), TH(-3)),
652
+ dtstart=datetime(1997, 9, 2, 9, 0))),
653
+ [datetime(1998, 1, 15, 9, 0),
654
+ datetime(1998, 1, 20, 9, 0),
655
+ datetime(1998, 3, 12, 9, 0)])
656
+
657
+ def testMonthlyByMonthDayAndWeekDay(self):
658
+ self.assertEqual(list(rrule(MONTHLY,
659
+ count=3,
660
+ bymonthday=(1, 3),
661
+ byweekday=(TU, TH),
662
+ dtstart=datetime(1997, 9, 2, 9, 0))),
663
+ [datetime(1998, 1, 1, 9, 0),
664
+ datetime(1998, 2, 3, 9, 0),
665
+ datetime(1998, 3, 3, 9, 0)])
666
+
667
+ def testMonthlyByMonthAndMonthDayAndWeekDay(self):
668
+ self.assertEqual(list(rrule(MONTHLY,
669
+ count=3,
670
+ bymonth=(1, 3),
671
+ bymonthday=(1, 3),
672
+ byweekday=(TU, TH),
673
+ dtstart=datetime(1997, 9, 2, 9, 0))),
674
+ [datetime(1998, 1, 1, 9, 0),
675
+ datetime(1998, 3, 3, 9, 0),
676
+ datetime(2001, 3, 1, 9, 0)])
677
+
678
+ def testMonthlyByYearDay(self):
679
+ self.assertEqual(list(rrule(MONTHLY,
680
+ count=4,
681
+ byyearday=(1, 100, 200, 365),
682
+ dtstart=datetime(1997, 9, 2, 9, 0))),
683
+ [datetime(1997, 12, 31, 9, 0),
684
+ datetime(1998, 1, 1, 9, 0),
685
+ datetime(1998, 4, 10, 9, 0),
686
+ datetime(1998, 7, 19, 9, 0)])
687
+
688
+ def testMonthlyByYearDayNeg(self):
689
+ self.assertEqual(list(rrule(MONTHLY,
690
+ count=4,
691
+ byyearday=(-365, -266, -166, -1),
692
+ dtstart=datetime(1997, 9, 2, 9, 0))),
693
+ [datetime(1997, 12, 31, 9, 0),
694
+ datetime(1998, 1, 1, 9, 0),
695
+ datetime(1998, 4, 10, 9, 0),
696
+ datetime(1998, 7, 19, 9, 0)])
697
+
698
+ def testMonthlyByMonthAndYearDay(self):
699
+ self.assertEqual(list(rrule(MONTHLY,
700
+ count=4,
701
+ bymonth=(4, 7),
702
+ byyearday=(1, 100, 200, 365),
703
+ dtstart=datetime(1997, 9, 2, 9, 0))),
704
+ [datetime(1998, 4, 10, 9, 0),
705
+ datetime(1998, 7, 19, 9, 0),
706
+ datetime(1999, 4, 10, 9, 0),
707
+ datetime(1999, 7, 19, 9, 0)])
708
+
709
+ def testMonthlyByMonthAndYearDayNeg(self):
710
+ self.assertEqual(list(rrule(MONTHLY,
711
+ count=4,
712
+ bymonth=(4, 7),
713
+ byyearday=(-365, -266, -166, -1),
714
+ dtstart=datetime(1997, 9, 2, 9, 0))),
715
+ [datetime(1998, 4, 10, 9, 0),
716
+ datetime(1998, 7, 19, 9, 0),
717
+ datetime(1999, 4, 10, 9, 0),
718
+ datetime(1999, 7, 19, 9, 0)])
719
+
720
+ def testMonthlyByWeekNo(self):
721
+ self.assertEqual(list(rrule(MONTHLY,
722
+ count=3,
723
+ byweekno=20,
724
+ dtstart=datetime(1997, 9, 2, 9, 0))),
725
+ [datetime(1998, 5, 11, 9, 0),
726
+ datetime(1998, 5, 12, 9, 0),
727
+ datetime(1998, 5, 13, 9, 0)])
728
+
729
+ def testMonthlyByWeekNoAndWeekDay(self):
730
+ # That's a nice one. The first days of week number one
731
+ # may be in the last year.
732
+ self.assertEqual(list(rrule(MONTHLY,
733
+ count=3,
734
+ byweekno=1,
735
+ byweekday=MO,
736
+ dtstart=datetime(1997, 9, 2, 9, 0))),
737
+ [datetime(1997, 12, 29, 9, 0),
738
+ datetime(1999, 1, 4, 9, 0),
739
+ datetime(2000, 1, 3, 9, 0)])
740
+
741
+ def testMonthlyByWeekNoAndWeekDayLarge(self):
742
+ # Another nice test. The last days of week number 52/53
743
+ # may be in the next year.
744
+ self.assertEqual(list(rrule(MONTHLY,
745
+ count=3,
746
+ byweekno=52,
747
+ byweekday=SU,
748
+ dtstart=datetime(1997, 9, 2, 9, 0))),
749
+ [datetime(1997, 12, 28, 9, 0),
750
+ datetime(1998, 12, 27, 9, 0),
751
+ datetime(2000, 1, 2, 9, 0)])
752
+
753
+ def testMonthlyByWeekNoAndWeekDayLast(self):
754
+ self.assertEqual(list(rrule(MONTHLY,
755
+ count=3,
756
+ byweekno=-1,
757
+ byweekday=SU,
758
+ dtstart=datetime(1997, 9, 2, 9, 0))),
759
+ [datetime(1997, 12, 28, 9, 0),
760
+ datetime(1999, 1, 3, 9, 0),
761
+ datetime(2000, 1, 2, 9, 0)])
762
+
763
+ def testMonthlyByWeekNoAndWeekDay53(self):
764
+ self.assertEqual(list(rrule(MONTHLY,
765
+ count=3,
766
+ byweekno=53,
767
+ byweekday=MO,
768
+ dtstart=datetime(1997, 9, 2, 9, 0))),
769
+ [datetime(1998, 12, 28, 9, 0),
770
+ datetime(2004, 12, 27, 9, 0),
771
+ datetime(2009, 12, 28, 9, 0)])
772
+
773
+ def testMonthlyByEaster(self):
774
+ self.assertEqual(list(rrule(MONTHLY,
775
+ count=3,
776
+ byeaster=0,
777
+ dtstart=datetime(1997, 9, 2, 9, 0))),
778
+ [datetime(1998, 4, 12, 9, 0),
779
+ datetime(1999, 4, 4, 9, 0),
780
+ datetime(2000, 4, 23, 9, 0)])
781
+
782
+ def testMonthlyByEasterPos(self):
783
+ self.assertEqual(list(rrule(MONTHLY,
784
+ count=3,
785
+ byeaster=1,
786
+ dtstart=datetime(1997, 9, 2, 9, 0))),
787
+ [datetime(1998, 4, 13, 9, 0),
788
+ datetime(1999, 4, 5, 9, 0),
789
+ datetime(2000, 4, 24, 9, 0)])
790
+
791
+ def testMonthlyByEasterNeg(self):
792
+ self.assertEqual(list(rrule(MONTHLY,
793
+ count=3,
794
+ byeaster=-1,
795
+ dtstart=datetime(1997, 9, 2, 9, 0))),
796
+ [datetime(1998, 4, 11, 9, 0),
797
+ datetime(1999, 4, 3, 9, 0),
798
+ datetime(2000, 4, 22, 9, 0)])
799
+
800
+ def testMonthlyByHour(self):
801
+ self.assertEqual(list(rrule(MONTHLY,
802
+ count=3,
803
+ byhour=(6, 18),
804
+ dtstart=datetime(1997, 9, 2, 9, 0))),
805
+ [datetime(1997, 9, 2, 18, 0),
806
+ datetime(1997, 10, 2, 6, 0),
807
+ datetime(1997, 10, 2, 18, 0)])
808
+
809
+ def testMonthlyByMinute(self):
810
+ self.assertEqual(list(rrule(MONTHLY,
811
+ count=3,
812
+ byminute=(6, 18),
813
+ dtstart=datetime(1997, 9, 2, 9, 0))),
814
+ [datetime(1997, 9, 2, 9, 6),
815
+ datetime(1997, 9, 2, 9, 18),
816
+ datetime(1997, 10, 2, 9, 6)])
817
+
818
+ def testMonthlyBySecond(self):
819
+ self.assertEqual(list(rrule(MONTHLY,
820
+ count=3,
821
+ bysecond=(6, 18),
822
+ dtstart=datetime(1997, 9, 2, 9, 0))),
823
+ [datetime(1997, 9, 2, 9, 0, 6),
824
+ datetime(1997, 9, 2, 9, 0, 18),
825
+ datetime(1997, 10, 2, 9, 0, 6)])
826
+
827
+ def testMonthlyByHourAndMinute(self):
828
+ self.assertEqual(list(rrule(MONTHLY,
829
+ count=3,
830
+ byhour=(6, 18),
831
+ byminute=(6, 18),
832
+ dtstart=datetime(1997, 9, 2, 9, 0))),
833
+ [datetime(1997, 9, 2, 18, 6),
834
+ datetime(1997, 9, 2, 18, 18),
835
+ datetime(1997, 10, 2, 6, 6)])
836
+
837
+ def testMonthlyByHourAndSecond(self):
838
+ self.assertEqual(list(rrule(MONTHLY,
839
+ count=3,
840
+ byhour=(6, 18),
841
+ bysecond=(6, 18),
842
+ dtstart=datetime(1997, 9, 2, 9, 0))),
843
+ [datetime(1997, 9, 2, 18, 0, 6),
844
+ datetime(1997, 9, 2, 18, 0, 18),
845
+ datetime(1997, 10, 2, 6, 0, 6)])
846
+
847
+ def testMonthlyByMinuteAndSecond(self):
848
+ self.assertEqual(list(rrule(MONTHLY,
849
+ count=3,
850
+ byminute=(6, 18),
851
+ bysecond=(6, 18),
852
+ dtstart=datetime(1997, 9, 2, 9, 0))),
853
+ [datetime(1997, 9, 2, 9, 6, 6),
854
+ datetime(1997, 9, 2, 9, 6, 18),
855
+ datetime(1997, 9, 2, 9, 18, 6)])
856
+
857
+ def testMonthlyByHourAndMinuteAndSecond(self):
858
+ self.assertEqual(list(rrule(MONTHLY,
859
+ count=3,
860
+ byhour=(6, 18),
861
+ byminute=(6, 18),
862
+ bysecond=(6, 18),
863
+ dtstart=datetime(1997, 9, 2, 9, 0))),
864
+ [datetime(1997, 9, 2, 18, 6, 6),
865
+ datetime(1997, 9, 2, 18, 6, 18),
866
+ datetime(1997, 9, 2, 18, 18, 6)])
867
+
868
+ def testMonthlyBySetPos(self):
869
+ self.assertEqual(list(rrule(MONTHLY,
870
+ count=3,
871
+ bymonthday=(13, 17),
872
+ byhour=(6, 18),
873
+ bysetpos=(3, -3),
874
+ dtstart=datetime(1997, 9, 2, 9, 0))),
875
+ [datetime(1997, 9, 13, 18, 0),
876
+ datetime(1997, 9, 17, 6, 0),
877
+ datetime(1997, 10, 13, 18, 0)])
878
+
879
+ def testWeekly(self):
880
+ self.assertEqual(list(rrule(WEEKLY,
881
+ count=3,
882
+ dtstart=datetime(1997, 9, 2, 9, 0))),
883
+ [datetime(1997, 9, 2, 9, 0),
884
+ datetime(1997, 9, 9, 9, 0),
885
+ datetime(1997, 9, 16, 9, 0)])
886
+
887
+ def testWeeklyInterval(self):
888
+ self.assertEqual(list(rrule(WEEKLY,
889
+ count=3,
890
+ interval=2,
891
+ dtstart=datetime(1997, 9, 2, 9, 0))),
892
+ [datetime(1997, 9, 2, 9, 0),
893
+ datetime(1997, 9, 16, 9, 0),
894
+ datetime(1997, 9, 30, 9, 0)])
895
+
896
+ def testWeeklyIntervalLarge(self):
897
+ self.assertEqual(list(rrule(WEEKLY,
898
+ count=3,
899
+ interval=20,
900
+ dtstart=datetime(1997, 9, 2, 9, 0))),
901
+ [datetime(1997, 9, 2, 9, 0),
902
+ datetime(1998, 1, 20, 9, 0),
903
+ datetime(1998, 6, 9, 9, 0)])
904
+
905
+ def testWeeklyByMonth(self):
906
+ self.assertEqual(list(rrule(WEEKLY,
907
+ count=3,
908
+ bymonth=(1, 3),
909
+ dtstart=datetime(1997, 9, 2, 9, 0))),
910
+ [datetime(1998, 1, 6, 9, 0),
911
+ datetime(1998, 1, 13, 9, 0),
912
+ datetime(1998, 1, 20, 9, 0)])
913
+
914
+ def testWeeklyByMonthDay(self):
915
+ self.assertEqual(list(rrule(WEEKLY,
916
+ count=3,
917
+ bymonthday=(1, 3),
918
+ dtstart=datetime(1997, 9, 2, 9, 0))),
919
+ [datetime(1997, 9, 3, 9, 0),
920
+ datetime(1997, 10, 1, 9, 0),
921
+ datetime(1997, 10, 3, 9, 0)])
922
+
923
+ def testWeeklyByMonthAndMonthDay(self):
924
+ self.assertEqual(list(rrule(WEEKLY,
925
+ count=3,
926
+ bymonth=(1, 3),
927
+ bymonthday=(5, 7),
928
+ dtstart=datetime(1997, 9, 2, 9, 0))),
929
+ [datetime(1998, 1, 5, 9, 0),
930
+ datetime(1998, 1, 7, 9, 0),
931
+ datetime(1998, 3, 5, 9, 0)])
932
+
933
+ def testWeeklyByWeekDay(self):
934
+ self.assertEqual(list(rrule(WEEKLY,
935
+ count=3,
936
+ byweekday=(TU, TH),
937
+ dtstart=datetime(1997, 9, 2, 9, 0))),
938
+ [datetime(1997, 9, 2, 9, 0),
939
+ datetime(1997, 9, 4, 9, 0),
940
+ datetime(1997, 9, 9, 9, 0)])
941
+
942
+ def testWeeklyByNWeekDay(self):
943
+ self.assertEqual(list(rrule(WEEKLY,
944
+ count=3,
945
+ byweekday=(TU(1), TH(-1)),
946
+ dtstart=datetime(1997, 9, 2, 9, 0))),
947
+ [datetime(1997, 9, 2, 9, 0),
948
+ datetime(1997, 9, 4, 9, 0),
949
+ datetime(1997, 9, 9, 9, 0)])
950
+
951
+ def testWeeklyByMonthAndWeekDay(self):
952
+ # This test is interesting, because it crosses the year
953
+ # boundary in a weekly period to find day '1' as a
954
+ # valid recurrence.
955
+ self.assertEqual(list(rrule(WEEKLY,
956
+ count=3,
957
+ bymonth=(1, 3),
958
+ byweekday=(TU, TH),
959
+ dtstart=datetime(1997, 9, 2, 9, 0))),
960
+ [datetime(1998, 1, 1, 9, 0),
961
+ datetime(1998, 1, 6, 9, 0),
962
+ datetime(1998, 1, 8, 9, 0)])
963
+
964
+ def testWeeklyByMonthAndNWeekDay(self):
965
+ self.assertEqual(list(rrule(WEEKLY,
966
+ count=3,
967
+ bymonth=(1, 3),
968
+ byweekday=(TU(1), TH(-1)),
969
+ dtstart=datetime(1997, 9, 2, 9, 0))),
970
+ [datetime(1998, 1, 1, 9, 0),
971
+ datetime(1998, 1, 6, 9, 0),
972
+ datetime(1998, 1, 8, 9, 0)])
973
+
974
+ def testWeeklyByMonthDayAndWeekDay(self):
975
+ self.assertEqual(list(rrule(WEEKLY,
976
+ count=3,
977
+ bymonthday=(1, 3),
978
+ byweekday=(TU, TH),
979
+ dtstart=datetime(1997, 9, 2, 9, 0))),
980
+ [datetime(1998, 1, 1, 9, 0),
981
+ datetime(1998, 2, 3, 9, 0),
982
+ datetime(1998, 3, 3, 9, 0)])
983
+
984
+ def testWeeklyByMonthAndMonthDayAndWeekDay(self):
985
+ self.assertEqual(list(rrule(WEEKLY,
986
+ count=3,
987
+ bymonth=(1, 3),
988
+ bymonthday=(1, 3),
989
+ byweekday=(TU, TH),
990
+ dtstart=datetime(1997, 9, 2, 9, 0))),
991
+ [datetime(1998, 1, 1, 9, 0),
992
+ datetime(1998, 3, 3, 9, 0),
993
+ datetime(2001, 3, 1, 9, 0)])
994
+
995
+ def testWeeklyByYearDay(self):
996
+ self.assertEqual(list(rrule(WEEKLY,
997
+ count=4,
998
+ byyearday=(1, 100, 200, 365),
999
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1000
+ [datetime(1997, 12, 31, 9, 0),
1001
+ datetime(1998, 1, 1, 9, 0),
1002
+ datetime(1998, 4, 10, 9, 0),
1003
+ datetime(1998, 7, 19, 9, 0)])
1004
+
1005
+ def testWeeklyByYearDayNeg(self):
1006
+ self.assertEqual(list(rrule(WEEKLY,
1007
+ count=4,
1008
+ byyearday=(-365, -266, -166, -1),
1009
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1010
+ [datetime(1997, 12, 31, 9, 0),
1011
+ datetime(1998, 1, 1, 9, 0),
1012
+ datetime(1998, 4, 10, 9, 0),
1013
+ datetime(1998, 7, 19, 9, 0)])
1014
+
1015
+ def testWeeklyByMonthAndYearDay(self):
1016
+ self.assertEqual(list(rrule(WEEKLY,
1017
+ count=4,
1018
+ bymonth=(1, 7),
1019
+ byyearday=(1, 100, 200, 365),
1020
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1021
+ [datetime(1998, 1, 1, 9, 0),
1022
+ datetime(1998, 7, 19, 9, 0),
1023
+ datetime(1999, 1, 1, 9, 0),
1024
+ datetime(1999, 7, 19, 9, 0)])
1025
+
1026
+ def testWeeklyByMonthAndYearDayNeg(self):
1027
+ self.assertEqual(list(rrule(WEEKLY,
1028
+ count=4,
1029
+ bymonth=(1, 7),
1030
+ byyearday=(-365, -266, -166, -1),
1031
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1032
+ [datetime(1998, 1, 1, 9, 0),
1033
+ datetime(1998, 7, 19, 9, 0),
1034
+ datetime(1999, 1, 1, 9, 0),
1035
+ datetime(1999, 7, 19, 9, 0)])
1036
+
1037
+ def testWeeklyByWeekNo(self):
1038
+ self.assertEqual(list(rrule(WEEKLY,
1039
+ count=3,
1040
+ byweekno=20,
1041
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1042
+ [datetime(1998, 5, 11, 9, 0),
1043
+ datetime(1998, 5, 12, 9, 0),
1044
+ datetime(1998, 5, 13, 9, 0)])
1045
+
1046
+ def testWeeklyByWeekNoAndWeekDay(self):
1047
+ # That's a nice one. The first days of week number one
1048
+ # may be in the last year.
1049
+ self.assertEqual(list(rrule(WEEKLY,
1050
+ count=3,
1051
+ byweekno=1,
1052
+ byweekday=MO,
1053
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1054
+ [datetime(1997, 12, 29, 9, 0),
1055
+ datetime(1999, 1, 4, 9, 0),
1056
+ datetime(2000, 1, 3, 9, 0)])
1057
+
1058
+ def testWeeklyByWeekNoAndWeekDayLarge(self):
1059
+ # Another nice test. The last days of week number 52/53
1060
+ # may be in the next year.
1061
+ self.assertEqual(list(rrule(WEEKLY,
1062
+ count=3,
1063
+ byweekno=52,
1064
+ byweekday=SU,
1065
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1066
+ [datetime(1997, 12, 28, 9, 0),
1067
+ datetime(1998, 12, 27, 9, 0),
1068
+ datetime(2000, 1, 2, 9, 0)])
1069
+
1070
+ def testWeeklyByWeekNoAndWeekDayLast(self):
1071
+ self.assertEqual(list(rrule(WEEKLY,
1072
+ count=3,
1073
+ byweekno=-1,
1074
+ byweekday=SU,
1075
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1076
+ [datetime(1997, 12, 28, 9, 0),
1077
+ datetime(1999, 1, 3, 9, 0),
1078
+ datetime(2000, 1, 2, 9, 0)])
1079
+
1080
+ def testWeeklyByWeekNoAndWeekDay53(self):
1081
+ self.assertEqual(list(rrule(WEEKLY,
1082
+ count=3,
1083
+ byweekno=53,
1084
+ byweekday=MO,
1085
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1086
+ [datetime(1998, 12, 28, 9, 0),
1087
+ datetime(2004, 12, 27, 9, 0),
1088
+ datetime(2009, 12, 28, 9, 0)])
1089
+
1090
+ def testWeeklyByEaster(self):
1091
+ self.assertEqual(list(rrule(WEEKLY,
1092
+ count=3,
1093
+ byeaster=0,
1094
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1095
+ [datetime(1998, 4, 12, 9, 0),
1096
+ datetime(1999, 4, 4, 9, 0),
1097
+ datetime(2000, 4, 23, 9, 0)])
1098
+
1099
+ def testWeeklyByEasterPos(self):
1100
+ self.assertEqual(list(rrule(WEEKLY,
1101
+ count=3,
1102
+ byeaster=1,
1103
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1104
+ [datetime(1998, 4, 13, 9, 0),
1105
+ datetime(1999, 4, 5, 9, 0),
1106
+ datetime(2000, 4, 24, 9, 0)])
1107
+
1108
+ def testWeeklyByEasterNeg(self):
1109
+ self.assertEqual(list(rrule(WEEKLY,
1110
+ count=3,
1111
+ byeaster=-1,
1112
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1113
+ [datetime(1998, 4, 11, 9, 0),
1114
+ datetime(1999, 4, 3, 9, 0),
1115
+ datetime(2000, 4, 22, 9, 0)])
1116
+
1117
+ def testWeeklyByHour(self):
1118
+ self.assertEqual(list(rrule(WEEKLY,
1119
+ count=3,
1120
+ byhour=(6, 18),
1121
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1122
+ [datetime(1997, 9, 2, 18, 0),
1123
+ datetime(1997, 9, 9, 6, 0),
1124
+ datetime(1997, 9, 9, 18, 0)])
1125
+
1126
+ def testWeeklyByMinute(self):
1127
+ self.assertEqual(list(rrule(WEEKLY,
1128
+ count=3,
1129
+ byminute=(6, 18),
1130
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1131
+ [datetime(1997, 9, 2, 9, 6),
1132
+ datetime(1997, 9, 2, 9, 18),
1133
+ datetime(1997, 9, 9, 9, 6)])
1134
+
1135
+ def testWeeklyBySecond(self):
1136
+ self.assertEqual(list(rrule(WEEKLY,
1137
+ count=3,
1138
+ bysecond=(6, 18),
1139
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1140
+ [datetime(1997, 9, 2, 9, 0, 6),
1141
+ datetime(1997, 9, 2, 9, 0, 18),
1142
+ datetime(1997, 9, 9, 9, 0, 6)])
1143
+
1144
+ def testWeeklyByHourAndMinute(self):
1145
+ self.assertEqual(list(rrule(WEEKLY,
1146
+ count=3,
1147
+ byhour=(6, 18),
1148
+ byminute=(6, 18),
1149
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1150
+ [datetime(1997, 9, 2, 18, 6),
1151
+ datetime(1997, 9, 2, 18, 18),
1152
+ datetime(1997, 9, 9, 6, 6)])
1153
+
1154
+ def testWeeklyByHourAndSecond(self):
1155
+ self.assertEqual(list(rrule(WEEKLY,
1156
+ count=3,
1157
+ byhour=(6, 18),
1158
+ bysecond=(6, 18),
1159
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1160
+ [datetime(1997, 9, 2, 18, 0, 6),
1161
+ datetime(1997, 9, 2, 18, 0, 18),
1162
+ datetime(1997, 9, 9, 6, 0, 6)])
1163
+
1164
+ def testWeeklyByMinuteAndSecond(self):
1165
+ self.assertEqual(list(rrule(WEEKLY,
1166
+ count=3,
1167
+ byminute=(6, 18),
1168
+ bysecond=(6, 18),
1169
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1170
+ [datetime(1997, 9, 2, 9, 6, 6),
1171
+ datetime(1997, 9, 2, 9, 6, 18),
1172
+ datetime(1997, 9, 2, 9, 18, 6)])
1173
+
1174
+ def testWeeklyByHourAndMinuteAndSecond(self):
1175
+ self.assertEqual(list(rrule(WEEKLY,
1176
+ count=3,
1177
+ byhour=(6, 18),
1178
+ byminute=(6, 18),
1179
+ bysecond=(6, 18),
1180
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1181
+ [datetime(1997, 9, 2, 18, 6, 6),
1182
+ datetime(1997, 9, 2, 18, 6, 18),
1183
+ datetime(1997, 9, 2, 18, 18, 6)])
1184
+
1185
+ def testWeeklyBySetPos(self):
1186
+ self.assertEqual(list(rrule(WEEKLY,
1187
+ count=3,
1188
+ byweekday=(TU, TH),
1189
+ byhour=(6, 18),
1190
+ bysetpos=(3, -3),
1191
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1192
+ [datetime(1997, 9, 2, 18, 0),
1193
+ datetime(1997, 9, 4, 6, 0),
1194
+ datetime(1997, 9, 9, 18, 0)])
1195
+
1196
+ def testDaily(self):
1197
+ self.assertEqual(list(rrule(DAILY,
1198
+ count=3,
1199
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1200
+ [datetime(1997, 9, 2, 9, 0),
1201
+ datetime(1997, 9, 3, 9, 0),
1202
+ datetime(1997, 9, 4, 9, 0)])
1203
+
1204
+ def testDailyInterval(self):
1205
+ self.assertEqual(list(rrule(DAILY,
1206
+ count=3,
1207
+ interval=2,
1208
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1209
+ [datetime(1997, 9, 2, 9, 0),
1210
+ datetime(1997, 9, 4, 9, 0),
1211
+ datetime(1997, 9, 6, 9, 0)])
1212
+
1213
+ def testDailyIntervalLarge(self):
1214
+ self.assertEqual(list(rrule(DAILY,
1215
+ count=3,
1216
+ interval=92,
1217
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1218
+ [datetime(1997, 9, 2, 9, 0),
1219
+ datetime(1997, 12, 3, 9, 0),
1220
+ datetime(1998, 3, 5, 9, 0)])
1221
+
1222
+ def testDailyByMonth(self):
1223
+ self.assertEqual(list(rrule(DAILY,
1224
+ count=3,
1225
+ bymonth=(1, 3),
1226
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1227
+ [datetime(1998, 1, 1, 9, 0),
1228
+ datetime(1998, 1, 2, 9, 0),
1229
+ datetime(1998, 1, 3, 9, 0)])
1230
+
1231
+ def testDailyByMonthDay(self):
1232
+ self.assertEqual(list(rrule(DAILY,
1233
+ count=3,
1234
+ bymonthday=(1, 3),
1235
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1236
+ [datetime(1997, 9, 3, 9, 0),
1237
+ datetime(1997, 10, 1, 9, 0),
1238
+ datetime(1997, 10, 3, 9, 0)])
1239
+
1240
+ def testDailyByMonthAndMonthDay(self):
1241
+ self.assertEqual(list(rrule(DAILY,
1242
+ count=3,
1243
+ bymonth=(1, 3),
1244
+ bymonthday=(5, 7),
1245
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1246
+ [datetime(1998, 1, 5, 9, 0),
1247
+ datetime(1998, 1, 7, 9, 0),
1248
+ datetime(1998, 3, 5, 9, 0)])
1249
+
1250
+ def testDailyByWeekDay(self):
1251
+ self.assertEqual(list(rrule(DAILY,
1252
+ count=3,
1253
+ byweekday=(TU, TH),
1254
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1255
+ [datetime(1997, 9, 2, 9, 0),
1256
+ datetime(1997, 9, 4, 9, 0),
1257
+ datetime(1997, 9, 9, 9, 0)])
1258
+
1259
+ def testDailyByNWeekDay(self):
1260
+ self.assertEqual(list(rrule(DAILY,
1261
+ count=3,
1262
+ byweekday=(TU(1), TH(-1)),
1263
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1264
+ [datetime(1997, 9, 2, 9, 0),
1265
+ datetime(1997, 9, 4, 9, 0),
1266
+ datetime(1997, 9, 9, 9, 0)])
1267
+
1268
+ def testDailyByMonthAndWeekDay(self):
1269
+ self.assertEqual(list(rrule(DAILY,
1270
+ count=3,
1271
+ bymonth=(1, 3),
1272
+ byweekday=(TU, TH),
1273
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1274
+ [datetime(1998, 1, 1, 9, 0),
1275
+ datetime(1998, 1, 6, 9, 0),
1276
+ datetime(1998, 1, 8, 9, 0)])
1277
+
1278
+ def testDailyByMonthAndNWeekDay(self):
1279
+ self.assertEqual(list(rrule(DAILY,
1280
+ count=3,
1281
+ bymonth=(1, 3),
1282
+ byweekday=(TU(1), TH(-1)),
1283
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1284
+ [datetime(1998, 1, 1, 9, 0),
1285
+ datetime(1998, 1, 6, 9, 0),
1286
+ datetime(1998, 1, 8, 9, 0)])
1287
+
1288
+ def testDailyByMonthDayAndWeekDay(self):
1289
+ self.assertEqual(list(rrule(DAILY,
1290
+ count=3,
1291
+ bymonthday=(1, 3),
1292
+ byweekday=(TU, TH),
1293
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1294
+ [datetime(1998, 1, 1, 9, 0),
1295
+ datetime(1998, 2, 3, 9, 0),
1296
+ datetime(1998, 3, 3, 9, 0)])
1297
+
1298
+ def testDailyByMonthAndMonthDayAndWeekDay(self):
1299
+ self.assertEqual(list(rrule(DAILY,
1300
+ count=3,
1301
+ bymonth=(1, 3),
1302
+ bymonthday=(1, 3),
1303
+ byweekday=(TU, TH),
1304
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1305
+ [datetime(1998, 1, 1, 9, 0),
1306
+ datetime(1998, 3, 3, 9, 0),
1307
+ datetime(2001, 3, 1, 9, 0)])
1308
+
1309
+ def testDailyByYearDay(self):
1310
+ self.assertEqual(list(rrule(DAILY,
1311
+ count=4,
1312
+ byyearday=(1, 100, 200, 365),
1313
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1314
+ [datetime(1997, 12, 31, 9, 0),
1315
+ datetime(1998, 1, 1, 9, 0),
1316
+ datetime(1998, 4, 10, 9, 0),
1317
+ datetime(1998, 7, 19, 9, 0)])
1318
+
1319
+ def testDailyByYearDayNeg(self):
1320
+ self.assertEqual(list(rrule(DAILY,
1321
+ count=4,
1322
+ byyearday=(-365, -266, -166, -1),
1323
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1324
+ [datetime(1997, 12, 31, 9, 0),
1325
+ datetime(1998, 1, 1, 9, 0),
1326
+ datetime(1998, 4, 10, 9, 0),
1327
+ datetime(1998, 7, 19, 9, 0)])
1328
+
1329
+ def testDailyByMonthAndYearDay(self):
1330
+ self.assertEqual(list(rrule(DAILY,
1331
+ count=4,
1332
+ bymonth=(1, 7),
1333
+ byyearday=(1, 100, 200, 365),
1334
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1335
+ [datetime(1998, 1, 1, 9, 0),
1336
+ datetime(1998, 7, 19, 9, 0),
1337
+ datetime(1999, 1, 1, 9, 0),
1338
+ datetime(1999, 7, 19, 9, 0)])
1339
+
1340
+ def testDailyByMonthAndYearDayNeg(self):
1341
+ self.assertEqual(list(rrule(DAILY,
1342
+ count=4,
1343
+ bymonth=(1, 7),
1344
+ byyearday=(-365, -266, -166, -1),
1345
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1346
+ [datetime(1998, 1, 1, 9, 0),
1347
+ datetime(1998, 7, 19, 9, 0),
1348
+ datetime(1999, 1, 1, 9, 0),
1349
+ datetime(1999, 7, 19, 9, 0)])
1350
+
1351
+ def testDailyByWeekNo(self):
1352
+ self.assertEqual(list(rrule(DAILY,
1353
+ count=3,
1354
+ byweekno=20,
1355
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1356
+ [datetime(1998, 5, 11, 9, 0),
1357
+ datetime(1998, 5, 12, 9, 0),
1358
+ datetime(1998, 5, 13, 9, 0)])
1359
+
1360
+ def testDailyByWeekNoAndWeekDay(self):
1361
+ # That's a nice one. The first days of week number one
1362
+ # may be in the last year.
1363
+ self.assertEqual(list(rrule(DAILY,
1364
+ count=3,
1365
+ byweekno=1,
1366
+ byweekday=MO,
1367
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1368
+ [datetime(1997, 12, 29, 9, 0),
1369
+ datetime(1999, 1, 4, 9, 0),
1370
+ datetime(2000, 1, 3, 9, 0)])
1371
+
1372
+ def testDailyByWeekNoAndWeekDayLarge(self):
1373
+ # Another nice test. The last days of week number 52/53
1374
+ # may be in the next year.
1375
+ self.assertEqual(list(rrule(DAILY,
1376
+ count=3,
1377
+ byweekno=52,
1378
+ byweekday=SU,
1379
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1380
+ [datetime(1997, 12, 28, 9, 0),
1381
+ datetime(1998, 12, 27, 9, 0),
1382
+ datetime(2000, 1, 2, 9, 0)])
1383
+
1384
+ def testDailyByWeekNoAndWeekDayLast(self):
1385
+ self.assertEqual(list(rrule(DAILY,
1386
+ count=3,
1387
+ byweekno=-1,
1388
+ byweekday=SU,
1389
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1390
+ [datetime(1997, 12, 28, 9, 0),
1391
+ datetime(1999, 1, 3, 9, 0),
1392
+ datetime(2000, 1, 2, 9, 0)])
1393
+
1394
+ def testDailyByWeekNoAndWeekDay53(self):
1395
+ self.assertEqual(list(rrule(DAILY,
1396
+ count=3,
1397
+ byweekno=53,
1398
+ byweekday=MO,
1399
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1400
+ [datetime(1998, 12, 28, 9, 0),
1401
+ datetime(2004, 12, 27, 9, 0),
1402
+ datetime(2009, 12, 28, 9, 0)])
1403
+
1404
+ def testDailyByEaster(self):
1405
+ self.assertEqual(list(rrule(DAILY,
1406
+ count=3,
1407
+ byeaster=0,
1408
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1409
+ [datetime(1998, 4, 12, 9, 0),
1410
+ datetime(1999, 4, 4, 9, 0),
1411
+ datetime(2000, 4, 23, 9, 0)])
1412
+
1413
+ def testDailyByEasterPos(self):
1414
+ self.assertEqual(list(rrule(DAILY,
1415
+ count=3,
1416
+ byeaster=1,
1417
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1418
+ [datetime(1998, 4, 13, 9, 0),
1419
+ datetime(1999, 4, 5, 9, 0),
1420
+ datetime(2000, 4, 24, 9, 0)])
1421
+
1422
+ def testDailyByEasterNeg(self):
1423
+ self.assertEqual(list(rrule(DAILY,
1424
+ count=3,
1425
+ byeaster=-1,
1426
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1427
+ [datetime(1998, 4, 11, 9, 0),
1428
+ datetime(1999, 4, 3, 9, 0),
1429
+ datetime(2000, 4, 22, 9, 0)])
1430
+
1431
+ def testDailyByHour(self):
1432
+ self.assertEqual(list(rrule(DAILY,
1433
+ count=3,
1434
+ byhour=(6, 18),
1435
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1436
+ [datetime(1997, 9, 2, 18, 0),
1437
+ datetime(1997, 9, 3, 6, 0),
1438
+ datetime(1997, 9, 3, 18, 0)])
1439
+
1440
+ def testDailyByMinute(self):
1441
+ self.assertEqual(list(rrule(DAILY,
1442
+ count=3,
1443
+ byminute=(6, 18),
1444
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1445
+ [datetime(1997, 9, 2, 9, 6),
1446
+ datetime(1997, 9, 2, 9, 18),
1447
+ datetime(1997, 9, 3, 9, 6)])
1448
+
1449
+ def testDailyBySecond(self):
1450
+ self.assertEqual(list(rrule(DAILY,
1451
+ count=3,
1452
+ bysecond=(6, 18),
1453
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1454
+ [datetime(1997, 9, 2, 9, 0, 6),
1455
+ datetime(1997, 9, 2, 9, 0, 18),
1456
+ datetime(1997, 9, 3, 9, 0, 6)])
1457
+
1458
+ def testDailyByHourAndMinute(self):
1459
+ self.assertEqual(list(rrule(DAILY,
1460
+ count=3,
1461
+ byhour=(6, 18),
1462
+ byminute=(6, 18),
1463
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1464
+ [datetime(1997, 9, 2, 18, 6),
1465
+ datetime(1997, 9, 2, 18, 18),
1466
+ datetime(1997, 9, 3, 6, 6)])
1467
+
1468
+ def testDailyByHourAndSecond(self):
1469
+ self.assertEqual(list(rrule(DAILY,
1470
+ count=3,
1471
+ byhour=(6, 18),
1472
+ bysecond=(6, 18),
1473
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1474
+ [datetime(1997, 9, 2, 18, 0, 6),
1475
+ datetime(1997, 9, 2, 18, 0, 18),
1476
+ datetime(1997, 9, 3, 6, 0, 6)])
1477
+
1478
+ def testDailyByMinuteAndSecond(self):
1479
+ self.assertEqual(list(rrule(DAILY,
1480
+ count=3,
1481
+ byminute=(6, 18),
1482
+ bysecond=(6, 18),
1483
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1484
+ [datetime(1997, 9, 2, 9, 6, 6),
1485
+ datetime(1997, 9, 2, 9, 6, 18),
1486
+ datetime(1997, 9, 2, 9, 18, 6)])
1487
+
1488
+ def testDailyByHourAndMinuteAndSecond(self):
1489
+ self.assertEqual(list(rrule(DAILY,
1490
+ count=3,
1491
+ byhour=(6, 18),
1492
+ byminute=(6, 18),
1493
+ bysecond=(6, 18),
1494
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1495
+ [datetime(1997, 9, 2, 18, 6, 6),
1496
+ datetime(1997, 9, 2, 18, 6, 18),
1497
+ datetime(1997, 9, 2, 18, 18, 6)])
1498
+
1499
+ def testDailyBySetPos(self):
1500
+ self.assertEqual(list(rrule(DAILY,
1501
+ count=3,
1502
+ byhour=(6, 18),
1503
+ byminute=(15, 45),
1504
+ bysetpos=(3, -3),
1505
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1506
+ [datetime(1997, 9, 2, 18, 15),
1507
+ datetime(1997, 9, 3, 6, 45),
1508
+ datetime(1997, 9, 3, 18, 15)])
1509
+
1510
+ def testHourly(self):
1511
+ self.assertEqual(list(rrule(HOURLY,
1512
+ count=3,
1513
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1514
+ [datetime(1997, 9, 2, 9, 0),
1515
+ datetime(1997, 9, 2, 10, 0),
1516
+ datetime(1997, 9, 2, 11, 0)])
1517
+
1518
+ def testHourlyInterval(self):
1519
+ self.assertEqual(list(rrule(HOURLY,
1520
+ count=3,
1521
+ interval=2,
1522
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1523
+ [datetime(1997, 9, 2, 9, 0),
1524
+ datetime(1997, 9, 2, 11, 0),
1525
+ datetime(1997, 9, 2, 13, 0)])
1526
+
1527
+ def testHourlyIntervalLarge(self):
1528
+ self.assertEqual(list(rrule(HOURLY,
1529
+ count=3,
1530
+ interval=769,
1531
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1532
+ [datetime(1997, 9, 2, 9, 0),
1533
+ datetime(1997, 10, 4, 10, 0),
1534
+ datetime(1997, 11, 5, 11, 0)])
1535
+
1536
+ def testHourlyByMonth(self):
1537
+ self.assertEqual(list(rrule(HOURLY,
1538
+ count=3,
1539
+ bymonth=(1, 3),
1540
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1541
+ [datetime(1998, 1, 1, 0, 0),
1542
+ datetime(1998, 1, 1, 1, 0),
1543
+ datetime(1998, 1, 1, 2, 0)])
1544
+
1545
+ def testHourlyByMonthDay(self):
1546
+ self.assertEqual(list(rrule(HOURLY,
1547
+ count=3,
1548
+ bymonthday=(1, 3),
1549
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1550
+ [datetime(1997, 9, 3, 0, 0),
1551
+ datetime(1997, 9, 3, 1, 0),
1552
+ datetime(1997, 9, 3, 2, 0)])
1553
+
1554
+ def testHourlyByMonthAndMonthDay(self):
1555
+ self.assertEqual(list(rrule(HOURLY,
1556
+ count=3,
1557
+ bymonth=(1, 3),
1558
+ bymonthday=(5, 7),
1559
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1560
+ [datetime(1998, 1, 5, 0, 0),
1561
+ datetime(1998, 1, 5, 1, 0),
1562
+ datetime(1998, 1, 5, 2, 0)])
1563
+
1564
+ def testHourlyByWeekDay(self):
1565
+ self.assertEqual(list(rrule(HOURLY,
1566
+ count=3,
1567
+ byweekday=(TU, TH),
1568
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1569
+ [datetime(1997, 9, 2, 9, 0),
1570
+ datetime(1997, 9, 2, 10, 0),
1571
+ datetime(1997, 9, 2, 11, 0)])
1572
+
1573
+ def testHourlyByNWeekDay(self):
1574
+ self.assertEqual(list(rrule(HOURLY,
1575
+ count=3,
1576
+ byweekday=(TU(1), TH(-1)),
1577
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1578
+ [datetime(1997, 9, 2, 9, 0),
1579
+ datetime(1997, 9, 2, 10, 0),
1580
+ datetime(1997, 9, 2, 11, 0)])
1581
+
1582
+ def testHourlyByMonthAndWeekDay(self):
1583
+ self.assertEqual(list(rrule(HOURLY,
1584
+ count=3,
1585
+ bymonth=(1, 3),
1586
+ byweekday=(TU, TH),
1587
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1588
+ [datetime(1998, 1, 1, 0, 0),
1589
+ datetime(1998, 1, 1, 1, 0),
1590
+ datetime(1998, 1, 1, 2, 0)])
1591
+
1592
+ def testHourlyByMonthAndNWeekDay(self):
1593
+ self.assertEqual(list(rrule(HOURLY,
1594
+ count=3,
1595
+ bymonth=(1, 3),
1596
+ byweekday=(TU(1), TH(-1)),
1597
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1598
+ [datetime(1998, 1, 1, 0, 0),
1599
+ datetime(1998, 1, 1, 1, 0),
1600
+ datetime(1998, 1, 1, 2, 0)])
1601
+
1602
+ def testHourlyByMonthDayAndWeekDay(self):
1603
+ self.assertEqual(list(rrule(HOURLY,
1604
+ count=3,
1605
+ bymonthday=(1, 3),
1606
+ byweekday=(TU, TH),
1607
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1608
+ [datetime(1998, 1, 1, 0, 0),
1609
+ datetime(1998, 1, 1, 1, 0),
1610
+ datetime(1998, 1, 1, 2, 0)])
1611
+
1612
+ def testHourlyByMonthAndMonthDayAndWeekDay(self):
1613
+ self.assertEqual(list(rrule(HOURLY,
1614
+ count=3,
1615
+ bymonth=(1, 3),
1616
+ bymonthday=(1, 3),
1617
+ byweekday=(TU, TH),
1618
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1619
+ [datetime(1998, 1, 1, 0, 0),
1620
+ datetime(1998, 1, 1, 1, 0),
1621
+ datetime(1998, 1, 1, 2, 0)])
1622
+
1623
+ def testHourlyByYearDay(self):
1624
+ self.assertEqual(list(rrule(HOURLY,
1625
+ count=4,
1626
+ byyearday=(1, 100, 200, 365),
1627
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1628
+ [datetime(1997, 12, 31, 0, 0),
1629
+ datetime(1997, 12, 31, 1, 0),
1630
+ datetime(1997, 12, 31, 2, 0),
1631
+ datetime(1997, 12, 31, 3, 0)])
1632
+
1633
+ def testHourlyByYearDayNeg(self):
1634
+ self.assertEqual(list(rrule(HOURLY,
1635
+ count=4,
1636
+ byyearday=(-365, -266, -166, -1),
1637
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1638
+ [datetime(1997, 12, 31, 0, 0),
1639
+ datetime(1997, 12, 31, 1, 0),
1640
+ datetime(1997, 12, 31, 2, 0),
1641
+ datetime(1997, 12, 31, 3, 0)])
1642
+
1643
+ def testHourlyByMonthAndYearDay(self):
1644
+ self.assertEqual(list(rrule(HOURLY,
1645
+ count=4,
1646
+ bymonth=(4, 7),
1647
+ byyearday=(1, 100, 200, 365),
1648
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1649
+ [datetime(1998, 4, 10, 0, 0),
1650
+ datetime(1998, 4, 10, 1, 0),
1651
+ datetime(1998, 4, 10, 2, 0),
1652
+ datetime(1998, 4, 10, 3, 0)])
1653
+
1654
+ def testHourlyByMonthAndYearDayNeg(self):
1655
+ self.assertEqual(list(rrule(HOURLY,
1656
+ count=4,
1657
+ bymonth=(4, 7),
1658
+ byyearday=(-365, -266, -166, -1),
1659
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1660
+ [datetime(1998, 4, 10, 0, 0),
1661
+ datetime(1998, 4, 10, 1, 0),
1662
+ datetime(1998, 4, 10, 2, 0),
1663
+ datetime(1998, 4, 10, 3, 0)])
1664
+
1665
+ def testHourlyByWeekNo(self):
1666
+ self.assertEqual(list(rrule(HOURLY,
1667
+ count=3,
1668
+ byweekno=20,
1669
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1670
+ [datetime(1998, 5, 11, 0, 0),
1671
+ datetime(1998, 5, 11, 1, 0),
1672
+ datetime(1998, 5, 11, 2, 0)])
1673
+
1674
+ def testHourlyByWeekNoAndWeekDay(self):
1675
+ self.assertEqual(list(rrule(HOURLY,
1676
+ count=3,
1677
+ byweekno=1,
1678
+ byweekday=MO,
1679
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1680
+ [datetime(1997, 12, 29, 0, 0),
1681
+ datetime(1997, 12, 29, 1, 0),
1682
+ datetime(1997, 12, 29, 2, 0)])
1683
+
1684
+ def testHourlyByWeekNoAndWeekDayLarge(self):
1685
+ self.assertEqual(list(rrule(HOURLY,
1686
+ count=3,
1687
+ byweekno=52,
1688
+ byweekday=SU,
1689
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1690
+ [datetime(1997, 12, 28, 0, 0),
1691
+ datetime(1997, 12, 28, 1, 0),
1692
+ datetime(1997, 12, 28, 2, 0)])
1693
+
1694
+ def testHourlyByWeekNoAndWeekDayLast(self):
1695
+ self.assertEqual(list(rrule(HOURLY,
1696
+ count=3,
1697
+ byweekno=-1,
1698
+ byweekday=SU,
1699
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1700
+ [datetime(1997, 12, 28, 0, 0),
1701
+ datetime(1997, 12, 28, 1, 0),
1702
+ datetime(1997, 12, 28, 2, 0)])
1703
+
1704
+ def testHourlyByWeekNoAndWeekDay53(self):
1705
+ self.assertEqual(list(rrule(HOURLY,
1706
+ count=3,
1707
+ byweekno=53,
1708
+ byweekday=MO,
1709
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1710
+ [datetime(1998, 12, 28, 0, 0),
1711
+ datetime(1998, 12, 28, 1, 0),
1712
+ datetime(1998, 12, 28, 2, 0)])
1713
+
1714
+ def testHourlyByEaster(self):
1715
+ self.assertEqual(list(rrule(HOURLY,
1716
+ count=3,
1717
+ byeaster=0,
1718
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1719
+ [datetime(1998, 4, 12, 0, 0),
1720
+ datetime(1998, 4, 12, 1, 0),
1721
+ datetime(1998, 4, 12, 2, 0)])
1722
+
1723
+ def testHourlyByEasterPos(self):
1724
+ self.assertEqual(list(rrule(HOURLY,
1725
+ count=3,
1726
+ byeaster=1,
1727
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1728
+ [datetime(1998, 4, 13, 0, 0),
1729
+ datetime(1998, 4, 13, 1, 0),
1730
+ datetime(1998, 4, 13, 2, 0)])
1731
+
1732
+ def testHourlyByEasterNeg(self):
1733
+ self.assertEqual(list(rrule(HOURLY,
1734
+ count=3,
1735
+ byeaster=-1,
1736
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1737
+ [datetime(1998, 4, 11, 0, 0),
1738
+ datetime(1998, 4, 11, 1, 0),
1739
+ datetime(1998, 4, 11, 2, 0)])
1740
+
1741
+ def testHourlyByHour(self):
1742
+ self.assertEqual(list(rrule(HOURLY,
1743
+ count=3,
1744
+ byhour=(6, 18),
1745
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1746
+ [datetime(1997, 9, 2, 18, 0),
1747
+ datetime(1997, 9, 3, 6, 0),
1748
+ datetime(1997, 9, 3, 18, 0)])
1749
+
1750
+ def testHourlyByMinute(self):
1751
+ self.assertEqual(list(rrule(HOURLY,
1752
+ count=3,
1753
+ byminute=(6, 18),
1754
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1755
+ [datetime(1997, 9, 2, 9, 6),
1756
+ datetime(1997, 9, 2, 9, 18),
1757
+ datetime(1997, 9, 2, 10, 6)])
1758
+
1759
+ def testHourlyBySecond(self):
1760
+ self.assertEqual(list(rrule(HOURLY,
1761
+ count=3,
1762
+ bysecond=(6, 18),
1763
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1764
+ [datetime(1997, 9, 2, 9, 0, 6),
1765
+ datetime(1997, 9, 2, 9, 0, 18),
1766
+ datetime(1997, 9, 2, 10, 0, 6)])
1767
+
1768
+ def testHourlyByHourAndMinute(self):
1769
+ self.assertEqual(list(rrule(HOURLY,
1770
+ count=3,
1771
+ byhour=(6, 18),
1772
+ byminute=(6, 18),
1773
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1774
+ [datetime(1997, 9, 2, 18, 6),
1775
+ datetime(1997, 9, 2, 18, 18),
1776
+ datetime(1997, 9, 3, 6, 6)])
1777
+
1778
+ def testHourlyByHourAndSecond(self):
1779
+ self.assertEqual(list(rrule(HOURLY,
1780
+ count=3,
1781
+ byhour=(6, 18),
1782
+ bysecond=(6, 18),
1783
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1784
+ [datetime(1997, 9, 2, 18, 0, 6),
1785
+ datetime(1997, 9, 2, 18, 0, 18),
1786
+ datetime(1997, 9, 3, 6, 0, 6)])
1787
+
1788
+ def testHourlyByMinuteAndSecond(self):
1789
+ self.assertEqual(list(rrule(HOURLY,
1790
+ count=3,
1791
+ byminute=(6, 18),
1792
+ bysecond=(6, 18),
1793
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1794
+ [datetime(1997, 9, 2, 9, 6, 6),
1795
+ datetime(1997, 9, 2, 9, 6, 18),
1796
+ datetime(1997, 9, 2, 9, 18, 6)])
1797
+
1798
+ def testHourlyByHourAndMinuteAndSecond(self):
1799
+ self.assertEqual(list(rrule(HOURLY,
1800
+ count=3,
1801
+ byhour=(6, 18),
1802
+ byminute=(6, 18),
1803
+ bysecond=(6, 18),
1804
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1805
+ [datetime(1997, 9, 2, 18, 6, 6),
1806
+ datetime(1997, 9, 2, 18, 6, 18),
1807
+ datetime(1997, 9, 2, 18, 18, 6)])
1808
+
1809
+ def testHourlyBySetPos(self):
1810
+ self.assertEqual(list(rrule(HOURLY,
1811
+ count=3,
1812
+ byminute=(15, 45),
1813
+ bysecond=(15, 45),
1814
+ bysetpos=(3, -3),
1815
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1816
+ [datetime(1997, 9, 2, 9, 15, 45),
1817
+ datetime(1997, 9, 2, 9, 45, 15),
1818
+ datetime(1997, 9, 2, 10, 15, 45)])
1819
+
1820
+ def testMinutely(self):
1821
+ self.assertEqual(list(rrule(MINUTELY,
1822
+ count=3,
1823
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1824
+ [datetime(1997, 9, 2, 9, 0),
1825
+ datetime(1997, 9, 2, 9, 1),
1826
+ datetime(1997, 9, 2, 9, 2)])
1827
+
1828
+ def testMinutelyInterval(self):
1829
+ self.assertEqual(list(rrule(MINUTELY,
1830
+ count=3,
1831
+ interval=2,
1832
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1833
+ [datetime(1997, 9, 2, 9, 0),
1834
+ datetime(1997, 9, 2, 9, 2),
1835
+ datetime(1997, 9, 2, 9, 4)])
1836
+
1837
+ def testMinutelyIntervalLarge(self):
1838
+ self.assertEqual(list(rrule(MINUTELY,
1839
+ count=3,
1840
+ interval=1501,
1841
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1842
+ [datetime(1997, 9, 2, 9, 0),
1843
+ datetime(1997, 9, 3, 10, 1),
1844
+ datetime(1997, 9, 4, 11, 2)])
1845
+
1846
+ def testMinutelyByMonth(self):
1847
+ self.assertEqual(list(rrule(MINUTELY,
1848
+ count=3,
1849
+ bymonth=(1, 3),
1850
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1851
+ [datetime(1998, 1, 1, 0, 0),
1852
+ datetime(1998, 1, 1, 0, 1),
1853
+ datetime(1998, 1, 1, 0, 2)])
1854
+
1855
+ def testMinutelyByMonthDay(self):
1856
+ self.assertEqual(list(rrule(MINUTELY,
1857
+ count=3,
1858
+ bymonthday=(1, 3),
1859
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1860
+ [datetime(1997, 9, 3, 0, 0),
1861
+ datetime(1997, 9, 3, 0, 1),
1862
+ datetime(1997, 9, 3, 0, 2)])
1863
+
1864
+ def testMinutelyByMonthAndMonthDay(self):
1865
+ self.assertEqual(list(rrule(MINUTELY,
1866
+ count=3,
1867
+ bymonth=(1, 3),
1868
+ bymonthday=(5, 7),
1869
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1870
+ [datetime(1998, 1, 5, 0, 0),
1871
+ datetime(1998, 1, 5, 0, 1),
1872
+ datetime(1998, 1, 5, 0, 2)])
1873
+
1874
+ def testMinutelyByWeekDay(self):
1875
+ self.assertEqual(list(rrule(MINUTELY,
1876
+ count=3,
1877
+ byweekday=(TU, TH),
1878
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1879
+ [datetime(1997, 9, 2, 9, 0),
1880
+ datetime(1997, 9, 2, 9, 1),
1881
+ datetime(1997, 9, 2, 9, 2)])
1882
+
1883
+ def testMinutelyByNWeekDay(self):
1884
+ self.assertEqual(list(rrule(MINUTELY,
1885
+ count=3,
1886
+ byweekday=(TU(1), TH(-1)),
1887
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1888
+ [datetime(1997, 9, 2, 9, 0),
1889
+ datetime(1997, 9, 2, 9, 1),
1890
+ datetime(1997, 9, 2, 9, 2)])
1891
+
1892
+ def testMinutelyByMonthAndWeekDay(self):
1893
+ self.assertEqual(list(rrule(MINUTELY,
1894
+ count=3,
1895
+ bymonth=(1, 3),
1896
+ byweekday=(TU, TH),
1897
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1898
+ [datetime(1998, 1, 1, 0, 0),
1899
+ datetime(1998, 1, 1, 0, 1),
1900
+ datetime(1998, 1, 1, 0, 2)])
1901
+
1902
+ def testMinutelyByMonthAndNWeekDay(self):
1903
+ self.assertEqual(list(rrule(MINUTELY,
1904
+ count=3,
1905
+ bymonth=(1, 3),
1906
+ byweekday=(TU(1), TH(-1)),
1907
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1908
+ [datetime(1998, 1, 1, 0, 0),
1909
+ datetime(1998, 1, 1, 0, 1),
1910
+ datetime(1998, 1, 1, 0, 2)])
1911
+
1912
+ def testMinutelyByMonthDayAndWeekDay(self):
1913
+ self.assertEqual(list(rrule(MINUTELY,
1914
+ count=3,
1915
+ bymonthday=(1, 3),
1916
+ byweekday=(TU, TH),
1917
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1918
+ [datetime(1998, 1, 1, 0, 0),
1919
+ datetime(1998, 1, 1, 0, 1),
1920
+ datetime(1998, 1, 1, 0, 2)])
1921
+
1922
+ def testMinutelyByMonthAndMonthDayAndWeekDay(self):
1923
+ self.assertEqual(list(rrule(MINUTELY,
1924
+ count=3,
1925
+ bymonth=(1, 3),
1926
+ bymonthday=(1, 3),
1927
+ byweekday=(TU, TH),
1928
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1929
+ [datetime(1998, 1, 1, 0, 0),
1930
+ datetime(1998, 1, 1, 0, 1),
1931
+ datetime(1998, 1, 1, 0, 2)])
1932
+
1933
+ def testMinutelyByYearDay(self):
1934
+ self.assertEqual(list(rrule(MINUTELY,
1935
+ count=4,
1936
+ byyearday=(1, 100, 200, 365),
1937
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1938
+ [datetime(1997, 12, 31, 0, 0),
1939
+ datetime(1997, 12, 31, 0, 1),
1940
+ datetime(1997, 12, 31, 0, 2),
1941
+ datetime(1997, 12, 31, 0, 3)])
1942
+
1943
+ def testMinutelyByYearDayNeg(self):
1944
+ self.assertEqual(list(rrule(MINUTELY,
1945
+ count=4,
1946
+ byyearday=(-365, -266, -166, -1),
1947
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1948
+ [datetime(1997, 12, 31, 0, 0),
1949
+ datetime(1997, 12, 31, 0, 1),
1950
+ datetime(1997, 12, 31, 0, 2),
1951
+ datetime(1997, 12, 31, 0, 3)])
1952
+
1953
+ def testMinutelyByMonthAndYearDay(self):
1954
+ self.assertEqual(list(rrule(MINUTELY,
1955
+ count=4,
1956
+ bymonth=(4, 7),
1957
+ byyearday=(1, 100, 200, 365),
1958
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1959
+ [datetime(1998, 4, 10, 0, 0),
1960
+ datetime(1998, 4, 10, 0, 1),
1961
+ datetime(1998, 4, 10, 0, 2),
1962
+ datetime(1998, 4, 10, 0, 3)])
1963
+
1964
+ def testMinutelyByMonthAndYearDayNeg(self):
1965
+ self.assertEqual(list(rrule(MINUTELY,
1966
+ count=4,
1967
+ bymonth=(4, 7),
1968
+ byyearday=(-365, -266, -166, -1),
1969
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1970
+ [datetime(1998, 4, 10, 0, 0),
1971
+ datetime(1998, 4, 10, 0, 1),
1972
+ datetime(1998, 4, 10, 0, 2),
1973
+ datetime(1998, 4, 10, 0, 3)])
1974
+
1975
+ def testMinutelyByWeekNo(self):
1976
+ self.assertEqual(list(rrule(MINUTELY,
1977
+ count=3,
1978
+ byweekno=20,
1979
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1980
+ [datetime(1998, 5, 11, 0, 0),
1981
+ datetime(1998, 5, 11, 0, 1),
1982
+ datetime(1998, 5, 11, 0, 2)])
1983
+
1984
+ def testMinutelyByWeekNoAndWeekDay(self):
1985
+ self.assertEqual(list(rrule(MINUTELY,
1986
+ count=3,
1987
+ byweekno=1,
1988
+ byweekday=MO,
1989
+ dtstart=datetime(1997, 9, 2, 9, 0))),
1990
+ [datetime(1997, 12, 29, 0, 0),
1991
+ datetime(1997, 12, 29, 0, 1),
1992
+ datetime(1997, 12, 29, 0, 2)])
1993
+
1994
+ def testMinutelyByWeekNoAndWeekDayLarge(self):
1995
+ self.assertEqual(list(rrule(MINUTELY,
1996
+ count=3,
1997
+ byweekno=52,
1998
+ byweekday=SU,
1999
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2000
+ [datetime(1997, 12, 28, 0, 0),
2001
+ datetime(1997, 12, 28, 0, 1),
2002
+ datetime(1997, 12, 28, 0, 2)])
2003
+
2004
+ def testMinutelyByWeekNoAndWeekDayLast(self):
2005
+ self.assertEqual(list(rrule(MINUTELY,
2006
+ count=3,
2007
+ byweekno=-1,
2008
+ byweekday=SU,
2009
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2010
+ [datetime(1997, 12, 28, 0, 0),
2011
+ datetime(1997, 12, 28, 0, 1),
2012
+ datetime(1997, 12, 28, 0, 2)])
2013
+
2014
+ def testMinutelyByWeekNoAndWeekDay53(self):
2015
+ self.assertEqual(list(rrule(MINUTELY,
2016
+ count=3,
2017
+ byweekno=53,
2018
+ byweekday=MO,
2019
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2020
+ [datetime(1998, 12, 28, 0, 0),
2021
+ datetime(1998, 12, 28, 0, 1),
2022
+ datetime(1998, 12, 28, 0, 2)])
2023
+
2024
+ def testMinutelyByEaster(self):
2025
+ self.assertEqual(list(rrule(MINUTELY,
2026
+ count=3,
2027
+ byeaster=0,
2028
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2029
+ [datetime(1998, 4, 12, 0, 0),
2030
+ datetime(1998, 4, 12, 0, 1),
2031
+ datetime(1998, 4, 12, 0, 2)])
2032
+
2033
+ def testMinutelyByEasterPos(self):
2034
+ self.assertEqual(list(rrule(MINUTELY,
2035
+ count=3,
2036
+ byeaster=1,
2037
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2038
+ [datetime(1998, 4, 13, 0, 0),
2039
+ datetime(1998, 4, 13, 0, 1),
2040
+ datetime(1998, 4, 13, 0, 2)])
2041
+
2042
+ def testMinutelyByEasterNeg(self):
2043
+ self.assertEqual(list(rrule(MINUTELY,
2044
+ count=3,
2045
+ byeaster=-1,
2046
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2047
+ [datetime(1998, 4, 11, 0, 0),
2048
+ datetime(1998, 4, 11, 0, 1),
2049
+ datetime(1998, 4, 11, 0, 2)])
2050
+
2051
+ def testMinutelyByHour(self):
2052
+ self.assertEqual(list(rrule(MINUTELY,
2053
+ count=3,
2054
+ byhour=(6, 18),
2055
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2056
+ [datetime(1997, 9, 2, 18, 0),
2057
+ datetime(1997, 9, 2, 18, 1),
2058
+ datetime(1997, 9, 2, 18, 2)])
2059
+
2060
+ def testMinutelyByMinute(self):
2061
+ self.assertEqual(list(rrule(MINUTELY,
2062
+ count=3,
2063
+ byminute=(6, 18),
2064
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2065
+ [datetime(1997, 9, 2, 9, 6),
2066
+ datetime(1997, 9, 2, 9, 18),
2067
+ datetime(1997, 9, 2, 10, 6)])
2068
+
2069
+ def testMinutelyBySecond(self):
2070
+ self.assertEqual(list(rrule(MINUTELY,
2071
+ count=3,
2072
+ bysecond=(6, 18),
2073
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2074
+ [datetime(1997, 9, 2, 9, 0, 6),
2075
+ datetime(1997, 9, 2, 9, 0, 18),
2076
+ datetime(1997, 9, 2, 9, 1, 6)])
2077
+
2078
+ def testMinutelyByHourAndMinute(self):
2079
+ self.assertEqual(list(rrule(MINUTELY,
2080
+ count=3,
2081
+ byhour=(6, 18),
2082
+ byminute=(6, 18),
2083
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2084
+ [datetime(1997, 9, 2, 18, 6),
2085
+ datetime(1997, 9, 2, 18, 18),
2086
+ datetime(1997, 9, 3, 6, 6)])
2087
+
2088
+ def testMinutelyByHourAndSecond(self):
2089
+ self.assertEqual(list(rrule(MINUTELY,
2090
+ count=3,
2091
+ byhour=(6, 18),
2092
+ bysecond=(6, 18),
2093
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2094
+ [datetime(1997, 9, 2, 18, 0, 6),
2095
+ datetime(1997, 9, 2, 18, 0, 18),
2096
+ datetime(1997, 9, 2, 18, 1, 6)])
2097
+
2098
+ def testMinutelyByMinuteAndSecond(self):
2099
+ self.assertEqual(list(rrule(MINUTELY,
2100
+ count=3,
2101
+ byminute=(6, 18),
2102
+ bysecond=(6, 18),
2103
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2104
+ [datetime(1997, 9, 2, 9, 6, 6),
2105
+ datetime(1997, 9, 2, 9, 6, 18),
2106
+ datetime(1997, 9, 2, 9, 18, 6)])
2107
+
2108
+ def testMinutelyByHourAndMinuteAndSecond(self):
2109
+ self.assertEqual(list(rrule(MINUTELY,
2110
+ count=3,
2111
+ byhour=(6, 18),
2112
+ byminute=(6, 18),
2113
+ bysecond=(6, 18),
2114
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2115
+ [datetime(1997, 9, 2, 18, 6, 6),
2116
+ datetime(1997, 9, 2, 18, 6, 18),
2117
+ datetime(1997, 9, 2, 18, 18, 6)])
2118
+
2119
+ def testMinutelyBySetPos(self):
2120
+ self.assertEqual(list(rrule(MINUTELY,
2121
+ count=3,
2122
+ bysecond=(15, 30, 45),
2123
+ bysetpos=(3, -3),
2124
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2125
+ [datetime(1997, 9, 2, 9, 0, 15),
2126
+ datetime(1997, 9, 2, 9, 0, 45),
2127
+ datetime(1997, 9, 2, 9, 1, 15)])
2128
+
2129
+ def testSecondly(self):
2130
+ self.assertEqual(list(rrule(SECONDLY,
2131
+ count=3,
2132
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2133
+ [datetime(1997, 9, 2, 9, 0, 0),
2134
+ datetime(1997, 9, 2, 9, 0, 1),
2135
+ datetime(1997, 9, 2, 9, 0, 2)])
2136
+
2137
+ def testSecondlyInterval(self):
2138
+ self.assertEqual(list(rrule(SECONDLY,
2139
+ count=3,
2140
+ interval=2,
2141
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2142
+ [datetime(1997, 9, 2, 9, 0, 0),
2143
+ datetime(1997, 9, 2, 9, 0, 2),
2144
+ datetime(1997, 9, 2, 9, 0, 4)])
2145
+
2146
+ def testSecondlyIntervalLarge(self):
2147
+ self.assertEqual(list(rrule(SECONDLY,
2148
+ count=3,
2149
+ interval=90061,
2150
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2151
+ [datetime(1997, 9, 2, 9, 0, 0),
2152
+ datetime(1997, 9, 3, 10, 1, 1),
2153
+ datetime(1997, 9, 4, 11, 2, 2)])
2154
+
2155
+ def testSecondlyByMonth(self):
2156
+ self.assertEqual(list(rrule(SECONDLY,
2157
+ count=3,
2158
+ bymonth=(1, 3),
2159
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2160
+ [datetime(1998, 1, 1, 0, 0, 0),
2161
+ datetime(1998, 1, 1, 0, 0, 1),
2162
+ datetime(1998, 1, 1, 0, 0, 2)])
2163
+
2164
+ def testSecondlyByMonthDay(self):
2165
+ self.assertEqual(list(rrule(SECONDLY,
2166
+ count=3,
2167
+ bymonthday=(1, 3),
2168
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2169
+ [datetime(1997, 9, 3, 0, 0, 0),
2170
+ datetime(1997, 9, 3, 0, 0, 1),
2171
+ datetime(1997, 9, 3, 0, 0, 2)])
2172
+
2173
+ def testSecondlyByMonthAndMonthDay(self):
2174
+ self.assertEqual(list(rrule(SECONDLY,
2175
+ count=3,
2176
+ bymonth=(1, 3),
2177
+ bymonthday=(5, 7),
2178
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2179
+ [datetime(1998, 1, 5, 0, 0, 0),
2180
+ datetime(1998, 1, 5, 0, 0, 1),
2181
+ datetime(1998, 1, 5, 0, 0, 2)])
2182
+
2183
+ def testSecondlyByWeekDay(self):
2184
+ self.assertEqual(list(rrule(SECONDLY,
2185
+ count=3,
2186
+ byweekday=(TU, TH),
2187
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2188
+ [datetime(1997, 9, 2, 9, 0, 0),
2189
+ datetime(1997, 9, 2, 9, 0, 1),
2190
+ datetime(1997, 9, 2, 9, 0, 2)])
2191
+
2192
+ def testSecondlyByNWeekDay(self):
2193
+ self.assertEqual(list(rrule(SECONDLY,
2194
+ count=3,
2195
+ byweekday=(TU(1), TH(-1)),
2196
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2197
+ [datetime(1997, 9, 2, 9, 0, 0),
2198
+ datetime(1997, 9, 2, 9, 0, 1),
2199
+ datetime(1997, 9, 2, 9, 0, 2)])
2200
+
2201
+ def testSecondlyByMonthAndWeekDay(self):
2202
+ self.assertEqual(list(rrule(SECONDLY,
2203
+ count=3,
2204
+ bymonth=(1, 3),
2205
+ byweekday=(TU, TH),
2206
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2207
+ [datetime(1998, 1, 1, 0, 0, 0),
2208
+ datetime(1998, 1, 1, 0, 0, 1),
2209
+ datetime(1998, 1, 1, 0, 0, 2)])
2210
+
2211
+ def testSecondlyByMonthAndNWeekDay(self):
2212
+ self.assertEqual(list(rrule(SECONDLY,
2213
+ count=3,
2214
+ bymonth=(1, 3),
2215
+ byweekday=(TU(1), TH(-1)),
2216
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2217
+ [datetime(1998, 1, 1, 0, 0, 0),
2218
+ datetime(1998, 1, 1, 0, 0, 1),
2219
+ datetime(1998, 1, 1, 0, 0, 2)])
2220
+
2221
+ def testSecondlyByMonthDayAndWeekDay(self):
2222
+ self.assertEqual(list(rrule(SECONDLY,
2223
+ count=3,
2224
+ bymonthday=(1, 3),
2225
+ byweekday=(TU, TH),
2226
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2227
+ [datetime(1998, 1, 1, 0, 0, 0),
2228
+ datetime(1998, 1, 1, 0, 0, 1),
2229
+ datetime(1998, 1, 1, 0, 0, 2)])
2230
+
2231
+ def testSecondlyByMonthAndMonthDayAndWeekDay(self):
2232
+ self.assertEqual(list(rrule(SECONDLY,
2233
+ count=3,
2234
+ bymonth=(1, 3),
2235
+ bymonthday=(1, 3),
2236
+ byweekday=(TU, TH),
2237
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2238
+ [datetime(1998, 1, 1, 0, 0, 0),
2239
+ datetime(1998, 1, 1, 0, 0, 1),
2240
+ datetime(1998, 1, 1, 0, 0, 2)])
2241
+
2242
+ def testSecondlyByYearDay(self):
2243
+ self.assertEqual(list(rrule(SECONDLY,
2244
+ count=4,
2245
+ byyearday=(1, 100, 200, 365),
2246
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2247
+ [datetime(1997, 12, 31, 0, 0, 0),
2248
+ datetime(1997, 12, 31, 0, 0, 1),
2249
+ datetime(1997, 12, 31, 0, 0, 2),
2250
+ datetime(1997, 12, 31, 0, 0, 3)])
2251
+
2252
+ def testSecondlyByYearDayNeg(self):
2253
+ self.assertEqual(list(rrule(SECONDLY,
2254
+ count=4,
2255
+ byyearday=(-365, -266, -166, -1),
2256
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2257
+ [datetime(1997, 12, 31, 0, 0, 0),
2258
+ datetime(1997, 12, 31, 0, 0, 1),
2259
+ datetime(1997, 12, 31, 0, 0, 2),
2260
+ datetime(1997, 12, 31, 0, 0, 3)])
2261
+
2262
+ def testSecondlyByMonthAndYearDay(self):
2263
+ self.assertEqual(list(rrule(SECONDLY,
2264
+ count=4,
2265
+ bymonth=(4, 7),
2266
+ byyearday=(1, 100, 200, 365),
2267
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2268
+ [datetime(1998, 4, 10, 0, 0, 0),
2269
+ datetime(1998, 4, 10, 0, 0, 1),
2270
+ datetime(1998, 4, 10, 0, 0, 2),
2271
+ datetime(1998, 4, 10, 0, 0, 3)])
2272
+
2273
+ def testSecondlyByMonthAndYearDayNeg(self):
2274
+ self.assertEqual(list(rrule(SECONDLY,
2275
+ count=4,
2276
+ bymonth=(4, 7),
2277
+ byyearday=(-365, -266, -166, -1),
2278
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2279
+ [datetime(1998, 4, 10, 0, 0, 0),
2280
+ datetime(1998, 4, 10, 0, 0, 1),
2281
+ datetime(1998, 4, 10, 0, 0, 2),
2282
+ datetime(1998, 4, 10, 0, 0, 3)])
2283
+
2284
+ def testSecondlyByWeekNo(self):
2285
+ self.assertEqual(list(rrule(SECONDLY,
2286
+ count=3,
2287
+ byweekno=20,
2288
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2289
+ [datetime(1998, 5, 11, 0, 0, 0),
2290
+ datetime(1998, 5, 11, 0, 0, 1),
2291
+ datetime(1998, 5, 11, 0, 0, 2)])
2292
+
2293
+ def testSecondlyByWeekNoAndWeekDay(self):
2294
+ self.assertEqual(list(rrule(SECONDLY,
2295
+ count=3,
2296
+ byweekno=1,
2297
+ byweekday=MO,
2298
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2299
+ [datetime(1997, 12, 29, 0, 0, 0),
2300
+ datetime(1997, 12, 29, 0, 0, 1),
2301
+ datetime(1997, 12, 29, 0, 0, 2)])
2302
+
2303
+ def testSecondlyByWeekNoAndWeekDayLarge(self):
2304
+ self.assertEqual(list(rrule(SECONDLY,
2305
+ count=3,
2306
+ byweekno=52,
2307
+ byweekday=SU,
2308
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2309
+ [datetime(1997, 12, 28, 0, 0, 0),
2310
+ datetime(1997, 12, 28, 0, 0, 1),
2311
+ datetime(1997, 12, 28, 0, 0, 2)])
2312
+
2313
+ def testSecondlyByWeekNoAndWeekDayLast(self):
2314
+ self.assertEqual(list(rrule(SECONDLY,
2315
+ count=3,
2316
+ byweekno=-1,
2317
+ byweekday=SU,
2318
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2319
+ [datetime(1997, 12, 28, 0, 0, 0),
2320
+ datetime(1997, 12, 28, 0, 0, 1),
2321
+ datetime(1997, 12, 28, 0, 0, 2)])
2322
+
2323
+ def testSecondlyByWeekNoAndWeekDay53(self):
2324
+ self.assertEqual(list(rrule(SECONDLY,
2325
+ count=3,
2326
+ byweekno=53,
2327
+ byweekday=MO,
2328
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2329
+ [datetime(1998, 12, 28, 0, 0, 0),
2330
+ datetime(1998, 12, 28, 0, 0, 1),
2331
+ datetime(1998, 12, 28, 0, 0, 2)])
2332
+
2333
+ def testSecondlyByEaster(self):
2334
+ self.assertEqual(list(rrule(SECONDLY,
2335
+ count=3,
2336
+ byeaster=0,
2337
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2338
+ [datetime(1998, 4, 12, 0, 0, 0),
2339
+ datetime(1998, 4, 12, 0, 0, 1),
2340
+ datetime(1998, 4, 12, 0, 0, 2)])
2341
+
2342
+ def testSecondlyByEasterPos(self):
2343
+ self.assertEqual(list(rrule(SECONDLY,
2344
+ count=3,
2345
+ byeaster=1,
2346
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2347
+ [datetime(1998, 4, 13, 0, 0, 0),
2348
+ datetime(1998, 4, 13, 0, 0, 1),
2349
+ datetime(1998, 4, 13, 0, 0, 2)])
2350
+
2351
+ def testSecondlyByEasterNeg(self):
2352
+ self.assertEqual(list(rrule(SECONDLY,
2353
+ count=3,
2354
+ byeaster=-1,
2355
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2356
+ [datetime(1998, 4, 11, 0, 0, 0),
2357
+ datetime(1998, 4, 11, 0, 0, 1),
2358
+ datetime(1998, 4, 11, 0, 0, 2)])
2359
+
2360
+ def testSecondlyByHour(self):
2361
+ self.assertEqual(list(rrule(SECONDLY,
2362
+ count=3,
2363
+ byhour=(6, 18),
2364
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2365
+ [datetime(1997, 9, 2, 18, 0, 0),
2366
+ datetime(1997, 9, 2, 18, 0, 1),
2367
+ datetime(1997, 9, 2, 18, 0, 2)])
2368
+
2369
+ def testSecondlyByMinute(self):
2370
+ self.assertEqual(list(rrule(SECONDLY,
2371
+ count=3,
2372
+ byminute=(6, 18),
2373
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2374
+ [datetime(1997, 9, 2, 9, 6, 0),
2375
+ datetime(1997, 9, 2, 9, 6, 1),
2376
+ datetime(1997, 9, 2, 9, 6, 2)])
2377
+
2378
+ def testSecondlyBySecond(self):
2379
+ self.assertEqual(list(rrule(SECONDLY,
2380
+ count=3,
2381
+ bysecond=(6, 18),
2382
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2383
+ [datetime(1997, 9, 2, 9, 0, 6),
2384
+ datetime(1997, 9, 2, 9, 0, 18),
2385
+ datetime(1997, 9, 2, 9, 1, 6)])
2386
+
2387
+ def testSecondlyByHourAndMinute(self):
2388
+ self.assertEqual(list(rrule(SECONDLY,
2389
+ count=3,
2390
+ byhour=(6, 18),
2391
+ byminute=(6, 18),
2392
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2393
+ [datetime(1997, 9, 2, 18, 6, 0),
2394
+ datetime(1997, 9, 2, 18, 6, 1),
2395
+ datetime(1997, 9, 2, 18, 6, 2)])
2396
+
2397
+ def testSecondlyByHourAndSecond(self):
2398
+ self.assertEqual(list(rrule(SECONDLY,
2399
+ count=3,
2400
+ byhour=(6, 18),
2401
+ bysecond=(6, 18),
2402
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2403
+ [datetime(1997, 9, 2, 18, 0, 6),
2404
+ datetime(1997, 9, 2, 18, 0, 18),
2405
+ datetime(1997, 9, 2, 18, 1, 6)])
2406
+
2407
+ def testSecondlyByMinuteAndSecond(self):
2408
+ self.assertEqual(list(rrule(SECONDLY,
2409
+ count=3,
2410
+ byminute=(6, 18),
2411
+ bysecond=(6, 18),
2412
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2413
+ [datetime(1997, 9, 2, 9, 6, 6),
2414
+ datetime(1997, 9, 2, 9, 6, 18),
2415
+ datetime(1997, 9, 2, 9, 18, 6)])
2416
+
2417
+ def testSecondlyByHourAndMinuteAndSecond(self):
2418
+ self.assertEqual(list(rrule(SECONDLY,
2419
+ count=3,
2420
+ byhour=(6, 18),
2421
+ byminute=(6, 18),
2422
+ bysecond=(6, 18),
2423
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2424
+ [datetime(1997, 9, 2, 18, 6, 6),
2425
+ datetime(1997, 9, 2, 18, 6, 18),
2426
+ datetime(1997, 9, 2, 18, 18, 6)])
2427
+
2428
+ def testSecondlyByHourAndMinuteAndSecondBug(self):
2429
+ # This explores a bug found by Mathieu Bridon.
2430
+ self.assertEqual(list(rrule(SECONDLY,
2431
+ count=3,
2432
+ bysecond=(0,),
2433
+ byminute=(1,),
2434
+ dtstart=datetime(2010, 3, 22, 12, 1))),
2435
+ [datetime(2010, 3, 22, 12, 1),
2436
+ datetime(2010, 3, 22, 13, 1),
2437
+ datetime(2010, 3, 22, 14, 1)])
2438
+
2439
+ def testLongIntegers(self):
2440
+ if not PY3: # There is no longs in python3
2441
+ self.assertEqual(list(rrule(MINUTELY,
2442
+ count=long(2),
2443
+ interval=long(2),
2444
+ bymonth=long(2),
2445
+ byweekday=long(3),
2446
+ byhour=long(6),
2447
+ byminute=long(6),
2448
+ bysecond=long(6),
2449
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2450
+ [datetime(1998, 2, 5, 6, 6, 6),
2451
+ datetime(1998, 2, 12, 6, 6, 6)])
2452
+ self.assertEqual(list(rrule(YEARLY,
2453
+ count=long(2),
2454
+ bymonthday=long(5),
2455
+ byweekno=long(2),
2456
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2457
+ [datetime(1998, 1, 5, 9, 0),
2458
+ datetime(2004, 1, 5, 9, 0)])
2459
+
2460
+ def testHourlyBadRRule(self):
2461
+ """
2462
+ When `byhour` is specified with `freq=HOURLY`, there are certain
2463
+ combinations of `dtstart` and `byhour` which result in an rrule with no
2464
+ valid values.
2465
+
2466
+ See https://github.com/dateutil/dateutil/issues/4
2467
+ """
2468
+
2469
+ self.assertRaises(ValueError, rrule, HOURLY,
2470
+ **dict(interval=4, byhour=(7, 11, 15, 19),
2471
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2472
+
2473
+ def testMinutelyBadRRule(self):
2474
+ """
2475
+ See :func:`testHourlyBadRRule` for details.
2476
+ """
2477
+
2478
+ self.assertRaises(ValueError, rrule, MINUTELY,
2479
+ **dict(interval=12, byminute=(10, 11, 25, 39, 50),
2480
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2481
+
2482
+ def testSecondlyBadRRule(self):
2483
+ """
2484
+ See :func:`testHourlyBadRRule` for details.
2485
+ """
2486
+
2487
+ self.assertRaises(ValueError, rrule, SECONDLY,
2488
+ **dict(interval=10, bysecond=(2, 15, 37, 42, 59),
2489
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2490
+
2491
+ def testMinutelyBadComboRRule(self):
2492
+ """
2493
+ Certain values of :param:`interval` in :class:`rrule`, when combined
2494
+ with certain values of :param:`byhour` create rules which apply to no
2495
+ valid dates. The library should detect this case in the iterator and
2496
+ raise a :exception:`ValueError`.
2497
+ """
2498
+
2499
+ # In Python 2.7 you can use a context manager for this.
2500
+ def make_bad_rrule():
2501
+ list(rrule(MINUTELY, interval=120, byhour=(10, 12, 14, 16),
2502
+ count=2, dtstart=datetime(1997, 9, 2, 9, 0)))
2503
+
2504
+ self.assertRaises(ValueError, make_bad_rrule)
2505
+
2506
+ def testSecondlyBadComboRRule(self):
2507
+ """
2508
+ See :func:`testMinutelyBadComboRRule' for details.
2509
+ """
2510
+
2511
+ # In Python 2.7 you can use a context manager for this.
2512
+ def make_bad_minute_rrule():
2513
+ list(rrule(SECONDLY, interval=360, byminute=(10, 28, 49),
2514
+ count=4, dtstart=datetime(1997, 9, 2, 9, 0)))
2515
+
2516
+ def make_bad_hour_rrule():
2517
+ list(rrule(SECONDLY, interval=43200, byhour=(2, 10, 18, 23),
2518
+ count=4, dtstart=datetime(1997, 9, 2, 9, 0)))
2519
+
2520
+ self.assertRaises(ValueError, make_bad_minute_rrule)
2521
+ self.assertRaises(ValueError, make_bad_hour_rrule)
2522
+
2523
+ def testUntilNotMatching(self):
2524
+ self.assertEqual(list(rrule(DAILY,
2525
+ count=3,
2526
+ dtstart=datetime(1997, 9, 2, 9, 0),
2527
+ until=datetime(1997, 9, 5, 8, 0))),
2528
+ [datetime(1997, 9, 2, 9, 0),
2529
+ datetime(1997, 9, 3, 9, 0),
2530
+ datetime(1997, 9, 4, 9, 0)])
2531
+
2532
+ def testUntilMatching(self):
2533
+ self.assertEqual(list(rrule(DAILY,
2534
+ count=3,
2535
+ dtstart=datetime(1997, 9, 2, 9, 0),
2536
+ until=datetime(1997, 9, 4, 9, 0))),
2537
+ [datetime(1997, 9, 2, 9, 0),
2538
+ datetime(1997, 9, 3, 9, 0),
2539
+ datetime(1997, 9, 4, 9, 0)])
2540
+
2541
+ def testUntilSingle(self):
2542
+ self.assertEqual(list(rrule(DAILY,
2543
+ count=3,
2544
+ dtstart=datetime(1997, 9, 2, 9, 0),
2545
+ until=datetime(1997, 9, 2, 9, 0))),
2546
+ [datetime(1997, 9, 2, 9, 0)])
2547
+
2548
+ def testUntilEmpty(self):
2549
+ self.assertEqual(list(rrule(DAILY,
2550
+ count=3,
2551
+ dtstart=datetime(1997, 9, 2, 9, 0),
2552
+ until=datetime(1997, 9, 1, 9, 0))),
2553
+ [])
2554
+
2555
+ def testUntilWithDate(self):
2556
+ self.assertEqual(list(rrule(DAILY,
2557
+ count=3,
2558
+ dtstart=datetime(1997, 9, 2, 9, 0),
2559
+ until=date(1997, 9, 5))),
2560
+ [datetime(1997, 9, 2, 9, 0),
2561
+ datetime(1997, 9, 3, 9, 0),
2562
+ datetime(1997, 9, 4, 9, 0)])
2563
+
2564
+ def testWkStIntervalMO(self):
2565
+ self.assertEqual(list(rrule(WEEKLY,
2566
+ count=3,
2567
+ interval=2,
2568
+ byweekday=(TU, SU),
2569
+ wkst=MO,
2570
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2571
+ [datetime(1997, 9, 2, 9, 0),
2572
+ datetime(1997, 9, 7, 9, 0),
2573
+ datetime(1997, 9, 16, 9, 0)])
2574
+
2575
+ def testWkStIntervalSU(self):
2576
+ self.assertEqual(list(rrule(WEEKLY,
2577
+ count=3,
2578
+ interval=2,
2579
+ byweekday=(TU, SU),
2580
+ wkst=SU,
2581
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2582
+ [datetime(1997, 9, 2, 9, 0),
2583
+ datetime(1997, 9, 14, 9, 0),
2584
+ datetime(1997, 9, 16, 9, 0)])
2585
+
2586
+ def testDTStartIsDate(self):
2587
+ self.assertEqual(list(rrule(DAILY,
2588
+ count=3,
2589
+ dtstart=date(1997, 9, 2))),
2590
+ [datetime(1997, 9, 2, 0, 0),
2591
+ datetime(1997, 9, 3, 0, 0),
2592
+ datetime(1997, 9, 4, 0, 0)])
2593
+
2594
+ def testDTStartWithMicroseconds(self):
2595
+ self.assertEqual(list(rrule(DAILY,
2596
+ count=3,
2597
+ dtstart=datetime(1997, 9, 2, 9, 0, 0, 500000))),
2598
+ [datetime(1997, 9, 2, 9, 0),
2599
+ datetime(1997, 9, 3, 9, 0),
2600
+ datetime(1997, 9, 4, 9, 0)])
2601
+
2602
+ def testMaxYear(self):
2603
+ self.assertEqual(list(rrule(YEARLY,
2604
+ count=3,
2605
+ bymonth=2,
2606
+ bymonthday=31,
2607
+ dtstart=datetime(9997, 9, 2, 9, 0, 0))),
2608
+ [])
2609
+
2610
+ def testGetItem(self):
2611
+ self.assertEqual(rrule(DAILY,
2612
+ count=3,
2613
+ dtstart=datetime(1997, 9, 2, 9, 0))[0],
2614
+ datetime(1997, 9, 2, 9, 0))
2615
+
2616
+ def testGetItemNeg(self):
2617
+ self.assertEqual(rrule(DAILY,
2618
+ count=3,
2619
+ dtstart=datetime(1997, 9, 2, 9, 0))[-1],
2620
+ datetime(1997, 9, 4, 9, 0))
2621
+
2622
+ def testGetItemSlice(self):
2623
+ self.assertEqual(rrule(DAILY,
2624
+ # count=3,
2625
+ dtstart=datetime(1997, 9, 2, 9, 0))[1:2],
2626
+ [datetime(1997, 9, 3, 9, 0)])
2627
+
2628
+ def testGetItemSliceEmpty(self):
2629
+ self.assertEqual(rrule(DAILY,
2630
+ count=3,
2631
+ dtstart=datetime(1997, 9, 2, 9, 0))[:],
2632
+ [datetime(1997, 9, 2, 9, 0),
2633
+ datetime(1997, 9, 3, 9, 0),
2634
+ datetime(1997, 9, 4, 9, 0)])
2635
+
2636
+ def testGetItemSliceStep(self):
2637
+ self.assertEqual(rrule(DAILY,
2638
+ count=3,
2639
+ dtstart=datetime(1997, 9, 2, 9, 0))[::-2],
2640
+ [datetime(1997, 9, 4, 9, 0),
2641
+ datetime(1997, 9, 2, 9, 0)])
2642
+
2643
+ def testCount(self):
2644
+ self.assertEqual(rrule(DAILY,
2645
+ count=3,
2646
+ dtstart=datetime(1997, 9, 2, 9, 0)).count(),
2647
+ 3)
2648
+
2649
+ def testContains(self):
2650
+ rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0))
2651
+ self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2652
+
2653
+ def testContainsNot(self):
2654
+ rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0))
2655
+ self.assertEqual(datetime(1997, 9, 3, 9, 0) not in rr, False)
2656
+
2657
+ def testBefore(self):
2658
+ self.assertEqual(rrule(DAILY, # count=5
2659
+ dtstart=datetime(1997, 9, 2, 9, 0)).before(datetime(1997, 9, 5, 9, 0)),
2660
+ datetime(1997, 9, 4, 9, 0))
2661
+
2662
+ def testBeforeInc(self):
2663
+ self.assertEqual(rrule(DAILY,
2664
+ #count=5,
2665
+ dtstart=datetime(1997, 9, 2, 9, 0))
2666
+ .before(datetime(1997, 9, 5, 9, 0), inc=True),
2667
+ datetime(1997, 9, 5, 9, 0))
2668
+
2669
+ def testAfter(self):
2670
+ self.assertEqual(rrule(DAILY,
2671
+ #count=5,
2672
+ dtstart=datetime(1997, 9, 2, 9, 0))
2673
+ .after(datetime(1997, 9, 4, 9, 0)),
2674
+ datetime(1997, 9, 5, 9, 0))
2675
+
2676
+ def testAfterInc(self):
2677
+ self.assertEqual(rrule(DAILY,
2678
+ #count=5,
2679
+ dtstart=datetime(1997, 9, 2, 9, 0))
2680
+ .after(datetime(1997, 9, 4, 9, 0), inc=True),
2681
+ datetime(1997, 9, 4, 9, 0))
2682
+
2683
+ def testBetween(self):
2684
+ self.assertEqual(rrule(DAILY,
2685
+ #count=5,
2686
+ dtstart=datetime(1997, 9, 2, 9, 0))
2687
+ .between(datetime(1997, 9, 2, 9, 0),
2688
+ datetime(1997, 9, 6, 9, 0)),
2689
+ [datetime(1997, 9, 3, 9, 0),
2690
+ datetime(1997, 9, 4, 9, 0),
2691
+ datetime(1997, 9, 5, 9, 0)])
2692
+
2693
+ def testBetweenInc(self):
2694
+ self.assertEqual(rrule(DAILY,
2695
+ #count=5,
2696
+ dtstart=datetime(1997, 9, 2, 9, 0))
2697
+ .between(datetime(1997, 9, 2, 9, 0),
2698
+ datetime(1997, 9, 6, 9, 0), inc=True),
2699
+ [datetime(1997, 9, 2, 9, 0),
2700
+ datetime(1997, 9, 3, 9, 0),
2701
+ datetime(1997, 9, 4, 9, 0),
2702
+ datetime(1997, 9, 5, 9, 0),
2703
+ datetime(1997, 9, 6, 9, 0)])
2704
+
2705
+ def testCachePre(self):
2706
+ rr = rrule(DAILY, count=15, cache=True,
2707
+ dtstart=datetime(1997, 9, 2, 9, 0))
2708
+ self.assertEqual(list(rr),
2709
+ [datetime(1997, 9, 2, 9, 0),
2710
+ datetime(1997, 9, 3, 9, 0),
2711
+ datetime(1997, 9, 4, 9, 0),
2712
+ datetime(1997, 9, 5, 9, 0),
2713
+ datetime(1997, 9, 6, 9, 0),
2714
+ datetime(1997, 9, 7, 9, 0),
2715
+ datetime(1997, 9, 8, 9, 0),
2716
+ datetime(1997, 9, 9, 9, 0),
2717
+ datetime(1997, 9, 10, 9, 0),
2718
+ datetime(1997, 9, 11, 9, 0),
2719
+ datetime(1997, 9, 12, 9, 0),
2720
+ datetime(1997, 9, 13, 9, 0),
2721
+ datetime(1997, 9, 14, 9, 0),
2722
+ datetime(1997, 9, 15, 9, 0),
2723
+ datetime(1997, 9, 16, 9, 0)])
2724
+
2725
+ def testCachePost(self):
2726
+ rr = rrule(DAILY, count=15, cache=True,
2727
+ dtstart=datetime(1997, 9, 2, 9, 0))
2728
+ for x in rr: pass
2729
+ self.assertEqual(list(rr),
2730
+ [datetime(1997, 9, 2, 9, 0),
2731
+ datetime(1997, 9, 3, 9, 0),
2732
+ datetime(1997, 9, 4, 9, 0),
2733
+ datetime(1997, 9, 5, 9, 0),
2734
+ datetime(1997, 9, 6, 9, 0),
2735
+ datetime(1997, 9, 7, 9, 0),
2736
+ datetime(1997, 9, 8, 9, 0),
2737
+ datetime(1997, 9, 9, 9, 0),
2738
+ datetime(1997, 9, 10, 9, 0),
2739
+ datetime(1997, 9, 11, 9, 0),
2740
+ datetime(1997, 9, 12, 9, 0),
2741
+ datetime(1997, 9, 13, 9, 0),
2742
+ datetime(1997, 9, 14, 9, 0),
2743
+ datetime(1997, 9, 15, 9, 0),
2744
+ datetime(1997, 9, 16, 9, 0)])
2745
+
2746
+ def testCachePostInternal(self):
2747
+ rr = rrule(DAILY, count=15, cache=True,
2748
+ dtstart=datetime(1997, 9, 2, 9, 0))
2749
+ for x in rr: pass
2750
+ self.assertEqual(rr._cache,
2751
+ [datetime(1997, 9, 2, 9, 0),
2752
+ datetime(1997, 9, 3, 9, 0),
2753
+ datetime(1997, 9, 4, 9, 0),
2754
+ datetime(1997, 9, 5, 9, 0),
2755
+ datetime(1997, 9, 6, 9, 0),
2756
+ datetime(1997, 9, 7, 9, 0),
2757
+ datetime(1997, 9, 8, 9, 0),
2758
+ datetime(1997, 9, 9, 9, 0),
2759
+ datetime(1997, 9, 10, 9, 0),
2760
+ datetime(1997, 9, 11, 9, 0),
2761
+ datetime(1997, 9, 12, 9, 0),
2762
+ datetime(1997, 9, 13, 9, 0),
2763
+ datetime(1997, 9, 14, 9, 0),
2764
+ datetime(1997, 9, 15, 9, 0),
2765
+ datetime(1997, 9, 16, 9, 0)])
2766
+
2767
+ def testCachePreContains(self):
2768
+ rr = rrule(DAILY, count=3, cache=True,
2769
+ dtstart=datetime(1997, 9, 2, 9, 0))
2770
+ self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2771
+
2772
+ def testCachePostContains(self):
2773
+ rr = rrule(DAILY, count=3, cache=True,
2774
+ dtstart=datetime(1997, 9, 2, 9, 0))
2775
+ for x in rr: pass
2776
+ self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2777
+
2778
+ def testSet(self):
2779
+ set = rruleset()
2780
+ set.rrule(rrule(YEARLY, count=2, byweekday=TU,
2781
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2782
+ set.rrule(rrule(YEARLY, count=1, byweekday=TH,
2783
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2784
+ self.assertEqual(list(set),
2785
+ [datetime(1997, 9, 2, 9, 0),
2786
+ datetime(1997, 9, 4, 9, 0),
2787
+ datetime(1997, 9, 9, 9, 0)])
2788
+
2789
+ def testSetDate(self):
2790
+ set = rruleset()
2791
+ set.rrule(rrule(YEARLY, count=1, byweekday=TU,
2792
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2793
+ set.rdate(datetime(1997, 9, 4, 9))
2794
+ set.rdate(datetime(1997, 9, 9, 9))
2795
+ self.assertEqual(list(set),
2796
+ [datetime(1997, 9, 2, 9, 0),
2797
+ datetime(1997, 9, 4, 9, 0),
2798
+ datetime(1997, 9, 9, 9, 0)])
2799
+
2800
+ def testSetExRule(self):
2801
+ set = rruleset()
2802
+ set.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
2803
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2804
+ set.exrule(rrule(YEARLY, count=3, byweekday=TH,
2805
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2806
+ self.assertEqual(list(set),
2807
+ [datetime(1997, 9, 2, 9, 0),
2808
+ datetime(1997, 9, 9, 9, 0),
2809
+ datetime(1997, 9, 16, 9, 0)])
2810
+
2811
+ def testSetExDate(self):
2812
+ set = rruleset()
2813
+ set.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
2814
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2815
+ set.exdate(datetime(1997, 9, 4, 9))
2816
+ set.exdate(datetime(1997, 9, 11, 9))
2817
+ set.exdate(datetime(1997, 9, 18, 9))
2818
+ self.assertEqual(list(set),
2819
+ [datetime(1997, 9, 2, 9, 0),
2820
+ datetime(1997, 9, 9, 9, 0),
2821
+ datetime(1997, 9, 16, 9, 0)])
2822
+
2823
+ def testSetExDateRevOrder(self):
2824
+ set = rruleset()
2825
+ set.rrule(rrule(MONTHLY, count=5, bymonthday=10,
2826
+ dtstart=datetime(2004, 1, 1, 9, 0)))
2827
+ set.exdate(datetime(2004, 4, 10, 9, 0))
2828
+ set.exdate(datetime(2004, 2, 10, 9, 0))
2829
+ self.assertEqual(list(set),
2830
+ [datetime(2004, 1, 10, 9, 0),
2831
+ datetime(2004, 3, 10, 9, 0),
2832
+ datetime(2004, 5, 10, 9, 0)])
2833
+
2834
+ def testSetDateAndExDate(self):
2835
+ set = rruleset()
2836
+ set.rdate(datetime(1997, 9, 2, 9))
2837
+ set.rdate(datetime(1997, 9, 4, 9))
2838
+ set.rdate(datetime(1997, 9, 9, 9))
2839
+ set.rdate(datetime(1997, 9, 11, 9))
2840
+ set.rdate(datetime(1997, 9, 16, 9))
2841
+ set.rdate(datetime(1997, 9, 18, 9))
2842
+ set.exdate(datetime(1997, 9, 4, 9))
2843
+ set.exdate(datetime(1997, 9, 11, 9))
2844
+ set.exdate(datetime(1997, 9, 18, 9))
2845
+ self.assertEqual(list(set),
2846
+ [datetime(1997, 9, 2, 9, 0),
2847
+ datetime(1997, 9, 9, 9, 0),
2848
+ datetime(1997, 9, 16, 9, 0)])
2849
+
2850
+ def testSetDateAndExRule(self):
2851
+ set = rruleset()
2852
+ set.rdate(datetime(1997, 9, 2, 9))
2853
+ set.rdate(datetime(1997, 9, 4, 9))
2854
+ set.rdate(datetime(1997, 9, 9, 9))
2855
+ set.rdate(datetime(1997, 9, 11, 9))
2856
+ set.rdate(datetime(1997, 9, 16, 9))
2857
+ set.rdate(datetime(1997, 9, 18, 9))
2858
+ set.exrule(rrule(YEARLY, count=3, byweekday=TH,
2859
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2860
+ self.assertEqual(list(set),
2861
+ [datetime(1997, 9, 2, 9, 0),
2862
+ datetime(1997, 9, 9, 9, 0),
2863
+ datetime(1997, 9, 16, 9, 0)])
2864
+
2865
+ def testSetCount(self):
2866
+ set = rruleset()
2867
+ set.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
2868
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2869
+ set.exrule(rrule(YEARLY, count=3, byweekday=TH,
2870
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2871
+ self.assertEqual(set.count(), 3)
2872
+
2873
+ def testSetCachePre(self):
2874
+ set = rruleset()
2875
+ set.rrule(rrule(YEARLY, count=2, byweekday=TU,
2876
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2877
+ set.rrule(rrule(YEARLY, count=1, byweekday=TH,
2878
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2879
+ self.assertEqual(list(set),
2880
+ [datetime(1997, 9, 2, 9, 0),
2881
+ datetime(1997, 9, 4, 9, 0),
2882
+ datetime(1997, 9, 9, 9, 0)])
2883
+
2884
+ def testSetCachePost(self):
2885
+ set = rruleset(cache=True)
2886
+ set.rrule(rrule(YEARLY, count=2, byweekday=TU,
2887
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2888
+ set.rrule(rrule(YEARLY, count=1, byweekday=TH,
2889
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2890
+ for x in set: pass
2891
+ self.assertEqual(list(set),
2892
+ [datetime(1997, 9, 2, 9, 0),
2893
+ datetime(1997, 9, 4, 9, 0),
2894
+ datetime(1997, 9, 9, 9, 0)])
2895
+
2896
+ def testSetCachePostInternal(self):
2897
+ set = rruleset(cache=True)
2898
+ set.rrule(rrule(YEARLY, count=2, byweekday=TU,
2899
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2900
+ set.rrule(rrule(YEARLY, count=1, byweekday=TH,
2901
+ dtstart=datetime(1997, 9, 2, 9, 0)))
2902
+ for x in set: pass
2903
+ self.assertEqual(list(set._cache),
2904
+ [datetime(1997, 9, 2, 9, 0),
2905
+ datetime(1997, 9, 4, 9, 0),
2906
+ datetime(1997, 9, 9, 9, 0)])
2907
+
2908
+ def testStr(self):
2909
+ self.assertEqual(list(rrulestr(
2910
+ "DTSTART:19970902T090000\n"
2911
+ "RRULE:FREQ=YEARLY;COUNT=3\n"
2912
+ )),
2913
+ [datetime(1997, 9, 2, 9, 0),
2914
+ datetime(1998, 9, 2, 9, 0),
2915
+ datetime(1999, 9, 2, 9, 0)])
2916
+
2917
+ def testStrType(self):
2918
+ self.assertEqual(isinstance(rrulestr(
2919
+ "DTSTART:19970902T090000\n"
2920
+ "RRULE:FREQ=YEARLY;COUNT=3\n"
2921
+ ), rrule), True)
2922
+
2923
+ def testStrForceSetType(self):
2924
+ self.assertEqual(isinstance(rrulestr(
2925
+ "DTSTART:19970902T090000\n"
2926
+ "RRULE:FREQ=YEARLY;COUNT=3\n"
2927
+ , forceset=True), rruleset), True)
2928
+
2929
+ def testStrSetType(self):
2930
+ self.assertEqual(isinstance(rrulestr(
2931
+ "DTSTART:19970902T090000\n"
2932
+ "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2933
+ "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2934
+ ), rruleset), True)
2935
+
2936
+ def testStrCase(self):
2937
+ self.assertEqual(list(rrulestr(
2938
+ "dtstart:19970902T090000\n"
2939
+ "rrule:freq=yearly;count=3\n"
2940
+ )),
2941
+ [datetime(1997, 9, 2, 9, 0),
2942
+ datetime(1998, 9, 2, 9, 0),
2943
+ datetime(1999, 9, 2, 9, 0)])
2944
+
2945
+ def testStrSpaces(self):
2946
+ self.assertEqual(list(rrulestr(
2947
+ " DTSTART:19970902T090000 "
2948
+ " RRULE:FREQ=YEARLY;COUNT=3 "
2949
+ )),
2950
+ [datetime(1997, 9, 2, 9, 0),
2951
+ datetime(1998, 9, 2, 9, 0),
2952
+ datetime(1999, 9, 2, 9, 0)])
2953
+
2954
+ def testStrSpacesAndLines(self):
2955
+ self.assertEqual(list(rrulestr(
2956
+ " DTSTART:19970902T090000 \n"
2957
+ " \n"
2958
+ " RRULE:FREQ=YEARLY;COUNT=3 \n"
2959
+ )),
2960
+ [datetime(1997, 9, 2, 9, 0),
2961
+ datetime(1998, 9, 2, 9, 0),
2962
+ datetime(1999, 9, 2, 9, 0)])
2963
+
2964
+ def testStrNoDTStart(self):
2965
+ self.assertEqual(list(rrulestr(
2966
+ "RRULE:FREQ=YEARLY;COUNT=3\n"
2967
+ , dtstart=datetime(1997, 9, 2, 9, 0))),
2968
+ [datetime(1997, 9, 2, 9, 0),
2969
+ datetime(1998, 9, 2, 9, 0),
2970
+ datetime(1999, 9, 2, 9, 0)])
2971
+
2972
+ def testStrValueOnly(self):
2973
+ self.assertEqual(list(rrulestr(
2974
+ "FREQ=YEARLY;COUNT=3\n"
2975
+ , dtstart=datetime(1997, 9, 2, 9, 0))),
2976
+ [datetime(1997, 9, 2, 9, 0),
2977
+ datetime(1998, 9, 2, 9, 0),
2978
+ datetime(1999, 9, 2, 9, 0)])
2979
+
2980
+ def testStrUnfold(self):
2981
+ self.assertEqual(list(rrulestr(
2982
+ "FREQ=YEA\n RLY;COUNT=3\n", unfold=True,
2983
+ dtstart=datetime(1997, 9, 2, 9, 0))),
2984
+ [datetime(1997, 9, 2, 9, 0),
2985
+ datetime(1998, 9, 2, 9, 0),
2986
+ datetime(1999, 9, 2, 9, 0)])
2987
+
2988
+ def testStrSet(self):
2989
+ self.assertEqual(list(rrulestr(
2990
+ "DTSTART:19970902T090000\n"
2991
+ "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2992
+ "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2993
+ )),
2994
+ [datetime(1997, 9, 2, 9, 0),
2995
+ datetime(1997, 9, 4, 9, 0),
2996
+ datetime(1997, 9, 9, 9, 0)])
2997
+
2998
+ def testStrSetDate(self):
2999
+ self.assertEqual(list(rrulestr(
3000
+ "DTSTART:19970902T090000\n"
3001
+ "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n"
3002
+ "RDATE:19970904T090000\n"
3003
+ "RDATE:19970909T090000\n"
3004
+ )),
3005
+ [datetime(1997, 9, 2, 9, 0),
3006
+ datetime(1997, 9, 4, 9, 0),
3007
+ datetime(1997, 9, 9, 9, 0)])
3008
+
3009
+ def testStrSetExRule(self):
3010
+ self.assertEqual(list(rrulestr(
3011
+ "DTSTART:19970902T090000\n"
3012
+ "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
3013
+ "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
3014
+ )),
3015
+ [datetime(1997, 9, 2, 9, 0),
3016
+ datetime(1997, 9, 9, 9, 0),
3017
+ datetime(1997, 9, 16, 9, 0)])
3018
+
3019
+ def testStrSetExDate(self):
3020
+ self.assertEqual(list(rrulestr(
3021
+ "DTSTART:19970902T090000\n"
3022
+ "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
3023
+ "EXDATE:19970904T090000\n"
3024
+ "EXDATE:19970911T090000\n"
3025
+ "EXDATE:19970918T090000\n"
3026
+ )),
3027
+ [datetime(1997, 9, 2, 9, 0),
3028
+ datetime(1997, 9, 9, 9, 0),
3029
+ datetime(1997, 9, 16, 9, 0)])
3030
+
3031
+ def testStrSetDateAndExDate(self):
3032
+ self.assertEqual(list(rrulestr(
3033
+ "DTSTART:19970902T090000\n"
3034
+ "RDATE:19970902T090000\n"
3035
+ "RDATE:19970904T090000\n"
3036
+ "RDATE:19970909T090000\n"
3037
+ "RDATE:19970911T090000\n"
3038
+ "RDATE:19970916T090000\n"
3039
+ "RDATE:19970918T090000\n"
3040
+ "EXDATE:19970904T090000\n"
3041
+ "EXDATE:19970911T090000\n"
3042
+ "EXDATE:19970918T090000\n"
3043
+ )),
3044
+ [datetime(1997, 9, 2, 9, 0),
3045
+ datetime(1997, 9, 9, 9, 0),
3046
+ datetime(1997, 9, 16, 9, 0)])
3047
+
3048
+ def testStrSetDateAndExRule(self):
3049
+ self.assertEqual(list(rrulestr(
3050
+ "DTSTART:19970902T090000\n"
3051
+ "RDATE:19970902T090000\n"
3052
+ "RDATE:19970904T090000\n"
3053
+ "RDATE:19970909T090000\n"
3054
+ "RDATE:19970911T090000\n"
3055
+ "RDATE:19970916T090000\n"
3056
+ "RDATE:19970918T090000\n"
3057
+ "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
3058
+ )),
3059
+ [datetime(1997, 9, 2, 9, 0),
3060
+ datetime(1997, 9, 9, 9, 0),
3061
+ datetime(1997, 9, 16, 9, 0)])
3062
+
3063
+ def testStrKeywords(self):
3064
+ self.assertEqual(list(rrulestr(
3065
+ "DTSTART:19970902T090000\n"
3066
+ "RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;"
3067
+ "BYMONTH=3;BYWEEKDAY=TH;BYMONTHDAY=3;"
3068
+ "BYHOUR=3;BYMINUTE=3;BYSECOND=3\n"
3069
+ )),
3070
+ [datetime(2033, 3, 3, 3, 3, 3),
3071
+ datetime(2039, 3, 3, 3, 3, 3),
3072
+ datetime(2072, 3, 3, 3, 3, 3)])
3073
+
3074
+ def testStrNWeekDay(self):
3075
+ self.assertEqual(list(rrulestr(
3076
+ "DTSTART:19970902T090000\n"
3077
+ "RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n"
3078
+ )),
3079
+ [datetime(1997, 12, 25, 9, 0),
3080
+ datetime(1998, 1, 6, 9, 0),
3081
+ datetime(1998, 12, 31, 9, 0)])
3082
+
3083
+ def testBadBySetPos(self):
3084
+ self.assertRaises(ValueError,
3085
+ rrule, MONTHLY,
3086
+ count=1,
3087
+ bysetpos=0,
3088
+ dtstart=datetime(1997, 9, 2, 9, 0))
3089
+
3090
+ def testBadBySetPosMany(self):
3091
+ self.assertRaises(ValueError,
3092
+ rrule, MONTHLY,
3093
+ count=1,
3094
+ bysetpos=(-1, 0, 1),
3095
+ dtstart=datetime(1997, 9, 2, 9, 0))
3096
+
3097
+
3098
+ class ParserTest(unittest.TestCase):
3099
+
3100
+ def setUp(self):
3101
+ self.tzinfos = {"BRST": -10800}
3102
+ self.brsttz = tzoffset("BRST", -10800)
3103
+ self.default = datetime(2003, 9, 25)
3104
+
3105
+ def testDateCommandFormat(self):
3106
+ self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
3107
+ tzinfos=self.tzinfos),
3108
+ datetime(2003, 9, 25, 10, 36, 28,
3109
+ tzinfo=self.brsttz))
3110
+
3111
+ def testDateCommandFormatUnicode(self):
3112
+ self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
3113
+ tzinfos=self.tzinfos),
3114
+ datetime(2003, 9, 25, 10, 36, 28,
3115
+ tzinfo=self.brsttz))
3116
+
3117
+
3118
+ def testDateCommandFormatReversed(self):
3119
+ self.assertEqual(parse("2003 10:36:28 BRST 25 Sep Thu",
3120
+ tzinfos=self.tzinfos),
3121
+ datetime(2003, 9, 25, 10, 36, 28,
3122
+ tzinfo=self.brsttz))
3123
+
3124
+ def testDateCommandFormatWithLong(self):
3125
+ if not PY3:
3126
+ self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
3127
+ tzinfos={"BRST": long(-10800)}),
3128
+ datetime(2003, 9, 25, 10, 36, 28,
3129
+ tzinfo=self.brsttz))
3130
+ def testDateCommandFormatIgnoreTz(self):
3131
+ self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003",
3132
+ ignoretz=True),
3133
+ datetime(2003, 9, 25, 10, 36, 28))
3134
+
3135
+ def testDateCommandFormatStrip1(self):
3136
+ self.assertEqual(parse("Thu Sep 25 10:36:28 2003"),
3137
+ datetime(2003, 9, 25, 10, 36, 28))
3138
+
3139
+ def testDateCommandFormatStrip2(self):
3140
+ self.assertEqual(parse("Thu Sep 25 10:36:28", default=self.default),
3141
+ datetime(2003, 9, 25, 10, 36, 28))
3142
+
3143
+ def testDateCommandFormatStrip3(self):
3144
+ self.assertEqual(parse("Thu Sep 10:36:28", default=self.default),
3145
+ datetime(2003, 9, 25, 10, 36, 28))
3146
+
3147
+ def testDateCommandFormatStrip4(self):
3148
+ self.assertEqual(parse("Thu 10:36:28", default=self.default),
3149
+ datetime(2003, 9, 25, 10, 36, 28))
3150
+
3151
+ def testDateCommandFormatStrip5(self):
3152
+ self.assertEqual(parse("Sep 10:36:28", default=self.default),
3153
+ datetime(2003, 9, 25, 10, 36, 28))
3154
+
3155
+ def testDateCommandFormatStrip6(self):
3156
+ self.assertEqual(parse("10:36:28", default=self.default),
3157
+ datetime(2003, 9, 25, 10, 36, 28))
3158
+
3159
+ def testDateCommandFormatStrip7(self):
3160
+ self.assertEqual(parse("10:36", default=self.default),
3161
+ datetime(2003, 9, 25, 10, 36))
3162
+
3163
+ def testDateCommandFormatStrip8(self):
3164
+ self.assertEqual(parse("Thu Sep 25 2003"),
3165
+ datetime(2003, 9, 25))
3166
+
3167
+ def testDateCommandFormatStrip9(self):
3168
+ self.assertEqual(parse("Sep 25 2003"),
3169
+ datetime(2003, 9, 25))
3170
+
3171
+ def testDateCommandFormatStrip10(self):
3172
+ self.assertEqual(parse("Sep 2003", default=self.default),
3173
+ datetime(2003, 9, 25))
3174
+
3175
+ def testDateCommandFormatStrip11(self):
3176
+ self.assertEqual(parse("Sep", default=self.default),
3177
+ datetime(2003, 9, 25))
3178
+
3179
+ def testDateCommandFormatStrip12(self):
3180
+ self.assertEqual(parse("2003", default=self.default),
3181
+ datetime(2003, 9, 25))
3182
+
3183
+ def testDateRCommandFormat(self):
3184
+ self.assertEqual(parse("Thu, 25 Sep 2003 10:49:41 -0300"),
3185
+ datetime(2003, 9, 25, 10, 49, 41,
3186
+ tzinfo=self.brsttz))
3187
+
3188
+ def testISOFormat(self):
3189
+ self.assertEqual(parse("2003-09-25T10:49:41.5-03:00"),
3190
+ datetime(2003, 9, 25, 10, 49, 41, 500000,
3191
+ tzinfo=self.brsttz))
3192
+
3193
+ def testISOFormatStrip1(self):
3194
+ self.assertEqual(parse("2003-09-25T10:49:41-03:00"),
3195
+ datetime(2003, 9, 25, 10, 49, 41,
3196
+ tzinfo=self.brsttz))
3197
+
3198
+ def testISOFormatStrip2(self):
3199
+ self.assertEqual(parse("2003-09-25T10:49:41"),
3200
+ datetime(2003, 9, 25, 10, 49, 41))
3201
+
3202
+ def testISOFormatStrip3(self):
3203
+ self.assertEqual(parse("2003-09-25T10:49"),
3204
+ datetime(2003, 9, 25, 10, 49))
3205
+
3206
+ def testISOFormatStrip4(self):
3207
+ self.assertEqual(parse("2003-09-25T10"),
3208
+ datetime(2003, 9, 25, 10))
3209
+
3210
+ def testISOFormatStrip5(self):
3211
+ self.assertEqual(parse("2003-09-25"),
3212
+ datetime(2003, 9, 25))
3213
+
3214
+ def testISOStrippedFormat(self):
3215
+ self.assertEqual(parse("20030925T104941.5-0300"),
3216
+ datetime(2003, 9, 25, 10, 49, 41, 500000,
3217
+ tzinfo=self.brsttz))
3218
+
3219
+ def testISOStrippedFormatStrip1(self):
3220
+ self.assertEqual(parse("20030925T104941-0300"),
3221
+ datetime(2003, 9, 25, 10, 49, 41,
3222
+ tzinfo=self.brsttz))
3223
+
3224
+ def testISOStrippedFormatStrip2(self):
3225
+ self.assertEqual(parse("20030925T104941"),
3226
+ datetime(2003, 9, 25, 10, 49, 41))
3227
+
3228
+ def testISOStrippedFormatStrip3(self):
3229
+ self.assertEqual(parse("20030925T1049"),
3230
+ datetime(2003, 9, 25, 10, 49, 0))
3231
+
3232
+ def testISOStrippedFormatStrip4(self):
3233
+ self.assertEqual(parse("20030925T10"),
3234
+ datetime(2003, 9, 25, 10))
3235
+
3236
+ def testISOStrippedFormatStrip5(self):
3237
+ self.assertEqual(parse("20030925"),
3238
+ datetime(2003, 9, 25))
3239
+
3240
+ def testNoSeparator1(self):
3241
+ self.assertEqual(parse("199709020908"),
3242
+ datetime(1997, 9, 2, 9, 8))
3243
+
3244
+ def testNoSeparator2(self):
3245
+ self.assertEqual(parse("19970902090807"),
3246
+ datetime(1997, 9, 2, 9, 8, 7))
3247
+
3248
+ def testDateWithDash1(self):
3249
+ self.assertEqual(parse("2003-09-25"),
3250
+ datetime(2003, 9, 25))
3251
+
3252
+ def testDateWithDash2(self):
3253
+ self.assertEqual(parse("2003-Sep-25"),
3254
+ datetime(2003, 9, 25))
3255
+
3256
+ def testDateWithDash3(self):
3257
+ self.assertEqual(parse("25-Sep-2003"),
3258
+ datetime(2003, 9, 25))
3259
+
3260
+ def testDateWithDash4(self):
3261
+ self.assertEqual(parse("25-Sep-2003"),
3262
+ datetime(2003, 9, 25))
3263
+
3264
+ def testDateWithDash5(self):
3265
+ self.assertEqual(parse("Sep-25-2003"),
3266
+ datetime(2003, 9, 25))
3267
+
3268
+ def testDateWithDash6(self):
3269
+ self.assertEqual(parse("09-25-2003"),
3270
+ datetime(2003, 9, 25))
3271
+
3272
+ def testDateWithDash7(self):
3273
+ self.assertEqual(parse("25-09-2003"),
3274
+ datetime(2003, 9, 25))
3275
+
3276
+ def testDateWithDash8(self):
3277
+ self.assertEqual(parse("10-09-2003", dayfirst=True),
3278
+ datetime(2003, 9, 10))
3279
+
3280
+ def testDateWithDash9(self):
3281
+ self.assertEqual(parse("10-09-2003"),
3282
+ datetime(2003, 10, 9))
3283
+
3284
+ def testDateWithDash10(self):
3285
+ self.assertEqual(parse("10-09-03"),
3286
+ datetime(2003, 10, 9))
3287
+
3288
+ def testDateWithDash11(self):
3289
+ self.assertEqual(parse("10-09-03", yearfirst=True),
3290
+ datetime(2010, 9, 3))
3291
+
3292
+ def testDateWithDot1(self):
3293
+ self.assertEqual(parse("2003.09.25"),
3294
+ datetime(2003, 9, 25))
3295
+
3296
+ def testDateWithDot2(self):
3297
+ self.assertEqual(parse("2003.Sep.25"),
3298
+ datetime(2003, 9, 25))
3299
+
3300
+ def testDateWithDot3(self):
3301
+ self.assertEqual(parse("25.Sep.2003"),
3302
+ datetime(2003, 9, 25))
3303
+
3304
+ def testDateWithDot4(self):
3305
+ self.assertEqual(parse("25.Sep.2003"),
3306
+ datetime(2003, 9, 25))
3307
+
3308
+ def testDateWithDot5(self):
3309
+ self.assertEqual(parse("Sep.25.2003"),
3310
+ datetime(2003, 9, 25))
3311
+
3312
+ def testDateWithDot6(self):
3313
+ self.assertEqual(parse("09.25.2003"),
3314
+ datetime(2003, 9, 25))
3315
+
3316
+ def testDateWithDot7(self):
3317
+ self.assertEqual(parse("25.09.2003"),
3318
+ datetime(2003, 9, 25))
3319
+
3320
+ def testDateWithDot8(self):
3321
+ self.assertEqual(parse("10.09.2003", dayfirst=True),
3322
+ datetime(2003, 9, 10))
3323
+
3324
+ def testDateWithDot9(self):
3325
+ self.assertEqual(parse("10.09.2003"),
3326
+ datetime(2003, 10, 9))
3327
+
3328
+ def testDateWithDot10(self):
3329
+ self.assertEqual(parse("10.09.03"),
3330
+ datetime(2003, 10, 9))
3331
+
3332
+ def testDateWithDot11(self):
3333
+ self.assertEqual(parse("10.09.03", yearfirst=True),
3334
+ datetime(2010, 9, 3))
3335
+
3336
+ def testDateWithSlash1(self):
3337
+ self.assertEqual(parse("2003/09/25"),
3338
+ datetime(2003, 9, 25))
3339
+
3340
+ def testDateWithSlash2(self):
3341
+ self.assertEqual(parse("2003/Sep/25"),
3342
+ datetime(2003, 9, 25))
3343
+
3344
+ def testDateWithSlash3(self):
3345
+ self.assertEqual(parse("25/Sep/2003"),
3346
+ datetime(2003, 9, 25))
3347
+
3348
+ def testDateWithSlash4(self):
3349
+ self.assertEqual(parse("25/Sep/2003"),
3350
+ datetime(2003, 9, 25))
3351
+
3352
+ def testDateWithSlash5(self):
3353
+ self.assertEqual(parse("Sep/25/2003"),
3354
+ datetime(2003, 9, 25))
3355
+
3356
+ def testDateWithSlash6(self):
3357
+ self.assertEqual(parse("09/25/2003"),
3358
+ datetime(2003, 9, 25))
3359
+
3360
+ def testDateWithSlash7(self):
3361
+ self.assertEqual(parse("25/09/2003"),
3362
+ datetime(2003, 9, 25))
3363
+
3364
+ def testDateWithSlash8(self):
3365
+ self.assertEqual(parse("10/09/2003", dayfirst=True),
3366
+ datetime(2003, 9, 10))
3367
+
3368
+ def testDateWithSlash9(self):
3369
+ self.assertEqual(parse("10/09/2003"),
3370
+ datetime(2003, 10, 9))
3371
+
3372
+ def testDateWithSlash10(self):
3373
+ self.assertEqual(parse("10/09/03"),
3374
+ datetime(2003, 10, 9))
3375
+
3376
+ def testDateWithSlash11(self):
3377
+ self.assertEqual(parse("10/09/03", yearfirst=True),
3378
+ datetime(2010, 9, 3))
3379
+
3380
+ def testDateWithSpace1(self):
3381
+ self.assertEqual(parse("2003 09 25"),
3382
+ datetime(2003, 9, 25))
3383
+
3384
+ def testDateWithSpace2(self):
3385
+ self.assertEqual(parse("2003 Sep 25"),
3386
+ datetime(2003, 9, 25))
3387
+
3388
+ def testDateWithSpace3(self):
3389
+ self.assertEqual(parse("25 Sep 2003"),
3390
+ datetime(2003, 9, 25))
3391
+
3392
+ def testDateWithSpace4(self):
3393
+ self.assertEqual(parse("25 Sep 2003"),
3394
+ datetime(2003, 9, 25))
3395
+
3396
+ def testDateWithSpace5(self):
3397
+ self.assertEqual(parse("Sep 25 2003"),
3398
+ datetime(2003, 9, 25))
3399
+
3400
+ def testDateWithSpace6(self):
3401
+ self.assertEqual(parse("09 25 2003"),
3402
+ datetime(2003, 9, 25))
3403
+
3404
+ def testDateWithSpace7(self):
3405
+ self.assertEqual(parse("25 09 2003"),
3406
+ datetime(2003, 9, 25))
3407
+
3408
+ def testDateWithSpace8(self):
3409
+ self.assertEqual(parse("10 09 2003", dayfirst=True),
3410
+ datetime(2003, 9, 10))
3411
+
3412
+ def testDateWithSpace9(self):
3413
+ self.assertEqual(parse("10 09 2003"),
3414
+ datetime(2003, 10, 9))
3415
+
3416
+ def testDateWithSpace10(self):
3417
+ self.assertEqual(parse("10 09 03"),
3418
+ datetime(2003, 10, 9))
3419
+
3420
+ def testDateWithSpace11(self):
3421
+ self.assertEqual(parse("10 09 03", yearfirst=True),
3422
+ datetime(2010, 9, 3))
3423
+
3424
+ def testDateWithSpace12(self):
3425
+ self.assertEqual(parse("25 09 03"),
3426
+ datetime(2003, 9, 25))
3427
+
3428
+ def testStrangelyOrderedDate1(self):
3429
+ self.assertEqual(parse("03 25 Sep"),
3430
+ datetime(2003, 9, 25))
3431
+
3432
+ def testStrangelyOrderedDate2(self):
3433
+ self.assertEqual(parse("2003 25 Sep"),
3434
+ datetime(2003, 9, 25))
3435
+
3436
+ def testStrangelyOrderedDate3(self):
3437
+ self.assertEqual(parse("25 03 Sep"),
3438
+ datetime(2025, 9, 3))
3439
+
3440
+ def testHourWithLetters(self):
3441
+ self.assertEqual(parse("10h36m28.5s", default=self.default),
3442
+ datetime(2003, 9, 25, 10, 36, 28, 500000))
3443
+
3444
+ def testHourWithLettersStrip1(self):
3445
+ self.assertEqual(parse("10h36m28s", default=self.default),
3446
+ datetime(2003, 9, 25, 10, 36, 28))
3447
+
3448
+ def testHourWithLettersStrip2(self):
3449
+ self.assertEqual(parse("10h36m", default=self.default),
3450
+ datetime(2003, 9, 25, 10, 36))
3451
+
3452
+ def testHourWithLettersStrip3(self):
3453
+ self.assertEqual(parse("10h", default=self.default),
3454
+ datetime(2003, 9, 25, 10))
3455
+
3456
+ def testHourWithLettersStrip4(self):
3457
+ self.assertEqual(parse("10 h 36", default=self.default),
3458
+ datetime(2003, 9, 25, 10, 36))
3459
+
3460
+ def testHourAmPm1(self):
3461
+ self.assertEqual(parse("10h am", default=self.default),
3462
+ datetime(2003, 9, 25, 10))
3463
+
3464
+ def testHourAmPm2(self):
3465
+ self.assertEqual(parse("10h pm", default=self.default),
3466
+ datetime(2003, 9, 25, 22))
3467
+
3468
+ def testHourAmPm3(self):
3469
+ self.assertEqual(parse("10am", default=self.default),
3470
+ datetime(2003, 9, 25, 10))
3471
+
3472
+ def testHourAmPm4(self):
3473
+ self.assertEqual(parse("10pm", default=self.default),
3474
+ datetime(2003, 9, 25, 22))
3475
+
3476
+ def testHourAmPm5(self):
3477
+ self.assertEqual(parse("10:00 am", default=self.default),
3478
+ datetime(2003, 9, 25, 10))
3479
+
3480
+ def testHourAmPm6(self):
3481
+ self.assertEqual(parse("10:00 pm", default=self.default),
3482
+ datetime(2003, 9, 25, 22))
3483
+
3484
+ def testHourAmPm7(self):
3485
+ self.assertEqual(parse("10:00am", default=self.default),
3486
+ datetime(2003, 9, 25, 10))
3487
+
3488
+ def testHourAmPm8(self):
3489
+ self.assertEqual(parse("10:00pm", default=self.default),
3490
+ datetime(2003, 9, 25, 22))
3491
+
3492
+ def testHourAmPm9(self):
3493
+ self.assertEqual(parse("10:00a.m", default=self.default),
3494
+ datetime(2003, 9, 25, 10))
3495
+
3496
+ def testHourAmPm10(self):
3497
+ self.assertEqual(parse("10:00p.m", default=self.default),
3498
+ datetime(2003, 9, 25, 22))
3499
+
3500
+ def testHourAmPm11(self):
3501
+ self.assertEqual(parse("10:00a.m.", default=self.default),
3502
+ datetime(2003, 9, 25, 10))
3503
+
3504
+ def testHourAmPm12(self):
3505
+ self.assertEqual(parse("10:00p.m.", default=self.default),
3506
+ datetime(2003, 9, 25, 22))
3507
+
3508
+ def testPertain(self):
3509
+ self.assertEqual(parse("Sep 03", default=self.default),
3510
+ datetime(2003, 9, 3))
3511
+ self.assertEqual(parse("Sep of 03", default=self.default),
3512
+ datetime(2003, 9, 25))
3513
+
3514
+ def testWeekdayAlone(self):
3515
+ self.assertEqual(parse("Wed", default=self.default),
3516
+ datetime(2003, 10, 1))
3517
+
3518
+ def testLongWeekday(self):
3519
+ self.assertEqual(parse("Wednesday", default=self.default),
3520
+ datetime(2003, 10, 1))
3521
+
3522
+ def testLongMonth(self):
3523
+ self.assertEqual(parse("October", default=self.default),
3524
+ datetime(2003, 10, 25))
3525
+
3526
+ def testZeroYear(self):
3527
+ self.assertEqual(parse("31-Dec-00", default=self.default),
3528
+ datetime(2000, 12, 31))
3529
+
3530
+ def testFuzzy(self):
3531
+ s = "Today is 25 of September of 2003, exactly " \
3532
+ "at 10:49:41 with timezone -03:00."
3533
+ self.assertEqual(parse(s, fuzzy=True),
3534
+ datetime(2003, 9, 25, 10, 49, 41,
3535
+ tzinfo=self.brsttz))
3536
+
3537
+ def testFuzzyWithTokens(self):
3538
+ s = "Today is 25 of September of 2003, exactly " \
3539
+ "at 10:49:41 with timezone -03:00."
3540
+ self.assertEqual(parse(s, fuzzy_with_tokens=True),
3541
+ (datetime(2003, 9, 25, 10, 49, 41,
3542
+ tzinfo=self.brsttz),
3543
+ ('Today is ', 'of ', ', exactly at ',
3544
+ ' with timezone ', '.')))
3545
+
3546
+ def testExtraSpace(self):
3547
+ self.assertEqual(parse(" July 4 , 1976 12:01:02 am "),
3548
+ datetime(1976, 7, 4, 0, 1, 2))
3549
+
3550
+ def testRandomFormat1(self):
3551
+ self.assertEqual(parse("Wed, July 10, '96"),
3552
+ datetime(1996, 7, 10, 0, 0))
3553
+
3554
+ def testRandomFormat2(self):
3555
+ self.assertEqual(parse("1996.07.10 AD at 15:08:56 PDT",
3556
+ ignoretz=True),
3557
+ datetime(1996, 7, 10, 15, 8, 56))
3558
+
3559
+ def testRandomFormat3(self):
3560
+ self.assertEqual(parse("1996.July.10 AD 12:08 PM"),
3561
+ datetime(1996, 7, 10, 12, 8))
3562
+
3563
+ def testRandomFormat4(self):
3564
+ self.assertEqual(parse("Tuesday, April 12, 1952 AD 3:30:42pm PST",
3565
+ ignoretz=True),
3566
+ datetime(1952, 4, 12, 15, 30, 42))
3567
+
3568
+ def testRandomFormat5(self):
3569
+ self.assertEqual(parse("November 5, 1994, 8:15:30 am EST",
3570
+ ignoretz=True),
3571
+ datetime(1994, 11, 5, 8, 15, 30))
3572
+
3573
+ def testRandomFormat6(self):
3574
+ self.assertEqual(parse("1994-11-05T08:15:30-05:00",
3575
+ ignoretz=True),
3576
+ datetime(1994, 11, 5, 8, 15, 30))
3577
+
3578
+ def testRandomFormat7(self):
3579
+ self.assertEqual(parse("1994-11-05T08:15:30Z",
3580
+ ignoretz=True),
3581
+ datetime(1994, 11, 5, 8, 15, 30))
3582
+
3583
+ def testRandomFormat8(self):
3584
+ self.assertEqual(parse("July 4, 1976"), datetime(1976, 7, 4))
3585
+
3586
+ def testRandomFormat9(self):
3587
+ self.assertEqual(parse("7 4 1976"), datetime(1976, 7, 4))
3588
+
3589
+ def testRandomFormat10(self):
3590
+ self.assertEqual(parse("4 jul 1976"), datetime(1976, 7, 4))
3591
+
3592
+ def testRandomFormat11(self):
3593
+ self.assertEqual(parse("7-4-76"), datetime(1976, 7, 4))
3594
+
3595
+ def testRandomFormat12(self):
3596
+ self.assertEqual(parse("19760704"), datetime(1976, 7, 4))
3597
+
3598
+ def testRandomFormat13(self):
3599
+ self.assertEqual(parse("0:01:02", default=self.default),
3600
+ datetime(2003, 9, 25, 0, 1, 2))
3601
+
3602
+ def testRandomFormat14(self):
3603
+ self.assertEqual(parse("12h 01m02s am", default=self.default),
3604
+ datetime(2003, 9, 25, 0, 1, 2))
3605
+
3606
+ def testRandomFormat15(self):
3607
+ self.assertEqual(parse("0:01:02 on July 4, 1976"),
3608
+ datetime(1976, 7, 4, 0, 1, 2))
3609
+
3610
+ def testRandomFormat16(self):
3611
+ self.assertEqual(parse("0:01:02 on July 4, 1976"),
3612
+ datetime(1976, 7, 4, 0, 1, 2))
3613
+
3614
+ def testRandomFormat17(self):
3615
+ self.assertEqual(parse("1976-07-04T00:01:02Z", ignoretz=True),
3616
+ datetime(1976, 7, 4, 0, 1, 2))
3617
+
3618
+ def testRandomFormat18(self):
3619
+ self.assertEqual(parse("July 4, 1976 12:01:02 am"),
3620
+ datetime(1976, 7, 4, 0, 1, 2))
3621
+
3622
+ def testRandomFormat19(self):
3623
+ self.assertEqual(parse("Mon Jan 2 04:24:27 1995"),
3624
+ datetime(1995, 1, 2, 4, 24, 27))
3625
+
3626
+ def testRandomFormat20(self):
3627
+ self.assertEqual(parse("Tue Apr 4 00:22:12 PDT 1995", ignoretz=True),
3628
+ datetime(1995, 4, 4, 0, 22, 12))
3629
+
3630
+ def testRandomFormat21(self):
3631
+ self.assertEqual(parse("04.04.95 00:22"),
3632
+ datetime(1995, 4, 4, 0, 22))
3633
+
3634
+ def testRandomFormat22(self):
3635
+ self.assertEqual(parse("Jan 1 1999 11:23:34.578"),
3636
+ datetime(1999, 1, 1, 11, 23, 34, 578000))
3637
+
3638
+ def testRandomFormat23(self):
3639
+ self.assertEqual(parse("950404 122212"),
3640
+ datetime(1995, 4, 4, 12, 22, 12))
3641
+
3642
+ def testRandomFormat24(self):
3643
+ self.assertEqual(parse("0:00 PM, PST", default=self.default,
3644
+ ignoretz=True),
3645
+ datetime(2003, 9, 25, 12, 0))
3646
+
3647
+ def testRandomFormat25(self):
3648
+ self.assertEqual(parse("12:08 PM", default=self.default),
3649
+ datetime(2003, 9, 25, 12, 8))
3650
+
3651
+ def testRandomFormat26(self):
3652
+ self.assertEqual(parse("5:50 A.M. on June 13, 1990"),
3653
+ datetime(1990, 6, 13, 5, 50))
3654
+
3655
+ def testRandomFormat27(self):
3656
+ self.assertEqual(parse("3rd of May 2001"), datetime(2001, 5, 3))
3657
+
3658
+ def testRandomFormat28(self):
3659
+ self.assertEqual(parse("5th of March 2001"), datetime(2001, 3, 5))
3660
+
3661
+ def testRandomFormat29(self):
3662
+ self.assertEqual(parse("1st of May 2003"), datetime(2003, 5, 1))
3663
+
3664
+ def testRandomFormat30(self):
3665
+ self.assertEqual(parse("01h02m03", default=self.default),
3666
+ datetime(2003, 9, 25, 1, 2, 3))
3667
+
3668
+ def testRandomFormat31(self):
3669
+ self.assertEqual(parse("01h02", default=self.default),
3670
+ datetime(2003, 9, 25, 1, 2))
3671
+
3672
+ def testRandomFormat32(self):
3673
+ self.assertEqual(parse("01h02s", default=self.default),
3674
+ datetime(2003, 9, 25, 1, 0, 2))
3675
+
3676
+ def testRandomFormat33(self):
3677
+ self.assertEqual(parse("01m02", default=self.default),
3678
+ datetime(2003, 9, 25, 0, 1, 2))
3679
+
3680
+ def testRandomFormat34(self):
3681
+ self.assertEqual(parse("01m02h", default=self.default),
3682
+ datetime(2003, 9, 25, 2, 1))
3683
+
3684
+ def testRandomFormat35(self):
3685
+ self.assertEqual(parse("2004 10 Apr 11h30m", default=self.default),
3686
+ datetime(2004, 4, 10, 11, 30))
3687
+
3688
+ def testErrorType01(self):
3689
+ self.assertRaises(ValueError,
3690
+ parse,'shouldfail')
3691
+
3692
+ def testIncreasingCTime(self):
3693
+ # This test will check 200 different years, every month, every day,
3694
+ # every hour, every minute, every second, and every weekday, using
3695
+ # a delta of more or less 1 year, 1 month, 1 day, 1 minute and
3696
+ # 1 second.
3697
+ delta = timedelta(days=365+31+1, seconds=1+60+60*60)
3698
+ dt = datetime(1900, 1, 1, 0, 0, 0, 0)
3699
+ for i in range(200):
3700
+ self.assertEqual(parse(dt.ctime()), dt)
3701
+ dt += delta
3702
+
3703
+ def testIncreasingISOFormat(self):
3704
+ delta = timedelta(days=365+31+1, seconds=1+60+60*60)
3705
+ dt = datetime(1900, 1, 1, 0, 0, 0, 0)
3706
+ for i in range(200):
3707
+ self.assertEqual(parse(dt.isoformat()), dt)
3708
+ dt += delta
3709
+
3710
+ def testMicrosecondsPrecisionError(self):
3711
+ # Skip found out that sad precision problem. :-(
3712
+ dt1 = parse("00:11:25.01")
3713
+ dt2 = parse("00:12:10.01")
3714
+ self.assertEqual(dt1.microsecond, 10000)
3715
+ self.assertEqual(dt2.microsecond, 10000)
3716
+
3717
+ def testMicrosecondPrecisionErrorReturns(self):
3718
+ # One more precision issue, discovered by Eric Brown. This should
3719
+ # be the last one, as we're no longer using floating points.
3720
+ for ms in [100001, 100000, 99999, 99998,
3721
+ 10001, 10000, 9999, 9998,
3722
+ 1001, 1000, 999, 998,
3723
+ 101, 100, 99, 98]:
3724
+ dt = datetime(2008, 2, 27, 21, 26, 1, ms)
3725
+ self.assertEqual(parse(dt.isoformat()), dt)
3726
+
3727
+ def testHighPrecisionSeconds(self):
3728
+ self.assertEqual(parse("20080227T21:26:01.123456789"),
3729
+ datetime(2008, 2, 27, 21, 26, 1, 123456))
3730
+
3731
+ def testCustomParserInfo(self):
3732
+ # Custom parser info wasn't working, as Michael Elsdörfer discovered.
3733
+ from dateutil.parser import parserinfo, parser
3734
+
3735
+ class myparserinfo(parserinfo):
3736
+ MONTHS = parserinfo.MONTHS[:]
3737
+ MONTHS[0] = ("Foo", "Foo")
3738
+ myparser = parser(myparserinfo())
3739
+ dt = myparser.parse("01/Foo/2007")
3740
+ self.assertEqual(dt, datetime(2007, 1, 1))
3741
+
3742
+
3743
+ class EasterTest(unittest.TestCase):
3744
+ easterlist = [
3745
+ # WESTERN ORTHODOX
3746
+ (date(1990, 4, 15), date(1990, 4, 15)),
3747
+ (date(1991, 3, 31), date(1991, 4, 7)),
3748
+ (date(1992, 4, 19), date(1992, 4, 26)),
3749
+ (date(1993, 4, 11), date(1993, 4, 18)),
3750
+ (date(1994, 4, 3), date(1994, 5, 1)),
3751
+ (date(1995, 4, 16), date(1995, 4, 23)),
3752
+ (date(1996, 4, 7), date(1996, 4, 14)),
3753
+ (date(1997, 3, 30), date(1997, 4, 27)),
3754
+ (date(1998, 4, 12), date(1998, 4, 19)),
3755
+ (date(1999, 4, 4), date(1999, 4, 11)),
3756
+
3757
+ (date(2000, 4, 23), date(2000, 4, 30)),
3758
+ (date(2001, 4, 15), date(2001, 4, 15)),
3759
+ (date(2002, 3, 31), date(2002, 5, 5)),
3760
+ (date(2003, 4, 20), date(2003, 4, 27)),
3761
+ (date(2004, 4, 11), date(2004, 4, 11)),
3762
+ (date(2005, 3, 27), date(2005, 5, 1)),
3763
+ (date(2006, 4, 16), date(2006, 4, 23)),
3764
+ (date(2007, 4, 8), date(2007, 4, 8)),
3765
+ (date(2008, 3, 23), date(2008, 4, 27)),
3766
+ (date(2009, 4, 12), date(2009, 4, 19)),
3767
+
3768
+ (date(2010, 4, 4), date(2010, 4, 4)),
3769
+ (date(2011, 4, 24), date(2011, 4, 24)),
3770
+ (date(2012, 4, 8), date(2012, 4, 15)),
3771
+ (date(2013, 3, 31), date(2013, 5, 5)),
3772
+ (date(2014, 4, 20), date(2014, 4, 20)),
3773
+ (date(2015, 4, 5), date(2015, 4, 12)),
3774
+ (date(2016, 3, 27), date(2016, 5, 1)),
3775
+ (date(2017, 4, 16), date(2017, 4, 16)),
3776
+ (date(2018, 4, 1), date(2018, 4, 8)),
3777
+ (date(2019, 4, 21), date(2019, 4, 28)),
3778
+
3779
+ (date(2020, 4, 12), date(2020, 4, 19)),
3780
+ (date(2021, 4, 4), date(2021, 5, 2)),
3781
+ (date(2022, 4, 17), date(2022, 4, 24)),
3782
+ (date(2023, 4, 9), date(2023, 4, 16)),
3783
+ (date(2024, 3, 31), date(2024, 5, 5)),
3784
+ (date(2025, 4, 20), date(2025, 4, 20)),
3785
+ (date(2026, 4, 5), date(2026, 4, 12)),
3786
+ (date(2027, 3, 28), date(2027, 5, 2)),
3787
+ (date(2028, 4, 16), date(2028, 4, 16)),
3788
+ (date(2029, 4, 1), date(2029, 4, 8)),
3789
+
3790
+ (date(2030, 4, 21), date(2030, 4, 28)),
3791
+ (date(2031, 4, 13), date(2031, 4, 13)),
3792
+ (date(2032, 3, 28), date(2032, 5, 2)),
3793
+ (date(2033, 4, 17), date(2033, 4, 24)),
3794
+ (date(2034, 4, 9), date(2034, 4, 9)),
3795
+ (date(2035, 3, 25), date(2035, 4, 29)),
3796
+ (date(2036, 4, 13), date(2036, 4, 20)),
3797
+ (date(2037, 4, 5), date(2037, 4, 5)),
3798
+ (date(2038, 4, 25), date(2038, 4, 25)),
3799
+ (date(2039, 4, 10), date(2039, 4, 17)),
3800
+
3801
+ (date(2040, 4, 1), date(2040, 5, 6)),
3802
+ (date(2041, 4, 21), date(2041, 4, 21)),
3803
+ (date(2042, 4, 6), date(2042, 4, 13)),
3804
+ (date(2043, 3, 29), date(2043, 5, 3)),
3805
+ (date(2044, 4, 17), date(2044, 4, 24)),
3806
+ (date(2045, 4, 9), date(2045, 4, 9)),
3807
+ (date(2046, 3, 25), date(2046, 4, 29)),
3808
+ (date(2047, 4, 14), date(2047, 4, 21)),
3809
+ (date(2048, 4, 5), date(2048, 4, 5)),
3810
+ (date(2049, 4, 18), date(2049, 4, 25)),
3811
+
3812
+ (date(2050, 4, 10), date(2050, 4, 17)),
3813
+ ]
3814
+
3815
+ def testEaster(self):
3816
+ for western, orthodox in self.easterlist:
3817
+ self.assertEqual(western, easter(western.year, EASTER_WESTERN))
3818
+ self.assertEqual(orthodox, easter(orthodox.year, EASTER_ORTHODOX))
3819
+
3820
+ class TZTest(unittest.TestCase):
3821
+
3822
+ TZFILE_EST5EDT = b"""
3823
+ VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
3824
+ ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
3825
+ S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
3826
+ YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
3827
+ yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
3828
+ wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
3829
+ 8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
3830
+ YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
3831
+ BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR
3832
+ iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x
3833
+ znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H
3834
+ cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w
3835
+ Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH
3836
+ JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM
3837
+ jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w
3838
+ 4GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg
3839
+ b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8
3840
+ o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3841
+ AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3842
+ AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
3843
+ AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3844
+ AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
3845
+ AEVQVAAAAAABAAAAAQ==
3846
+ """
3847
+
3848
+ EUROPE_HELSINKI = b"""
3849
+ VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAAAAAB1AAAABQAAAA2kc28Yy85RYMy/hdAV
3850
+ I+uQFhPckBcDzZAX876QGOOvkBnToJAaw5GQG7y9EBysrhAdnJ8QHoyQEB98gRAgbHIQIVxjECJM
3851
+ VBAjPEUQJCw2ECUcJxAmDBgQJwVDkCf1NJAo5SWQKdUWkCrFB5ArtPiQLKTpkC2U2pAuhMuQL3S8
3852
+ kDBkrZAxXdkQMnK0EDM9uxA0UpYQNR2dEDYyeBA2/X8QOBuUkDjdYRA5+3aQOr1DEDvbWJA8pl+Q
3853
+ Pbs6kD6GQZA/mxyQQGYjkEGEORBCRgWQQ2QbEEQl55BFQ/0QRgXJkEcj3xBH7uYQSQPBEEnOyBBK
3854
+ 46MQS66qEEzMv5BNjowQTqyhkE9ubhBQjIOQUVeKkFJsZZBTN2yQVExHkFUXTpBWLCmQVvcwkFgV
3855
+ RhBY1xKQWfUoEFq29JBb1QoQXKAREF207BBef/MQX5TOEGBf1RBhfeqQYj+3EGNdzJBkH5kQZT2u
3856
+ kGYItZBnHZCQZ+iXkGj9cpBpyHmQat1UkGuoW5BsxnEQbYg9kG6mUxBvaB+QcIY1EHFRPBByZhcQ
3857
+ czEeEHRF+RB1EQAQdi8VkHbw4hB4DveQeNDEEHnu2ZB6sKYQe867kHyZwpB9rp2QfnmkkH+Of5AC
3858
+ AQIDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQD
3859
+ BAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAME
3860
+ AwQAABdoAAAAACowAQQAABwgAAkAACowAQQAABwgAAlITVQARUVTVABFRVQAAAAAAQEAAAABAQ==
3861
+ """
3862
+
3863
+ NEW_YORK = b"""
3864
+ VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABcAAADrAAAABAAAABCeph5wn7rrYKCGAHCh
3865
+ ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e
3866
+ S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0
3867
+ YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg
3868
+ yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db
3869
+ wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW
3870
+ 8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b
3871
+ YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g
3872
+ BGD9cAVQ4GEGQN9yBzDCYgeNGXMJEKRjCa2U9ArwhmQL4IV1DNmi5Q3AZ3YOuYTmD6mD9xCZZucR
3873
+ iWX4EnlI6BNpR/kUWSrpFUkp+RY5DOoXKQv6GCIpaxkI7fsaAgtsGvIKfBvh7Wwc0ex8HcHPbR6x
3874
+ zn0fobFtIHYA/SGBk20iVeL+I2qv7iQ1xP4lSpHuJhWm/ycqc+8n/sOAKQpV8CnepYAq6jfxK76H
3875
+ gSzTVHItnmmCLrM2cy9+S4MwkxhzMWdoBDJy+nQzR0oENFLcdTUnLAU2Mr51NwcOBjgb2vY45vAG
3876
+ Ofu89jrG0gY72572PK/uhj27gPY+j9CGP5ti9kBvsoZBhH92Qk+UhkNkYXZEL3aHRURDd0XzqQdH
3877
+ LV/3R9OLB0kNQfdJs20HSu0j90uciYdM1kB3TXxrh062IndPXE2HUJYEd1E8L4dSdeZ3UxwRh1RV
3878
+ yHdU+/OHVjWqd1blEAdYHsb3WMTyB1n+qPdapNQHW96K91yEtgddvmz3XmSYB1+eTvdgTbSHYYdr
3879
+ d2ItlodjZ013ZA14h2VHL3dl7VqHZycRd2fNPIdpBvN3aa0eh2rm1XdrljsHbM/x9212HQdur9P3
3880
+ b1X/B3CPtfdxNeEHcm+X93MVwwd0T3n3dP7fh3Y4lnd23sGHeBh4d3i+o4d5+Fp3ep6Fh3vYPHd8
3881
+ fmeHfbged35eSYd/mAB3AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3882
+ AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3883
+ AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
3884
+ AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB
3885
+ AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU
3886
+ AEVQVAAEslgAAAAAAQWk7AEAAAACB4YfggAAAAMJZ1MDAAAABAtIhoQAAAAFDSsLhQAAAAYPDD8G
3887
+ AAAABxDtcocAAAAIEs6mCAAAAAkVn8qJAAAACheA/goAAAALGWIxiwAAAAwdJeoMAAAADSHa5Q0A
3888
+ AAAOJZ6djgAAAA8nf9EPAAAAECpQ9ZAAAAARLDIpEQAAABIuE1ySAAAAEzDnJBMAAAAUM7hIlAAA
3889
+ ABU2jBAVAAAAFkO3G5YAAAAXAAAAAQAAAAE=
3890
+ """
3891
+
3892
+ TZICAL_EST5EDT = """
3893
+ BEGIN:VTIMEZONE
3894
+ TZID:US-Eastern
3895
+ LAST-MODIFIED:19870101T000000Z
3896
+ TZURL:http://zones.stds_r_us.net/tz/US-Eastern
3897
+ BEGIN:STANDARD
3898
+ DTSTART:19671029T020000
3899
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
3900
+ TZOFFSETFROM:-0400
3901
+ TZOFFSETTO:-0500
3902
+ TZNAME:EST
3903
+ END:STANDARD
3904
+ BEGIN:DAYLIGHT
3905
+ DTSTART:19870405T020000
3906
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
3907
+ TZOFFSETFROM:-0500
3908
+ TZOFFSETTO:-0400
3909
+ TZNAME:EDT
3910
+ END:DAYLIGHT
3911
+ END:VTIMEZONE
3912
+ """
3913
+
3914
+ def testStrStart1(self):
3915
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3916
+ tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3917
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3918
+ tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3919
+
3920
+ def testStrEnd1(self):
3921
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3922
+ tzinfo=tzstr("EST5EDT")).tzname(), "EDT")
3923
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3924
+ tzinfo=tzstr("EST5EDT")).tzname(), "EST")
3925
+
3926
+ def testStrStart2(self):
3927
+ s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3928
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3929
+ tzinfo=tzstr(s)).tzname(), "EST")
3930
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3931
+ tzinfo=tzstr(s)).tzname(), "EDT")
3932
+
3933
+ def testStrEnd2(self):
3934
+ s = "EST5EDT,4,0,6,7200,10,0,26,7200,3600"
3935
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3936
+ tzinfo=tzstr(s)).tzname(), "EDT")
3937
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3938
+ tzinfo=tzstr(s)).tzname(), "EST")
3939
+
3940
+ def testStrStart3(self):
3941
+ s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3942
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3943
+ tzinfo=tzstr(s)).tzname(), "EST")
3944
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3945
+ tzinfo=tzstr(s)).tzname(), "EDT")
3946
+
3947
+ def testStrEnd3(self):
3948
+ s = "EST5EDT,4,1,0,7200,10,-1,0,7200,3600"
3949
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3950
+ tzinfo=tzstr(s)).tzname(), "EDT")
3951
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3952
+ tzinfo=tzstr(s)).tzname(), "EST")
3953
+
3954
+ def testStrStart4(self):
3955
+ s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3956
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3957
+ tzinfo=tzstr(s)).tzname(), "EST")
3958
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3959
+ tzinfo=tzstr(s)).tzname(), "EDT")
3960
+
3961
+ def testStrEnd4(self):
3962
+ s = "EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"
3963
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3964
+ tzinfo=tzstr(s)).tzname(), "EDT")
3965
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3966
+ tzinfo=tzstr(s)).tzname(), "EST")
3967
+
3968
+ def testStrStart5(self):
3969
+ s = "EST5EDT4,95/02:00:00,298/02:00"
3970
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3971
+ tzinfo=tzstr(s)).tzname(), "EST")
3972
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3973
+ tzinfo=tzstr(s)).tzname(), "EDT")
3974
+
3975
+ def testStrEnd5(self):
3976
+ s = "EST5EDT4,95/02:00:00,298/02"
3977
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3978
+ tzinfo=tzstr(s)).tzname(), "EDT")
3979
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3980
+ tzinfo=tzstr(s)).tzname(), "EST")
3981
+
3982
+ def testStrStart6(self):
3983
+ s = "EST5EDT4,J96/02:00:00,J299/02:00"
3984
+ self.assertEqual(datetime(2003, 4, 6, 1, 59,
3985
+ tzinfo=tzstr(s)).tzname(), "EST")
3986
+ self.assertEqual(datetime(2003, 4, 6, 2, 00,
3987
+ tzinfo=tzstr(s)).tzname(), "EDT")
3988
+
3989
+ def testStrEnd6(self):
3990
+ s = "EST5EDT4,J96/02:00:00,J299/02"
3991
+ self.assertEqual(datetime(2003, 10, 26, 0, 59,
3992
+ tzinfo=tzstr(s)).tzname(), "EDT")
3993
+ self.assertEqual(datetime(2003, 10, 26, 1, 00,
3994
+ tzinfo=tzstr(s)).tzname(), "EST")
3995
+
3996
+ def testStrCmp1(self):
3997
+ self.assertEqual(tzstr("EST5EDT"),
3998
+ tzstr("EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00"))
3999
+
4000
+ def testStrCmp2(self):
4001
+ self.assertEqual(tzstr("EST5EDT"),
4002
+ tzstr("EST5EDT,4,1,0,7200,10,-1,0,7200,3600"))
4003
+
4004
+ def testRangeCmp1(self):
4005
+ self.assertEqual(tzstr("EST5EDT"),
4006
+ tzrange("EST", -18000, "EDT", -14400,
4007
+ relativedelta(hours=+2,
4008
+ month=4, day=1,
4009
+ weekday=SU(+1)),
4010
+ relativedelta(hours=+1,
4011
+ month=10, day=31,
4012
+ weekday=SU(-1))))
4013
+
4014
+ def testRangeCmp2(self):
4015
+ self.assertEqual(tzstr("EST5EDT"),
4016
+ tzrange("EST", -18000, "EDT"))
4017
+
4018
+ def testFileStart1(self):
4019
+ tz = tzfile(BytesIO(base64.decodestring(self.TZFILE_EST5EDT)))
4020
+ self.assertEqual(datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname(), "EST")
4021
+ self.assertEqual(datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname(), "EDT")
4022
+
4023
+ def testFileEnd1(self):
4024
+ tz = tzfile(BytesIO(base64.decodestring(self.TZFILE_EST5EDT)))
4025
+ self.assertEqual(datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname(),
4026
+ "EDT")
4027
+ self.assertEqual(datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname(),
4028
+ "EST")
4029
+
4030
+ def testZoneInfoFileStart1(self):
4031
+ tz = zoneinfo.gettz("EST5EDT")
4032
+ self.assertEqual(datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname(), "EST",
4033
+ MISSING_TARBALL)
4034
+ self.assertEqual(datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname(), "EDT")
4035
+
4036
+ def testZoneInfoFileEnd1(self):
4037
+ tz = zoneinfo.gettz("EST5EDT")
4038
+ self.assertEqual(datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname(),
4039
+ "EDT", MISSING_TARBALL)
4040
+ self.assertEqual(datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname(),
4041
+ "EST")
4042
+
4043
+ def testZoneInfoOffsetSignal(self):
4044
+ utc = zoneinfo.gettz("UTC")
4045
+ nyc = zoneinfo.gettz("America/New_York")
4046
+ self.assertNotEqual(utc, None, MISSING_TARBALL)
4047
+ self.assertNotEqual(nyc, None)
4048
+ t0 = datetime(2007, 11, 4, 0, 30, tzinfo=nyc)
4049
+ t1 = t0.astimezone(utc)
4050
+ t2 = t1.astimezone(nyc)
4051
+ self.assertEqual(t0, t2)
4052
+ self.assertEqual(nyc.dst(t0), timedelta(hours=1))
4053
+
4054
+ def testICalStart1(self):
4055
+ tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
4056
+ self.assertEqual(datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname(), "EST")
4057
+ self.assertEqual(datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname(), "EDT")
4058
+
4059
+ def testICalEnd1(self):
4060
+ tz = tzical(StringIO(self.TZICAL_EST5EDT)).get()
4061
+ self.assertEqual(datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname(), "EDT")
4062
+ self.assertEqual(datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname(), "EST")
4063
+
4064
+ def testRoundNonFullMinutes(self):
4065
+ # This timezone has an offset of 5992 seconds in 1900-01-01.
4066
+ tz = tzfile(BytesIO(base64.decodestring(self.EUROPE_HELSINKI)))
4067
+ self.assertEqual(str(datetime(1900, 1, 1, 0, 0, tzinfo=tz)),
4068
+ "1900-01-01 00:00:00+01:40")
4069
+
4070
+ def testLeapCountDecodesProperly(self):
4071
+ # This timezone has leapcnt, and failed to decode until
4072
+ # Eugene Oden notified about the issue.
4073
+ tz = tzfile(BytesIO(base64.decodestring(self.NEW_YORK)))
4074
+ self.assertEqual(datetime(2007, 3, 31, 20, 12).tzname(), None)
4075
+
4076
+ def testGettz(self):
4077
+ # bug 892569
4078
+ str(gettz('UTC'))
4079
+
4080
+ def testBrokenIsDstHandling(self):
4081
+ # tzrange._isdst() was using a date() rather than a datetime().
4082
+ # Issue reported by Lennart Regebro.
4083
+ dt = datetime(2007, 8, 6, 4, 10, tzinfo=tzutc())
4084
+ self.assertEqual(dt.astimezone(tz=gettz("GMT+2")),
4085
+ datetime(2007, 8, 6, 6, 10, tzinfo=tzstr("GMT+2")))
4086
+
4087
+ def testGMTHasNoDaylight(self):
4088
+ # tzstr("GMT+2") improperly considered daylight saving time.
4089
+ # Issue reported by Lennart Regebro.
4090
+ dt = datetime(2007, 8, 6, 4, 10)
4091
+ self.assertEqual(gettz("GMT+2").dst(dt), timedelta(0))
4092
+
4093
+ def testGMTOffset(self):
4094
+ # GMT and UTC offsets have inverted signal when compared to the
4095
+ # usual TZ variable handling.
4096
+ dt = datetime(2007, 8, 6, 4, 10, tzinfo=tzutc())
4097
+ self.assertEqual(dt.astimezone(tz=tzstr("GMT+2")),
4098
+ datetime(2007, 8, 6, 6, 10, tzinfo=tzstr("GMT+2")))
4099
+ self.assertEqual(dt.astimezone(tz=gettz("UTC-2")),
4100
+ datetime(2007, 8, 6, 2, 10, tzinfo=tzstr("UTC-2")))
4101
+
4102
+ @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
4103
+ def testIsdstZoneWithNoDaylightSaving(self):
4104
+ tz = tzwin.tzwin("UTC")
4105
+ dt = parse("2013-03-06 19:08:15")
4106
+ self.assertFalse(tz._isdst(dt))
4107
+
4108
+ # vim:ts=4:sw=4