1# -*- coding: utf-8 -*-
2from __future__ import unicode_literals
3from ._common import WarningTestMixin, unittest
4
5import calendar
6from datetime import datetime, date
7from six import PY3
8
9from dateutil.rrule import *
10
11
12class RRuleTest(WarningTestMixin, unittest.TestCase):
13    def _rrulestr_reverse_test(self, rule):
14        """
15        Call with an `rrule` and it will test that `str(rrule)` generates a
16        string which generates the same `rrule` as the input when passed to
17        `rrulestr()`
18        """
19        rr_str = str(rule)
20        rrulestr_rrule = rrulestr(rr_str)
21
22        self.assertEqual(list(rule), list(rrulestr_rrule))
23
24    def testYearly(self):
25        self.assertEqual(list(rrule(YEARLY,
26                              count=3,
27                              dtstart=datetime(1997, 9, 2, 9, 0))),
28                         [datetime(1997, 9, 2, 9, 0),
29                          datetime(1998, 9, 2, 9, 0),
30                          datetime(1999, 9, 2, 9, 0)])
31
32    def testYearlyInterval(self):
33        self.assertEqual(list(rrule(YEARLY,
34                              count=3,
35                              interval=2,
36                              dtstart=datetime(1997, 9, 2, 9, 0))),
37                         [datetime(1997, 9, 2, 9, 0),
38                          datetime(1999, 9, 2, 9, 0),
39                          datetime(2001, 9, 2, 9, 0)])
40
41    def testYearlyIntervalLarge(self):
42        self.assertEqual(list(rrule(YEARLY,
43                              count=3,
44                              interval=100,
45                              dtstart=datetime(1997, 9, 2, 9, 0))),
46                         [datetime(1997, 9, 2, 9, 0),
47                          datetime(2097, 9, 2, 9, 0),
48                          datetime(2197, 9, 2, 9, 0)])
49
50    def testYearlyByMonth(self):
51        self.assertEqual(list(rrule(YEARLY,
52                              count=3,
53                              bymonth=(1, 3),
54                              dtstart=datetime(1997, 9, 2, 9, 0))),
55                         [datetime(1998, 1, 2, 9, 0),
56                          datetime(1998, 3, 2, 9, 0),
57                          datetime(1999, 1, 2, 9, 0)])
58
59    def testYearlyByMonthDay(self):
60        self.assertEqual(list(rrule(YEARLY,
61                              count=3,
62                              bymonthday=(1, 3),
63                              dtstart=datetime(1997, 9, 2, 9, 0))),
64                         [datetime(1997, 9, 3, 9, 0),
65                          datetime(1997, 10, 1, 9, 0),
66                          datetime(1997, 10, 3, 9, 0)])
67
68    def testYearlyByMonthAndMonthDay(self):
69        self.assertEqual(list(rrule(YEARLY,
70                              count=3,
71                              bymonth=(1, 3),
72                              bymonthday=(5, 7),
73                              dtstart=datetime(1997, 9, 2, 9, 0))),
74                         [datetime(1998, 1, 5, 9, 0),
75                          datetime(1998, 1, 7, 9, 0),
76                          datetime(1998, 3, 5, 9, 0)])
77
78    def testYearlyByWeekDay(self):
79        self.assertEqual(list(rrule(YEARLY,
80                              count=3,
81                              byweekday=(TU, TH),
82                              dtstart=datetime(1997, 9, 2, 9, 0))),
83                         [datetime(1997, 9, 2, 9, 0),
84                          datetime(1997, 9, 4, 9, 0),
85                          datetime(1997, 9, 9, 9, 0)])
86
87    def testYearlyByNWeekDay(self):
88        self.assertEqual(list(rrule(YEARLY,
89                              count=3,
90                              byweekday=(TU(1), TH(-1)),
91                              dtstart=datetime(1997, 9, 2, 9, 0))),
92                         [datetime(1997, 12, 25, 9, 0),
93                          datetime(1998, 1, 6, 9, 0),
94                          datetime(1998, 12, 31, 9, 0)])
95
96    def testYearlyByNWeekDayLarge(self):
97        self.assertEqual(list(rrule(YEARLY,
98                              count=3,
99                              byweekday=(TU(3), TH(-3)),
100                              dtstart=datetime(1997, 9, 2, 9, 0))),
101                         [datetime(1997, 12, 11, 9, 0),
102                          datetime(1998, 1, 20, 9, 0),
103                          datetime(1998, 12, 17, 9, 0)])
104
105    def testYearlyByMonthAndWeekDay(self):
106        self.assertEqual(list(rrule(YEARLY,
107                              count=3,
108                              bymonth=(1, 3),
109                              byweekday=(TU, TH),
110                              dtstart=datetime(1997, 9, 2, 9, 0))),
111                         [datetime(1998, 1, 1, 9, 0),
112                          datetime(1998, 1, 6, 9, 0),
113                          datetime(1998, 1, 8, 9, 0)])
114
115    def testYearlyByMonthAndNWeekDay(self):
116        self.assertEqual(list(rrule(YEARLY,
117                              count=3,
118                              bymonth=(1, 3),
119                              byweekday=(TU(1), TH(-1)),
120                              dtstart=datetime(1997, 9, 2, 9, 0))),
121                         [datetime(1998, 1, 6, 9, 0),
122                          datetime(1998, 1, 29, 9, 0),
123                          datetime(1998, 3, 3, 9, 0)])
124
125    def testYearlyByMonthAndNWeekDayLarge(self):
126        # This is interesting because the TH(-3) ends up before
127        # the TU(3).
128        self.assertEqual(list(rrule(YEARLY,
129                              count=3,
130                              bymonth=(1, 3),
131                              byweekday=(TU(3), TH(-3)),
132                              dtstart=datetime(1997, 9, 2, 9, 0))),
133                         [datetime(1998, 1, 15, 9, 0),
134                          datetime(1998, 1, 20, 9, 0),
135                          datetime(1998, 3, 12, 9, 0)])
136
137    def testYearlyByMonthDayAndWeekDay(self):
138        self.assertEqual(list(rrule(YEARLY,
139                              count=3,
140                              bymonthday=(1, 3),
141                              byweekday=(TU, TH),
142                              dtstart=datetime(1997, 9, 2, 9, 0))),
143                         [datetime(1998, 1, 1, 9, 0),
144                          datetime(1998, 2, 3, 9, 0),
145                          datetime(1998, 3, 3, 9, 0)])
146
147    def testYearlyByMonthAndMonthDayAndWeekDay(self):
148        self.assertEqual(list(rrule(YEARLY,
149                              count=3,
150                              bymonth=(1, 3),
151                              bymonthday=(1, 3),
152                              byweekday=(TU, TH),
153                              dtstart=datetime(1997, 9, 2, 9, 0))),
154                         [datetime(1998, 1, 1, 9, 0),
155                          datetime(1998, 3, 3, 9, 0),
156                          datetime(2001, 3, 1, 9, 0)])
157
158    def testYearlyByYearDay(self):
159        self.assertEqual(list(rrule(YEARLY,
160                              count=4,
161                              byyearday=(1, 100, 200, 365),
162                              dtstart=datetime(1997, 9, 2, 9, 0))),
163                         [datetime(1997, 12, 31, 9, 0),
164                          datetime(1998, 1, 1, 9, 0),
165                          datetime(1998, 4, 10, 9, 0),
166                          datetime(1998, 7, 19, 9, 0)])
167
168    def testYearlyByYearDayNeg(self):
169        self.assertEqual(list(rrule(YEARLY,
170                              count=4,
171                              byyearday=(-365, -266, -166, -1),
172                              dtstart=datetime(1997, 9, 2, 9, 0))),
173                         [datetime(1997, 12, 31, 9, 0),
174                          datetime(1998, 1, 1, 9, 0),
175                          datetime(1998, 4, 10, 9, 0),
176                          datetime(1998, 7, 19, 9, 0)])
177
178    def testYearlyByMonthAndYearDay(self):
179        self.assertEqual(list(rrule(YEARLY,
180                              count=4,
181                              bymonth=(4, 7),
182                              byyearday=(1, 100, 200, 365),
183                              dtstart=datetime(1997, 9, 2, 9, 0))),
184                         [datetime(1998, 4, 10, 9, 0),
185                          datetime(1998, 7, 19, 9, 0),
186                          datetime(1999, 4, 10, 9, 0),
187                          datetime(1999, 7, 19, 9, 0)])
188
189    def testYearlyByMonthAndYearDayNeg(self):
190        self.assertEqual(list(rrule(YEARLY,
191                              count=4,
192                              bymonth=(4, 7),
193                              byyearday=(-365, -266, -166, -1),
194                              dtstart=datetime(1997, 9, 2, 9, 0))),
195                         [datetime(1998, 4, 10, 9, 0),
196                          datetime(1998, 7, 19, 9, 0),
197                          datetime(1999, 4, 10, 9, 0),
198                          datetime(1999, 7, 19, 9, 0)])
199
200    def testYearlyByWeekNo(self):
201        self.assertEqual(list(rrule(YEARLY,
202                              count=3,
203                              byweekno=20,
204                              dtstart=datetime(1997, 9, 2, 9, 0))),
205                         [datetime(1998, 5, 11, 9, 0),
206                          datetime(1998, 5, 12, 9, 0),
207                          datetime(1998, 5, 13, 9, 0)])
208
209    def testYearlyByWeekNoAndWeekDay(self):
210        # That's a nice one. The first days of week number one
211        # may be in the last year.
212        self.assertEqual(list(rrule(YEARLY,
213                              count=3,
214                              byweekno=1,
215                              byweekday=MO,
216                              dtstart=datetime(1997, 9, 2, 9, 0))),
217                         [datetime(1997, 12, 29, 9, 0),
218                          datetime(1999, 1, 4, 9, 0),
219                          datetime(2000, 1, 3, 9, 0)])
220
221    def testYearlyByWeekNoAndWeekDayLarge(self):
222        # Another nice test. The last days of week number 52/53
223        # may be in the next year.
224        self.assertEqual(list(rrule(YEARLY,
225                              count=3,
226                              byweekno=52,
227                              byweekday=SU,
228                              dtstart=datetime(1997, 9, 2, 9, 0))),
229                         [datetime(1997, 12, 28, 9, 0),
230                          datetime(1998, 12, 27, 9, 0),
231                          datetime(2000, 1, 2, 9, 0)])
232
233    def testYearlyByWeekNoAndWeekDayLast(self):
234        self.assertEqual(list(rrule(YEARLY,
235                              count=3,
236                              byweekno=-1,
237                              byweekday=SU,
238                              dtstart=datetime(1997, 9, 2, 9, 0))),
239                         [datetime(1997, 12, 28, 9, 0),
240                          datetime(1999, 1, 3, 9, 0),
241                          datetime(2000, 1, 2, 9, 0)])
242
243    def testYearlyByEaster(self):
244        self.assertEqual(list(rrule(YEARLY,
245                              count=3,
246                              byeaster=0,
247                              dtstart=datetime(1997, 9, 2, 9, 0))),
248                         [datetime(1998, 4, 12, 9, 0),
249                          datetime(1999, 4, 4, 9, 0),
250                          datetime(2000, 4, 23, 9, 0)])
251
252    def testYearlyByEasterPos(self):
253        self.assertEqual(list(rrule(YEARLY,
254                              count=3,
255                              byeaster=1,
256                              dtstart=datetime(1997, 9, 2, 9, 0))),
257                         [datetime(1998, 4, 13, 9, 0),
258                          datetime(1999, 4, 5, 9, 0),
259                          datetime(2000, 4, 24, 9, 0)])
260
261    def testYearlyByEasterNeg(self):
262        self.assertEqual(list(rrule(YEARLY,
263                              count=3,
264                              byeaster=-1,
265                              dtstart=datetime(1997, 9, 2, 9, 0))),
266                         [datetime(1998, 4, 11, 9, 0),
267                          datetime(1999, 4, 3, 9, 0),
268                          datetime(2000, 4, 22, 9, 0)])
269
270    def testYearlyByWeekNoAndWeekDay53(self):
271        self.assertEqual(list(rrule(YEARLY,
272                              count=3,
273                              byweekno=53,
274                              byweekday=MO,
275                              dtstart=datetime(1997, 9, 2, 9, 0))),
276                         [datetime(1998, 12, 28, 9, 0),
277                          datetime(2004, 12, 27, 9, 0),
278                          datetime(2009, 12, 28, 9, 0)])
279
280    def testYearlyByHour(self):
281        self.assertEqual(list(rrule(YEARLY,
282                              count=3,
283                              byhour=(6, 18),
284                              dtstart=datetime(1997, 9, 2, 9, 0))),
285                         [datetime(1997, 9, 2, 18, 0),
286                          datetime(1998, 9, 2, 6, 0),
287                          datetime(1998, 9, 2, 18, 0)])
288
289    def testYearlyByMinute(self):
290        self.assertEqual(list(rrule(YEARLY,
291                              count=3,
292                              byminute=(6, 18),
293                              dtstart=datetime(1997, 9, 2, 9, 0))),
294                         [datetime(1997, 9, 2, 9, 6),
295                          datetime(1997, 9, 2, 9, 18),
296                          datetime(1998, 9, 2, 9, 6)])
297
298    def testYearlyBySecond(self):
299        self.assertEqual(list(rrule(YEARLY,
300                              count=3,
301                              bysecond=(6, 18),
302                              dtstart=datetime(1997, 9, 2, 9, 0))),
303                         [datetime(1997, 9, 2, 9, 0, 6),
304                          datetime(1997, 9, 2, 9, 0, 18),
305                          datetime(1998, 9, 2, 9, 0, 6)])
306
307    def testYearlyByHourAndMinute(self):
308        self.assertEqual(list(rrule(YEARLY,
309                              count=3,
310                              byhour=(6, 18),
311                              byminute=(6, 18),
312                              dtstart=datetime(1997, 9, 2, 9, 0))),
313                         [datetime(1997, 9, 2, 18, 6),
314                          datetime(1997, 9, 2, 18, 18),
315                          datetime(1998, 9, 2, 6, 6)])
316
317    def testYearlyByHourAndSecond(self):
318        self.assertEqual(list(rrule(YEARLY,
319                              count=3,
320                              byhour=(6, 18),
321                              bysecond=(6, 18),
322                              dtstart=datetime(1997, 9, 2, 9, 0))),
323                         [datetime(1997, 9, 2, 18, 0, 6),
324                          datetime(1997, 9, 2, 18, 0, 18),
325                          datetime(1998, 9, 2, 6, 0, 6)])
326
327    def testYearlyByMinuteAndSecond(self):
328        self.assertEqual(list(rrule(YEARLY,
329                              count=3,
330                              byminute=(6, 18),
331                              bysecond=(6, 18),
332                              dtstart=datetime(1997, 9, 2, 9, 0))),
333                         [datetime(1997, 9, 2, 9, 6, 6),
334                          datetime(1997, 9, 2, 9, 6, 18),
335                          datetime(1997, 9, 2, 9, 18, 6)])
336
337    def testYearlyByHourAndMinuteAndSecond(self):
338        self.assertEqual(list(rrule(YEARLY,
339                              count=3,
340                              byhour=(6, 18),
341                              byminute=(6, 18),
342                              bysecond=(6, 18),
343                              dtstart=datetime(1997, 9, 2, 9, 0))),
344                         [datetime(1997, 9, 2, 18, 6, 6),
345                          datetime(1997, 9, 2, 18, 6, 18),
346                          datetime(1997, 9, 2, 18, 18, 6)])
347
348    def testYearlyBySetPos(self):
349        self.assertEqual(list(rrule(YEARLY,
350                              count=3,
351                              bymonthday=15,
352                              byhour=(6, 18),
353                              bysetpos=(3, -3),
354                              dtstart=datetime(1997, 9, 2, 9, 0))),
355                         [datetime(1997, 11, 15, 18, 0),
356                          datetime(1998, 2, 15, 6, 0),
357                          datetime(1998, 11, 15, 18, 0)])
358
359    def testMonthly(self):
360        self.assertEqual(list(rrule(MONTHLY,
361                              count=3,
362                              dtstart=datetime(1997, 9, 2, 9, 0))),
363                         [datetime(1997, 9, 2, 9, 0),
364                          datetime(1997, 10, 2, 9, 0),
365                          datetime(1997, 11, 2, 9, 0)])
366
367    def testMonthlyInterval(self):
368        self.assertEqual(list(rrule(MONTHLY,
369                              count=3,
370                              interval=2,
371                              dtstart=datetime(1997, 9, 2, 9, 0))),
372                         [datetime(1997, 9, 2, 9, 0),
373                          datetime(1997, 11, 2, 9, 0),
374                          datetime(1998, 1, 2, 9, 0)])
375
376    def testMonthlyIntervalLarge(self):
377        self.assertEqual(list(rrule(MONTHLY,
378                              count=3,
379                              interval=18,
380                              dtstart=datetime(1997, 9, 2, 9, 0))),
381                         [datetime(1997, 9, 2, 9, 0),
382                          datetime(1999, 3, 2, 9, 0),
383                          datetime(2000, 9, 2, 9, 0)])
384
385    def testMonthlyByMonth(self):
386        self.assertEqual(list(rrule(MONTHLY,
387                              count=3,
388                              bymonth=(1, 3),
389                              dtstart=datetime(1997, 9, 2, 9, 0))),
390                         [datetime(1998, 1, 2, 9, 0),
391                          datetime(1998, 3, 2, 9, 0),
392                          datetime(1999, 1, 2, 9, 0)])
393
394    def testMonthlyByMonthDay(self):
395        self.assertEqual(list(rrule(MONTHLY,
396                              count=3,
397                              bymonthday=(1, 3),
398                              dtstart=datetime(1997, 9, 2, 9, 0))),
399                         [datetime(1997, 9, 3, 9, 0),
400                          datetime(1997, 10, 1, 9, 0),
401                          datetime(1997, 10, 3, 9, 0)])
402
403    def testMonthlyByMonthAndMonthDay(self):
404        self.assertEqual(list(rrule(MONTHLY,
405                              count=3,
406                              bymonth=(1, 3),
407                              bymonthday=(5, 7),
408                              dtstart=datetime(1997, 9, 2, 9, 0))),
409                         [datetime(1998, 1, 5, 9, 0),
410                          datetime(1998, 1, 7, 9, 0),
411                          datetime(1998, 3, 5, 9, 0)])
412
413    def testMonthlyByWeekDay(self):
414        self.assertEqual(list(rrule(MONTHLY,
415                              count=3,
416                              byweekday=(TU, TH),
417                              dtstart=datetime(1997, 9, 2, 9, 0))),
418                         [datetime(1997, 9, 2, 9, 0),
419                          datetime(1997, 9, 4, 9, 0),
420                          datetime(1997, 9, 9, 9, 0)])
421
422        # Third Monday of the month
423        self.assertEqual(rrule(MONTHLY,
424                         byweekday=(MO(+3)),
425                         dtstart=datetime(1997, 9, 1)).between(datetime(1997, 9, 1),
426                                                               datetime(1997, 12, 1)),
427                         [datetime(1997, 9, 15, 0, 0),
428                          datetime(1997, 10, 20, 0, 0),
429                          datetime(1997, 11, 17, 0, 0)])
430
431    def testMonthlyByNWeekDay(self):
432        self.assertEqual(list(rrule(MONTHLY,
433                              count=3,
434                              byweekday=(TU(1), TH(-1)),
435                              dtstart=datetime(1997, 9, 2, 9, 0))),
436                         [datetime(1997, 9, 2, 9, 0),
437                          datetime(1997, 9, 25, 9, 0),
438                          datetime(1997, 10, 7, 9, 0)])
439
440    def testMonthlyByNWeekDayLarge(self):
441        self.assertEqual(list(rrule(MONTHLY,
442                              count=3,
443                              byweekday=(TU(3), TH(-3)),
444                              dtstart=datetime(1997, 9, 2, 9, 0))),
445                         [datetime(1997, 9, 11, 9, 0),
446                          datetime(1997, 9, 16, 9, 0),
447                          datetime(1997, 10, 16, 9, 0)])
448
449    def testMonthlyByMonthAndWeekDay(self):
450        self.assertEqual(list(rrule(MONTHLY,
451                              count=3,
452                              bymonth=(1, 3),
453                              byweekday=(TU, TH),
454                              dtstart=datetime(1997, 9, 2, 9, 0))),
455                         [datetime(1998, 1, 1, 9, 0),
456                          datetime(1998, 1, 6, 9, 0),
457                          datetime(1998, 1, 8, 9, 0)])
458
459    def testMonthlyByMonthAndNWeekDay(self):
460        self.assertEqual(list(rrule(MONTHLY,
461                              count=3,
462                              bymonth=(1, 3),
463                              byweekday=(TU(1), TH(-1)),
464                              dtstart=datetime(1997, 9, 2, 9, 0))),
465                         [datetime(1998, 1, 6, 9, 0),
466                          datetime(1998, 1, 29, 9, 0),
467                          datetime(1998, 3, 3, 9, 0)])
468
469    def testMonthlyByMonthAndNWeekDayLarge(self):
470        self.assertEqual(list(rrule(MONTHLY,
471                              count=3,
472                              bymonth=(1, 3),
473                              byweekday=(TU(3), TH(-3)),
474                              dtstart=datetime(1997, 9, 2, 9, 0))),
475                         [datetime(1998, 1, 15, 9, 0),
476                          datetime(1998, 1, 20, 9, 0),
477                          datetime(1998, 3, 12, 9, 0)])
478
479    def testMonthlyByMonthDayAndWeekDay(self):
480        self.assertEqual(list(rrule(MONTHLY,
481                              count=3,
482                              bymonthday=(1, 3),
483                              byweekday=(TU, TH),
484                              dtstart=datetime(1997, 9, 2, 9, 0))),
485                         [datetime(1998, 1, 1, 9, 0),
486                          datetime(1998, 2, 3, 9, 0),
487                          datetime(1998, 3, 3, 9, 0)])
488
489    def testMonthlyByMonthAndMonthDayAndWeekDay(self):
490        self.assertEqual(list(rrule(MONTHLY,
491                              count=3,
492                              bymonth=(1, 3),
493                              bymonthday=(1, 3),
494                              byweekday=(TU, TH),
495                              dtstart=datetime(1997, 9, 2, 9, 0))),
496                         [datetime(1998, 1, 1, 9, 0),
497                          datetime(1998, 3, 3, 9, 0),
498                          datetime(2001, 3, 1, 9, 0)])
499
500    def testMonthlyByYearDay(self):
501        self.assertEqual(list(rrule(MONTHLY,
502                              count=4,
503                              byyearday=(1, 100, 200, 365),
504                              dtstart=datetime(1997, 9, 2, 9, 0))),
505                         [datetime(1997, 12, 31, 9, 0),
506                          datetime(1998, 1, 1, 9, 0),
507                          datetime(1998, 4, 10, 9, 0),
508                          datetime(1998, 7, 19, 9, 0)])
509
510    def testMonthlyByYearDayNeg(self):
511        self.assertEqual(list(rrule(MONTHLY,
512                              count=4,
513                              byyearday=(-365, -266, -166, -1),
514                              dtstart=datetime(1997, 9, 2, 9, 0))),
515                         [datetime(1997, 12, 31, 9, 0),
516                          datetime(1998, 1, 1, 9, 0),
517                          datetime(1998, 4, 10, 9, 0),
518                          datetime(1998, 7, 19, 9, 0)])
519
520    def testMonthlyByMonthAndYearDay(self):
521        self.assertEqual(list(rrule(MONTHLY,
522                              count=4,
523                              bymonth=(4, 7),
524                              byyearday=(1, 100, 200, 365),
525                              dtstart=datetime(1997, 9, 2, 9, 0))),
526                         [datetime(1998, 4, 10, 9, 0),
527                          datetime(1998, 7, 19, 9, 0),
528                          datetime(1999, 4, 10, 9, 0),
529                          datetime(1999, 7, 19, 9, 0)])
530
531    def testMonthlyByMonthAndYearDayNeg(self):
532        self.assertEqual(list(rrule(MONTHLY,
533                              count=4,
534                              bymonth=(4, 7),
535                              byyearday=(-365, -266, -166, -1),
536                              dtstart=datetime(1997, 9, 2, 9, 0))),
537                         [datetime(1998, 4, 10, 9, 0),
538                          datetime(1998, 7, 19, 9, 0),
539                          datetime(1999, 4, 10, 9, 0),
540                          datetime(1999, 7, 19, 9, 0)])
541
542    def testMonthlyByWeekNo(self):
543        self.assertEqual(list(rrule(MONTHLY,
544                              count=3,
545                              byweekno=20,
546                              dtstart=datetime(1997, 9, 2, 9, 0))),
547                         [datetime(1998, 5, 11, 9, 0),
548                          datetime(1998, 5, 12, 9, 0),
549                          datetime(1998, 5, 13, 9, 0)])
550
551    def testMonthlyByWeekNoAndWeekDay(self):
552        # That's a nice one. The first days of week number one
553        # may be in the last year.
554        self.assertEqual(list(rrule(MONTHLY,
555                              count=3,
556                              byweekno=1,
557                              byweekday=MO,
558                              dtstart=datetime(1997, 9, 2, 9, 0))),
559                         [datetime(1997, 12, 29, 9, 0),
560                          datetime(1999, 1, 4, 9, 0),
561                          datetime(2000, 1, 3, 9, 0)])
562
563    def testMonthlyByWeekNoAndWeekDayLarge(self):
564        # Another nice test. The last days of week number 52/53
565        # may be in the next year.
566        self.assertEqual(list(rrule(MONTHLY,
567                              count=3,
568                              byweekno=52,
569                              byweekday=SU,
570                              dtstart=datetime(1997, 9, 2, 9, 0))),
571                         [datetime(1997, 12, 28, 9, 0),
572                          datetime(1998, 12, 27, 9, 0),
573                          datetime(2000, 1, 2, 9, 0)])
574
575    def testMonthlyByWeekNoAndWeekDayLast(self):
576        self.assertEqual(list(rrule(MONTHLY,
577                              count=3,
578                              byweekno=-1,
579                              byweekday=SU,
580                              dtstart=datetime(1997, 9, 2, 9, 0))),
581                         [datetime(1997, 12, 28, 9, 0),
582                          datetime(1999, 1, 3, 9, 0),
583                          datetime(2000, 1, 2, 9, 0)])
584
585    def testMonthlyByWeekNoAndWeekDay53(self):
586        self.assertEqual(list(rrule(MONTHLY,
587                              count=3,
588                              byweekno=53,
589                              byweekday=MO,
590                              dtstart=datetime(1997, 9, 2, 9, 0))),
591                         [datetime(1998, 12, 28, 9, 0),
592                          datetime(2004, 12, 27, 9, 0),
593                          datetime(2009, 12, 28, 9, 0)])
594
595    def testMonthlyByEaster(self):
596        self.assertEqual(list(rrule(MONTHLY,
597                              count=3,
598                              byeaster=0,
599                              dtstart=datetime(1997, 9, 2, 9, 0))),
600                         [datetime(1998, 4, 12, 9, 0),
601                          datetime(1999, 4, 4, 9, 0),
602                          datetime(2000, 4, 23, 9, 0)])
603
604    def testMonthlyByEasterPos(self):
605        self.assertEqual(list(rrule(MONTHLY,
606                              count=3,
607                              byeaster=1,
608                              dtstart=datetime(1997, 9, 2, 9, 0))),
609                         [datetime(1998, 4, 13, 9, 0),
610                          datetime(1999, 4, 5, 9, 0),
611                          datetime(2000, 4, 24, 9, 0)])
612
613    def testMonthlyByEasterNeg(self):
614        self.assertEqual(list(rrule(MONTHLY,
615                              count=3,
616                              byeaster=-1,
617                              dtstart=datetime(1997, 9, 2, 9, 0))),
618                         [datetime(1998, 4, 11, 9, 0),
619                          datetime(1999, 4, 3, 9, 0),
620                          datetime(2000, 4, 22, 9, 0)])
621
622    def testMonthlyByHour(self):
623        self.assertEqual(list(rrule(MONTHLY,
624                              count=3,
625                              byhour=(6, 18),
626                              dtstart=datetime(1997, 9, 2, 9, 0))),
627                         [datetime(1997, 9, 2, 18, 0),
628                          datetime(1997, 10, 2, 6, 0),
629                          datetime(1997, 10, 2, 18, 0)])
630
631    def testMonthlyByMinute(self):
632        self.assertEqual(list(rrule(MONTHLY,
633                              count=3,
634                              byminute=(6, 18),
635                              dtstart=datetime(1997, 9, 2, 9, 0))),
636                         [datetime(1997, 9, 2, 9, 6),
637                          datetime(1997, 9, 2, 9, 18),
638                          datetime(1997, 10, 2, 9, 6)])
639
640    def testMonthlyBySecond(self):
641        self.assertEqual(list(rrule(MONTHLY,
642                              count=3,
643                              bysecond=(6, 18),
644                              dtstart=datetime(1997, 9, 2, 9, 0))),
645                         [datetime(1997, 9, 2, 9, 0, 6),
646                          datetime(1997, 9, 2, 9, 0, 18),
647                          datetime(1997, 10, 2, 9, 0, 6)])
648
649    def testMonthlyByHourAndMinute(self):
650        self.assertEqual(list(rrule(MONTHLY,
651                              count=3,
652                              byhour=(6, 18),
653                              byminute=(6, 18),
654                              dtstart=datetime(1997, 9, 2, 9, 0))),
655                         [datetime(1997, 9, 2, 18, 6),
656                          datetime(1997, 9, 2, 18, 18),
657                          datetime(1997, 10, 2, 6, 6)])
658
659    def testMonthlyByHourAndSecond(self):
660        self.assertEqual(list(rrule(MONTHLY,
661                              count=3,
662                              byhour=(6, 18),
663                              bysecond=(6, 18),
664                              dtstart=datetime(1997, 9, 2, 9, 0))),
665                         [datetime(1997, 9, 2, 18, 0, 6),
666                          datetime(1997, 9, 2, 18, 0, 18),
667                          datetime(1997, 10, 2, 6, 0, 6)])
668
669    def testMonthlyByMinuteAndSecond(self):
670        self.assertEqual(list(rrule(MONTHLY,
671                              count=3,
672                              byminute=(6, 18),
673                              bysecond=(6, 18),
674                              dtstart=datetime(1997, 9, 2, 9, 0))),
675                         [datetime(1997, 9, 2, 9, 6, 6),
676                          datetime(1997, 9, 2, 9, 6, 18),
677                          datetime(1997, 9, 2, 9, 18, 6)])
678
679    def testMonthlyByHourAndMinuteAndSecond(self):
680        self.assertEqual(list(rrule(MONTHLY,
681                              count=3,
682                              byhour=(6, 18),
683                              byminute=(6, 18),
684                              bysecond=(6, 18),
685                              dtstart=datetime(1997, 9, 2, 9, 0))),
686                         [datetime(1997, 9, 2, 18, 6, 6),
687                          datetime(1997, 9, 2, 18, 6, 18),
688                          datetime(1997, 9, 2, 18, 18, 6)])
689
690    def testMonthlyBySetPos(self):
691        self.assertEqual(list(rrule(MONTHLY,
692                              count=3,
693                              bymonthday=(13, 17),
694                              byhour=(6, 18),
695                              bysetpos=(3, -3),
696                              dtstart=datetime(1997, 9, 2, 9, 0))),
697                         [datetime(1997, 9, 13, 18, 0),
698                          datetime(1997, 9, 17, 6, 0),
699                          datetime(1997, 10, 13, 18, 0)])
700
701    def testWeekly(self):
702        self.assertEqual(list(rrule(WEEKLY,
703                              count=3,
704                              dtstart=datetime(1997, 9, 2, 9, 0))),
705                         [datetime(1997, 9, 2, 9, 0),
706                          datetime(1997, 9, 9, 9, 0),
707                          datetime(1997, 9, 16, 9, 0)])
708
709    def testWeeklyInterval(self):
710        self.assertEqual(list(rrule(WEEKLY,
711                              count=3,
712                              interval=2,
713                              dtstart=datetime(1997, 9, 2, 9, 0))),
714                         [datetime(1997, 9, 2, 9, 0),
715                          datetime(1997, 9, 16, 9, 0),
716                          datetime(1997, 9, 30, 9, 0)])
717
718    def testWeeklyIntervalLarge(self):
719        self.assertEqual(list(rrule(WEEKLY,
720                              count=3,
721                              interval=20,
722                              dtstart=datetime(1997, 9, 2, 9, 0))),
723                         [datetime(1997, 9, 2, 9, 0),
724                          datetime(1998, 1, 20, 9, 0),
725                          datetime(1998, 6, 9, 9, 0)])
726
727    def testWeeklyByMonth(self):
728        self.assertEqual(list(rrule(WEEKLY,
729                              count=3,
730                              bymonth=(1, 3),
731                              dtstart=datetime(1997, 9, 2, 9, 0))),
732                         [datetime(1998, 1, 6, 9, 0),
733                          datetime(1998, 1, 13, 9, 0),
734                          datetime(1998, 1, 20, 9, 0)])
735
736    def testWeeklyByMonthDay(self):
737        self.assertEqual(list(rrule(WEEKLY,
738                              count=3,
739                              bymonthday=(1, 3),
740                              dtstart=datetime(1997, 9, 2, 9, 0))),
741                         [datetime(1997, 9, 3, 9, 0),
742                          datetime(1997, 10, 1, 9, 0),
743                          datetime(1997, 10, 3, 9, 0)])
744
745    def testWeeklyByMonthAndMonthDay(self):
746        self.assertEqual(list(rrule(WEEKLY,
747                              count=3,
748                              bymonth=(1, 3),
749                              bymonthday=(5, 7),
750                              dtstart=datetime(1997, 9, 2, 9, 0))),
751                         [datetime(1998, 1, 5, 9, 0),
752                          datetime(1998, 1, 7, 9, 0),
753                          datetime(1998, 3, 5, 9, 0)])
754
755    def testWeeklyByWeekDay(self):
756        self.assertEqual(list(rrule(WEEKLY,
757                              count=3,
758                              byweekday=(TU, TH),
759                              dtstart=datetime(1997, 9, 2, 9, 0))),
760                         [datetime(1997, 9, 2, 9, 0),
761                          datetime(1997, 9, 4, 9, 0),
762                          datetime(1997, 9, 9, 9, 0)])
763
764    def testWeeklyByNWeekDay(self):
765        self.assertEqual(list(rrule(WEEKLY,
766                              count=3,
767                              byweekday=(TU(1), TH(-1)),
768                              dtstart=datetime(1997, 9, 2, 9, 0))),
769                         [datetime(1997, 9, 2, 9, 0),
770                          datetime(1997, 9, 4, 9, 0),
771                          datetime(1997, 9, 9, 9, 0)])
772
773    def testWeeklyByMonthAndWeekDay(self):
774        # This test is interesting, because it crosses the year
775        # boundary in a weekly period to find day '1' as a
776        # valid recurrence.
777        self.assertEqual(list(rrule(WEEKLY,
778                              count=3,
779                              bymonth=(1, 3),
780                              byweekday=(TU, TH),
781                              dtstart=datetime(1997, 9, 2, 9, 0))),
782                         [datetime(1998, 1, 1, 9, 0),
783                          datetime(1998, 1, 6, 9, 0),
784                          datetime(1998, 1, 8, 9, 0)])
785
786    def testWeeklyByMonthAndNWeekDay(self):
787        self.assertEqual(list(rrule(WEEKLY,
788                              count=3,
789                              bymonth=(1, 3),
790                              byweekday=(TU(1), TH(-1)),
791                              dtstart=datetime(1997, 9, 2, 9, 0))),
792                         [datetime(1998, 1, 1, 9, 0),
793                          datetime(1998, 1, 6, 9, 0),
794                          datetime(1998, 1, 8, 9, 0)])
795
796    def testWeeklyByMonthDayAndWeekDay(self):
797        self.assertEqual(list(rrule(WEEKLY,
798                              count=3,
799                              bymonthday=(1, 3),
800                              byweekday=(TU, TH),
801                              dtstart=datetime(1997, 9, 2, 9, 0))),
802                         [datetime(1998, 1, 1, 9, 0),
803                          datetime(1998, 2, 3, 9, 0),
804                          datetime(1998, 3, 3, 9, 0)])
805
806    def testWeeklyByMonthAndMonthDayAndWeekDay(self):
807        self.assertEqual(list(rrule(WEEKLY,
808                              count=3,
809                              bymonth=(1, 3),
810                              bymonthday=(1, 3),
811                              byweekday=(TU, TH),
812                              dtstart=datetime(1997, 9, 2, 9, 0))),
813                         [datetime(1998, 1, 1, 9, 0),
814                          datetime(1998, 3, 3, 9, 0),
815                          datetime(2001, 3, 1, 9, 0)])
816
817    def testWeeklyByYearDay(self):
818        self.assertEqual(list(rrule(WEEKLY,
819                              count=4,
820                              byyearday=(1, 100, 200, 365),
821                              dtstart=datetime(1997, 9, 2, 9, 0))),
822                         [datetime(1997, 12, 31, 9, 0),
823                          datetime(1998, 1, 1, 9, 0),
824                          datetime(1998, 4, 10, 9, 0),
825                          datetime(1998, 7, 19, 9, 0)])
826
827    def testWeeklyByYearDayNeg(self):
828        self.assertEqual(list(rrule(WEEKLY,
829                              count=4,
830                              byyearday=(-365, -266, -166, -1),
831                              dtstart=datetime(1997, 9, 2, 9, 0))),
832                         [datetime(1997, 12, 31, 9, 0),
833                          datetime(1998, 1, 1, 9, 0),
834                          datetime(1998, 4, 10, 9, 0),
835                          datetime(1998, 7, 19, 9, 0)])
836
837    def testWeeklyByMonthAndYearDay(self):
838        self.assertEqual(list(rrule(WEEKLY,
839                              count=4,
840                              bymonth=(1, 7),
841                              byyearday=(1, 100, 200, 365),
842                              dtstart=datetime(1997, 9, 2, 9, 0))),
843                         [datetime(1998, 1, 1, 9, 0),
844                          datetime(1998, 7, 19, 9, 0),
845                          datetime(1999, 1, 1, 9, 0),
846                          datetime(1999, 7, 19, 9, 0)])
847
848    def testWeeklyByMonthAndYearDayNeg(self):
849        self.assertEqual(list(rrule(WEEKLY,
850                              count=4,
851                              bymonth=(1, 7),
852                              byyearday=(-365, -266, -166, -1),
853                              dtstart=datetime(1997, 9, 2, 9, 0))),
854                         [datetime(1998, 1, 1, 9, 0),
855                          datetime(1998, 7, 19, 9, 0),
856                          datetime(1999, 1, 1, 9, 0),
857                          datetime(1999, 7, 19, 9, 0)])
858
859    def testWeeklyByWeekNo(self):
860        self.assertEqual(list(rrule(WEEKLY,
861                              count=3,
862                              byweekno=20,
863                              dtstart=datetime(1997, 9, 2, 9, 0))),
864                         [datetime(1998, 5, 11, 9, 0),
865                          datetime(1998, 5, 12, 9, 0),
866                          datetime(1998, 5, 13, 9, 0)])
867
868    def testWeeklyByWeekNoAndWeekDay(self):
869        # That's a nice one. The first days of week number one
870        # may be in the last year.
871        self.assertEqual(list(rrule(WEEKLY,
872                              count=3,
873                              byweekno=1,
874                              byweekday=MO,
875                              dtstart=datetime(1997, 9, 2, 9, 0))),
876                         [datetime(1997, 12, 29, 9, 0),
877                          datetime(1999, 1, 4, 9, 0),
878                          datetime(2000, 1, 3, 9, 0)])
879
880    def testWeeklyByWeekNoAndWeekDayLarge(self):
881        # Another nice test. The last days of week number 52/53
882        # may be in the next year.
883        self.assertEqual(list(rrule(WEEKLY,
884                              count=3,
885                              byweekno=52,
886                              byweekday=SU,
887                              dtstart=datetime(1997, 9, 2, 9, 0))),
888                         [datetime(1997, 12, 28, 9, 0),
889                          datetime(1998, 12, 27, 9, 0),
890                          datetime(2000, 1, 2, 9, 0)])
891
892    def testWeeklyByWeekNoAndWeekDayLast(self):
893        self.assertEqual(list(rrule(WEEKLY,
894                              count=3,
895                              byweekno=-1,
896                              byweekday=SU,
897                              dtstart=datetime(1997, 9, 2, 9, 0))),
898                         [datetime(1997, 12, 28, 9, 0),
899                          datetime(1999, 1, 3, 9, 0),
900                          datetime(2000, 1, 2, 9, 0)])
901
902    def testWeeklyByWeekNoAndWeekDay53(self):
903        self.assertEqual(list(rrule(WEEKLY,
904                              count=3,
905                              byweekno=53,
906                              byweekday=MO,
907                              dtstart=datetime(1997, 9, 2, 9, 0))),
908                         [datetime(1998, 12, 28, 9, 0),
909                          datetime(2004, 12, 27, 9, 0),
910                          datetime(2009, 12, 28, 9, 0)])
911
912    def testWeeklyByEaster(self):
913        self.assertEqual(list(rrule(WEEKLY,
914                              count=3,
915                              byeaster=0,
916                              dtstart=datetime(1997, 9, 2, 9, 0))),
917                         [datetime(1998, 4, 12, 9, 0),
918                          datetime(1999, 4, 4, 9, 0),
919                          datetime(2000, 4, 23, 9, 0)])
920
921    def testWeeklyByEasterPos(self):
922        self.assertEqual(list(rrule(WEEKLY,
923                              count=3,
924                              byeaster=1,
925                              dtstart=datetime(1997, 9, 2, 9, 0))),
926                         [datetime(1998, 4, 13, 9, 0),
927                          datetime(1999, 4, 5, 9, 0),
928                          datetime(2000, 4, 24, 9, 0)])
929
930    def testWeeklyByEasterNeg(self):
931        self.assertEqual(list(rrule(WEEKLY,
932                              count=3,
933                              byeaster=-1,
934                              dtstart=datetime(1997, 9, 2, 9, 0))),
935                         [datetime(1998, 4, 11, 9, 0),
936                          datetime(1999, 4, 3, 9, 0),
937                          datetime(2000, 4, 22, 9, 0)])
938
939    def testWeeklyByHour(self):
940        self.assertEqual(list(rrule(WEEKLY,
941                              count=3,
942                              byhour=(6, 18),
943                              dtstart=datetime(1997, 9, 2, 9, 0))),
944                         [datetime(1997, 9, 2, 18, 0),
945                          datetime(1997, 9, 9, 6, 0),
946                          datetime(1997, 9, 9, 18, 0)])
947
948    def testWeeklyByMinute(self):
949        self.assertEqual(list(rrule(WEEKLY,
950                              count=3,
951                              byminute=(6, 18),
952                              dtstart=datetime(1997, 9, 2, 9, 0))),
953                         [datetime(1997, 9, 2, 9, 6),
954                          datetime(1997, 9, 2, 9, 18),
955                          datetime(1997, 9, 9, 9, 6)])
956
957    def testWeeklyBySecond(self):
958        self.assertEqual(list(rrule(WEEKLY,
959                              count=3,
960                              bysecond=(6, 18),
961                              dtstart=datetime(1997, 9, 2, 9, 0))),
962                         [datetime(1997, 9, 2, 9, 0, 6),
963                          datetime(1997, 9, 2, 9, 0, 18),
964                          datetime(1997, 9, 9, 9, 0, 6)])
965
966    def testWeeklyByHourAndMinute(self):
967        self.assertEqual(list(rrule(WEEKLY,
968                              count=3,
969                              byhour=(6, 18),
970                              byminute=(6, 18),
971                              dtstart=datetime(1997, 9, 2, 9, 0))),
972                         [datetime(1997, 9, 2, 18, 6),
973                          datetime(1997, 9, 2, 18, 18),
974                          datetime(1997, 9, 9, 6, 6)])
975
976    def testWeeklyByHourAndSecond(self):
977        self.assertEqual(list(rrule(WEEKLY,
978                              count=3,
979                              byhour=(6, 18),
980                              bysecond=(6, 18),
981                              dtstart=datetime(1997, 9, 2, 9, 0))),
982                         [datetime(1997, 9, 2, 18, 0, 6),
983                          datetime(1997, 9, 2, 18, 0, 18),
984                          datetime(1997, 9, 9, 6, 0, 6)])
985
986    def testWeeklyByMinuteAndSecond(self):
987        self.assertEqual(list(rrule(WEEKLY,
988                              count=3,
989                              byminute=(6, 18),
990                              bysecond=(6, 18),
991                              dtstart=datetime(1997, 9, 2, 9, 0))),
992                         [datetime(1997, 9, 2, 9, 6, 6),
993                          datetime(1997, 9, 2, 9, 6, 18),
994                          datetime(1997, 9, 2, 9, 18, 6)])
995
996    def testWeeklyByHourAndMinuteAndSecond(self):
997        self.assertEqual(list(rrule(WEEKLY,
998                              count=3,
999                              byhour=(6, 18),
1000                              byminute=(6, 18),
1001                              bysecond=(6, 18),
1002                              dtstart=datetime(1997, 9, 2, 9, 0))),
1003                         [datetime(1997, 9, 2, 18, 6, 6),
1004                          datetime(1997, 9, 2, 18, 6, 18),
1005                          datetime(1997, 9, 2, 18, 18, 6)])
1006
1007    def testWeeklyBySetPos(self):
1008        self.assertEqual(list(rrule(WEEKLY,
1009                              count=3,
1010                              byweekday=(TU, TH),
1011                              byhour=(6, 18),
1012                              bysetpos=(3, -3),
1013                              dtstart=datetime(1997, 9, 2, 9, 0))),
1014                         [datetime(1997, 9, 2, 18, 0),
1015                          datetime(1997, 9, 4, 6, 0),
1016                          datetime(1997, 9, 9, 18, 0)])
1017
1018    def testDaily(self):
1019        self.assertEqual(list(rrule(DAILY,
1020                              count=3,
1021                              dtstart=datetime(1997, 9, 2, 9, 0))),
1022                         [datetime(1997, 9, 2, 9, 0),
1023                          datetime(1997, 9, 3, 9, 0),
1024                          datetime(1997, 9, 4, 9, 0)])
1025
1026    def testDailyInterval(self):
1027        self.assertEqual(list(rrule(DAILY,
1028                              count=3,
1029                              interval=2,
1030                              dtstart=datetime(1997, 9, 2, 9, 0))),
1031                         [datetime(1997, 9, 2, 9, 0),
1032                          datetime(1997, 9, 4, 9, 0),
1033                          datetime(1997, 9, 6, 9, 0)])
1034
1035    def testDailyIntervalLarge(self):
1036        self.assertEqual(list(rrule(DAILY,
1037                              count=3,
1038                              interval=92,
1039                              dtstart=datetime(1997, 9, 2, 9, 0))),
1040                         [datetime(1997, 9, 2, 9, 0),
1041                          datetime(1997, 12, 3, 9, 0),
1042                          datetime(1998, 3, 5, 9, 0)])
1043
1044    def testDailyByMonth(self):
1045        self.assertEqual(list(rrule(DAILY,
1046                              count=3,
1047                              bymonth=(1, 3),
1048                              dtstart=datetime(1997, 9, 2, 9, 0))),
1049                         [datetime(1998, 1, 1, 9, 0),
1050                          datetime(1998, 1, 2, 9, 0),
1051                          datetime(1998, 1, 3, 9, 0)])
1052
1053    def testDailyByMonthDay(self):
1054        self.assertEqual(list(rrule(DAILY,
1055                              count=3,
1056                              bymonthday=(1, 3),
1057                              dtstart=datetime(1997, 9, 2, 9, 0))),
1058                         [datetime(1997, 9, 3, 9, 0),
1059                          datetime(1997, 10, 1, 9, 0),
1060                          datetime(1997, 10, 3, 9, 0)])
1061
1062    def testDailyByMonthAndMonthDay(self):
1063        self.assertEqual(list(rrule(DAILY,
1064                              count=3,
1065                              bymonth=(1, 3),
1066                              bymonthday=(5, 7),
1067                              dtstart=datetime(1997, 9, 2, 9, 0))),
1068                         [datetime(1998, 1, 5, 9, 0),
1069                          datetime(1998, 1, 7, 9, 0),
1070                          datetime(1998, 3, 5, 9, 0)])
1071
1072    def testDailyByWeekDay(self):
1073        self.assertEqual(list(rrule(DAILY,
1074                              count=3,
1075                              byweekday=(TU, TH),
1076                              dtstart=datetime(1997, 9, 2, 9, 0))),
1077                         [datetime(1997, 9, 2, 9, 0),
1078                          datetime(1997, 9, 4, 9, 0),
1079                          datetime(1997, 9, 9, 9, 0)])
1080
1081    def testDailyByNWeekDay(self):
1082        self.assertEqual(list(rrule(DAILY,
1083                              count=3,
1084                              byweekday=(TU(1), TH(-1)),
1085                              dtstart=datetime(1997, 9, 2, 9, 0))),
1086                         [datetime(1997, 9, 2, 9, 0),
1087                          datetime(1997, 9, 4, 9, 0),
1088                          datetime(1997, 9, 9, 9, 0)])
1089
1090    def testDailyByMonthAndWeekDay(self):
1091        self.assertEqual(list(rrule(DAILY,
1092                              count=3,
1093                              bymonth=(1, 3),
1094                              byweekday=(TU, TH),
1095                              dtstart=datetime(1997, 9, 2, 9, 0))),
1096                         [datetime(1998, 1, 1, 9, 0),
1097                          datetime(1998, 1, 6, 9, 0),
1098                          datetime(1998, 1, 8, 9, 0)])
1099
1100    def testDailyByMonthAndNWeekDay(self):
1101        self.assertEqual(list(rrule(DAILY,
1102                              count=3,
1103                              bymonth=(1, 3),
1104                              byweekday=(TU(1), TH(-1)),
1105                              dtstart=datetime(1997, 9, 2, 9, 0))),
1106                         [datetime(1998, 1, 1, 9, 0),
1107                          datetime(1998, 1, 6, 9, 0),
1108                          datetime(1998, 1, 8, 9, 0)])
1109
1110    def testDailyByMonthDayAndWeekDay(self):
1111        self.assertEqual(list(rrule(DAILY,
1112                              count=3,
1113                              bymonthday=(1, 3),
1114                              byweekday=(TU, TH),
1115                              dtstart=datetime(1997, 9, 2, 9, 0))),
1116                         [datetime(1998, 1, 1, 9, 0),
1117                          datetime(1998, 2, 3, 9, 0),
1118                          datetime(1998, 3, 3, 9, 0)])
1119
1120    def testDailyByMonthAndMonthDayAndWeekDay(self):
1121        self.assertEqual(list(rrule(DAILY,
1122                              count=3,
1123                              bymonth=(1, 3),
1124                              bymonthday=(1, 3),
1125                              byweekday=(TU, TH),
1126                              dtstart=datetime(1997, 9, 2, 9, 0))),
1127                         [datetime(1998, 1, 1, 9, 0),
1128                          datetime(1998, 3, 3, 9, 0),
1129                          datetime(2001, 3, 1, 9, 0)])
1130
1131    def testDailyByYearDay(self):
1132        self.assertEqual(list(rrule(DAILY,
1133                              count=4,
1134                              byyearday=(1, 100, 200, 365),
1135                              dtstart=datetime(1997, 9, 2, 9, 0))),
1136                         [datetime(1997, 12, 31, 9, 0),
1137                          datetime(1998, 1, 1, 9, 0),
1138                          datetime(1998, 4, 10, 9, 0),
1139                          datetime(1998, 7, 19, 9, 0)])
1140
1141    def testDailyByYearDayNeg(self):
1142        self.assertEqual(list(rrule(DAILY,
1143                              count=4,
1144                              byyearday=(-365, -266, -166, -1),
1145                              dtstart=datetime(1997, 9, 2, 9, 0))),
1146                         [datetime(1997, 12, 31, 9, 0),
1147                          datetime(1998, 1, 1, 9, 0),
1148                          datetime(1998, 4, 10, 9, 0),
1149                          datetime(1998, 7, 19, 9, 0)])
1150
1151    def testDailyByMonthAndYearDay(self):
1152        self.assertEqual(list(rrule(DAILY,
1153                              count=4,
1154                              bymonth=(1, 7),
1155                              byyearday=(1, 100, 200, 365),
1156                              dtstart=datetime(1997, 9, 2, 9, 0))),
1157                         [datetime(1998, 1, 1, 9, 0),
1158                          datetime(1998, 7, 19, 9, 0),
1159                          datetime(1999, 1, 1, 9, 0),
1160                          datetime(1999, 7, 19, 9, 0)])
1161
1162    def testDailyByMonthAndYearDayNeg(self):
1163        self.assertEqual(list(rrule(DAILY,
1164                              count=4,
1165                              bymonth=(1, 7),
1166                              byyearday=(-365, -266, -166, -1),
1167                              dtstart=datetime(1997, 9, 2, 9, 0))),
1168                         [datetime(1998, 1, 1, 9, 0),
1169                          datetime(1998, 7, 19, 9, 0),
1170                          datetime(1999, 1, 1, 9, 0),
1171                          datetime(1999, 7, 19, 9, 0)])
1172
1173    def testDailyByWeekNo(self):
1174        self.assertEqual(list(rrule(DAILY,
1175                              count=3,
1176                              byweekno=20,
1177                              dtstart=datetime(1997, 9, 2, 9, 0))),
1178                         [datetime(1998, 5, 11, 9, 0),
1179                          datetime(1998, 5, 12, 9, 0),
1180                          datetime(1998, 5, 13, 9, 0)])
1181
1182    def testDailyByWeekNoAndWeekDay(self):
1183        # That's a nice one. The first days of week number one
1184        # may be in the last year.
1185        self.assertEqual(list(rrule(DAILY,
1186                              count=3,
1187                              byweekno=1,
1188                              byweekday=MO,
1189                              dtstart=datetime(1997, 9, 2, 9, 0))),
1190                         [datetime(1997, 12, 29, 9, 0),
1191                          datetime(1999, 1, 4, 9, 0),
1192                          datetime(2000, 1, 3, 9, 0)])
1193
1194    def testDailyByWeekNoAndWeekDayLarge(self):
1195        # Another nice test. The last days of week number 52/53
1196        # may be in the next year.
1197        self.assertEqual(list(rrule(DAILY,
1198                              count=3,
1199                              byweekno=52,
1200                              byweekday=SU,
1201                              dtstart=datetime(1997, 9, 2, 9, 0))),
1202                         [datetime(1997, 12, 28, 9, 0),
1203                          datetime(1998, 12, 27, 9, 0),
1204                          datetime(2000, 1, 2, 9, 0)])
1205
1206    def testDailyByWeekNoAndWeekDayLast(self):
1207        self.assertEqual(list(rrule(DAILY,
1208                              count=3,
1209                              byweekno=-1,
1210                              byweekday=SU,
1211                              dtstart=datetime(1997, 9, 2, 9, 0))),
1212                         [datetime(1997, 12, 28, 9, 0),
1213                          datetime(1999, 1, 3, 9, 0),
1214                          datetime(2000, 1, 2, 9, 0)])
1215
1216    def testDailyByWeekNoAndWeekDay53(self):
1217        self.assertEqual(list(rrule(DAILY,
1218                              count=3,
1219                              byweekno=53,
1220                              byweekday=MO,
1221                              dtstart=datetime(1997, 9, 2, 9, 0))),
1222                         [datetime(1998, 12, 28, 9, 0),
1223                          datetime(2004, 12, 27, 9, 0),
1224                          datetime(2009, 12, 28, 9, 0)])
1225
1226    def testDailyByEaster(self):
1227        self.assertEqual(list(rrule(DAILY,
1228                              count=3,
1229                              byeaster=0,
1230                              dtstart=datetime(1997, 9, 2, 9, 0))),
1231                         [datetime(1998, 4, 12, 9, 0),
1232                          datetime(1999, 4, 4, 9, 0),
1233                          datetime(2000, 4, 23, 9, 0)])
1234
1235    def testDailyByEasterPos(self):
1236        self.assertEqual(list(rrule(DAILY,
1237                              count=3,
1238                              byeaster=1,
1239                              dtstart=datetime(1997, 9, 2, 9, 0))),
1240                         [datetime(1998, 4, 13, 9, 0),
1241                          datetime(1999, 4, 5, 9, 0),
1242                          datetime(2000, 4, 24, 9, 0)])
1243
1244    def testDailyByEasterNeg(self):
1245        self.assertEqual(list(rrule(DAILY,
1246                              count=3,
1247                              byeaster=-1,
1248                              dtstart=datetime(1997, 9, 2, 9, 0))),
1249                         [datetime(1998, 4, 11, 9, 0),
1250                          datetime(1999, 4, 3, 9, 0),
1251                          datetime(2000, 4, 22, 9, 0)])
1252
1253    def testDailyByHour(self):
1254        self.assertEqual(list(rrule(DAILY,
1255                              count=3,
1256                              byhour=(6, 18),
1257                              dtstart=datetime(1997, 9, 2, 9, 0))),
1258                         [datetime(1997, 9, 2, 18, 0),
1259                          datetime(1997, 9, 3, 6, 0),
1260                          datetime(1997, 9, 3, 18, 0)])
1261
1262    def testDailyByMinute(self):
1263        self.assertEqual(list(rrule(DAILY,
1264                              count=3,
1265                              byminute=(6, 18),
1266                              dtstart=datetime(1997, 9, 2, 9, 0))),
1267                         [datetime(1997, 9, 2, 9, 6),
1268                          datetime(1997, 9, 2, 9, 18),
1269                          datetime(1997, 9, 3, 9, 6)])
1270
1271    def testDailyBySecond(self):
1272        self.assertEqual(list(rrule(DAILY,
1273                              count=3,
1274                              bysecond=(6, 18),
1275                              dtstart=datetime(1997, 9, 2, 9, 0))),
1276                         [datetime(1997, 9, 2, 9, 0, 6),
1277                          datetime(1997, 9, 2, 9, 0, 18),
1278                          datetime(1997, 9, 3, 9, 0, 6)])
1279
1280    def testDailyByHourAndMinute(self):
1281        self.assertEqual(list(rrule(DAILY,
1282                              count=3,
1283                              byhour=(6, 18),
1284                              byminute=(6, 18),
1285                              dtstart=datetime(1997, 9, 2, 9, 0))),
1286                         [datetime(1997, 9, 2, 18, 6),
1287                          datetime(1997, 9, 2, 18, 18),
1288                          datetime(1997, 9, 3, 6, 6)])
1289
1290    def testDailyByHourAndSecond(self):
1291        self.assertEqual(list(rrule(DAILY,
1292                              count=3,
1293                              byhour=(6, 18),
1294                              bysecond=(6, 18),
1295                              dtstart=datetime(1997, 9, 2, 9, 0))),
1296                         [datetime(1997, 9, 2, 18, 0, 6),
1297                          datetime(1997, 9, 2, 18, 0, 18),
1298                          datetime(1997, 9, 3, 6, 0, 6)])
1299
1300    def testDailyByMinuteAndSecond(self):
1301        self.assertEqual(list(rrule(DAILY,
1302                              count=3,
1303                              byminute=(6, 18),
1304                              bysecond=(6, 18),
1305                              dtstart=datetime(1997, 9, 2, 9, 0))),
1306                         [datetime(1997, 9, 2, 9, 6, 6),
1307                          datetime(1997, 9, 2, 9, 6, 18),
1308                          datetime(1997, 9, 2, 9, 18, 6)])
1309
1310    def testDailyByHourAndMinuteAndSecond(self):
1311        self.assertEqual(list(rrule(DAILY,
1312                              count=3,
1313                              byhour=(6, 18),
1314                              byminute=(6, 18),
1315                              bysecond=(6, 18),
1316                              dtstart=datetime(1997, 9, 2, 9, 0))),
1317                         [datetime(1997, 9, 2, 18, 6, 6),
1318                          datetime(1997, 9, 2, 18, 6, 18),
1319                          datetime(1997, 9, 2, 18, 18, 6)])
1320
1321    def testDailyBySetPos(self):
1322        self.assertEqual(list(rrule(DAILY,
1323                              count=3,
1324                              byhour=(6, 18),
1325                              byminute=(15, 45),
1326                              bysetpos=(3, -3),
1327                              dtstart=datetime(1997, 9, 2, 9, 0))),
1328                         [datetime(1997, 9, 2, 18, 15),
1329                          datetime(1997, 9, 3, 6, 45),
1330                          datetime(1997, 9, 3, 18, 15)])
1331
1332    def testHourly(self):
1333        self.assertEqual(list(rrule(HOURLY,
1334                              count=3,
1335                              dtstart=datetime(1997, 9, 2, 9, 0))),
1336                         [datetime(1997, 9, 2, 9, 0),
1337                          datetime(1997, 9, 2, 10, 0),
1338                          datetime(1997, 9, 2, 11, 0)])
1339
1340    def testHourlyInterval(self):
1341        self.assertEqual(list(rrule(HOURLY,
1342                              count=3,
1343                              interval=2,
1344                              dtstart=datetime(1997, 9, 2, 9, 0))),
1345                         [datetime(1997, 9, 2, 9, 0),
1346                          datetime(1997, 9, 2, 11, 0),
1347                          datetime(1997, 9, 2, 13, 0)])
1348
1349    def testHourlyIntervalLarge(self):
1350        self.assertEqual(list(rrule(HOURLY,
1351                              count=3,
1352                              interval=769,
1353                              dtstart=datetime(1997, 9, 2, 9, 0))),
1354                         [datetime(1997, 9, 2, 9, 0),
1355                          datetime(1997, 10, 4, 10, 0),
1356                          datetime(1997, 11, 5, 11, 0)])
1357
1358    def testHourlyByMonth(self):
1359        self.assertEqual(list(rrule(HOURLY,
1360                              count=3,
1361                              bymonth=(1, 3),
1362                              dtstart=datetime(1997, 9, 2, 9, 0))),
1363                         [datetime(1998, 1, 1, 0, 0),
1364                          datetime(1998, 1, 1, 1, 0),
1365                          datetime(1998, 1, 1, 2, 0)])
1366
1367    def testHourlyByMonthDay(self):
1368        self.assertEqual(list(rrule(HOURLY,
1369                              count=3,
1370                              bymonthday=(1, 3),
1371                              dtstart=datetime(1997, 9, 2, 9, 0))),
1372                         [datetime(1997, 9, 3, 0, 0),
1373                          datetime(1997, 9, 3, 1, 0),
1374                          datetime(1997, 9, 3, 2, 0)])
1375
1376    def testHourlyByMonthAndMonthDay(self):
1377        self.assertEqual(list(rrule(HOURLY,
1378                              count=3,
1379                              bymonth=(1, 3),
1380                              bymonthday=(5, 7),
1381                              dtstart=datetime(1997, 9, 2, 9, 0))),
1382                         [datetime(1998, 1, 5, 0, 0),
1383                          datetime(1998, 1, 5, 1, 0),
1384                          datetime(1998, 1, 5, 2, 0)])
1385
1386    def testHourlyByWeekDay(self):
1387        self.assertEqual(list(rrule(HOURLY,
1388                              count=3,
1389                              byweekday=(TU, TH),
1390                              dtstart=datetime(1997, 9, 2, 9, 0))),
1391                         [datetime(1997, 9, 2, 9, 0),
1392                          datetime(1997, 9, 2, 10, 0),
1393                          datetime(1997, 9, 2, 11, 0)])
1394
1395    def testHourlyByNWeekDay(self):
1396        self.assertEqual(list(rrule(HOURLY,
1397                              count=3,
1398                              byweekday=(TU(1), TH(-1)),
1399                              dtstart=datetime(1997, 9, 2, 9, 0))),
1400                         [datetime(1997, 9, 2, 9, 0),
1401                          datetime(1997, 9, 2, 10, 0),
1402                          datetime(1997, 9, 2, 11, 0)])
1403
1404    def testHourlyByMonthAndWeekDay(self):
1405        self.assertEqual(list(rrule(HOURLY,
1406                              count=3,
1407                              bymonth=(1, 3),
1408                              byweekday=(TU, TH),
1409                              dtstart=datetime(1997, 9, 2, 9, 0))),
1410                         [datetime(1998, 1, 1, 0, 0),
1411                          datetime(1998, 1, 1, 1, 0),
1412                          datetime(1998, 1, 1, 2, 0)])
1413
1414    def testHourlyByMonthAndNWeekDay(self):
1415        self.assertEqual(list(rrule(HOURLY,
1416                              count=3,
1417                              bymonth=(1, 3),
1418                              byweekday=(TU(1), TH(-1)),
1419                              dtstart=datetime(1997, 9, 2, 9, 0))),
1420                         [datetime(1998, 1, 1, 0, 0),
1421                          datetime(1998, 1, 1, 1, 0),
1422                          datetime(1998, 1, 1, 2, 0)])
1423
1424    def testHourlyByMonthDayAndWeekDay(self):
1425        self.assertEqual(list(rrule(HOURLY,
1426                              count=3,
1427                              bymonthday=(1, 3),
1428                              byweekday=(TU, TH),
1429                              dtstart=datetime(1997, 9, 2, 9, 0))),
1430                         [datetime(1998, 1, 1, 0, 0),
1431                          datetime(1998, 1, 1, 1, 0),
1432                          datetime(1998, 1, 1, 2, 0)])
1433
1434    def testHourlyByMonthAndMonthDayAndWeekDay(self):
1435        self.assertEqual(list(rrule(HOURLY,
1436                              count=3,
1437                              bymonth=(1, 3),
1438                              bymonthday=(1, 3),
1439                              byweekday=(TU, TH),
1440                              dtstart=datetime(1997, 9, 2, 9, 0))),
1441                         [datetime(1998, 1, 1, 0, 0),
1442                          datetime(1998, 1, 1, 1, 0),
1443                          datetime(1998, 1, 1, 2, 0)])
1444
1445    def testHourlyByYearDay(self):
1446        self.assertEqual(list(rrule(HOURLY,
1447                              count=4,
1448                              byyearday=(1, 100, 200, 365),
1449                              dtstart=datetime(1997, 9, 2, 9, 0))),
1450                         [datetime(1997, 12, 31, 0, 0),
1451                          datetime(1997, 12, 31, 1, 0),
1452                          datetime(1997, 12, 31, 2, 0),
1453                          datetime(1997, 12, 31, 3, 0)])
1454
1455    def testHourlyByYearDayNeg(self):
1456        self.assertEqual(list(rrule(HOURLY,
1457                              count=4,
1458                              byyearday=(-365, -266, -166, -1),
1459                              dtstart=datetime(1997, 9, 2, 9, 0))),
1460                         [datetime(1997, 12, 31, 0, 0),
1461                          datetime(1997, 12, 31, 1, 0),
1462                          datetime(1997, 12, 31, 2, 0),
1463                          datetime(1997, 12, 31, 3, 0)])
1464
1465    def testHourlyByMonthAndYearDay(self):
1466        self.assertEqual(list(rrule(HOURLY,
1467                              count=4,
1468                              bymonth=(4, 7),
1469                              byyearday=(1, 100, 200, 365),
1470                              dtstart=datetime(1997, 9, 2, 9, 0))),
1471                         [datetime(1998, 4, 10, 0, 0),
1472                          datetime(1998, 4, 10, 1, 0),
1473                          datetime(1998, 4, 10, 2, 0),
1474                          datetime(1998, 4, 10, 3, 0)])
1475
1476    def testHourlyByMonthAndYearDayNeg(self):
1477        self.assertEqual(list(rrule(HOURLY,
1478                              count=4,
1479                              bymonth=(4, 7),
1480                              byyearday=(-365, -266, -166, -1),
1481                              dtstart=datetime(1997, 9, 2, 9, 0))),
1482                         [datetime(1998, 4, 10, 0, 0),
1483                          datetime(1998, 4, 10, 1, 0),
1484                          datetime(1998, 4, 10, 2, 0),
1485                          datetime(1998, 4, 10, 3, 0)])
1486
1487    def testHourlyByWeekNo(self):
1488        self.assertEqual(list(rrule(HOURLY,
1489                              count=3,
1490                              byweekno=20,
1491                              dtstart=datetime(1997, 9, 2, 9, 0))),
1492                         [datetime(1998, 5, 11, 0, 0),
1493                          datetime(1998, 5, 11, 1, 0),
1494                          datetime(1998, 5, 11, 2, 0)])
1495
1496    def testHourlyByWeekNoAndWeekDay(self):
1497        self.assertEqual(list(rrule(HOURLY,
1498                              count=3,
1499                              byweekno=1,
1500                              byweekday=MO,
1501                              dtstart=datetime(1997, 9, 2, 9, 0))),
1502                         [datetime(1997, 12, 29, 0, 0),
1503                          datetime(1997, 12, 29, 1, 0),
1504                          datetime(1997, 12, 29, 2, 0)])
1505
1506    def testHourlyByWeekNoAndWeekDayLarge(self):
1507        self.assertEqual(list(rrule(HOURLY,
1508                              count=3,
1509                              byweekno=52,
1510                              byweekday=SU,
1511                              dtstart=datetime(1997, 9, 2, 9, 0))),
1512                         [datetime(1997, 12, 28, 0, 0),
1513                          datetime(1997, 12, 28, 1, 0),
1514                          datetime(1997, 12, 28, 2, 0)])
1515
1516    def testHourlyByWeekNoAndWeekDayLast(self):
1517        self.assertEqual(list(rrule(HOURLY,
1518                              count=3,
1519                              byweekno=-1,
1520                              byweekday=SU,
1521                              dtstart=datetime(1997, 9, 2, 9, 0))),
1522                         [datetime(1997, 12, 28, 0, 0),
1523                          datetime(1997, 12, 28, 1, 0),
1524                          datetime(1997, 12, 28, 2, 0)])
1525
1526    def testHourlyByWeekNoAndWeekDay53(self):
1527        self.assertEqual(list(rrule(HOURLY,
1528                              count=3,
1529                              byweekno=53,
1530                              byweekday=MO,
1531                              dtstart=datetime(1997, 9, 2, 9, 0))),
1532                         [datetime(1998, 12, 28, 0, 0),
1533                          datetime(1998, 12, 28, 1, 0),
1534                          datetime(1998, 12, 28, 2, 0)])
1535
1536    def testHourlyByEaster(self):
1537        self.assertEqual(list(rrule(HOURLY,
1538                              count=3,
1539                              byeaster=0,
1540                              dtstart=datetime(1997, 9, 2, 9, 0))),
1541                         [datetime(1998, 4, 12, 0, 0),
1542                          datetime(1998, 4, 12, 1, 0),
1543                          datetime(1998, 4, 12, 2, 0)])
1544
1545    def testHourlyByEasterPos(self):
1546        self.assertEqual(list(rrule(HOURLY,
1547                              count=3,
1548                              byeaster=1,
1549                              dtstart=datetime(1997, 9, 2, 9, 0))),
1550                         [datetime(1998, 4, 13, 0, 0),
1551                          datetime(1998, 4, 13, 1, 0),
1552                          datetime(1998, 4, 13, 2, 0)])
1553
1554    def testHourlyByEasterNeg(self):
1555        self.assertEqual(list(rrule(HOURLY,
1556                              count=3,
1557                              byeaster=-1,
1558                              dtstart=datetime(1997, 9, 2, 9, 0))),
1559                         [datetime(1998, 4, 11, 0, 0),
1560                          datetime(1998, 4, 11, 1, 0),
1561                          datetime(1998, 4, 11, 2, 0)])
1562
1563    def testHourlyByHour(self):
1564        self.assertEqual(list(rrule(HOURLY,
1565                              count=3,
1566                              byhour=(6, 18),
1567                              dtstart=datetime(1997, 9, 2, 9, 0))),
1568                         [datetime(1997, 9, 2, 18, 0),
1569                          datetime(1997, 9, 3, 6, 0),
1570                          datetime(1997, 9, 3, 18, 0)])
1571
1572    def testHourlyByMinute(self):
1573        self.assertEqual(list(rrule(HOURLY,
1574                              count=3,
1575                              byminute=(6, 18),
1576                              dtstart=datetime(1997, 9, 2, 9, 0))),
1577                         [datetime(1997, 9, 2, 9, 6),
1578                          datetime(1997, 9, 2, 9, 18),
1579                          datetime(1997, 9, 2, 10, 6)])
1580
1581    def testHourlyBySecond(self):
1582        self.assertEqual(list(rrule(HOURLY,
1583                              count=3,
1584                              bysecond=(6, 18),
1585                              dtstart=datetime(1997, 9, 2, 9, 0))),
1586                         [datetime(1997, 9, 2, 9, 0, 6),
1587                          datetime(1997, 9, 2, 9, 0, 18),
1588                          datetime(1997, 9, 2, 10, 0, 6)])
1589
1590    def testHourlyByHourAndMinute(self):
1591        self.assertEqual(list(rrule(HOURLY,
1592                              count=3,
1593                              byhour=(6, 18),
1594                              byminute=(6, 18),
1595                              dtstart=datetime(1997, 9, 2, 9, 0))),
1596                         [datetime(1997, 9, 2, 18, 6),
1597                          datetime(1997, 9, 2, 18, 18),
1598                          datetime(1997, 9, 3, 6, 6)])
1599
1600    def testHourlyByHourAndSecond(self):
1601        self.assertEqual(list(rrule(HOURLY,
1602                              count=3,
1603                              byhour=(6, 18),
1604                              bysecond=(6, 18),
1605                              dtstart=datetime(1997, 9, 2, 9, 0))),
1606                         [datetime(1997, 9, 2, 18, 0, 6),
1607                          datetime(1997, 9, 2, 18, 0, 18),
1608                          datetime(1997, 9, 3, 6, 0, 6)])
1609
1610    def testHourlyByMinuteAndSecond(self):
1611        self.assertEqual(list(rrule(HOURLY,
1612                              count=3,
1613                              byminute=(6, 18),
1614                              bysecond=(6, 18),
1615                              dtstart=datetime(1997, 9, 2, 9, 0))),
1616                         [datetime(1997, 9, 2, 9, 6, 6),
1617                          datetime(1997, 9, 2, 9, 6, 18),
1618                          datetime(1997, 9, 2, 9, 18, 6)])
1619
1620    def testHourlyByHourAndMinuteAndSecond(self):
1621        self.assertEqual(list(rrule(HOURLY,
1622                              count=3,
1623                              byhour=(6, 18),
1624                              byminute=(6, 18),
1625                              bysecond=(6, 18),
1626                              dtstart=datetime(1997, 9, 2, 9, 0))),
1627                         [datetime(1997, 9, 2, 18, 6, 6),
1628                          datetime(1997, 9, 2, 18, 6, 18),
1629                          datetime(1997, 9, 2, 18, 18, 6)])
1630
1631    def testHourlyBySetPos(self):
1632        self.assertEqual(list(rrule(HOURLY,
1633                              count=3,
1634                              byminute=(15, 45),
1635                              bysecond=(15, 45),
1636                              bysetpos=(3, -3),
1637                              dtstart=datetime(1997, 9, 2, 9, 0))),
1638                         [datetime(1997, 9, 2, 9, 15, 45),
1639                          datetime(1997, 9, 2, 9, 45, 15),
1640                          datetime(1997, 9, 2, 10, 15, 45)])
1641
1642    def testMinutely(self):
1643        self.assertEqual(list(rrule(MINUTELY,
1644                              count=3,
1645                              dtstart=datetime(1997, 9, 2, 9, 0))),
1646                         [datetime(1997, 9, 2, 9, 0),
1647                          datetime(1997, 9, 2, 9, 1),
1648                          datetime(1997, 9, 2, 9, 2)])
1649
1650    def testMinutelyInterval(self):
1651        self.assertEqual(list(rrule(MINUTELY,
1652                              count=3,
1653                              interval=2,
1654                              dtstart=datetime(1997, 9, 2, 9, 0))),
1655                         [datetime(1997, 9, 2, 9, 0),
1656                          datetime(1997, 9, 2, 9, 2),
1657                          datetime(1997, 9, 2, 9, 4)])
1658
1659    def testMinutelyIntervalLarge(self):
1660        self.assertEqual(list(rrule(MINUTELY,
1661                              count=3,
1662                              interval=1501,
1663                              dtstart=datetime(1997, 9, 2, 9, 0))),
1664                         [datetime(1997, 9, 2, 9, 0),
1665                          datetime(1997, 9, 3, 10, 1),
1666                          datetime(1997, 9, 4, 11, 2)])
1667
1668    def testMinutelyByMonth(self):
1669        self.assertEqual(list(rrule(MINUTELY,
1670                              count=3,
1671                              bymonth=(1, 3),
1672                              dtstart=datetime(1997, 9, 2, 9, 0))),
1673                         [datetime(1998, 1, 1, 0, 0),
1674                          datetime(1998, 1, 1, 0, 1),
1675                          datetime(1998, 1, 1, 0, 2)])
1676
1677    def testMinutelyByMonthDay(self):
1678        self.assertEqual(list(rrule(MINUTELY,
1679                              count=3,
1680                              bymonthday=(1, 3),
1681                              dtstart=datetime(1997, 9, 2, 9, 0))),
1682                         [datetime(1997, 9, 3, 0, 0),
1683                          datetime(1997, 9, 3, 0, 1),
1684                          datetime(1997, 9, 3, 0, 2)])
1685
1686    def testMinutelyByMonthAndMonthDay(self):
1687        self.assertEqual(list(rrule(MINUTELY,
1688                              count=3,
1689                              bymonth=(1, 3),
1690                              bymonthday=(5, 7),
1691                              dtstart=datetime(1997, 9, 2, 9, 0))),
1692                         [datetime(1998, 1, 5, 0, 0),
1693                          datetime(1998, 1, 5, 0, 1),
1694                          datetime(1998, 1, 5, 0, 2)])
1695
1696    def testMinutelyByWeekDay(self):
1697        self.assertEqual(list(rrule(MINUTELY,
1698                              count=3,
1699                              byweekday=(TU, TH),
1700                              dtstart=datetime(1997, 9, 2, 9, 0))),
1701                         [datetime(1997, 9, 2, 9, 0),
1702                          datetime(1997, 9, 2, 9, 1),
1703                          datetime(1997, 9, 2, 9, 2)])
1704
1705    def testMinutelyByNWeekDay(self):
1706        self.assertEqual(list(rrule(MINUTELY,
1707                              count=3,
1708                              byweekday=(TU(1), TH(-1)),
1709                              dtstart=datetime(1997, 9, 2, 9, 0))),
1710                         [datetime(1997, 9, 2, 9, 0),
1711                          datetime(1997, 9, 2, 9, 1),
1712                          datetime(1997, 9, 2, 9, 2)])
1713
1714    def testMinutelyByMonthAndWeekDay(self):
1715        self.assertEqual(list(rrule(MINUTELY,
1716                              count=3,
1717                              bymonth=(1, 3),
1718                              byweekday=(TU, TH),
1719                              dtstart=datetime(1997, 9, 2, 9, 0))),
1720                         [datetime(1998, 1, 1, 0, 0),
1721                          datetime(1998, 1, 1, 0, 1),
1722                          datetime(1998, 1, 1, 0, 2)])
1723
1724    def testMinutelyByMonthAndNWeekDay(self):
1725        self.assertEqual(list(rrule(MINUTELY,
1726                              count=3,
1727                              bymonth=(1, 3),
1728                              byweekday=(TU(1), TH(-1)),
1729                              dtstart=datetime(1997, 9, 2, 9, 0))),
1730                         [datetime(1998, 1, 1, 0, 0),
1731                          datetime(1998, 1, 1, 0, 1),
1732                          datetime(1998, 1, 1, 0, 2)])
1733
1734    def testMinutelyByMonthDayAndWeekDay(self):
1735        self.assertEqual(list(rrule(MINUTELY,
1736                              count=3,
1737                              bymonthday=(1, 3),
1738                              byweekday=(TU, TH),
1739                              dtstart=datetime(1997, 9, 2, 9, 0))),
1740                         [datetime(1998, 1, 1, 0, 0),
1741                          datetime(1998, 1, 1, 0, 1),
1742                          datetime(1998, 1, 1, 0, 2)])
1743
1744    def testMinutelyByMonthAndMonthDayAndWeekDay(self):
1745        self.assertEqual(list(rrule(MINUTELY,
1746                              count=3,
1747                              bymonth=(1, 3),
1748                              bymonthday=(1, 3),
1749                              byweekday=(TU, TH),
1750                              dtstart=datetime(1997, 9, 2, 9, 0))),
1751                         [datetime(1998, 1, 1, 0, 0),
1752                          datetime(1998, 1, 1, 0, 1),
1753                          datetime(1998, 1, 1, 0, 2)])
1754
1755    def testMinutelyByYearDay(self):
1756        self.assertEqual(list(rrule(MINUTELY,
1757                              count=4,
1758                              byyearday=(1, 100, 200, 365),
1759                              dtstart=datetime(1997, 9, 2, 9, 0))),
1760                         [datetime(1997, 12, 31, 0, 0),
1761                          datetime(1997, 12, 31, 0, 1),
1762                          datetime(1997, 12, 31, 0, 2),
1763                          datetime(1997, 12, 31, 0, 3)])
1764
1765    def testMinutelyByYearDayNeg(self):
1766        self.assertEqual(list(rrule(MINUTELY,
1767                              count=4,
1768                              byyearday=(-365, -266, -166, -1),
1769                              dtstart=datetime(1997, 9, 2, 9, 0))),
1770                         [datetime(1997, 12, 31, 0, 0),
1771                          datetime(1997, 12, 31, 0, 1),
1772                          datetime(1997, 12, 31, 0, 2),
1773                          datetime(1997, 12, 31, 0, 3)])
1774
1775    def testMinutelyByMonthAndYearDay(self):
1776        self.assertEqual(list(rrule(MINUTELY,
1777                              count=4,
1778                              bymonth=(4, 7),
1779                              byyearday=(1, 100, 200, 365),
1780                              dtstart=datetime(1997, 9, 2, 9, 0))),
1781                         [datetime(1998, 4, 10, 0, 0),
1782                          datetime(1998, 4, 10, 0, 1),
1783                          datetime(1998, 4, 10, 0, 2),
1784                          datetime(1998, 4, 10, 0, 3)])
1785
1786    def testMinutelyByMonthAndYearDayNeg(self):
1787        self.assertEqual(list(rrule(MINUTELY,
1788                              count=4,
1789                              bymonth=(4, 7),
1790                              byyearday=(-365, -266, -166, -1),
1791                              dtstart=datetime(1997, 9, 2, 9, 0))),
1792                         [datetime(1998, 4, 10, 0, 0),
1793                          datetime(1998, 4, 10, 0, 1),
1794                          datetime(1998, 4, 10, 0, 2),
1795                          datetime(1998, 4, 10, 0, 3)])
1796
1797    def testMinutelyByWeekNo(self):
1798        self.assertEqual(list(rrule(MINUTELY,
1799                              count=3,
1800                              byweekno=20,
1801                              dtstart=datetime(1997, 9, 2, 9, 0))),
1802                         [datetime(1998, 5, 11, 0, 0),
1803                          datetime(1998, 5, 11, 0, 1),
1804                          datetime(1998, 5, 11, 0, 2)])
1805
1806    def testMinutelyByWeekNoAndWeekDay(self):
1807        self.assertEqual(list(rrule(MINUTELY,
1808                              count=3,
1809                              byweekno=1,
1810                              byweekday=MO,
1811                              dtstart=datetime(1997, 9, 2, 9, 0))),
1812                         [datetime(1997, 12, 29, 0, 0),
1813                          datetime(1997, 12, 29, 0, 1),
1814                          datetime(1997, 12, 29, 0, 2)])
1815
1816    def testMinutelyByWeekNoAndWeekDayLarge(self):
1817        self.assertEqual(list(rrule(MINUTELY,
1818                              count=3,
1819                              byweekno=52,
1820                              byweekday=SU,
1821                              dtstart=datetime(1997, 9, 2, 9, 0))),
1822                         [datetime(1997, 12, 28, 0, 0),
1823                          datetime(1997, 12, 28, 0, 1),
1824                          datetime(1997, 12, 28, 0, 2)])
1825
1826    def testMinutelyByWeekNoAndWeekDayLast(self):
1827        self.assertEqual(list(rrule(MINUTELY,
1828                              count=3,
1829                              byweekno=-1,
1830                              byweekday=SU,
1831                              dtstart=datetime(1997, 9, 2, 9, 0))),
1832                         [datetime(1997, 12, 28, 0, 0),
1833                          datetime(1997, 12, 28, 0, 1),
1834                          datetime(1997, 12, 28, 0, 2)])
1835
1836    def testMinutelyByWeekNoAndWeekDay53(self):
1837        self.assertEqual(list(rrule(MINUTELY,
1838                              count=3,
1839                              byweekno=53,
1840                              byweekday=MO,
1841                              dtstart=datetime(1997, 9, 2, 9, 0))),
1842                         [datetime(1998, 12, 28, 0, 0),
1843                          datetime(1998, 12, 28, 0, 1),
1844                          datetime(1998, 12, 28, 0, 2)])
1845
1846    def testMinutelyByEaster(self):
1847        self.assertEqual(list(rrule(MINUTELY,
1848                              count=3,
1849                              byeaster=0,
1850                              dtstart=datetime(1997, 9, 2, 9, 0))),
1851                         [datetime(1998, 4, 12, 0, 0),
1852                          datetime(1998, 4, 12, 0, 1),
1853                          datetime(1998, 4, 12, 0, 2)])
1854
1855    def testMinutelyByEasterPos(self):
1856        self.assertEqual(list(rrule(MINUTELY,
1857                              count=3,
1858                              byeaster=1,
1859                              dtstart=datetime(1997, 9, 2, 9, 0))),
1860                         [datetime(1998, 4, 13, 0, 0),
1861                          datetime(1998, 4, 13, 0, 1),
1862                          datetime(1998, 4, 13, 0, 2)])
1863
1864    def testMinutelyByEasterNeg(self):
1865        self.assertEqual(list(rrule(MINUTELY,
1866                              count=3,
1867                              byeaster=-1,
1868                              dtstart=datetime(1997, 9, 2, 9, 0))),
1869                         [datetime(1998, 4, 11, 0, 0),
1870                          datetime(1998, 4, 11, 0, 1),
1871                          datetime(1998, 4, 11, 0, 2)])
1872
1873    def testMinutelyByHour(self):
1874        self.assertEqual(list(rrule(MINUTELY,
1875                              count=3,
1876                              byhour=(6, 18),
1877                              dtstart=datetime(1997, 9, 2, 9, 0))),
1878                         [datetime(1997, 9, 2, 18, 0),
1879                          datetime(1997, 9, 2, 18, 1),
1880                          datetime(1997, 9, 2, 18, 2)])
1881
1882    def testMinutelyByMinute(self):
1883        self.assertEqual(list(rrule(MINUTELY,
1884                              count=3,
1885                              byminute=(6, 18),
1886                              dtstart=datetime(1997, 9, 2, 9, 0))),
1887                         [datetime(1997, 9, 2, 9, 6),
1888                          datetime(1997, 9, 2, 9, 18),
1889                          datetime(1997, 9, 2, 10, 6)])
1890
1891    def testMinutelyBySecond(self):
1892        self.assertEqual(list(rrule(MINUTELY,
1893                              count=3,
1894                              bysecond=(6, 18),
1895                              dtstart=datetime(1997, 9, 2, 9, 0))),
1896                         [datetime(1997, 9, 2, 9, 0, 6),
1897                          datetime(1997, 9, 2, 9, 0, 18),
1898                          datetime(1997, 9, 2, 9, 1, 6)])
1899
1900    def testMinutelyByHourAndMinute(self):
1901        self.assertEqual(list(rrule(MINUTELY,
1902                              count=3,
1903                              byhour=(6, 18),
1904                              byminute=(6, 18),
1905                              dtstart=datetime(1997, 9, 2, 9, 0))),
1906                         [datetime(1997, 9, 2, 18, 6),
1907                          datetime(1997, 9, 2, 18, 18),
1908                          datetime(1997, 9, 3, 6, 6)])
1909
1910    def testMinutelyByHourAndSecond(self):
1911        self.assertEqual(list(rrule(MINUTELY,
1912                              count=3,
1913                              byhour=(6, 18),
1914                              bysecond=(6, 18),
1915                              dtstart=datetime(1997, 9, 2, 9, 0))),
1916                         [datetime(1997, 9, 2, 18, 0, 6),
1917                          datetime(1997, 9, 2, 18, 0, 18),
1918                          datetime(1997, 9, 2, 18, 1, 6)])
1919
1920    def testMinutelyByMinuteAndSecond(self):
1921        self.assertEqual(list(rrule(MINUTELY,
1922                              count=3,
1923                              byminute=(6, 18),
1924                              bysecond=(6, 18),
1925                              dtstart=datetime(1997, 9, 2, 9, 0))),
1926                         [datetime(1997, 9, 2, 9, 6, 6),
1927                          datetime(1997, 9, 2, 9, 6, 18),
1928                          datetime(1997, 9, 2, 9, 18, 6)])
1929
1930    def testMinutelyByHourAndMinuteAndSecond(self):
1931        self.assertEqual(list(rrule(MINUTELY,
1932                              count=3,
1933                              byhour=(6, 18),
1934                              byminute=(6, 18),
1935                              bysecond=(6, 18),
1936                              dtstart=datetime(1997, 9, 2, 9, 0))),
1937                         [datetime(1997, 9, 2, 18, 6, 6),
1938                          datetime(1997, 9, 2, 18, 6, 18),
1939                          datetime(1997, 9, 2, 18, 18, 6)])
1940
1941    def testMinutelyBySetPos(self):
1942        self.assertEqual(list(rrule(MINUTELY,
1943                              count=3,
1944                              bysecond=(15, 30, 45),
1945                              bysetpos=(3, -3),
1946                              dtstart=datetime(1997, 9, 2, 9, 0))),
1947                         [datetime(1997, 9, 2, 9, 0, 15),
1948                          datetime(1997, 9, 2, 9, 0, 45),
1949                          datetime(1997, 9, 2, 9, 1, 15)])
1950
1951    def testSecondly(self):
1952        self.assertEqual(list(rrule(SECONDLY,
1953                              count=3,
1954                              dtstart=datetime(1997, 9, 2, 9, 0))),
1955                         [datetime(1997, 9, 2, 9, 0, 0),
1956                          datetime(1997, 9, 2, 9, 0, 1),
1957                          datetime(1997, 9, 2, 9, 0, 2)])
1958
1959    def testSecondlyInterval(self):
1960        self.assertEqual(list(rrule(SECONDLY,
1961                              count=3,
1962                              interval=2,
1963                              dtstart=datetime(1997, 9, 2, 9, 0))),
1964                         [datetime(1997, 9, 2, 9, 0, 0),
1965                          datetime(1997, 9, 2, 9, 0, 2),
1966                          datetime(1997, 9, 2, 9, 0, 4)])
1967
1968    def testSecondlyIntervalLarge(self):
1969        self.assertEqual(list(rrule(SECONDLY,
1970                              count=3,
1971                              interval=90061,
1972                              dtstart=datetime(1997, 9, 2, 9, 0))),
1973                         [datetime(1997, 9, 2, 9, 0, 0),
1974                          datetime(1997, 9, 3, 10, 1, 1),
1975                          datetime(1997, 9, 4, 11, 2, 2)])
1976
1977    def testSecondlyByMonth(self):
1978        self.assertEqual(list(rrule(SECONDLY,
1979                              count=3,
1980                              bymonth=(1, 3),
1981                              dtstart=datetime(1997, 9, 2, 9, 0))),
1982                         [datetime(1998, 1, 1, 0, 0, 0),
1983                          datetime(1998, 1, 1, 0, 0, 1),
1984                          datetime(1998, 1, 1, 0, 0, 2)])
1985
1986    def testSecondlyByMonthDay(self):
1987        self.assertEqual(list(rrule(SECONDLY,
1988                              count=3,
1989                              bymonthday=(1, 3),
1990                              dtstart=datetime(1997, 9, 2, 9, 0))),
1991                         [datetime(1997, 9, 3, 0, 0, 0),
1992                          datetime(1997, 9, 3, 0, 0, 1),
1993                          datetime(1997, 9, 3, 0, 0, 2)])
1994
1995    def testSecondlyByMonthAndMonthDay(self):
1996        self.assertEqual(list(rrule(SECONDLY,
1997                              count=3,
1998                              bymonth=(1, 3),
1999                              bymonthday=(5, 7),
2000                              dtstart=datetime(1997, 9, 2, 9, 0))),
2001                         [datetime(1998, 1, 5, 0, 0, 0),
2002                          datetime(1998, 1, 5, 0, 0, 1),
2003                          datetime(1998, 1, 5, 0, 0, 2)])
2004
2005    def testSecondlyByWeekDay(self):
2006        self.assertEqual(list(rrule(SECONDLY,
2007                              count=3,
2008                              byweekday=(TU, TH),
2009                              dtstart=datetime(1997, 9, 2, 9, 0))),
2010                         [datetime(1997, 9, 2, 9, 0, 0),
2011                          datetime(1997, 9, 2, 9, 0, 1),
2012                          datetime(1997, 9, 2, 9, 0, 2)])
2013
2014    def testSecondlyByNWeekDay(self):
2015        self.assertEqual(list(rrule(SECONDLY,
2016                              count=3,
2017                              byweekday=(TU(1), TH(-1)),
2018                              dtstart=datetime(1997, 9, 2, 9, 0))),
2019                         [datetime(1997, 9, 2, 9, 0, 0),
2020                          datetime(1997, 9, 2, 9, 0, 1),
2021                          datetime(1997, 9, 2, 9, 0, 2)])
2022
2023    def testSecondlyByMonthAndWeekDay(self):
2024        self.assertEqual(list(rrule(SECONDLY,
2025                              count=3,
2026                              bymonth=(1, 3),
2027                              byweekday=(TU, TH),
2028                              dtstart=datetime(1997, 9, 2, 9, 0))),
2029                         [datetime(1998, 1, 1, 0, 0, 0),
2030                          datetime(1998, 1, 1, 0, 0, 1),
2031                          datetime(1998, 1, 1, 0, 0, 2)])
2032
2033    def testSecondlyByMonthAndNWeekDay(self):
2034        self.assertEqual(list(rrule(SECONDLY,
2035                              count=3,
2036                              bymonth=(1, 3),
2037                              byweekday=(TU(1), TH(-1)),
2038                              dtstart=datetime(1997, 9, 2, 9, 0))),
2039                         [datetime(1998, 1, 1, 0, 0, 0),
2040                          datetime(1998, 1, 1, 0, 0, 1),
2041                          datetime(1998, 1, 1, 0, 0, 2)])
2042
2043    def testSecondlyByMonthDayAndWeekDay(self):
2044        self.assertEqual(list(rrule(SECONDLY,
2045                              count=3,
2046                              bymonthday=(1, 3),
2047                              byweekday=(TU, TH),
2048                              dtstart=datetime(1997, 9, 2, 9, 0))),
2049                         [datetime(1998, 1, 1, 0, 0, 0),
2050                          datetime(1998, 1, 1, 0, 0, 1),
2051                          datetime(1998, 1, 1, 0, 0, 2)])
2052
2053    def testSecondlyByMonthAndMonthDayAndWeekDay(self):
2054        self.assertEqual(list(rrule(SECONDLY,
2055                              count=3,
2056                              bymonth=(1, 3),
2057                              bymonthday=(1, 3),
2058                              byweekday=(TU, TH),
2059                              dtstart=datetime(1997, 9, 2, 9, 0))),
2060                         [datetime(1998, 1, 1, 0, 0, 0),
2061                          datetime(1998, 1, 1, 0, 0, 1),
2062                          datetime(1998, 1, 1, 0, 0, 2)])
2063
2064    def testSecondlyByYearDay(self):
2065        self.assertEqual(list(rrule(SECONDLY,
2066                              count=4,
2067                              byyearday=(1, 100, 200, 365),
2068                              dtstart=datetime(1997, 9, 2, 9, 0))),
2069                         [datetime(1997, 12, 31, 0, 0, 0),
2070                          datetime(1997, 12, 31, 0, 0, 1),
2071                          datetime(1997, 12, 31, 0, 0, 2),
2072                          datetime(1997, 12, 31, 0, 0, 3)])
2073
2074    def testSecondlyByYearDayNeg(self):
2075        self.assertEqual(list(rrule(SECONDLY,
2076                              count=4,
2077                              byyearday=(-365, -266, -166, -1),
2078                              dtstart=datetime(1997, 9, 2, 9, 0))),
2079                         [datetime(1997, 12, 31, 0, 0, 0),
2080                          datetime(1997, 12, 31, 0, 0, 1),
2081                          datetime(1997, 12, 31, 0, 0, 2),
2082                          datetime(1997, 12, 31, 0, 0, 3)])
2083
2084    def testSecondlyByMonthAndYearDay(self):
2085        self.assertEqual(list(rrule(SECONDLY,
2086                              count=4,
2087                              bymonth=(4, 7),
2088                              byyearday=(1, 100, 200, 365),
2089                              dtstart=datetime(1997, 9, 2, 9, 0))),
2090                         [datetime(1998, 4, 10, 0, 0, 0),
2091                          datetime(1998, 4, 10, 0, 0, 1),
2092                          datetime(1998, 4, 10, 0, 0, 2),
2093                          datetime(1998, 4, 10, 0, 0, 3)])
2094
2095    def testSecondlyByMonthAndYearDayNeg(self):
2096        self.assertEqual(list(rrule(SECONDLY,
2097                              count=4,
2098                              bymonth=(4, 7),
2099                              byyearday=(-365, -266, -166, -1),
2100                              dtstart=datetime(1997, 9, 2, 9, 0))),
2101                         [datetime(1998, 4, 10, 0, 0, 0),
2102                          datetime(1998, 4, 10, 0, 0, 1),
2103                          datetime(1998, 4, 10, 0, 0, 2),
2104                          datetime(1998, 4, 10, 0, 0, 3)])
2105
2106    def testSecondlyByWeekNo(self):
2107        self.assertEqual(list(rrule(SECONDLY,
2108                              count=3,
2109                              byweekno=20,
2110                              dtstart=datetime(1997, 9, 2, 9, 0))),
2111                         [datetime(1998, 5, 11, 0, 0, 0),
2112                          datetime(1998, 5, 11, 0, 0, 1),
2113                          datetime(1998, 5, 11, 0, 0, 2)])
2114
2115    def testSecondlyByWeekNoAndWeekDay(self):
2116        self.assertEqual(list(rrule(SECONDLY,
2117                              count=3,
2118                              byweekno=1,
2119                              byweekday=MO,
2120                              dtstart=datetime(1997, 9, 2, 9, 0))),
2121                         [datetime(1997, 12, 29, 0, 0, 0),
2122                          datetime(1997, 12, 29, 0, 0, 1),
2123                          datetime(1997, 12, 29, 0, 0, 2)])
2124
2125    def testSecondlyByWeekNoAndWeekDayLarge(self):
2126        self.assertEqual(list(rrule(SECONDLY,
2127                              count=3,
2128                              byweekno=52,
2129                              byweekday=SU,
2130                              dtstart=datetime(1997, 9, 2, 9, 0))),
2131                         [datetime(1997, 12, 28, 0, 0, 0),
2132                          datetime(1997, 12, 28, 0, 0, 1),
2133                          datetime(1997, 12, 28, 0, 0, 2)])
2134
2135    def testSecondlyByWeekNoAndWeekDayLast(self):
2136        self.assertEqual(list(rrule(SECONDLY,
2137                              count=3,
2138                              byweekno=-1,
2139                              byweekday=SU,
2140                              dtstart=datetime(1997, 9, 2, 9, 0))),
2141                         [datetime(1997, 12, 28, 0, 0, 0),
2142                          datetime(1997, 12, 28, 0, 0, 1),
2143                          datetime(1997, 12, 28, 0, 0, 2)])
2144
2145    def testSecondlyByWeekNoAndWeekDay53(self):
2146        self.assertEqual(list(rrule(SECONDLY,
2147                              count=3,
2148                              byweekno=53,
2149                              byweekday=MO,
2150                              dtstart=datetime(1997, 9, 2, 9, 0))),
2151                         [datetime(1998, 12, 28, 0, 0, 0),
2152                          datetime(1998, 12, 28, 0, 0, 1),
2153                          datetime(1998, 12, 28, 0, 0, 2)])
2154
2155    def testSecondlyByEaster(self):
2156        self.assertEqual(list(rrule(SECONDLY,
2157                              count=3,
2158                              byeaster=0,
2159                              dtstart=datetime(1997, 9, 2, 9, 0))),
2160                         [datetime(1998, 4, 12, 0, 0, 0),
2161                          datetime(1998, 4, 12, 0, 0, 1),
2162                          datetime(1998, 4, 12, 0, 0, 2)])
2163
2164    def testSecondlyByEasterPos(self):
2165        self.assertEqual(list(rrule(SECONDLY,
2166                              count=3,
2167                              byeaster=1,
2168                              dtstart=datetime(1997, 9, 2, 9, 0))),
2169                         [datetime(1998, 4, 13, 0, 0, 0),
2170                          datetime(1998, 4, 13, 0, 0, 1),
2171                          datetime(1998, 4, 13, 0, 0, 2)])
2172
2173    def testSecondlyByEasterNeg(self):
2174        self.assertEqual(list(rrule(SECONDLY,
2175                              count=3,
2176                              byeaster=-1,
2177                              dtstart=datetime(1997, 9, 2, 9, 0))),
2178                         [datetime(1998, 4, 11, 0, 0, 0),
2179                          datetime(1998, 4, 11, 0, 0, 1),
2180                          datetime(1998, 4, 11, 0, 0, 2)])
2181
2182    def testSecondlyByHour(self):
2183        self.assertEqual(list(rrule(SECONDLY,
2184                              count=3,
2185                              byhour=(6, 18),
2186                              dtstart=datetime(1997, 9, 2, 9, 0))),
2187                         [datetime(1997, 9, 2, 18, 0, 0),
2188                          datetime(1997, 9, 2, 18, 0, 1),
2189                          datetime(1997, 9, 2, 18, 0, 2)])
2190
2191    def testSecondlyByMinute(self):
2192        self.assertEqual(list(rrule(SECONDLY,
2193                              count=3,
2194                              byminute=(6, 18),
2195                              dtstart=datetime(1997, 9, 2, 9, 0))),
2196                         [datetime(1997, 9, 2, 9, 6, 0),
2197                          datetime(1997, 9, 2, 9, 6, 1),
2198                          datetime(1997, 9, 2, 9, 6, 2)])
2199
2200    def testSecondlyBySecond(self):
2201        self.assertEqual(list(rrule(SECONDLY,
2202                              count=3,
2203                              bysecond=(6, 18),
2204                              dtstart=datetime(1997, 9, 2, 9, 0))),
2205                         [datetime(1997, 9, 2, 9, 0, 6),
2206                          datetime(1997, 9, 2, 9, 0, 18),
2207                          datetime(1997, 9, 2, 9, 1, 6)])
2208
2209    def testSecondlyByHourAndMinute(self):
2210        self.assertEqual(list(rrule(SECONDLY,
2211                              count=3,
2212                              byhour=(6, 18),
2213                              byminute=(6, 18),
2214                              dtstart=datetime(1997, 9, 2, 9, 0))),
2215                         [datetime(1997, 9, 2, 18, 6, 0),
2216                          datetime(1997, 9, 2, 18, 6, 1),
2217                          datetime(1997, 9, 2, 18, 6, 2)])
2218
2219    def testSecondlyByHourAndSecond(self):
2220        self.assertEqual(list(rrule(SECONDLY,
2221                              count=3,
2222                              byhour=(6, 18),
2223                              bysecond=(6, 18),
2224                              dtstart=datetime(1997, 9, 2, 9, 0))),
2225                         [datetime(1997, 9, 2, 18, 0, 6),
2226                          datetime(1997, 9, 2, 18, 0, 18),
2227                          datetime(1997, 9, 2, 18, 1, 6)])
2228
2229    def testSecondlyByMinuteAndSecond(self):
2230        self.assertEqual(list(rrule(SECONDLY,
2231                              count=3,
2232                              byminute=(6, 18),
2233                              bysecond=(6, 18),
2234                              dtstart=datetime(1997, 9, 2, 9, 0))),
2235                         [datetime(1997, 9, 2, 9, 6, 6),
2236                          datetime(1997, 9, 2, 9, 6, 18),
2237                          datetime(1997, 9, 2, 9, 18, 6)])
2238
2239    def testSecondlyByHourAndMinuteAndSecond(self):
2240        self.assertEqual(list(rrule(SECONDLY,
2241                              count=3,
2242                              byhour=(6, 18),
2243                              byminute=(6, 18),
2244                              bysecond=(6, 18),
2245                              dtstart=datetime(1997, 9, 2, 9, 0))),
2246                         [datetime(1997, 9, 2, 18, 6, 6),
2247                          datetime(1997, 9, 2, 18, 6, 18),
2248                          datetime(1997, 9, 2, 18, 18, 6)])
2249
2250    def testSecondlyByHourAndMinuteAndSecondBug(self):
2251        # This explores a bug found by Mathieu Bridon.
2252        self.assertEqual(list(rrule(SECONDLY,
2253                              count=3,
2254                              bysecond=(0,),
2255                              byminute=(1,),
2256                              dtstart=datetime(2010, 3, 22, 12, 1))),
2257                         [datetime(2010, 3, 22, 12, 1),
2258                          datetime(2010, 3, 22, 13, 1),
2259                          datetime(2010, 3, 22, 14, 1)])
2260
2261    def testLongIntegers(self):
2262        if not PY3:  # There is no longs in python3
2263            self.assertEqual(list(rrule(MINUTELY,
2264                                  count=long(2),
2265                                  interval=long(2),
2266                                  bymonth=long(2),
2267                                  byweekday=long(3),
2268                                  byhour=long(6),
2269                                  byminute=long(6),
2270                                  bysecond=long(6),
2271                                  dtstart=datetime(1997, 9, 2, 9, 0))),
2272                             [datetime(1998, 2, 5, 6, 6, 6),
2273                              datetime(1998, 2, 12, 6, 6, 6)])
2274            self.assertEqual(list(rrule(YEARLY,
2275                                  count=long(2),
2276                                  bymonthday=long(5),
2277                                  byweekno=long(2),
2278                                  dtstart=datetime(1997, 9, 2, 9, 0))),
2279                             [datetime(1998, 1, 5, 9, 0),
2280                              datetime(2004, 1, 5, 9, 0)])
2281
2282    def testHourlyBadRRule(self):
2283        """
2284        When `byhour` is specified with `freq=HOURLY`, there are certain
2285        combinations of `dtstart` and `byhour` which result in an rrule with no
2286        valid values.
2287
2288        See https://github.com/dateutil/dateutil/issues/4
2289        """
2290
2291        self.assertRaises(ValueError, rrule, HOURLY,
2292                          **dict(interval=4, byhour=(7, 11, 15, 19),
2293                                 dtstart=datetime(1997, 9, 2, 9, 0)))
2294
2295    def testMinutelyBadRRule(self):
2296        """
2297        See :func:`testHourlyBadRRule` for details.
2298        """
2299
2300        self.assertRaises(ValueError, rrule, MINUTELY,
2301                          **dict(interval=12, byminute=(10, 11, 25, 39, 50),
2302                                 dtstart=datetime(1997, 9, 2, 9, 0)))
2303
2304    def testSecondlyBadRRule(self):
2305        """
2306        See :func:`testHourlyBadRRule` for details.
2307        """
2308
2309        self.assertRaises(ValueError, rrule, SECONDLY,
2310                          **dict(interval=10, bysecond=(2, 15, 37, 42, 59),
2311                                 dtstart=datetime(1997, 9, 2, 9, 0)))
2312
2313    def testMinutelyBadComboRRule(self):
2314        """
2315        Certain values of :param:`interval` in :class:`rrule`, when combined
2316        with certain values of :param:`byhour` create rules which apply to no
2317        valid dates. The library should detect this case in the iterator and
2318        raise a :exception:`ValueError`.
2319        """
2320
2321        # In Python 2.7 you can use a context manager for this.
2322        def make_bad_rrule():
2323            list(rrule(MINUTELY, interval=120, byhour=(10, 12, 14, 16),
2324                 count=2, dtstart=datetime(1997, 9, 2, 9, 0)))
2325
2326        self.assertRaises(ValueError, make_bad_rrule)
2327
2328    def testSecondlyBadComboRRule(self):
2329        """
2330        See :func:`testMinutelyBadComboRRule' for details.
2331        """
2332
2333        # In Python 2.7 you can use a context manager for this.
2334        def make_bad_minute_rrule():
2335            list(rrule(SECONDLY, interval=360, byminute=(10, 28, 49),
2336                 count=4, dtstart=datetime(1997, 9, 2, 9, 0)))
2337
2338        def make_bad_hour_rrule():
2339            list(rrule(SECONDLY, interval=43200, byhour=(2, 10, 18, 23),
2340                 count=4, dtstart=datetime(1997, 9, 2, 9, 0)))
2341
2342        self.assertRaises(ValueError, make_bad_minute_rrule)
2343        self.assertRaises(ValueError, make_bad_hour_rrule)
2344
2345    def testBadUntilCountRRule(self):
2346        """
2347        See rfc-2445 4.3.10 - This checks for the deprecation warning, and will
2348        eventually check for an error.
2349        """
2350        with self.assertWarns(DeprecationWarning):
2351            rrule(DAILY, dtstart=datetime(1997, 9, 2, 9, 0),
2352                         count=3, until=datetime(1997, 9, 4, 9, 0))
2353
2354    def testUntilNotMatching(self):
2355        self.assertEqual(list(rrule(DAILY,
2356                              dtstart=datetime(1997, 9, 2, 9, 0),
2357                              until=datetime(1997, 9, 5, 8, 0))),
2358                         [datetime(1997, 9, 2, 9, 0),
2359                          datetime(1997, 9, 3, 9, 0),
2360                          datetime(1997, 9, 4, 9, 0)])
2361
2362    def testUntilMatching(self):
2363        self.assertEqual(list(rrule(DAILY,
2364                              dtstart=datetime(1997, 9, 2, 9, 0),
2365                              until=datetime(1997, 9, 4, 9, 0))),
2366                         [datetime(1997, 9, 2, 9, 0),
2367                          datetime(1997, 9, 3, 9, 0),
2368                          datetime(1997, 9, 4, 9, 0)])
2369
2370    def testUntilSingle(self):
2371        self.assertEqual(list(rrule(DAILY,
2372                              dtstart=datetime(1997, 9, 2, 9, 0),
2373                              until=datetime(1997, 9, 2, 9, 0))),
2374                         [datetime(1997, 9, 2, 9, 0)])
2375
2376    def testUntilEmpty(self):
2377        self.assertEqual(list(rrule(DAILY,
2378                              dtstart=datetime(1997, 9, 2, 9, 0),
2379                              until=datetime(1997, 9, 1, 9, 0))),
2380                         [])
2381
2382    def testUntilWithDate(self):
2383        self.assertEqual(list(rrule(DAILY,
2384                              dtstart=datetime(1997, 9, 2, 9, 0),
2385                              until=date(1997, 9, 5))),
2386                         [datetime(1997, 9, 2, 9, 0),
2387                          datetime(1997, 9, 3, 9, 0),
2388                          datetime(1997, 9, 4, 9, 0)])
2389
2390    def testWkStIntervalMO(self):
2391        self.assertEqual(list(rrule(WEEKLY,
2392                              count=3,
2393                              interval=2,
2394                              byweekday=(TU, SU),
2395                              wkst=MO,
2396                              dtstart=datetime(1997, 9, 2, 9, 0))),
2397                         [datetime(1997, 9, 2, 9, 0),
2398                          datetime(1997, 9, 7, 9, 0),
2399                          datetime(1997, 9, 16, 9, 0)])
2400
2401    def testWkStIntervalSU(self):
2402        self.assertEqual(list(rrule(WEEKLY,
2403                              count=3,
2404                              interval=2,
2405                              byweekday=(TU, SU),
2406                              wkst=SU,
2407                              dtstart=datetime(1997, 9, 2, 9, 0))),
2408                         [datetime(1997, 9, 2, 9, 0),
2409                          datetime(1997, 9, 14, 9, 0),
2410                          datetime(1997, 9, 16, 9, 0)])
2411
2412    def testDTStartIsDate(self):
2413        self.assertEqual(list(rrule(DAILY,
2414                              count=3,
2415                              dtstart=date(1997, 9, 2))),
2416                         [datetime(1997, 9, 2, 0, 0),
2417                          datetime(1997, 9, 3, 0, 0),
2418                          datetime(1997, 9, 4, 0, 0)])
2419
2420    def testDTStartWithMicroseconds(self):
2421        self.assertEqual(list(rrule(DAILY,
2422                              count=3,
2423                              dtstart=datetime(1997, 9, 2, 9, 0, 0, 500000))),
2424                         [datetime(1997, 9, 2, 9, 0),
2425                          datetime(1997, 9, 3, 9, 0),
2426                          datetime(1997, 9, 4, 9, 0)])
2427
2428    def testMaxYear(self):
2429        self.assertEqual(list(rrule(YEARLY,
2430                              count=3,
2431                              bymonth=2,
2432                              bymonthday=31,
2433                              dtstart=datetime(9997, 9, 2, 9, 0, 0))),
2434                         [])
2435
2436    def testGetItem(self):
2437        self.assertEqual(rrule(DAILY,
2438                               count=3,
2439                               dtstart=datetime(1997, 9, 2, 9, 0))[0],
2440                         datetime(1997, 9, 2, 9, 0))
2441
2442    def testGetItemNeg(self):
2443        self.assertEqual(rrule(DAILY,
2444                               count=3,
2445                               dtstart=datetime(1997, 9, 2, 9, 0))[-1],
2446                         datetime(1997, 9, 4, 9, 0))
2447
2448    def testGetItemSlice(self):
2449        self.assertEqual(rrule(DAILY,
2450                               # count=3,
2451                               dtstart=datetime(1997, 9, 2, 9, 0))[1:2],
2452                         [datetime(1997, 9, 3, 9, 0)])
2453
2454    def testGetItemSliceEmpty(self):
2455        self.assertEqual(rrule(DAILY,
2456                               count=3,
2457                               dtstart=datetime(1997, 9, 2, 9, 0))[:],
2458                         [datetime(1997, 9, 2, 9, 0),
2459                          datetime(1997, 9, 3, 9, 0),
2460                          datetime(1997, 9, 4, 9, 0)])
2461
2462    def testGetItemSliceStep(self):
2463        self.assertEqual(rrule(DAILY,
2464                               count=3,
2465                               dtstart=datetime(1997, 9, 2, 9, 0))[::-2],
2466                         [datetime(1997, 9, 4, 9, 0),
2467                          datetime(1997, 9, 2, 9, 0)])
2468
2469    def testCount(self):
2470        self.assertEqual(rrule(DAILY,
2471                               count=3,
2472                               dtstart=datetime(1997, 9, 2, 9, 0)).count(),
2473                         3)
2474
2475    def testContains(self):
2476        rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0))
2477        self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2478
2479    def testContainsNot(self):
2480        rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0))
2481        self.assertEqual(datetime(1997, 9, 3, 9, 0) not in rr, False)
2482
2483    def testBefore(self):
2484        self.assertEqual(rrule(DAILY,  # count=5
2485            dtstart=datetime(1997, 9, 2, 9, 0)).before(datetime(1997, 9, 5, 9, 0)),
2486                         datetime(1997, 9, 4, 9, 0))
2487
2488    def testBeforeInc(self):
2489        self.assertEqual(rrule(DAILY,
2490                               #count=5,
2491                               dtstart=datetime(1997, 9, 2, 9, 0))
2492                               .before(datetime(1997, 9, 5, 9, 0), inc=True),
2493                         datetime(1997, 9, 5, 9, 0))
2494
2495    def testAfter(self):
2496        self.assertEqual(rrule(DAILY,
2497                               #count=5,
2498                               dtstart=datetime(1997, 9, 2, 9, 0))
2499                               .after(datetime(1997, 9, 4, 9, 0)),
2500                         datetime(1997, 9, 5, 9, 0))
2501
2502    def testAfterInc(self):
2503        self.assertEqual(rrule(DAILY,
2504                               #count=5,
2505                               dtstart=datetime(1997, 9, 2, 9, 0))
2506                               .after(datetime(1997, 9, 4, 9, 0), inc=True),
2507                         datetime(1997, 9, 4, 9, 0))
2508
2509    def testXAfter(self):
2510        self.assertEqual(list(rrule(DAILY,
2511                                    dtstart=datetime(1997, 9, 2, 9, 0))
2512                                    .xafter(datetime(1997, 9, 8, 9, 0), count=12)),
2513                                    [datetime(1997, 9, 9, 9, 0),
2514                                     datetime(1997, 9, 10, 9, 0),
2515                                     datetime(1997, 9, 11, 9, 0),
2516                                     datetime(1997, 9, 12, 9, 0),
2517                                     datetime(1997, 9, 13, 9, 0),
2518                                     datetime(1997, 9, 14, 9, 0),
2519                                     datetime(1997, 9, 15, 9, 0),
2520                                     datetime(1997, 9, 16, 9, 0),
2521                                     datetime(1997, 9, 17, 9, 0),
2522                                     datetime(1997, 9, 18, 9, 0),
2523                                     datetime(1997, 9, 19, 9, 0),
2524                                     datetime(1997, 9, 20, 9, 0)])
2525
2526    def testXAfterInc(self):
2527        self.assertEqual(list(rrule(DAILY,
2528                                    dtstart=datetime(1997, 9, 2, 9, 0))
2529                                    .xafter(datetime(1997, 9, 8, 9, 0), count=12, inc=True)),
2530                                    [datetime(1997, 9, 8, 9, 0),
2531                                     datetime(1997, 9, 9, 9, 0),
2532                                     datetime(1997, 9, 10, 9, 0),
2533                                     datetime(1997, 9, 11, 9, 0),
2534                                     datetime(1997, 9, 12, 9, 0),
2535                                     datetime(1997, 9, 13, 9, 0),
2536                                     datetime(1997, 9, 14, 9, 0),
2537                                     datetime(1997, 9, 15, 9, 0),
2538                                     datetime(1997, 9, 16, 9, 0),
2539                                     datetime(1997, 9, 17, 9, 0),
2540                                     datetime(1997, 9, 18, 9, 0),
2541                                     datetime(1997, 9, 19, 9, 0)])
2542
2543    def testBetween(self):
2544        self.assertEqual(rrule(DAILY,
2545                               #count=5,
2546                               dtstart=datetime(1997, 9, 2, 9, 0))
2547                               .between(datetime(1997, 9, 2, 9, 0),
2548                                        datetime(1997, 9, 6, 9, 0)),
2549                         [datetime(1997, 9, 3, 9, 0),
2550                          datetime(1997, 9, 4, 9, 0),
2551                          datetime(1997, 9, 5, 9, 0)])
2552
2553    def testBetweenInc(self):
2554        self.assertEqual(rrule(DAILY,
2555                               #count=5,
2556                               dtstart=datetime(1997, 9, 2, 9, 0))
2557                               .between(datetime(1997, 9, 2, 9, 0),
2558                                        datetime(1997, 9, 6, 9, 0), inc=True),
2559                         [datetime(1997, 9, 2, 9, 0),
2560                          datetime(1997, 9, 3, 9, 0),
2561                          datetime(1997, 9, 4, 9, 0),
2562                          datetime(1997, 9, 5, 9, 0),
2563                          datetime(1997, 9, 6, 9, 0)])
2564
2565    def testCachePre(self):
2566        rr = rrule(DAILY, count=15, cache=True,
2567                   dtstart=datetime(1997, 9, 2, 9, 0))
2568        self.assertEqual(list(rr),
2569                         [datetime(1997, 9, 2, 9, 0),
2570                          datetime(1997, 9, 3, 9, 0),
2571                          datetime(1997, 9, 4, 9, 0),
2572                          datetime(1997, 9, 5, 9, 0),
2573                          datetime(1997, 9, 6, 9, 0),
2574                          datetime(1997, 9, 7, 9, 0),
2575                          datetime(1997, 9, 8, 9, 0),
2576                          datetime(1997, 9, 9, 9, 0),
2577                          datetime(1997, 9, 10, 9, 0),
2578                          datetime(1997, 9, 11, 9, 0),
2579                          datetime(1997, 9, 12, 9, 0),
2580                          datetime(1997, 9, 13, 9, 0),
2581                          datetime(1997, 9, 14, 9, 0),
2582                          datetime(1997, 9, 15, 9, 0),
2583                          datetime(1997, 9, 16, 9, 0)])
2584
2585    def testCachePost(self):
2586        rr = rrule(DAILY, count=15, cache=True,
2587                   dtstart=datetime(1997, 9, 2, 9, 0))
2588        for x in rr: pass
2589        self.assertEqual(list(rr),
2590                         [datetime(1997, 9, 2, 9, 0),
2591                          datetime(1997, 9, 3, 9, 0),
2592                          datetime(1997, 9, 4, 9, 0),
2593                          datetime(1997, 9, 5, 9, 0),
2594                          datetime(1997, 9, 6, 9, 0),
2595                          datetime(1997, 9, 7, 9, 0),
2596                          datetime(1997, 9, 8, 9, 0),
2597                          datetime(1997, 9, 9, 9, 0),
2598                          datetime(1997, 9, 10, 9, 0),
2599                          datetime(1997, 9, 11, 9, 0),
2600                          datetime(1997, 9, 12, 9, 0),
2601                          datetime(1997, 9, 13, 9, 0),
2602                          datetime(1997, 9, 14, 9, 0),
2603                          datetime(1997, 9, 15, 9, 0),
2604                          datetime(1997, 9, 16, 9, 0)])
2605
2606    def testCachePostInternal(self):
2607        rr = rrule(DAILY, count=15, cache=True,
2608                   dtstart=datetime(1997, 9, 2, 9, 0))
2609        for x in rr: pass
2610        self.assertEqual(rr._cache,
2611                         [datetime(1997, 9, 2, 9, 0),
2612                          datetime(1997, 9, 3, 9, 0),
2613                          datetime(1997, 9, 4, 9, 0),
2614                          datetime(1997, 9, 5, 9, 0),
2615                          datetime(1997, 9, 6, 9, 0),
2616                          datetime(1997, 9, 7, 9, 0),
2617                          datetime(1997, 9, 8, 9, 0),
2618                          datetime(1997, 9, 9, 9, 0),
2619                          datetime(1997, 9, 10, 9, 0),
2620                          datetime(1997, 9, 11, 9, 0),
2621                          datetime(1997, 9, 12, 9, 0),
2622                          datetime(1997, 9, 13, 9, 0),
2623                          datetime(1997, 9, 14, 9, 0),
2624                          datetime(1997, 9, 15, 9, 0),
2625                          datetime(1997, 9, 16, 9, 0)])
2626
2627    def testCachePreContains(self):
2628        rr = rrule(DAILY, count=3, cache=True,
2629                   dtstart=datetime(1997, 9, 2, 9, 0))
2630        self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2631
2632    def testCachePostContains(self):
2633        rr = rrule(DAILY, count=3, cache=True,
2634                   dtstart=datetime(1997, 9, 2, 9, 0))
2635        for x in rr: pass
2636        self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True)
2637
2638    def testStr(self):
2639        self.assertEqual(list(rrulestr(
2640                              "DTSTART:19970902T090000\n"
2641                              "RRULE:FREQ=YEARLY;COUNT=3\n"
2642                              )),
2643                         [datetime(1997, 9, 2, 9, 0),
2644                          datetime(1998, 9, 2, 9, 0),
2645                          datetime(1999, 9, 2, 9, 0)])
2646
2647    def testStrType(self):
2648        self.assertEqual(isinstance(rrulestr(
2649                              "DTSTART:19970902T090000\n"
2650                              "RRULE:FREQ=YEARLY;COUNT=3\n"
2651                              ), rrule), True)
2652
2653    def testStrForceSetType(self):
2654        self.assertEqual(isinstance(rrulestr(
2655                              "DTSTART:19970902T090000\n"
2656                              "RRULE:FREQ=YEARLY;COUNT=3\n"
2657                              , forceset=True), rruleset), True)
2658
2659    def testStrSetType(self):
2660        self.assertEqual(isinstance(rrulestr(
2661                              "DTSTART:19970902T090000\n"
2662                              "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2663                              "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2664                              ), rruleset), True)
2665
2666    def testStrCase(self):
2667        self.assertEqual(list(rrulestr(
2668                              "dtstart:19970902T090000\n"
2669                              "rrule:freq=yearly;count=3\n"
2670                              )),
2671                         [datetime(1997, 9, 2, 9, 0),
2672                          datetime(1998, 9, 2, 9, 0),
2673                          datetime(1999, 9, 2, 9, 0)])
2674
2675    def testStrSpaces(self):
2676        self.assertEqual(list(rrulestr(
2677                              " DTSTART:19970902T090000 "
2678                              " RRULE:FREQ=YEARLY;COUNT=3 "
2679                              )),
2680                         [datetime(1997, 9, 2, 9, 0),
2681                          datetime(1998, 9, 2, 9, 0),
2682                          datetime(1999, 9, 2, 9, 0)])
2683
2684    def testStrSpacesAndLines(self):
2685        self.assertEqual(list(rrulestr(
2686                              " DTSTART:19970902T090000 \n"
2687                              " \n"
2688                              " RRULE:FREQ=YEARLY;COUNT=3 \n"
2689                              )),
2690                         [datetime(1997, 9, 2, 9, 0),
2691                          datetime(1998, 9, 2, 9, 0),
2692                          datetime(1999, 9, 2, 9, 0)])
2693
2694    def testStrNoDTStart(self):
2695        self.assertEqual(list(rrulestr(
2696                              "RRULE:FREQ=YEARLY;COUNT=3\n"
2697                              , dtstart=datetime(1997, 9, 2, 9, 0))),
2698                         [datetime(1997, 9, 2, 9, 0),
2699                          datetime(1998, 9, 2, 9, 0),
2700                          datetime(1999, 9, 2, 9, 0)])
2701
2702    def testStrValueOnly(self):
2703        self.assertEqual(list(rrulestr(
2704                              "FREQ=YEARLY;COUNT=3\n"
2705                              , dtstart=datetime(1997, 9, 2, 9, 0))),
2706                         [datetime(1997, 9, 2, 9, 0),
2707                          datetime(1998, 9, 2, 9, 0),
2708                          datetime(1999, 9, 2, 9, 0)])
2709
2710    def testStrUnfold(self):
2711        self.assertEqual(list(rrulestr(
2712                              "FREQ=YEA\n RLY;COUNT=3\n", unfold=True,
2713                              dtstart=datetime(1997, 9, 2, 9, 0))),
2714                         [datetime(1997, 9, 2, 9, 0),
2715                          datetime(1998, 9, 2, 9, 0),
2716                          datetime(1999, 9, 2, 9, 0)])
2717
2718    def testStrSet(self):
2719        self.assertEqual(list(rrulestr(
2720                              "DTSTART:19970902T090000\n"
2721                              "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n"
2722                              "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n"
2723                              )),
2724                         [datetime(1997, 9, 2, 9, 0),
2725                          datetime(1997, 9, 4, 9, 0),
2726                          datetime(1997, 9, 9, 9, 0)])
2727
2728    def testStrSetDate(self):
2729        self.assertEqual(list(rrulestr(
2730                              "DTSTART:19970902T090000\n"
2731                              "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n"
2732                              "RDATE:19970904T090000\n"
2733                              "RDATE:19970909T090000\n"
2734                              )),
2735                         [datetime(1997, 9, 2, 9, 0),
2736                          datetime(1997, 9, 4, 9, 0),
2737                          datetime(1997, 9, 9, 9, 0)])
2738
2739    def testStrSetExRule(self):
2740        self.assertEqual(list(rrulestr(
2741                              "DTSTART:19970902T090000\n"
2742                              "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
2743                              "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
2744                              )),
2745                         [datetime(1997, 9, 2, 9, 0),
2746                          datetime(1997, 9, 9, 9, 0),
2747                          datetime(1997, 9, 16, 9, 0)])
2748
2749    def testStrSetExDate(self):
2750        self.assertEqual(list(rrulestr(
2751                              "DTSTART:19970902T090000\n"
2752                              "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n"
2753                              "EXDATE:19970904T090000\n"
2754                              "EXDATE:19970911T090000\n"
2755                              "EXDATE:19970918T090000\n"
2756                              )),
2757                         [datetime(1997, 9, 2, 9, 0),
2758                          datetime(1997, 9, 9, 9, 0),
2759                          datetime(1997, 9, 16, 9, 0)])
2760
2761    def testStrSetDateAndExDate(self):
2762        self.assertEqual(list(rrulestr(
2763                              "DTSTART:19970902T090000\n"
2764                              "RDATE:19970902T090000\n"
2765                              "RDATE:19970904T090000\n"
2766                              "RDATE:19970909T090000\n"
2767                              "RDATE:19970911T090000\n"
2768                              "RDATE:19970916T090000\n"
2769                              "RDATE:19970918T090000\n"
2770                              "EXDATE:19970904T090000\n"
2771                              "EXDATE:19970911T090000\n"
2772                              "EXDATE:19970918T090000\n"
2773                              )),
2774                         [datetime(1997, 9, 2, 9, 0),
2775                          datetime(1997, 9, 9, 9, 0),
2776                          datetime(1997, 9, 16, 9, 0)])
2777
2778    def testStrSetDateAndExRule(self):
2779        self.assertEqual(list(rrulestr(
2780                              "DTSTART:19970902T090000\n"
2781                              "RDATE:19970902T090000\n"
2782                              "RDATE:19970904T090000\n"
2783                              "RDATE:19970909T090000\n"
2784                              "RDATE:19970911T090000\n"
2785                              "RDATE:19970916T090000\n"
2786                              "RDATE:19970918T090000\n"
2787                              "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n"
2788                              )),
2789                         [datetime(1997, 9, 2, 9, 0),
2790                          datetime(1997, 9, 9, 9, 0),
2791                          datetime(1997, 9, 16, 9, 0)])
2792
2793    def testStrKeywords(self):
2794        self.assertEqual(list(rrulestr(
2795                              "DTSTART:19970902T090000\n"
2796                              "RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;"
2797                                    "BYMONTH=3;BYWEEKDAY=TH;BYMONTHDAY=3;"
2798                                    "BYHOUR=3;BYMINUTE=3;BYSECOND=3\n"
2799                              )),
2800                         [datetime(2033, 3, 3, 3, 3, 3),
2801                          datetime(2039, 3, 3, 3, 3, 3),
2802                          datetime(2072, 3, 3, 3, 3, 3)])
2803
2804    def testStrNWeekDay(self):
2805        self.assertEqual(list(rrulestr(
2806                              "DTSTART:19970902T090000\n"
2807                              "RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n"
2808                              )),
2809                         [datetime(1997, 12, 25, 9, 0),
2810                          datetime(1998, 1, 6, 9, 0),
2811                          datetime(1998, 12, 31, 9, 0)])
2812
2813    def testStrUntil(self):
2814        self.assertEqual(list(rrulestr(
2815                              "DTSTART:19970902T090000\n"
2816                              "RRULE:FREQ=YEARLY;"
2817                              "UNTIL=19990101T000000;BYDAY=1TU,-1TH\n"
2818                              )),
2819                         [datetime(1997, 12, 25, 9, 0),
2820                          datetime(1998, 1, 6, 9, 0),
2821                          datetime(1998, 12, 31, 9, 0)])
2822
2823    def testStrInvalidUntil(self):
2824        with self.assertRaises(ValueError):
2825            list(rrulestr("DTSTART:19970902T090000\n"
2826                          "RRULE:FREQ=YEARLY;"
2827                          "UNTIL=TheCowsComeHome;BYDAY=1TU,-1TH\n"))
2828
2829    def testStrEmptyByDay(self):
2830        with self.assertRaises(ValueError):
2831            list(rrulestr("DTSTART:19970902T090000\n"
2832                          "FREQ=WEEKLY;"
2833                          "BYDAY=;"         # This part is invalid
2834                          "WKST=SU"))
2835
2836    def testStrInvalidByDay(self):
2837        with self.assertRaises(ValueError):
2838            list(rrulestr("DTSTART:19970902T090000\n"
2839                          "FREQ=WEEKLY;"
2840                          "BYDAY=-1OK;"         # This part is invalid
2841                          "WKST=SU"))
2842
2843    def testBadBySetPos(self):
2844        self.assertRaises(ValueError,
2845                          rrule, MONTHLY,
2846                                 count=1,
2847                                 bysetpos=0,
2848                                 dtstart=datetime(1997, 9, 2, 9, 0))
2849
2850    def testBadBySetPosMany(self):
2851        self.assertRaises(ValueError,
2852                          rrule, MONTHLY,
2853                                 count=1,
2854                                 bysetpos=(-1, 0, 1),
2855                                 dtstart=datetime(1997, 9, 2, 9, 0))
2856
2857    # Tests to ensure that str(rrule) works
2858    def testToStrYearly(self):
2859        rule = rrule(YEARLY, count=3, dtstart=datetime(1997, 9, 2, 9, 0))
2860        self._rrulestr_reverse_test(rule)
2861
2862    def testToStrYearlyInterval(self):
2863        rule = rrule(YEARLY, count=3, interval=2,
2864                     dtstart=datetime(1997, 9, 2, 9, 0))
2865        self._rrulestr_reverse_test(rule)
2866
2867    def testToStrYearlyByMonth(self):
2868        rule = rrule(YEARLY, count=3, bymonth=(1, 3),
2869                     dtstart=datetime(1997, 9, 2, 9, 0))
2870
2871        self._rrulestr_reverse_test(rule)
2872
2873    def testToStrYearlyByMonth(self):
2874        self._rrulestr_reverse_test(rrule(YEARLY,
2875                                          count=3,
2876                                          bymonth=(1, 3),
2877                                          dtstart=datetime(1997, 9, 2, 9, 0)))
2878
2879    def testToStrYearlyByMonthDay(self):
2880        self._rrulestr_reverse_test(rrule(YEARLY,
2881                                          count=3,
2882                                          bymonthday=(1, 3),
2883                                          dtstart=datetime(1997, 9, 2, 9, 0)))
2884
2885    def testToStrYearlyByMonthAndMonthDay(self):
2886        self._rrulestr_reverse_test(rrule(YEARLY,
2887                                          count=3,
2888                                          bymonth=(1, 3),
2889                                          bymonthday=(5, 7),
2890                                          dtstart=datetime(1997, 9, 2, 9, 0)))
2891
2892    def testToStrYearlyByWeekDay(self):
2893        self._rrulestr_reverse_test(rrule(YEARLY,
2894                                          count=3,
2895                                          byweekday=(TU, TH),
2896                                          dtstart=datetime(1997, 9, 2, 9, 0)))
2897
2898    def testToStrYearlyByNWeekDay(self):
2899        self._rrulestr_reverse_test(rrule(YEARLY,
2900                                          count=3,
2901                                          byweekday=(TU(1), TH(-1)),
2902                                          dtstart=datetime(1997, 9, 2, 9, 0)))
2903
2904    def testToStrYearlyByNWeekDayLarge(self):
2905        self._rrulestr_reverse_test(rrule(YEARLY,
2906                              count=3,
2907                              byweekday=(TU(3), TH(-3)),
2908                              dtstart=datetime(1997, 9, 2, 9, 0)))
2909
2910    def testToStrYearlyByMonthAndWeekDay(self):
2911        self._rrulestr_reverse_test(rrule(YEARLY,
2912                              count=3,
2913                              bymonth=(1, 3),
2914                              byweekday=(TU, TH),
2915                              dtstart=datetime(1997, 9, 2, 9, 0)))
2916
2917    def testToStrYearlyByMonthAndNWeekDay(self):
2918        self._rrulestr_reverse_test(rrule(YEARLY,
2919                              count=3,
2920                              bymonth=(1, 3),
2921                              byweekday=(TU(1), TH(-1)),
2922                              dtstart=datetime(1997, 9, 2, 9, 0)))
2923
2924    def testToStrYearlyByMonthAndNWeekDayLarge(self):
2925        # This is interesting because the TH(-3) ends up before
2926        # the TU(3).
2927        self._rrulestr_reverse_test(rrule(YEARLY,
2928                              count=3,
2929                              bymonth=(1, 3),
2930                              byweekday=(TU(3), TH(-3)),
2931                              dtstart=datetime(1997, 9, 2, 9, 0)))
2932
2933    def testToStrYearlyByMonthDayAndWeekDay(self):
2934        self._rrulestr_reverse_test(rrule(YEARLY,
2935                              count=3,
2936                              bymonthday=(1, 3),
2937                              byweekday=(TU, TH),
2938                              dtstart=datetime(1997, 9, 2, 9, 0)))
2939
2940    def testToStrYearlyByMonthAndMonthDayAndWeekDay(self):
2941        self._rrulestr_reverse_test(rrule(YEARLY,
2942                              count=3,
2943                              bymonth=(1, 3),
2944                              bymonthday=(1, 3),
2945                              byweekday=(TU, TH),
2946                              dtstart=datetime(1997, 9, 2, 9, 0)))
2947
2948    def testToStrYearlyByYearDay(self):
2949        self._rrulestr_reverse_test(rrule(YEARLY,
2950                              count=4,
2951                              byyearday=(1, 100, 200, 365),
2952                              dtstart=datetime(1997, 9, 2, 9, 0)))
2953
2954    def testToStrYearlyByYearDayNeg(self):
2955        self._rrulestr_reverse_test(rrule(YEARLY,
2956                              count=4,
2957                              byyearday=(-365, -266, -166, -1),
2958                              dtstart=datetime(1997, 9, 2, 9, 0)))
2959
2960    def testToStrYearlyByMonthAndYearDay(self):
2961        self._rrulestr_reverse_test(rrule(YEARLY,
2962                              count=4,
2963                              bymonth=(4, 7),
2964                              byyearday=(1, 100, 200, 365),
2965                              dtstart=datetime(1997, 9, 2, 9, 0)))
2966
2967    def testToStrYearlyByMonthAndYearDayNeg(self):
2968        self._rrulestr_reverse_test(rrule(YEARLY,
2969                              count=4,
2970                              bymonth=(4, 7),
2971                              byyearday=(-365, -266, -166, -1),
2972                              dtstart=datetime(1997, 9, 2, 9, 0)))
2973
2974    def testToStrYearlyByWeekNo(self):
2975        self._rrulestr_reverse_test(rrule(YEARLY,
2976                              count=3,
2977                              byweekno=20,
2978                              dtstart=datetime(1997, 9, 2, 9, 0)))
2979
2980    def testToStrYearlyByWeekNoAndWeekDay(self):
2981        # That's a nice one. The first days of week number one
2982        # may be in the last year.
2983        self._rrulestr_reverse_test(rrule(YEARLY,
2984                              count=3,
2985                              byweekno=1,
2986                              byweekday=MO,
2987                              dtstart=datetime(1997, 9, 2, 9, 0)))
2988
2989    def testToStrYearlyByWeekNoAndWeekDayLarge(self):
2990        # Another nice test. The last days of week number 52/53
2991        # may be in the next year.
2992        self._rrulestr_reverse_test(rrule(YEARLY,
2993                              count=3,
2994                              byweekno=52,
2995                              byweekday=SU,
2996                              dtstart=datetime(1997, 9, 2, 9, 0)))
2997
2998    def testToStrYearlyByWeekNoAndWeekDayLast(self):
2999        self._rrulestr_reverse_test(rrule(YEARLY,
3000                              count=3,
3001                              byweekno=-1,
3002                              byweekday=SU,
3003                              dtstart=datetime(1997, 9, 2, 9, 0)))
3004
3005    def testToStrYearlyByEaster(self):
3006        self._rrulestr_reverse_test(rrule(YEARLY,
3007                              count=3,
3008                              byeaster=0,
3009                              dtstart=datetime(1997, 9, 2, 9, 0)))
3010
3011    def testToStrYearlyByEasterPos(self):
3012        self._rrulestr_reverse_test(rrule(YEARLY,
3013                              count=3,
3014                              byeaster=1,
3015                              dtstart=datetime(1997, 9, 2, 9, 0)))
3016
3017    def testToStrYearlyByEasterNeg(self):
3018        self._rrulestr_reverse_test(rrule(YEARLY,
3019                              count=3,
3020                              byeaster=-1,
3021                              dtstart=datetime(1997, 9, 2, 9, 0)))
3022
3023    def testToStrYearlyByWeekNoAndWeekDay53(self):
3024        self._rrulestr_reverse_test(rrule(YEARLY,
3025                              count=3,
3026                              byweekno=53,
3027                              byweekday=MO,
3028                              dtstart=datetime(1997, 9, 2, 9, 0)))
3029
3030    def testToStrYearlyByHour(self):
3031        self._rrulestr_reverse_test(rrule(YEARLY,
3032                              count=3,
3033                              byhour=(6, 18),
3034                              dtstart=datetime(1997, 9, 2, 9, 0)))
3035
3036    def testToStrYearlyByMinute(self):
3037        self._rrulestr_reverse_test(rrule(YEARLY,
3038                              count=3,
3039                              byminute=(6, 18),
3040                              dtstart=datetime(1997, 9, 2, 9, 0)))
3041
3042    def testToStrYearlyBySecond(self):
3043        self._rrulestr_reverse_test(rrule(YEARLY,
3044                              count=3,
3045                              bysecond=(6, 18),
3046                              dtstart=datetime(1997, 9, 2, 9, 0)))
3047
3048    def testToStrYearlyByHourAndMinute(self):
3049        self._rrulestr_reverse_test(rrule(YEARLY,
3050                              count=3,
3051                              byhour=(6, 18),
3052                              byminute=(6, 18),
3053                              dtstart=datetime(1997, 9, 2, 9, 0)))
3054
3055    def testToStrYearlyByHourAndSecond(self):
3056        self._rrulestr_reverse_test(rrule(YEARLY,
3057                              count=3,
3058                              byhour=(6, 18),
3059                              bysecond=(6, 18),
3060                              dtstart=datetime(1997, 9, 2, 9, 0)))
3061
3062    def testToStrYearlyByMinuteAndSecond(self):
3063        self._rrulestr_reverse_test(rrule(YEARLY,
3064                              count=3,
3065                              byminute=(6, 18),
3066                              bysecond=(6, 18),
3067                              dtstart=datetime(1997, 9, 2, 9, 0)))
3068
3069    def testToStrYearlyByHourAndMinuteAndSecond(self):
3070        self._rrulestr_reverse_test(rrule(YEARLY,
3071                              count=3,
3072                              byhour=(6, 18),
3073                              byminute=(6, 18),
3074                              bysecond=(6, 18),
3075                              dtstart=datetime(1997, 9, 2, 9, 0)))
3076
3077    def testToStrYearlyBySetPos(self):
3078        self._rrulestr_reverse_test(rrule(YEARLY,
3079                              count=3,
3080                              bymonthday=15,
3081                              byhour=(6, 18),
3082                              bysetpos=(3, -3),
3083                              dtstart=datetime(1997, 9, 2, 9, 0)))
3084
3085    def testToStrMonthly(self):
3086        self._rrulestr_reverse_test(rrule(MONTHLY,
3087                              count=3,
3088                              dtstart=datetime(1997, 9, 2, 9, 0)))
3089
3090    def testToStrMonthlyInterval(self):
3091        self._rrulestr_reverse_test(rrule(MONTHLY,
3092                              count=3,
3093                              interval=2,
3094                              dtstart=datetime(1997, 9, 2, 9, 0)))
3095
3096    def testToStrMonthlyIntervalLarge(self):
3097        self._rrulestr_reverse_test(rrule(MONTHLY,
3098                              count=3,
3099                              interval=18,
3100                              dtstart=datetime(1997, 9, 2, 9, 0)))
3101
3102    def testToStrMonthlyByMonth(self):
3103        self._rrulestr_reverse_test(rrule(MONTHLY,
3104                              count=3,
3105                              bymonth=(1, 3),
3106                              dtstart=datetime(1997, 9, 2, 9, 0)))
3107
3108    def testToStrMonthlyByMonthDay(self):
3109        self._rrulestr_reverse_test(rrule(MONTHLY,
3110                              count=3,
3111                              bymonthday=(1, 3),
3112                              dtstart=datetime(1997, 9, 2, 9, 0)))
3113
3114    def testToStrMonthlyByMonthAndMonthDay(self):
3115        self._rrulestr_reverse_test(rrule(MONTHLY,
3116                              count=3,
3117                              bymonth=(1, 3),
3118                              bymonthday=(5, 7),
3119                              dtstart=datetime(1997, 9, 2, 9, 0)))
3120
3121    def testToStrMonthlyByWeekDay(self):
3122        self._rrulestr_reverse_test(rrule(MONTHLY,
3123                              count=3,
3124                              byweekday=(TU, TH),
3125                              dtstart=datetime(1997, 9, 2, 9, 0)))
3126
3127        # Third Monday of the month
3128        self.assertEqual(rrule(MONTHLY,
3129                         byweekday=(MO(+3)),
3130                         dtstart=datetime(1997, 9, 1)).between(datetime(1997,
3131                                                                        9,
3132                                                                        1),
3133                                                               datetime(1997,
3134                                                                        12,
3135                                                                        1)),
3136                         [datetime(1997, 9, 15, 0, 0),
3137                          datetime(1997, 10, 20, 0, 0),
3138                          datetime(1997, 11, 17, 0, 0)])
3139
3140    def testToStrMonthlyByNWeekDay(self):
3141        self._rrulestr_reverse_test(rrule(MONTHLY,
3142                              count=3,
3143                              byweekday=(TU(1), TH(-1)),
3144                              dtstart=datetime(1997, 9, 2, 9, 0)))
3145
3146    def testToStrMonthlyByNWeekDayLarge(self):
3147        self._rrulestr_reverse_test(rrule(MONTHLY,
3148                              count=3,
3149                              byweekday=(TU(3), TH(-3)),
3150                              dtstart=datetime(1997, 9, 2, 9, 0)))
3151
3152    def testToStrMonthlyByMonthAndWeekDay(self):
3153        self._rrulestr_reverse_test(rrule(MONTHLY,
3154                              count=3,
3155                              bymonth=(1, 3),
3156                              byweekday=(TU, TH),
3157                              dtstart=datetime(1997, 9, 2, 9, 0)))
3158
3159    def testToStrMonthlyByMonthAndNWeekDay(self):
3160        self._rrulestr_reverse_test(rrule(MONTHLY,
3161                              count=3,
3162                              bymonth=(1, 3),
3163                              byweekday=(TU(1), TH(-1)),
3164                              dtstart=datetime(1997, 9, 2, 9, 0)))
3165
3166    def testToStrMonthlyByMonthAndNWeekDayLarge(self):
3167        self._rrulestr_reverse_test(rrule(MONTHLY,
3168                              count=3,
3169                              bymonth=(1, 3),
3170                              byweekday=(TU(3), TH(-3)),
3171                              dtstart=datetime(1997, 9, 2, 9, 0)))
3172
3173    def testToStrMonthlyByMonthDayAndWeekDay(self):
3174        self._rrulestr_reverse_test(rrule(MONTHLY,
3175                              count=3,
3176                              bymonthday=(1, 3),
3177                              byweekday=(TU, TH),
3178                              dtstart=datetime(1997, 9, 2, 9, 0)))
3179
3180    def testToStrMonthlyByMonthAndMonthDayAndWeekDay(self):
3181        self._rrulestr_reverse_test(rrule(MONTHLY,
3182                              count=3,
3183                              bymonth=(1, 3),
3184                              bymonthday=(1, 3),
3185                              byweekday=(TU, TH),
3186                              dtstart=datetime(1997, 9, 2, 9, 0)))
3187
3188    def testToStrMonthlyByYearDay(self):
3189        self._rrulestr_reverse_test(rrule(MONTHLY,
3190                              count=4,
3191                              byyearday=(1, 100, 200, 365),
3192                              dtstart=datetime(1997, 9, 2, 9, 0)))
3193
3194    def testToStrMonthlyByYearDayNeg(self):
3195        self._rrulestr_reverse_test(rrule(MONTHLY,
3196                              count=4,
3197                              byyearday=(-365, -266, -166, -1),
3198                              dtstart=datetime(1997, 9, 2, 9, 0)))
3199
3200    def testToStrMonthlyByMonthAndYearDay(self):
3201        self._rrulestr_reverse_test(rrule(MONTHLY,
3202                              count=4,
3203                              bymonth=(4, 7),
3204                              byyearday=(1, 100, 200, 365),
3205                              dtstart=datetime(1997, 9, 2, 9, 0)))
3206
3207    def testToStrMonthlyByMonthAndYearDayNeg(self):
3208        self._rrulestr_reverse_test(rrule(MONTHLY,
3209                              count=4,
3210                              bymonth=(4, 7),
3211                              byyearday=(-365, -266, -166, -1),
3212                              dtstart=datetime(1997, 9, 2, 9, 0)))
3213
3214    def testToStrMonthlyByWeekNo(self):
3215        self._rrulestr_reverse_test(rrule(MONTHLY,
3216                              count=3,
3217                              byweekno=20,
3218                              dtstart=datetime(1997, 9, 2, 9, 0)))
3219
3220    def testToStrMonthlyByWeekNoAndWeekDay(self):
3221        # That's a nice one. The first days of week number one
3222        # may be in the last year.
3223        self._rrulestr_reverse_test(rrule(MONTHLY,
3224                              count=3,
3225                              byweekno=1,
3226                              byweekday=MO,
3227                              dtstart=datetime(1997, 9, 2, 9, 0)))
3228
3229    def testToStrMonthlyByWeekNoAndWeekDayLarge(self):
3230        # Another nice test. The last days of week number 52/53
3231        # may be in the next year.
3232        self._rrulestr_reverse_test(rrule(MONTHLY,
3233                              count=3,
3234                              byweekno=52,
3235                              byweekday=SU,
3236                              dtstart=datetime(1997, 9, 2, 9, 0)))
3237
3238    def testToStrMonthlyByWeekNoAndWeekDayLast(self):
3239        self._rrulestr_reverse_test(rrule(MONTHLY,
3240                              count=3,
3241                              byweekno=-1,
3242                              byweekday=SU,
3243                              dtstart=datetime(1997, 9, 2, 9, 0)))
3244
3245    def testToStrMonthlyByWeekNoAndWeekDay53(self):
3246        self._rrulestr_reverse_test(rrule(MONTHLY,
3247                              count=3,
3248                              byweekno=53,
3249                              byweekday=MO,
3250                              dtstart=datetime(1997, 9, 2, 9, 0)))
3251
3252    def testToStrMonthlyByEaster(self):
3253        self._rrulestr_reverse_test(rrule(MONTHLY,
3254                              count=3,
3255                              byeaster=0,
3256                              dtstart=datetime(1997, 9, 2, 9, 0)))
3257
3258    def testToStrMonthlyByEasterPos(self):
3259        self._rrulestr_reverse_test(rrule(MONTHLY,
3260                              count=3,
3261                              byeaster=1,
3262                              dtstart=datetime(1997, 9, 2, 9, 0)))
3263
3264    def testToStrMonthlyByEasterNeg(self):
3265        self._rrulestr_reverse_test(rrule(MONTHLY,
3266                              count=3,
3267                              byeaster=-1,
3268                              dtstart=datetime(1997, 9, 2, 9, 0)))
3269
3270    def testToStrMonthlyByHour(self):
3271        self._rrulestr_reverse_test(rrule(MONTHLY,
3272                              count=3,
3273                              byhour=(6, 18),
3274                              dtstart=datetime(1997, 9, 2, 9, 0)))
3275
3276    def testToStrMonthlyByMinute(self):
3277        self._rrulestr_reverse_test(rrule(MONTHLY,
3278                              count=3,
3279                              byminute=(6, 18),
3280                              dtstart=datetime(1997, 9, 2, 9, 0)))
3281
3282    def testToStrMonthlyBySecond(self):
3283        self._rrulestr_reverse_test(rrule(MONTHLY,
3284                              count=3,
3285                              bysecond=(6, 18),
3286                              dtstart=datetime(1997, 9, 2, 9, 0)))
3287
3288    def testToStrMonthlyByHourAndMinute(self):
3289        self._rrulestr_reverse_test(rrule(MONTHLY,
3290                              count=3,
3291                              byhour=(6, 18),
3292                              byminute=(6, 18),
3293                              dtstart=datetime(1997, 9, 2, 9, 0)))
3294
3295    def testToStrMonthlyByHourAndSecond(self):
3296        self._rrulestr_reverse_test(rrule(MONTHLY,
3297                              count=3,
3298                              byhour=(6, 18),
3299                              bysecond=(6, 18),
3300                              dtstart=datetime(1997, 9, 2, 9, 0)))
3301
3302    def testToStrMonthlyByMinuteAndSecond(self):
3303        self._rrulestr_reverse_test(rrule(MONTHLY,
3304                              count=3,
3305                              byminute=(6, 18),
3306                              bysecond=(6, 18),
3307                              dtstart=datetime(1997, 9, 2, 9, 0)))
3308
3309    def testToStrMonthlyByHourAndMinuteAndSecond(self):
3310        self._rrulestr_reverse_test(rrule(MONTHLY,
3311                              count=3,
3312                              byhour=(6, 18),
3313                              byminute=(6, 18),
3314                              bysecond=(6, 18),
3315                              dtstart=datetime(1997, 9, 2, 9, 0)))
3316
3317    def testToStrMonthlyBySetPos(self):
3318        self._rrulestr_reverse_test(rrule(MONTHLY,
3319                              count=3,
3320                              bymonthday=(13, 17),
3321                              byhour=(6, 18),
3322                              bysetpos=(3, -3),
3323                              dtstart=datetime(1997, 9, 2, 9, 0)))
3324
3325    def testToStrWeekly(self):
3326        self._rrulestr_reverse_test(rrule(WEEKLY,
3327                              count=3,
3328                              dtstart=datetime(1997, 9, 2, 9, 0)))
3329
3330    def testToStrWeeklyInterval(self):
3331        self._rrulestr_reverse_test(rrule(WEEKLY,
3332                              count=3,
3333                              interval=2,
3334                              dtstart=datetime(1997, 9, 2, 9, 0)))
3335
3336    def testToStrWeeklyIntervalLarge(self):
3337        self._rrulestr_reverse_test(rrule(WEEKLY,
3338                              count=3,
3339                              interval=20,
3340                              dtstart=datetime(1997, 9, 2, 9, 0)))
3341
3342    def testToStrWeeklyByMonth(self):
3343        self._rrulestr_reverse_test(rrule(WEEKLY,
3344                              count=3,
3345                              bymonth=(1, 3),
3346                              dtstart=datetime(1997, 9, 2, 9, 0)))
3347
3348    def testToStrWeeklyByMonthDay(self):
3349        self._rrulestr_reverse_test(rrule(WEEKLY,
3350                              count=3,
3351                              bymonthday=(1, 3),
3352                              dtstart=datetime(1997, 9, 2, 9, 0)))
3353
3354    def testToStrWeeklyByMonthAndMonthDay(self):
3355        self._rrulestr_reverse_test(rrule(WEEKLY,
3356                              count=3,
3357                              bymonth=(1, 3),
3358                              bymonthday=(5, 7),
3359                              dtstart=datetime(1997, 9, 2, 9, 0)))
3360
3361    def testToStrWeeklyByWeekDay(self):
3362        self._rrulestr_reverse_test(rrule(WEEKLY,
3363                              count=3,
3364                              byweekday=(TU, TH),
3365                              dtstart=datetime(1997, 9, 2, 9, 0)))
3366
3367    def testToStrWeeklyByNWeekDay(self):
3368        self._rrulestr_reverse_test(rrule(WEEKLY,
3369                              count=3,
3370                              byweekday=(TU(1), TH(-1)),
3371                              dtstart=datetime(1997, 9, 2, 9, 0)))
3372
3373    def testToStrWeeklyByMonthAndWeekDay(self):
3374        # This test is interesting, because it crosses the year
3375        # boundary in a weekly period to find day '1' as a
3376        # valid recurrence.
3377        self._rrulestr_reverse_test(rrule(WEEKLY,
3378                              count=3,
3379                              bymonth=(1, 3),
3380                              byweekday=(TU, TH),
3381                              dtstart=datetime(1997, 9, 2, 9, 0)))
3382
3383    def testToStrWeeklyByMonthAndNWeekDay(self):
3384        self._rrulestr_reverse_test(rrule(WEEKLY,
3385                              count=3,
3386                              bymonth=(1, 3),
3387                              byweekday=(TU(1), TH(-1)),
3388                              dtstart=datetime(1997, 9, 2, 9, 0)))
3389
3390    def testToStrWeeklyByMonthDayAndWeekDay(self):
3391        self._rrulestr_reverse_test(rrule(WEEKLY,
3392                              count=3,
3393                              bymonthday=(1, 3),
3394                              byweekday=(TU, TH),
3395                              dtstart=datetime(1997, 9, 2, 9, 0)))
3396
3397    def testToStrWeeklyByMonthAndMonthDayAndWeekDay(self):
3398        self._rrulestr_reverse_test(rrule(WEEKLY,
3399                              count=3,
3400                              bymonth=(1, 3),
3401                              bymonthday=(1, 3),
3402                              byweekday=(TU, TH),
3403                              dtstart=datetime(1997, 9, 2, 9, 0)))
3404
3405    def testToStrWeeklyByYearDay(self):
3406        self._rrulestr_reverse_test(rrule(WEEKLY,
3407                              count=4,
3408                              byyearday=(1, 100, 200, 365),
3409                              dtstart=datetime(1997, 9, 2, 9, 0)))
3410
3411    def testToStrWeeklyByYearDayNeg(self):
3412        self._rrulestr_reverse_test(rrule(WEEKLY,
3413                              count=4,
3414                              byyearday=(-365, -266, -166, -1),
3415                              dtstart=datetime(1997, 9, 2, 9, 0)))
3416
3417    def testToStrWeeklyByMonthAndYearDay(self):
3418        self._rrulestr_reverse_test(rrule(WEEKLY,
3419                              count=4,
3420                              bymonth=(1, 7),
3421                              byyearday=(1, 100, 200, 365),
3422                              dtstart=datetime(1997, 9, 2, 9, 0)))
3423
3424    def testToStrWeeklyByMonthAndYearDayNeg(self):
3425        self._rrulestr_reverse_test(rrule(WEEKLY,
3426                              count=4,
3427                              bymonth=(1, 7),
3428                              byyearday=(-365, -266, -166, -1),
3429                              dtstart=datetime(1997, 9, 2, 9, 0)))
3430
3431    def testToStrWeeklyByWeekNo(self):
3432        self._rrulestr_reverse_test(rrule(WEEKLY,
3433                              count=3,
3434                              byweekno=20,
3435                              dtstart=datetime(1997, 9, 2, 9, 0)))
3436
3437    def testToStrWeeklyByWeekNoAndWeekDay(self):
3438        # That's a nice one. The first days of week number one
3439        # may be in the last year.
3440        self._rrulestr_reverse_test(rrule(WEEKLY,
3441                              count=3,
3442                              byweekno=1,
3443                              byweekday=MO,
3444                              dtstart=datetime(1997, 9, 2, 9, 0)))
3445
3446    def testToStrWeeklyByWeekNoAndWeekDayLarge(self):
3447        # Another nice test. The last days of week number 52/53
3448        # may be in the next year.
3449        self._rrulestr_reverse_test(rrule(WEEKLY,
3450                              count=3,
3451                              byweekno=52,
3452                              byweekday=SU,
3453                              dtstart=datetime(1997, 9, 2, 9, 0)))
3454
3455    def testToStrWeeklyByWeekNoAndWeekDayLast(self):
3456        self._rrulestr_reverse_test(rrule(WEEKLY,
3457                              count=3,
3458                              byweekno=-1,
3459                              byweekday=SU,
3460                              dtstart=datetime(1997, 9, 2, 9, 0)))
3461
3462    def testToStrWeeklyByWeekNoAndWeekDay53(self):
3463        self._rrulestr_reverse_test(rrule(WEEKLY,
3464                              count=3,
3465                              byweekno=53,
3466                              byweekday=MO,
3467                              dtstart=datetime(1997, 9, 2, 9, 0)))
3468
3469    def testToStrWeeklyByEaster(self):
3470        self._rrulestr_reverse_test(rrule(WEEKLY,
3471                              count=3,
3472                              byeaster=0,
3473                              dtstart=datetime(1997, 9, 2, 9, 0)))
3474
3475    def testToStrWeeklyByEasterPos(self):
3476        self._rrulestr_reverse_test(rrule(WEEKLY,
3477                              count=3,
3478                              byeaster=1,
3479                              dtstart=datetime(1997, 9, 2, 9, 0)))
3480
3481    def testToStrWeeklyByEasterNeg(self):
3482        self._rrulestr_reverse_test(rrule(WEEKLY,
3483                              count=3,
3484                              byeaster=-1,
3485                              dtstart=datetime(1997, 9, 2, 9, 0)))
3486
3487    def testToStrWeeklyByHour(self):
3488        self._rrulestr_reverse_test(rrule(WEEKLY,
3489                              count=3,
3490                              byhour=(6, 18),
3491                              dtstart=datetime(1997, 9, 2, 9, 0)))
3492
3493    def testToStrWeeklyByMinute(self):
3494        self._rrulestr_reverse_test(rrule(WEEKLY,
3495                              count=3,
3496                              byminute=(6, 18),
3497                              dtstart=datetime(1997, 9, 2, 9, 0)))
3498
3499    def testToStrWeeklyBySecond(self):
3500        self._rrulestr_reverse_test(rrule(WEEKLY,
3501                              count=3,
3502                              bysecond=(6, 18),
3503                              dtstart=datetime(1997, 9, 2, 9, 0)))
3504
3505    def testToStrWeeklyByHourAndMinute(self):
3506        self._rrulestr_reverse_test(rrule(WEEKLY,
3507                              count=3,
3508                              byhour=(6, 18),
3509                              byminute=(6, 18),
3510                              dtstart=datetime(1997, 9, 2, 9, 0)))
3511
3512    def testToStrWeeklyByHourAndSecond(self):
3513        self._rrulestr_reverse_test(rrule(WEEKLY,
3514                              count=3,
3515                              byhour=(6, 18),
3516                              bysecond=(6, 18),
3517                              dtstart=datetime(1997, 9, 2, 9, 0)))
3518
3519    def testToStrWeeklyByMinuteAndSecond(self):
3520        self._rrulestr_reverse_test(rrule(WEEKLY,
3521                              count=3,
3522                              byminute=(6, 18),
3523                              bysecond=(6, 18),
3524                              dtstart=datetime(1997, 9, 2, 9, 0)))
3525
3526    def testToStrWeeklyByHourAndMinuteAndSecond(self):
3527        self._rrulestr_reverse_test(rrule(WEEKLY,
3528                              count=3,
3529                              byhour=(6, 18),
3530                              byminute=(6, 18),
3531                              bysecond=(6, 18),
3532                              dtstart=datetime(1997, 9, 2, 9, 0)))
3533
3534    def testToStrWeeklyBySetPos(self):
3535        self._rrulestr_reverse_test(rrule(WEEKLY,
3536                              count=3,
3537                              byweekday=(TU, TH),
3538                              byhour=(6, 18),
3539                              bysetpos=(3, -3),
3540                              dtstart=datetime(1997, 9, 2, 9, 0)))
3541
3542    def testToStrDaily(self):
3543        self._rrulestr_reverse_test(rrule(DAILY,
3544                              count=3,
3545                              dtstart=datetime(1997, 9, 2, 9, 0)))
3546
3547    def testToStrDailyInterval(self):
3548        self._rrulestr_reverse_test(rrule(DAILY,
3549                              count=3,
3550                              interval=2,
3551                              dtstart=datetime(1997, 9, 2, 9, 0)))
3552
3553    def testToStrDailyIntervalLarge(self):
3554        self._rrulestr_reverse_test(rrule(DAILY,
3555                              count=3,
3556                              interval=92,
3557                              dtstart=datetime(1997, 9, 2, 9, 0)))
3558
3559    def testToStrDailyByMonth(self):
3560        self._rrulestr_reverse_test(rrule(DAILY,
3561                              count=3,
3562                              bymonth=(1, 3),
3563                              dtstart=datetime(1997, 9, 2, 9, 0)))
3564
3565    def testToStrDailyByMonthDay(self):
3566        self._rrulestr_reverse_test(rrule(DAILY,
3567                              count=3,
3568                              bymonthday=(1, 3),
3569                              dtstart=datetime(1997, 9, 2, 9, 0)))
3570
3571    def testToStrDailyByMonthAndMonthDay(self):
3572        self._rrulestr_reverse_test(rrule(DAILY,
3573                              count=3,
3574                              bymonth=(1, 3),
3575                              bymonthday=(5, 7),
3576                              dtstart=datetime(1997, 9, 2, 9, 0)))
3577
3578    def testToStrDailyByWeekDay(self):
3579        self._rrulestr_reverse_test(rrule(DAILY,
3580                              count=3,
3581                              byweekday=(TU, TH),
3582                              dtstart=datetime(1997, 9, 2, 9, 0)))
3583
3584    def testToStrDailyByNWeekDay(self):
3585        self._rrulestr_reverse_test(rrule(DAILY,
3586                              count=3,
3587                              byweekday=(TU(1), TH(-1)),
3588                              dtstart=datetime(1997, 9, 2, 9, 0)))
3589
3590    def testToStrDailyByMonthAndWeekDay(self):
3591        self._rrulestr_reverse_test(rrule(DAILY,
3592                              count=3,
3593                              bymonth=(1, 3),
3594                              byweekday=(TU, TH),
3595                              dtstart=datetime(1997, 9, 2, 9, 0)))
3596
3597    def testToStrDailyByMonthAndNWeekDay(self):
3598        self._rrulestr_reverse_test(rrule(DAILY,
3599                              count=3,
3600                              bymonth=(1, 3),
3601                              byweekday=(TU(1), TH(-1)),
3602                              dtstart=datetime(1997, 9, 2, 9, 0)))
3603
3604    def testToStrDailyByMonthDayAndWeekDay(self):
3605        self._rrulestr_reverse_test(rrule(DAILY,
3606                              count=3,
3607                              bymonthday=(1, 3),
3608                              byweekday=(TU, TH),
3609                              dtstart=datetime(1997, 9, 2, 9, 0)))
3610
3611    def testToStrDailyByMonthAndMonthDayAndWeekDay(self):
3612        self._rrulestr_reverse_test(rrule(DAILY,
3613                              count=3,
3614                              bymonth=(1, 3),
3615                              bymonthday=(1, 3),
3616                              byweekday=(TU, TH),
3617                              dtstart=datetime(1997, 9, 2, 9, 0)))
3618
3619    def testToStrDailyByYearDay(self):
3620        self._rrulestr_reverse_test(rrule(DAILY,
3621                              count=4,
3622                              byyearday=(1, 100, 200, 365),
3623                              dtstart=datetime(1997, 9, 2, 9, 0)))
3624
3625    def testToStrDailyByYearDayNeg(self):
3626        self._rrulestr_reverse_test(rrule(DAILY,
3627                              count=4,
3628                              byyearday=(-365, -266, -166, -1),
3629                              dtstart=datetime(1997, 9, 2, 9, 0)))
3630
3631    def testToStrDailyByMonthAndYearDay(self):
3632        self._rrulestr_reverse_test(rrule(DAILY,
3633                              count=4,
3634                              bymonth=(1, 7),
3635                              byyearday=(1, 100, 200, 365),
3636                              dtstart=datetime(1997, 9, 2, 9, 0)))
3637
3638    def testToStrDailyByMonthAndYearDayNeg(self):
3639        self._rrulestr_reverse_test(rrule(DAILY,
3640                              count=4,
3641                              bymonth=(1, 7),
3642                              byyearday=(-365, -266, -166, -1),
3643                              dtstart=datetime(1997, 9, 2, 9, 0)))
3644
3645    def testToStrDailyByWeekNo(self):
3646        self._rrulestr_reverse_test(rrule(DAILY,
3647                              count=3,
3648                              byweekno=20,
3649                              dtstart=datetime(1997, 9, 2, 9, 0)))
3650
3651    def testToStrDailyByWeekNoAndWeekDay(self):
3652        # That's a nice one. The first days of week number one
3653        # may be in the last year.
3654        self._rrulestr_reverse_test(rrule(DAILY,
3655                              count=3,
3656                              byweekno=1,
3657                              byweekday=MO,
3658                              dtstart=datetime(1997, 9, 2, 9, 0)))
3659
3660    def testToStrDailyByWeekNoAndWeekDayLarge(self):
3661        # Another nice test. The last days of week number 52/53
3662        # may be in the next year.
3663        self._rrulestr_reverse_test(rrule(DAILY,
3664                              count=3,
3665                              byweekno=52,
3666                              byweekday=SU,
3667                              dtstart=datetime(1997, 9, 2, 9, 0)))
3668
3669    def testToStrDailyByWeekNoAndWeekDayLast(self):
3670        self._rrulestr_reverse_test(rrule(DAILY,
3671                              count=3,
3672                              byweekno=-1,
3673                              byweekday=SU,
3674                              dtstart=datetime(1997, 9, 2, 9, 0)))
3675
3676    def testToStrDailyByWeekNoAndWeekDay53(self):
3677        self._rrulestr_reverse_test(rrule(DAILY,
3678                              count=3,
3679                              byweekno=53,
3680                              byweekday=MO,
3681                              dtstart=datetime(1997, 9, 2, 9, 0)))
3682
3683    def testToStrDailyByEaster(self):
3684        self._rrulestr_reverse_test(rrule(DAILY,
3685                              count=3,
3686                              byeaster=0,
3687                              dtstart=datetime(1997, 9, 2, 9, 0)))
3688
3689    def testToStrDailyByEasterPos(self):
3690        self._rrulestr_reverse_test(rrule(DAILY,
3691                              count=3,
3692                              byeaster=1,
3693                              dtstart=datetime(1997, 9, 2, 9, 0)))
3694
3695    def testToStrDailyByEasterNeg(self):
3696        self._rrulestr_reverse_test(rrule(DAILY,
3697                              count=3,
3698                              byeaster=-1,
3699                              dtstart=datetime(1997, 9, 2, 9, 0)))
3700
3701    def testToStrDailyByHour(self):
3702        self._rrulestr_reverse_test(rrule(DAILY,
3703                              count=3,
3704                              byhour=(6, 18),
3705                              dtstart=datetime(1997, 9, 2, 9, 0)))
3706
3707    def testToStrDailyByMinute(self):
3708        self._rrulestr_reverse_test(rrule(DAILY,
3709                              count=3,
3710                              byminute=(6, 18),
3711                              dtstart=datetime(1997, 9, 2, 9, 0)))
3712
3713    def testToStrDailyBySecond(self):
3714        self._rrulestr_reverse_test(rrule(DAILY,
3715                              count=3,
3716                              bysecond=(6, 18),
3717                              dtstart=datetime(1997, 9, 2, 9, 0)))
3718
3719    def testToStrDailyByHourAndMinute(self):
3720        self._rrulestr_reverse_test(rrule(DAILY,
3721                              count=3,
3722                              byhour=(6, 18),
3723                              byminute=(6, 18),
3724                              dtstart=datetime(1997, 9, 2, 9, 0)))
3725
3726    def testToStrDailyByHourAndSecond(self):
3727        self._rrulestr_reverse_test(rrule(DAILY,
3728                              count=3,
3729                              byhour=(6, 18),
3730                              bysecond=(6, 18),
3731                              dtstart=datetime(1997, 9, 2, 9, 0)))
3732
3733    def testToStrDailyByMinuteAndSecond(self):
3734        self._rrulestr_reverse_test(rrule(DAILY,
3735                              count=3,
3736                              byminute=(6, 18),
3737                              bysecond=(6, 18),
3738                              dtstart=datetime(1997, 9, 2, 9, 0)))
3739
3740    def testToStrDailyByHourAndMinuteAndSecond(self):
3741        self._rrulestr_reverse_test(rrule(DAILY,
3742                              count=3,
3743                              byhour=(6, 18),
3744                              byminute=(6, 18),
3745                              bysecond=(6, 18),
3746                              dtstart=datetime(1997, 9, 2, 9, 0)))
3747
3748    def testToStrDailyBySetPos(self):
3749        self._rrulestr_reverse_test(rrule(DAILY,
3750                              count=3,
3751                              byhour=(6, 18),
3752                              byminute=(15, 45),
3753                              bysetpos=(3, -3),
3754                              dtstart=datetime(1997, 9, 2, 9, 0)))
3755
3756    def testToStrHourly(self):
3757        self._rrulestr_reverse_test(rrule(HOURLY,
3758                              count=3,
3759                              dtstart=datetime(1997, 9, 2, 9, 0)))
3760
3761    def testToStrHourlyInterval(self):
3762        self._rrulestr_reverse_test(rrule(HOURLY,
3763                              count=3,
3764                              interval=2,
3765                              dtstart=datetime(1997, 9, 2, 9, 0)))
3766
3767    def testToStrHourlyIntervalLarge(self):
3768        self._rrulestr_reverse_test(rrule(HOURLY,
3769                              count=3,
3770                              interval=769,
3771                              dtstart=datetime(1997, 9, 2, 9, 0)))
3772
3773    def testToStrHourlyByMonth(self):
3774        self._rrulestr_reverse_test(rrule(HOURLY,
3775                              count=3,
3776                              bymonth=(1, 3),
3777                              dtstart=datetime(1997, 9, 2, 9, 0)))
3778
3779    def testToStrHourlyByMonthDay(self):
3780        self._rrulestr_reverse_test(rrule(HOURLY,
3781                              count=3,
3782                              bymonthday=(1, 3),
3783                              dtstart=datetime(1997, 9, 2, 9, 0)))
3784
3785    def testToStrHourlyByMonthAndMonthDay(self):
3786        self._rrulestr_reverse_test(rrule(HOURLY,
3787                              count=3,
3788                              bymonth=(1, 3),
3789                              bymonthday=(5, 7),
3790                              dtstart=datetime(1997, 9, 2, 9, 0)))
3791
3792    def testToStrHourlyByWeekDay(self):
3793        self._rrulestr_reverse_test(rrule(HOURLY,
3794                              count=3,
3795                              byweekday=(TU, TH),
3796                              dtstart=datetime(1997, 9, 2, 9, 0)))
3797
3798    def testToStrHourlyByNWeekDay(self):
3799        self._rrulestr_reverse_test(rrule(HOURLY,
3800                              count=3,
3801                              byweekday=(TU(1), TH(-1)),
3802                              dtstart=datetime(1997, 9, 2, 9, 0)))
3803
3804    def testToStrHourlyByMonthAndWeekDay(self):
3805        self._rrulestr_reverse_test(rrule(HOURLY,
3806                              count=3,
3807                              bymonth=(1, 3),
3808                              byweekday=(TU, TH),
3809                              dtstart=datetime(1997, 9, 2, 9, 0)))
3810
3811    def testToStrHourlyByMonthAndNWeekDay(self):
3812        self._rrulestr_reverse_test(rrule(HOURLY,
3813                              count=3,
3814                              bymonth=(1, 3),
3815                              byweekday=(TU(1), TH(-1)),
3816                              dtstart=datetime(1997, 9, 2, 9, 0)))
3817
3818    def testToStrHourlyByMonthDayAndWeekDay(self):
3819        self._rrulestr_reverse_test(rrule(HOURLY,
3820                              count=3,
3821                              bymonthday=(1, 3),
3822                              byweekday=(TU, TH),
3823                              dtstart=datetime(1997, 9, 2, 9, 0)))
3824
3825    def testToStrHourlyByMonthAndMonthDayAndWeekDay(self):
3826        self._rrulestr_reverse_test(rrule(HOURLY,
3827                              count=3,
3828                              bymonth=(1, 3),
3829                              bymonthday=(1, 3),
3830                              byweekday=(TU, TH),
3831                              dtstart=datetime(1997, 9, 2, 9, 0)))
3832
3833    def testToStrHourlyByYearDay(self):
3834        self._rrulestr_reverse_test(rrule(HOURLY,
3835                              count=4,
3836                              byyearday=(1, 100, 200, 365),
3837                              dtstart=datetime(1997, 9, 2, 9, 0)))
3838
3839    def testToStrHourlyByYearDayNeg(self):
3840        self._rrulestr_reverse_test(rrule(HOURLY,
3841                              count=4,
3842                              byyearday=(-365, -266, -166, -1),
3843                              dtstart=datetime(1997, 9, 2, 9, 0)))
3844
3845    def testToStrHourlyByMonthAndYearDay(self):
3846        self._rrulestr_reverse_test(rrule(HOURLY,
3847                              count=4,
3848                              bymonth=(4, 7),
3849                              byyearday=(1, 100, 200, 365),
3850                              dtstart=datetime(1997, 9, 2, 9, 0)))
3851
3852    def testToStrHourlyByMonthAndYearDayNeg(self):
3853        self._rrulestr_reverse_test(rrule(HOURLY,
3854                              count=4,
3855                              bymonth=(4, 7),
3856                              byyearday=(-365, -266, -166, -1),
3857                              dtstart=datetime(1997, 9, 2, 9, 0)))
3858
3859    def testToStrHourlyByWeekNo(self):
3860        self._rrulestr_reverse_test(rrule(HOURLY,
3861                              count=3,
3862                              byweekno=20,
3863                              dtstart=datetime(1997, 9, 2, 9, 0)))
3864
3865    def testToStrHourlyByWeekNoAndWeekDay(self):
3866        self._rrulestr_reverse_test(rrule(HOURLY,
3867                              count=3,
3868                              byweekno=1,
3869                              byweekday=MO,
3870                              dtstart=datetime(1997, 9, 2, 9, 0)))
3871
3872    def testToStrHourlyByWeekNoAndWeekDayLarge(self):
3873        self._rrulestr_reverse_test(rrule(HOURLY,
3874                              count=3,
3875                              byweekno=52,
3876                              byweekday=SU,
3877                              dtstart=datetime(1997, 9, 2, 9, 0)))
3878
3879    def testToStrHourlyByWeekNoAndWeekDayLast(self):
3880        self._rrulestr_reverse_test(rrule(HOURLY,
3881                              count=3,
3882                              byweekno=-1,
3883                              byweekday=SU,
3884                              dtstart=datetime(1997, 9, 2, 9, 0)))
3885
3886    def testToStrHourlyByWeekNoAndWeekDay53(self):
3887        self._rrulestr_reverse_test(rrule(HOURLY,
3888                              count=3,
3889                              byweekno=53,
3890                              byweekday=MO,
3891                              dtstart=datetime(1997, 9, 2, 9, 0)))
3892
3893    def testToStrHourlyByEaster(self):
3894        self._rrulestr_reverse_test(rrule(HOURLY,
3895                              count=3,
3896                              byeaster=0,
3897                              dtstart=datetime(1997, 9, 2, 9, 0)))
3898
3899    def testToStrHourlyByEasterPos(self):
3900        self._rrulestr_reverse_test(rrule(HOURLY,
3901                              count=3,
3902                              byeaster=1,
3903                              dtstart=datetime(1997, 9, 2, 9, 0)))
3904
3905    def testToStrHourlyByEasterNeg(self):
3906        self._rrulestr_reverse_test(rrule(HOURLY,
3907                              count=3,
3908                              byeaster=-1,
3909                              dtstart=datetime(1997, 9, 2, 9, 0)))
3910
3911    def testToStrHourlyByHour(self):
3912        self._rrulestr_reverse_test(rrule(HOURLY,
3913                              count=3,
3914                              byhour=(6, 18),
3915                              dtstart=datetime(1997, 9, 2, 9, 0)))
3916
3917    def testToStrHourlyByMinute(self):
3918        self._rrulestr_reverse_test(rrule(HOURLY,
3919                              count=3,
3920                              byminute=(6, 18),
3921                              dtstart=datetime(1997, 9, 2, 9, 0)))
3922
3923    def testToStrHourlyBySecond(self):
3924        self._rrulestr_reverse_test(rrule(HOURLY,
3925                              count=3,
3926                              bysecond=(6, 18),
3927                              dtstart=datetime(1997, 9, 2, 9, 0)))
3928
3929    def testToStrHourlyByHourAndMinute(self):
3930        self._rrulestr_reverse_test(rrule(HOURLY,
3931                              count=3,
3932                              byhour=(6, 18),
3933                              byminute=(6, 18),
3934                              dtstart=datetime(1997, 9, 2, 9, 0)))
3935
3936    def testToStrHourlyByHourAndSecond(self):
3937        self._rrulestr_reverse_test(rrule(HOURLY,
3938                              count=3,
3939                              byhour=(6, 18),
3940                              bysecond=(6, 18),
3941                              dtstart=datetime(1997, 9, 2, 9, 0)))
3942
3943    def testToStrHourlyByMinuteAndSecond(self):
3944        self._rrulestr_reverse_test(rrule(HOURLY,
3945                              count=3,
3946                              byminute=(6, 18),
3947                              bysecond=(6, 18),
3948                              dtstart=datetime(1997, 9, 2, 9, 0)))
3949
3950    def testToStrHourlyByHourAndMinuteAndSecond(self):
3951        self._rrulestr_reverse_test(rrule(HOURLY,
3952                              count=3,
3953                              byhour=(6, 18),
3954                              byminute=(6, 18),
3955                              bysecond=(6, 18),
3956                              dtstart=datetime(1997, 9, 2, 9, 0)))
3957
3958    def testToStrHourlyBySetPos(self):
3959        self._rrulestr_reverse_test(rrule(HOURLY,
3960                              count=3,
3961                              byminute=(15, 45),
3962                              bysecond=(15, 45),
3963                              bysetpos=(3, -3),
3964                              dtstart=datetime(1997, 9, 2, 9, 0)))
3965
3966    def testToStrMinutely(self):
3967        self._rrulestr_reverse_test(rrule(MINUTELY,
3968                              count=3,
3969                              dtstart=datetime(1997, 9, 2, 9, 0)))
3970
3971    def testToStrMinutelyInterval(self):
3972        self._rrulestr_reverse_test(rrule(MINUTELY,
3973                              count=3,
3974                              interval=2,
3975                              dtstart=datetime(1997, 9, 2, 9, 0)))
3976
3977    def testToStrMinutelyIntervalLarge(self):
3978        self._rrulestr_reverse_test(rrule(MINUTELY,
3979                              count=3,
3980                              interval=1501,
3981                              dtstart=datetime(1997, 9, 2, 9, 0)))
3982
3983    def testToStrMinutelyByMonth(self):
3984        self._rrulestr_reverse_test(rrule(MINUTELY,
3985                              count=3,
3986                              bymonth=(1, 3),
3987                              dtstart=datetime(1997, 9, 2, 9, 0)))
3988
3989    def testToStrMinutelyByMonthDay(self):
3990        self._rrulestr_reverse_test(rrule(MINUTELY,
3991                              count=3,
3992                              bymonthday=(1, 3),
3993                              dtstart=datetime(1997, 9, 2, 9, 0)))
3994
3995    def testToStrMinutelyByMonthAndMonthDay(self):
3996        self._rrulestr_reverse_test(rrule(MINUTELY,
3997                              count=3,
3998                              bymonth=(1, 3),
3999                              bymonthday=(5, 7),
4000                              dtstart=datetime(1997, 9, 2, 9, 0)))
4001
4002    def testToStrMinutelyByWeekDay(self):
4003        self._rrulestr_reverse_test(rrule(MINUTELY,
4004                              count=3,
4005                              byweekday=(TU, TH),
4006                              dtstart=datetime(1997, 9, 2, 9, 0)))
4007
4008    def testToStrMinutelyByNWeekDay(self):
4009        self._rrulestr_reverse_test(rrule(MINUTELY,
4010                              count=3,
4011                              byweekday=(TU(1), TH(-1)),
4012                              dtstart=datetime(1997, 9, 2, 9, 0)))
4013
4014    def testToStrMinutelyByMonthAndWeekDay(self):
4015        self._rrulestr_reverse_test(rrule(MINUTELY,
4016                              count=3,
4017                              bymonth=(1, 3),
4018                              byweekday=(TU, TH),
4019                              dtstart=datetime(1997, 9, 2, 9, 0)))
4020
4021    def testToStrMinutelyByMonthAndNWeekDay(self):
4022        self._rrulestr_reverse_test(rrule(MINUTELY,
4023                              count=3,
4024                              bymonth=(1, 3),
4025                              byweekday=(TU(1), TH(-1)),
4026                              dtstart=datetime(1997, 9, 2, 9, 0)))
4027
4028    def testToStrMinutelyByMonthDayAndWeekDay(self):
4029        self._rrulestr_reverse_test(rrule(MINUTELY,
4030                              count=3,
4031                              bymonthday=(1, 3),
4032                              byweekday=(TU, TH),
4033                              dtstart=datetime(1997, 9, 2, 9, 0)))
4034
4035    def testToStrMinutelyByMonthAndMonthDayAndWeekDay(self):
4036        self._rrulestr_reverse_test(rrule(MINUTELY,
4037                              count=3,
4038                              bymonth=(1, 3),
4039                              bymonthday=(1, 3),
4040                              byweekday=(TU, TH),
4041                              dtstart=datetime(1997, 9, 2, 9, 0)))
4042
4043    def testToStrMinutelyByYearDay(self):
4044        self._rrulestr_reverse_test(rrule(MINUTELY,
4045                              count=4,
4046                              byyearday=(1, 100, 200, 365),
4047                              dtstart=datetime(1997, 9, 2, 9, 0)))
4048
4049    def testToStrMinutelyByYearDayNeg(self):
4050        self._rrulestr_reverse_test(rrule(MINUTELY,
4051                              count=4,
4052                              byyearday=(-365, -266, -166, -1),
4053                              dtstart=datetime(1997, 9, 2, 9, 0)))
4054
4055    def testToStrMinutelyByMonthAndYearDay(self):
4056        self._rrulestr_reverse_test(rrule(MINUTELY,
4057                              count=4,
4058                              bymonth=(4, 7),
4059                              byyearday=(1, 100, 200, 365),
4060                              dtstart=datetime(1997, 9, 2, 9, 0)))
4061
4062    def testToStrMinutelyByMonthAndYearDayNeg(self):
4063        self._rrulestr_reverse_test(rrule(MINUTELY,
4064                              count=4,
4065                              bymonth=(4, 7),
4066                              byyearday=(-365, -266, -166, -1),
4067                              dtstart=datetime(1997, 9, 2, 9, 0)))
4068
4069    def testToStrMinutelyByWeekNo(self):
4070        self._rrulestr_reverse_test(rrule(MINUTELY,
4071                              count=3,
4072                              byweekno=20,
4073                              dtstart=datetime(1997, 9, 2, 9, 0)))
4074
4075    def testToStrMinutelyByWeekNoAndWeekDay(self):
4076        self._rrulestr_reverse_test(rrule(MINUTELY,
4077                              count=3,
4078                              byweekno=1,
4079                              byweekday=MO,
4080                              dtstart=datetime(1997, 9, 2, 9, 0)))
4081
4082    def testToStrMinutelyByWeekNoAndWeekDayLarge(self):
4083        self._rrulestr_reverse_test(rrule(MINUTELY,
4084                              count=3,
4085                              byweekno=52,
4086                              byweekday=SU,
4087                              dtstart=datetime(1997, 9, 2, 9, 0)))
4088
4089    def testToStrMinutelyByWeekNoAndWeekDayLast(self):
4090        self._rrulestr_reverse_test(rrule(MINUTELY,
4091                              count=3,
4092                              byweekno=-1,
4093                              byweekday=SU,
4094                              dtstart=datetime(1997, 9, 2, 9, 0)))
4095
4096    def testToStrMinutelyByWeekNoAndWeekDay53(self):
4097        self._rrulestr_reverse_test(rrule(MINUTELY,
4098                              count=3,
4099                              byweekno=53,
4100                              byweekday=MO,
4101                              dtstart=datetime(1997, 9, 2, 9, 0)))
4102
4103    def testToStrMinutelyByEaster(self):
4104        self._rrulestr_reverse_test(rrule(MINUTELY,
4105                              count=3,
4106                              byeaster=0,
4107                              dtstart=datetime(1997, 9, 2, 9, 0)))
4108
4109    def testToStrMinutelyByEasterPos(self):
4110        self._rrulestr_reverse_test(rrule(MINUTELY,
4111                              count=3,
4112                              byeaster=1,
4113                              dtstart=datetime(1997, 9, 2, 9, 0)))
4114
4115    def testToStrMinutelyByEasterNeg(self):
4116        self._rrulestr_reverse_test(rrule(MINUTELY,
4117                              count=3,
4118                              byeaster=-1,
4119                              dtstart=datetime(1997, 9, 2, 9, 0)))
4120
4121    def testToStrMinutelyByHour(self):
4122        self._rrulestr_reverse_test(rrule(MINUTELY,
4123                              count=3,
4124                              byhour=(6, 18),
4125                              dtstart=datetime(1997, 9, 2, 9, 0)))
4126
4127    def testToStrMinutelyByMinute(self):
4128        self._rrulestr_reverse_test(rrule(MINUTELY,
4129                              count=3,
4130                              byminute=(6, 18),
4131                              dtstart=datetime(1997, 9, 2, 9, 0)))
4132
4133    def testToStrMinutelyBySecond(self):
4134        self._rrulestr_reverse_test(rrule(MINUTELY,
4135                              count=3,
4136                              bysecond=(6, 18),
4137                              dtstart=datetime(1997, 9, 2, 9, 0)))
4138
4139    def testToStrMinutelyByHourAndMinute(self):
4140        self._rrulestr_reverse_test(rrule(MINUTELY,
4141                              count=3,
4142                              byhour=(6, 18),
4143                              byminute=(6, 18),
4144                              dtstart=datetime(1997, 9, 2, 9, 0)))
4145
4146    def testToStrMinutelyByHourAndSecond(self):
4147        self._rrulestr_reverse_test(rrule(MINUTELY,
4148                              count=3,
4149                              byhour=(6, 18),
4150                              bysecond=(6, 18),
4151                              dtstart=datetime(1997, 9, 2, 9, 0)))
4152
4153    def testToStrMinutelyByMinuteAndSecond(self):
4154        self._rrulestr_reverse_test(rrule(MINUTELY,
4155                              count=3,
4156                              byminute=(6, 18),
4157                              bysecond=(6, 18),
4158                              dtstart=datetime(1997, 9, 2, 9, 0)))
4159
4160    def testToStrMinutelyByHourAndMinuteAndSecond(self):
4161        self._rrulestr_reverse_test(rrule(MINUTELY,
4162                              count=3,
4163                              byhour=(6, 18),
4164                              byminute=(6, 18),
4165                              bysecond=(6, 18),
4166                              dtstart=datetime(1997, 9, 2, 9, 0)))
4167
4168    def testToStrMinutelyBySetPos(self):
4169        self._rrulestr_reverse_test(rrule(MINUTELY,
4170                              count=3,
4171                              bysecond=(15, 30, 45),
4172                              bysetpos=(3, -3),
4173                              dtstart=datetime(1997, 9, 2, 9, 0)))
4174
4175    def testToStrSecondly(self):
4176        self._rrulestr_reverse_test(rrule(SECONDLY,
4177                              count=3,
4178                              dtstart=datetime(1997, 9, 2, 9, 0)))
4179
4180    def testToStrSecondlyInterval(self):
4181        self._rrulestr_reverse_test(rrule(SECONDLY,
4182                              count=3,
4183                              interval=2,
4184                              dtstart=datetime(1997, 9, 2, 9, 0)))
4185
4186    def testToStrSecondlyIntervalLarge(self):
4187        self._rrulestr_reverse_test(rrule(SECONDLY,
4188                              count=3,
4189                              interval=90061,
4190                              dtstart=datetime(1997, 9, 2, 9, 0)))
4191
4192    def testToStrSecondlyByMonth(self):
4193        self._rrulestr_reverse_test(rrule(SECONDLY,
4194                              count=3,
4195                              bymonth=(1, 3),
4196                              dtstart=datetime(1997, 9, 2, 9, 0)))
4197
4198    def testToStrSecondlyByMonthDay(self):
4199        self._rrulestr_reverse_test(rrule(SECONDLY,
4200                              count=3,
4201                              bymonthday=(1, 3),
4202                              dtstart=datetime(1997, 9, 2, 9, 0)))
4203
4204    def testToStrSecondlyByMonthAndMonthDay(self):
4205        self._rrulestr_reverse_test(rrule(SECONDLY,
4206                              count=3,
4207                              bymonth=(1, 3),
4208                              bymonthday=(5, 7),
4209                              dtstart=datetime(1997, 9, 2, 9, 0)))
4210
4211    def testToStrSecondlyByWeekDay(self):
4212        self._rrulestr_reverse_test(rrule(SECONDLY,
4213                              count=3,
4214                              byweekday=(TU, TH),
4215                              dtstart=datetime(1997, 9, 2, 9, 0)))
4216
4217    def testToStrSecondlyByNWeekDay(self):
4218        self._rrulestr_reverse_test(rrule(SECONDLY,
4219                              count=3,
4220                              byweekday=(TU(1), TH(-1)),
4221                              dtstart=datetime(1997, 9, 2, 9, 0)))
4222
4223    def testToStrSecondlyByMonthAndWeekDay(self):
4224        self._rrulestr_reverse_test(rrule(SECONDLY,
4225                              count=3,
4226                              bymonth=(1, 3),
4227                              byweekday=(TU, TH),
4228                              dtstart=datetime(1997, 9, 2, 9, 0)))
4229
4230    def testToStrSecondlyByMonthAndNWeekDay(self):
4231        self._rrulestr_reverse_test(rrule(SECONDLY,
4232                              count=3,
4233                              bymonth=(1, 3),
4234                              byweekday=(TU(1), TH(-1)),
4235                              dtstart=datetime(1997, 9, 2, 9, 0)))
4236
4237    def testToStrSecondlyByMonthDayAndWeekDay(self):
4238        self._rrulestr_reverse_test(rrule(SECONDLY,
4239                              count=3,
4240                              bymonthday=(1, 3),
4241                              byweekday=(TU, TH),
4242                              dtstart=datetime(1997, 9, 2, 9, 0)))
4243
4244    def testToStrSecondlyByMonthAndMonthDayAndWeekDay(self):
4245        self._rrulestr_reverse_test(rrule(SECONDLY,
4246                              count=3,
4247                              bymonth=(1, 3),
4248                              bymonthday=(1, 3),
4249                              byweekday=(TU, TH),
4250                              dtstart=datetime(1997, 9, 2, 9, 0)))
4251
4252    def testToStrSecondlyByYearDay(self):
4253        self._rrulestr_reverse_test(rrule(SECONDLY,
4254                              count=4,
4255                              byyearday=(1, 100, 200, 365),
4256                              dtstart=datetime(1997, 9, 2, 9, 0)))
4257
4258    def testToStrSecondlyByYearDayNeg(self):
4259        self._rrulestr_reverse_test(rrule(SECONDLY,
4260                              count=4,
4261                              byyearday=(-365, -266, -166, -1),
4262                              dtstart=datetime(1997, 9, 2, 9, 0)))
4263
4264    def testToStrSecondlyByMonthAndYearDay(self):
4265        self._rrulestr_reverse_test(rrule(SECONDLY,
4266                              count=4,
4267                              bymonth=(4, 7),
4268                              byyearday=(1, 100, 200, 365),
4269                              dtstart=datetime(1997, 9, 2, 9, 0)))
4270
4271    def testToStrSecondlyByMonthAndYearDayNeg(self):
4272        self._rrulestr_reverse_test(rrule(SECONDLY,
4273                              count=4,
4274                              bymonth=(4, 7),
4275                              byyearday=(-365, -266, -166, -1),
4276                              dtstart=datetime(1997, 9, 2, 9, 0)))
4277
4278    def testToStrSecondlyByWeekNo(self):
4279        self._rrulestr_reverse_test(rrule(SECONDLY,
4280                              count=3,
4281                              byweekno=20,
4282                              dtstart=datetime(1997, 9, 2, 9, 0)))
4283
4284    def testToStrSecondlyByWeekNoAndWeekDay(self):
4285        self._rrulestr_reverse_test(rrule(SECONDLY,
4286                              count=3,
4287                              byweekno=1,
4288                              byweekday=MO,
4289                              dtstart=datetime(1997, 9, 2, 9, 0)))
4290
4291    def testToStrSecondlyByWeekNoAndWeekDayLarge(self):
4292        self._rrulestr_reverse_test(rrule(SECONDLY,
4293                              count=3,
4294                              byweekno=52,
4295                              byweekday=SU,
4296                              dtstart=datetime(1997, 9, 2, 9, 0)))
4297
4298    def testToStrSecondlyByWeekNoAndWeekDayLast(self):
4299        self._rrulestr_reverse_test(rrule(SECONDLY,
4300                              count=3,
4301                              byweekno=-1,
4302                              byweekday=SU,
4303                              dtstart=datetime(1997, 9, 2, 9, 0)))
4304
4305    def testToStrSecondlyByWeekNoAndWeekDay53(self):
4306        self._rrulestr_reverse_test(rrule(SECONDLY,
4307                              count=3,
4308                              byweekno=53,
4309                              byweekday=MO,
4310                              dtstart=datetime(1997, 9, 2, 9, 0)))
4311
4312    def testToStrSecondlyByEaster(self):
4313        self._rrulestr_reverse_test(rrule(SECONDLY,
4314                              count=3,
4315                              byeaster=0,
4316                              dtstart=datetime(1997, 9, 2, 9, 0)))
4317
4318    def testToStrSecondlyByEasterPos(self):
4319        self._rrulestr_reverse_test(rrule(SECONDLY,
4320                              count=3,
4321                              byeaster=1,
4322                              dtstart=datetime(1997, 9, 2, 9, 0)))
4323
4324    def testToStrSecondlyByEasterNeg(self):
4325        self._rrulestr_reverse_test(rrule(SECONDLY,
4326                              count=3,
4327                              byeaster=-1,
4328                              dtstart=datetime(1997, 9, 2, 9, 0)))
4329
4330    def testToStrSecondlyByHour(self):
4331        self._rrulestr_reverse_test(rrule(SECONDLY,
4332                              count=3,
4333                              byhour=(6, 18),
4334                              dtstart=datetime(1997, 9, 2, 9, 0)))
4335
4336    def testToStrSecondlyByMinute(self):
4337        self._rrulestr_reverse_test(rrule(SECONDLY,
4338                              count=3,
4339                              byminute=(6, 18),
4340                              dtstart=datetime(1997, 9, 2, 9, 0)))
4341
4342    def testToStrSecondlyBySecond(self):
4343        self._rrulestr_reverse_test(rrule(SECONDLY,
4344                              count=3,
4345                              bysecond=(6, 18),
4346                              dtstart=datetime(1997, 9, 2, 9, 0)))
4347
4348    def testToStrSecondlyByHourAndMinute(self):
4349        self._rrulestr_reverse_test(rrule(SECONDLY,
4350                              count=3,
4351                              byhour=(6, 18),
4352                              byminute=(6, 18),
4353                              dtstart=datetime(1997, 9, 2, 9, 0)))
4354
4355    def testToStrSecondlyByHourAndSecond(self):
4356        self._rrulestr_reverse_test(rrule(SECONDLY,
4357                              count=3,
4358                              byhour=(6, 18),
4359                              bysecond=(6, 18),
4360                              dtstart=datetime(1997, 9, 2, 9, 0)))
4361
4362    def testToStrSecondlyByMinuteAndSecond(self):
4363        self._rrulestr_reverse_test(rrule(SECONDLY,
4364                              count=3,
4365                              byminute=(6, 18),
4366                              bysecond=(6, 18),
4367                              dtstart=datetime(1997, 9, 2, 9, 0)))
4368
4369    def testToStrSecondlyByHourAndMinuteAndSecond(self):
4370        self._rrulestr_reverse_test(rrule(SECONDLY,
4371                              count=3,
4372                              byhour=(6, 18),
4373                              byminute=(6, 18),
4374                              bysecond=(6, 18),
4375                              dtstart=datetime(1997, 9, 2, 9, 0)))
4376
4377    def testToStrSecondlyByHourAndMinuteAndSecondBug(self):
4378        # This explores a bug found by Mathieu Bridon.
4379        self._rrulestr_reverse_test(rrule(SECONDLY,
4380                              count=3,
4381                              bysecond=(0,),
4382                              byminute=(1,),
4383                              dtstart=datetime(2010, 3, 22, 12, 1)))
4384
4385    def testToStrWithWkSt(self):
4386        self._rrulestr_reverse_test(rrule(WEEKLY,
4387                              count=3,
4388                              wkst=SU,
4389                              dtstart=datetime(1997, 9, 2, 9, 0)))
4390
4391    def testToStrLongIntegers(self):
4392        if not PY3:  # There is no longs in python3
4393            self._rrulestr_reverse_test(rrule(MINUTELY,
4394                                  count=long(2),
4395                                  interval=long(2),
4396                                  bymonth=long(2),
4397                                  byweekday=long(3),
4398                                  byhour=long(6),
4399                                  byminute=long(6),
4400                                  bysecond=long(6),
4401                                  dtstart=datetime(1997, 9, 2, 9, 0)))
4402
4403            self._rrulestr_reverse_test(rrule(YEARLY,
4404                                  count=long(2),
4405                                  bymonthday=long(5),
4406                                  byweekno=long(2),
4407                                  dtstart=datetime(1997, 9, 2, 9, 0)))
4408
4409    def testReplaceIfSet(self):
4410        rr = rrule(YEARLY,
4411                   count=1,
4412                   bymonthday=5,
4413                   dtstart=datetime(1997, 1, 1))
4414        newrr = rr.replace(bymonthday=6)
4415        self.assertEqual(list(rr), [datetime(1997, 1, 5)])
4416        self.assertEqual(list(newrr),
4417                             [datetime(1997, 1, 6)])
4418
4419    def testReplaceIfNotSet(self):
4420        rr = rrule(YEARLY,
4421           count=1,
4422           dtstart=datetime(1997, 1, 1))
4423        newrr = rr.replace(bymonthday=6)
4424        self.assertEqual(list(rr), [datetime(1997, 1, 1)])
4425        self.assertEqual(list(newrr),
4426                             [datetime(1997, 1, 6)])
4427
4428
4429class RRuleSetTest(unittest.TestCase):
4430    def testSet(self):
4431        rrset = rruleset()
4432        rrset.rrule(rrule(YEARLY, count=2, byweekday=TU,
4433                          dtstart=datetime(1997, 9, 2, 9, 0)))
4434        rrset.rrule(rrule(YEARLY, count=1, byweekday=TH,
4435                          dtstart=datetime(1997, 9, 2, 9, 0)))
4436        self.assertEqual(list(rrset),
4437                         [datetime(1997, 9, 2, 9, 0),
4438                          datetime(1997, 9, 4, 9, 0),
4439                          datetime(1997, 9, 9, 9, 0)])
4440
4441    def testSetDate(self):
4442        rrset = rruleset()
4443        rrset.rrule(rrule(YEARLY, count=1, byweekday=TU,
4444                          dtstart=datetime(1997, 9, 2, 9, 0)))
4445        rrset.rdate(datetime(1997, 9, 4, 9))
4446        rrset.rdate(datetime(1997, 9, 9, 9))
4447        self.assertEqual(list(rrset),
4448                         [datetime(1997, 9, 2, 9, 0),
4449                          datetime(1997, 9, 4, 9, 0),
4450                          datetime(1997, 9, 9, 9, 0)])
4451
4452    def testSetExRule(self):
4453        rrset = rruleset()
4454        rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
4455                          dtstart=datetime(1997, 9, 2, 9, 0)))
4456        rrset.exrule(rrule(YEARLY, count=3, byweekday=TH,
4457                          dtstart=datetime(1997, 9, 2, 9, 0)))
4458        self.assertEqual(list(rrset),
4459                         [datetime(1997, 9, 2, 9, 0),
4460                          datetime(1997, 9, 9, 9, 0),
4461                          datetime(1997, 9, 16, 9, 0)])
4462
4463    def testSetExDate(self):
4464        rrset = rruleset()
4465        rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
4466                          dtstart=datetime(1997, 9, 2, 9, 0)))
4467        rrset.exdate(datetime(1997, 9, 4, 9))
4468        rrset.exdate(datetime(1997, 9, 11, 9))
4469        rrset.exdate(datetime(1997, 9, 18, 9))
4470        self.assertEqual(list(rrset),
4471                         [datetime(1997, 9, 2, 9, 0),
4472                          datetime(1997, 9, 9, 9, 0),
4473                          datetime(1997, 9, 16, 9, 0)])
4474
4475    def testSetExDateRevOrder(self):
4476        rrset = rruleset()
4477        rrset.rrule(rrule(MONTHLY, count=5, bymonthday=10,
4478                          dtstart=datetime(2004, 1, 1, 9, 0)))
4479        rrset.exdate(datetime(2004, 4, 10, 9, 0))
4480        rrset.exdate(datetime(2004, 2, 10, 9, 0))
4481        self.assertEqual(list(rrset),
4482                         [datetime(2004, 1, 10, 9, 0),
4483                          datetime(2004, 3, 10, 9, 0),
4484                          datetime(2004, 5, 10, 9, 0)])
4485
4486    def testSetDateAndExDate(self):
4487        rrset = rruleset()
4488        rrset.rdate(datetime(1997, 9, 2, 9))
4489        rrset.rdate(datetime(1997, 9, 4, 9))
4490        rrset.rdate(datetime(1997, 9, 9, 9))
4491        rrset.rdate(datetime(1997, 9, 11, 9))
4492        rrset.rdate(datetime(1997, 9, 16, 9))
4493        rrset.rdate(datetime(1997, 9, 18, 9))
4494        rrset.exdate(datetime(1997, 9, 4, 9))
4495        rrset.exdate(datetime(1997, 9, 11, 9))
4496        rrset.exdate(datetime(1997, 9, 18, 9))
4497        self.assertEqual(list(rrset),
4498                         [datetime(1997, 9, 2, 9, 0),
4499                          datetime(1997, 9, 9, 9, 0),
4500                          datetime(1997, 9, 16, 9, 0)])
4501
4502    def testSetDateAndExRule(self):
4503        rrset = rruleset()
4504        rrset.rdate(datetime(1997, 9, 2, 9))
4505        rrset.rdate(datetime(1997, 9, 4, 9))
4506        rrset.rdate(datetime(1997, 9, 9, 9))
4507        rrset.rdate(datetime(1997, 9, 11, 9))
4508        rrset.rdate(datetime(1997, 9, 16, 9))
4509        rrset.rdate(datetime(1997, 9, 18, 9))
4510        rrset.exrule(rrule(YEARLY, count=3, byweekday=TH,
4511                           dtstart=datetime(1997, 9, 2, 9, 0)))
4512        self.assertEqual(list(rrset),
4513                         [datetime(1997, 9, 2, 9, 0),
4514                          datetime(1997, 9, 9, 9, 0),
4515                          datetime(1997, 9, 16, 9, 0)])
4516
4517    def testSetCount(self):
4518        rrset = rruleset()
4519        rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH),
4520                          dtstart=datetime(1997, 9, 2, 9, 0)))
4521        rrset.exrule(rrule(YEARLY, count=3, byweekday=TH,
4522                           dtstart=datetime(1997, 9, 2, 9, 0)))
4523        self.assertEqual(rrset.count(), 3)
4524
4525    def testSetCachePre(self):
4526        rrset = rruleset()
4527        rrset.rrule(rrule(YEARLY, count=2, byweekday=TU,
4528                          dtstart=datetime(1997, 9, 2, 9, 0)))
4529        rrset.rrule(rrule(YEARLY, count=1, byweekday=TH,
4530                          dtstart=datetime(1997, 9, 2, 9, 0)))
4531        self.assertEqual(list(rrset),
4532                         [datetime(1997, 9, 2, 9, 0),
4533                          datetime(1997, 9, 4, 9, 0),
4534                          datetime(1997, 9, 9, 9, 0)])
4535
4536    def testSetCachePost(self):
4537        rrset = rruleset(cache=True)
4538        rrset.rrule(rrule(YEARLY, count=2, byweekday=TU,
4539                          dtstart=datetime(1997, 9, 2, 9, 0)))
4540        rrset.rrule(rrule(YEARLY, count=1, byweekday=TH,
4541                          dtstart=datetime(1997, 9, 2, 9, 0)))
4542        for x in rrset: pass
4543        self.assertEqual(list(rrset),
4544                         [datetime(1997, 9, 2, 9, 0),
4545                          datetime(1997, 9, 4, 9, 0),
4546                          datetime(1997, 9, 9, 9, 0)])
4547
4548    def testSetCachePostInternal(self):
4549        rrset = rruleset(cache=True)
4550        rrset.rrule(rrule(YEARLY, count=2, byweekday=TU,
4551                          dtstart=datetime(1997, 9, 2, 9, 0)))
4552        rrset.rrule(rrule(YEARLY, count=1, byweekday=TH,
4553                          dtstart=datetime(1997, 9, 2, 9, 0)))
4554        for x in rrset: pass
4555        self.assertEqual(list(rrset._cache),
4556                         [datetime(1997, 9, 2, 9, 0),
4557                          datetime(1997, 9, 4, 9, 0),
4558                          datetime(1997, 9, 9, 9, 0)])
4559
4560    def testSetRRuleCount(self):
4561        # Test that the count is updated when an rrule is added
4562        rrset = rruleset(cache=False)
4563        for cache in (True, False):
4564            rrset = rruleset(cache=cache)
4565            rrset.rrule(rrule(YEARLY, count=2, byweekday=TH,
4566                              dtstart=datetime(1983, 4, 1)))
4567            rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR,
4568                              dtstart=datetime(1991, 6, 3)))
4569
4570            # Check the length twice - first one sets a cache, second reads it
4571            self.assertEqual(rrset.count(), 6)
4572            self.assertEqual(rrset.count(), 6)
4573
4574            # This should invalidate the cache and force an update
4575            rrset.rrule(rrule(MONTHLY, count=3, dtstart=datetime(1994, 1, 3)))
4576
4577            self.assertEqual(rrset.count(), 9)
4578            self.assertEqual(rrset.count(), 9)
4579
4580    def testSetRDateCount(self):
4581        # Test that the count is updated when an rdate is added
4582        rrset = rruleset(cache=False)
4583        for cache in (True, False):
4584            rrset = rruleset(cache=cache)
4585            rrset.rrule(rrule(YEARLY, count=2, byweekday=TH,
4586                              dtstart=datetime(1983, 4, 1)))
4587            rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR,
4588                              dtstart=datetime(1991, 6, 3)))
4589
4590            # Check the length twice - first one sets a cache, second reads it
4591            self.assertEqual(rrset.count(), 6)
4592            self.assertEqual(rrset.count(), 6)
4593
4594            # This should invalidate the cache and force an update
4595            rrset.rdate(datetime(1993, 2, 14))
4596
4597            self.assertEqual(rrset.count(), 7)
4598            self.assertEqual(rrset.count(), 7)
4599
4600    def testSetExRuleCount(self):
4601        # Test that the count is updated when an exrule is added
4602        rrset = rruleset(cache=False)
4603        for cache in (True, False):
4604            rrset = rruleset(cache=cache)
4605            rrset.rrule(rrule(YEARLY, count=2, byweekday=TH,
4606                              dtstart=datetime(1983, 4, 1)))
4607            rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR,
4608                              dtstart=datetime(1991, 6, 3)))
4609
4610            # Check the length twice - first one sets a cache, second reads it
4611            self.assertEqual(rrset.count(), 6)
4612            self.assertEqual(rrset.count(), 6)
4613
4614            # This should invalidate the cache and force an update
4615            rrset.exrule(rrule(WEEKLY, count=2, interval=2,
4616                               dtstart=datetime(1991, 6, 14)))
4617
4618            self.assertEqual(rrset.count(), 4)
4619            self.assertEqual(rrset.count(), 4)
4620
4621    def testSetExDateCount(self):
4622        # Test that the count is updated when an rdate is added
4623        for cache in (True, False):
4624            rrset = rruleset(cache=cache)
4625            rrset.rrule(rrule(YEARLY, count=2, byweekday=TH,
4626                              dtstart=datetime(1983, 4, 1)))
4627            rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR,
4628                              dtstart=datetime(1991, 6, 3)))
4629
4630            # Check the length twice - first one sets a cache, second reads it
4631            self.assertEqual(rrset.count(), 6)
4632            self.assertEqual(rrset.count(), 6)
4633
4634            # This should invalidate the cache and force an update
4635            rrset.exdate(datetime(1991, 6, 28))
4636
4637            self.assertEqual(rrset.count(), 5)
4638            self.assertEqual(rrset.count(), 5)
4639
4640
4641class WeekdayTest(unittest.TestCase):
4642    def testInvalidNthWeekday(self):
4643        with self.assertRaises(ValueError):
4644            zeroth_friday = FR(0)
4645
4646    def testWeekdayCallable(self):
4647        # Calling a weekday instance generates a new weekday instance with the
4648        # value of n changed.
4649        from dateutil.rrule import weekday
4650        self.assertEqual(MO(1), weekday(0, 1))
4651
4652        # Calling a weekday instance with the identical n returns the original
4653        # object
4654        FR_3 = weekday(4, 3)
4655        self.assertIs(FR_3(3), FR_3)
4656
4657    def testWeekdayEquality(self):
4658        # Two weekday objects are not equal if they have different values for n
4659        self.assertNotEqual(TH, TH(-1))
4660        self.assertNotEqual(SA(3), SA(2))
4661
4662    def testWeekdayEqualitySubclass(self):
4663        # Two weekday objects equal if their "weekday" and "n" attributes are
4664        # available and the same
4665        class BasicWeekday(object):
4666            def __init__(self, weekday):
4667                self.weekday = weekday
4668
4669        class BasicNWeekday(BasicWeekday):
4670            def __init__(self, weekday, n=None):
4671                super(BasicNWeekday, self).__init__(weekday)
4672                self.n = n
4673
4674        MO_Basic = BasicWeekday(0)
4675
4676        self.assertNotEqual(MO, MO_Basic)
4677        self.assertNotEqual(MO(1), MO_Basic)
4678
4679        TU_BasicN = BasicNWeekday(1)
4680
4681        self.assertEqual(TU, TU_BasicN)
4682        self.assertNotEqual(TU(3), TU_BasicN)
4683
4684        WE_Basic3 = BasicNWeekday(2, 3)
4685        self.assertEqual(WE(3), WE_Basic3)
4686        self.assertNotEqual(WE(2), WE_Basic3)
4687
4688    def testWeekdayReprNoN(self):
4689        no_n_reprs = ('MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU')
4690        no_n_wdays = (MO, TU, WE, TH, FR, SA, SU)
4691
4692        for repstr, wday in zip(no_n_reprs, no_n_wdays):
4693            self.assertEqual(repr(wday), repstr)
4694
4695    def testWeekdayReprWithN(self):
4696        with_n_reprs = ('WE(+1)', 'TH(-2)', 'SU(+3)')
4697        with_n_wdays = (WE(1), TH(-2), SU(+3))
4698
4699        for repstr, wday in zip(with_n_reprs, with_n_wdays):
4700            self.assertEqual(repr(wday), repstr)
4701
4702