Many new rrule tests.
diff --git a/test.py b/test.py
index 905e4ff..93f1d46 100644
--- a/test.py
+++ b/test.py
@@ -15,6 +15,7 @@
 from dateutil.relativedelta import *
 from dateutil.parser import *
 from dateutil.easter import *
+from dateutil.rrule import *
 from dateutil.tz import *
 
 from datetime import *
@@ -138,6 +139,618 @@
         self.assertEqual(self.today+relativedelta(yearday=261),
                          date(2003, 9, 18))
 
+class RRuleTest(unittest.TestCase):
+
+    def testYearly(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1998, 9, 2, 9, 0),
+                          datetime(1999, 9, 2, 9, 0)])
+
+    def testStrYearly(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=YEARLY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1998, 9, 2, 9, 0),
+                          datetime(1999, 9, 2, 9, 0)])
+
+    def testYearlyInterval(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1999, 9, 2, 9, 0),
+                          datetime(2001, 9, 2, 9, 0)])
+
+    def testYearlyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              interval=100,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(2097, 9, 2, 9, 0),
+                          datetime(2197, 9, 2, 9, 0)])
+
+    def testYearlyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 2, 9, 0),
+                          datetime(1998, 3, 2, 9, 0),
+                          datetime(1999, 1, 2, 9, 0)])
+
+    def testYearlyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 10, 1, 9, 0),
+                          datetime(1997, 10, 3, 9, 0)])
+
+    def testYearlyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 9, 0),
+                          datetime(1998, 1, 7, 9, 0),
+                          datetime(1998, 3, 5, 9, 0)])
+
+    def testYearlyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 4, 9, 0),
+                          datetime(1997, 9, 9, 9, 0)])
+
+    def testYearlyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_YEARLY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 9, 0),
+                          datetime(1998, 1, 6, 9, 0),
+                          datetime(1998, 1, 8, 9, 0)])
+
+    def testMonthly(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 10, 2, 9, 0),
+                          datetime(1997, 11, 2, 9, 0)])
+
+    def testStrMonthly(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=MONTHLY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 10, 2, 9, 0),
+                          datetime(1997, 11, 2, 9, 0)])
+
+    def testMonthlyInterval(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 11, 2, 9, 0),
+                          datetime(1998, 1, 2, 9, 0)])
+
+    def testMonthlyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              interval=18,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1999, 3, 2, 9, 0),
+                          datetime(2000, 9, 2, 9, 0)])
+
+    def testMonthlyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 2, 9, 0),
+                          datetime(1998, 3, 2, 9, 0),
+                          datetime(1999, 1, 2, 9, 0)])
+
+
+    def testMonthlyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 10, 1, 9, 0),
+                          datetime(1997, 10, 3, 9, 0)])
+
+    def testMonthlyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 9, 0),
+                          datetime(1998, 1, 7, 9, 0),
+                          datetime(1998, 3, 5, 9, 0)])
+
+    def testMonthlyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 4, 9, 0),
+                          datetime(1997, 9, 9, 9, 0)])
+
+    def testMonthlyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_MONTHLY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 9, 0),
+                          datetime(1998, 1, 6, 9, 0),
+                          datetime(1998, 1, 8, 9, 0)])
+
+    def testWeekly(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 9, 9, 0),
+                          datetime(1997, 9, 16, 9, 0)])
+
+    def testStrWeekly(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=WEEKLY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 9, 9, 0),
+                          datetime(1997, 9, 16, 9, 0)])
+
+    def testWeeklyInterval(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 16, 9, 0),
+                          datetime(1997, 9, 30, 9, 0)])
+
+    def testWeeklyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              interval=20,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1998, 1, 20, 9, 0),
+                          datetime(1998, 6, 9, 9, 0)])
+
+    def testWeeklyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 6, 9, 0),
+                          datetime(1998, 1, 13, 9, 0),
+                          datetime(1998, 1, 20, 9, 0)])
+
+    def testWeeklyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 10, 1, 9, 0),
+                          datetime(1997, 10, 3, 9, 0)])
+
+    def testWeeklyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 9, 0),
+                          datetime(1998, 1, 7, 9, 0),
+                          datetime(1998, 3, 5, 9, 0)])
+
+    def testWeeklyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 4, 9, 0),
+                          datetime(1997, 9, 9, 9, 0)])
+
+    def testWeeklyByMonthAndWeekDay(self):
+        # This test is interesting, because it crosses the year
+        # boundary in a weekly period to find day '1' as a
+        # valid recurrence.
+        self.assertEqual(list(rrule(FREQ_WEEKLY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 9, 0),
+                          datetime(1998, 1, 6, 9, 0),
+                          datetime(1998, 1, 8, 9, 0)])
+
+    def testDaily(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 9, 4, 9, 0)])
+
+    def testStrDaily(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=DAILY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 9, 4, 9, 0)])
+
+    def testDailyInterval(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 4, 9, 0),
+                          datetime(1997, 9, 6, 9, 0)])
+
+    def testDailyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              interval=92,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 12, 3, 9, 0),
+                          datetime(1998, 3, 5, 9, 0)])
+
+    def testDailyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 9, 0),
+                          datetime(1998, 1, 2, 9, 0),
+                          datetime(1998, 1, 3, 9, 0)])
+
+    def testDailyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 10, 1, 9, 0),
+                          datetime(1997, 10, 3, 9, 0)])
+
+    def testDailyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 9, 0),
+                          datetime(1998, 1, 7, 9, 0),
+                          datetime(1998, 3, 5, 9, 0)])
+
+    def testDailyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 4, 9, 0),
+                          datetime(1997, 9, 9, 9, 0)])
+
+    def testDailyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 9, 0),
+                          datetime(1998, 1, 6, 9, 0),
+                          datetime(1998, 1, 8, 9, 0)])
+
+    def testHourly(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 10, 0),
+                          datetime(1997, 9, 2, 11, 0)])
+
+    def testStrHourly(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=HOURLY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 10, 0),
+                          datetime(1997, 9, 2, 11, 0)])
+
+    def testHourlyInterval(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 11, 0),
+                          datetime(1997, 9, 2, 13, 0)])
+
+    def testHourlyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              interval=769,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 10, 4, 10, 0),
+                          datetime(1997, 11, 5, 11, 0)])
+
+    def testHourlyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0),
+                          datetime(1998, 1, 1, 1, 0),
+                          datetime(1998, 1, 1, 2, 0)])
+
+    def testHourlyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 0, 0),
+                          datetime(1997, 9, 3, 1, 0),
+                          datetime(1997, 9, 3, 2, 0)])
+
+    def testHourlyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 0, 0),
+                          datetime(1998, 1, 5, 1, 0),
+                          datetime(1998, 1, 5, 2, 0)])
+
+    def testHourlyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 10, 0),
+                          datetime(1997, 9, 2, 11, 0)])
+
+    def testHourlyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_HOURLY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0),
+                          datetime(1998, 1, 1, 1, 0),
+                          datetime(1998, 1, 1, 2, 0)])
+
+    def testMinutely(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 9, 1),
+                          datetime(1997, 9, 2, 9, 2)])
+
+    def testStrMinutely(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=MINUTELY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 9, 1),
+                          datetime(1997, 9, 2, 9, 2)])
+
+    def testMinutelyInterval(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 9, 2),
+                          datetime(1997, 9, 2, 9, 4)])
+
+    def testMinutelyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              interval=1501,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 3, 10, 1),
+                          datetime(1997, 9, 4, 11, 2)])
+
+    def testMinutelyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0),
+                          datetime(1998, 1, 1, 0, 1),
+                          datetime(1998, 1, 1, 0, 2)])
+
+    def testMinutelyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 0, 0),
+                          datetime(1997, 9, 3, 0, 1),
+                          datetime(1997, 9, 3, 0, 2)])
+
+    def testMinutelyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 0, 0),
+                          datetime(1998, 1, 5, 0, 1),
+                          datetime(1998, 1, 5, 0, 2)])
+
+    def testMinutelyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 2, 9, 1),
+                          datetime(1997, 9, 2, 9, 2)])
+
+    def testMinutelyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_MINUTELY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0),
+                          datetime(1998, 1, 1, 0, 1),
+                          datetime(1998, 1, 1, 0, 2)])
+
+    def testSecondly(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0, 0),
+                          datetime(1997, 9, 2, 9, 0, 1),
+                          datetime(1997, 9, 2, 9, 0, 2)])
+
+    def testStrSecondly(self):
+        self.assertEqual(list(rrulestr("""
+                              DTSTART:19970902T090000
+                              RRULE:FREQ=SECONDLY;COUNT=3
+                              """)),
+                         [datetime(1997, 9, 2, 9, 0, 0),
+                          datetime(1997, 9, 2, 9, 0, 1),
+                          datetime(1997, 9, 2, 9, 0, 2)])
+
+    def testSecondlyInterval(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              interval=2,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0, 0),
+                          datetime(1997, 9, 2, 9, 0, 2),
+                          datetime(1997, 9, 2, 9, 0, 4)])
+
+    def testSecondlyIntervalLarge(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              interval=90061,
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0, 0),
+                          datetime(1997, 9, 3, 10, 1, 1),
+                          datetime(1997, 9, 4, 11, 2, 2)])
+
+    def testSecondlyByMonth(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              bymonth=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0, 0),
+                          datetime(1998, 1, 1, 0, 0, 1),
+                          datetime(1998, 1, 1, 0, 0, 2)])
+
+    def testSecondlyByMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              bymonthday=(1,3),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 3, 0, 0, 0),
+                          datetime(1997, 9, 3, 0, 0, 1),
+                          datetime(1997, 9, 3, 0, 0, 2)])
+
+    def testSecondlyByMonthAndMonthDay(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              bymonth=(1,3),
+                              bymonthday=(5,7),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 5, 0, 0, 0),
+                          datetime(1998, 1, 5, 0, 0, 1),
+                          datetime(1998, 1, 5, 0, 0, 2)])
+
+    def testSecondlyByWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0, 0),
+                          datetime(1997, 9, 2, 9, 0, 1),
+                          datetime(1997, 9, 2, 9, 0, 2)])
+
+    def testSecondlyByMonthAndWeekDay(self):
+        self.assertEqual(list(rrule(FREQ_SECONDLY,
+                              count=3,
+                              bymonth=(1,3),
+                              byweekday=(TU,TH),
+                              dtstart=parse("19970902T090000"))),
+                         [datetime(1998, 1, 1, 0, 0, 0),
+                          datetime(1998, 1, 1, 0, 0, 1),
+                          datetime(1998, 1, 1, 0, 0, 2)])
+
+    def testUntilNotMatching(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              dtstart=parse("19970902T090000"),
+                              until=parse("19970905T080000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 9, 4, 9, 0)])
+
+    def testUntilMatching(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              dtstart=parse("19970902T090000"),
+                              until=parse("19970904T090000"))),
+                         [datetime(1997, 9, 2, 9, 0),
+                          datetime(1997, 9, 3, 9, 0),
+                          datetime(1997, 9, 4, 9, 0)])
+
+    def testUntilSingle(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              dtstart=parse("19970902T090000"),
+                              until=parse("19970902T090000"))),
+                         [datetime(1997, 9, 2, 9, 0)])
+
+    def testUntilEmpty(self):
+        self.assertEqual(list(rrule(FREQ_DAILY,
+                              count=3,
+                              dtstart=parse("19970902T090000"),
+                              until=parse("19970901T090000"))),
+                         [])
+
 class ParserTest(unittest.TestCase):
     def setUp(self):
         self.tzinfos = {"BRST": -10800}