Port first half of recurrence tests.
authorJan Schneider <jan@horde.org>
Mon, 8 Jun 2009 15:29:02 +0000 (17:29 +0200)
committerJan Schneider <jan@horde.org>
Mon, 8 Jun 2009 15:35:58 +0000 (17:35 +0200)
framework/Date/test/Horde/Date/RecurrenceTest.php

index 497d8b5..605bcf3 100644 (file)
@@ -6,6 +6,262 @@
  */
 class Horde_Date_RecurrenceTest extends PHPUnit_Framework_TestCase
 {
+    protected function setUp()
+    {
+        require_once 'Horde/String.php';
+        String::setDefaultCharset('UTF-8');
+        $this->ical = new Horde_iCalendar();
+    }
+
+    private function _getRecurrences($r)
+    {
+        $recurrences = array();
+        $protect = 0;
+        $next = new Horde_Date('2007-03-01 00:00:00');
+        while ($next = $r->nextRecurrence($next)) {
+            if (++$protect > 10) {
+                return 'Infinite loop';
+            }
+            $recurrences[] = (string)$next;
+            $next->mday++;
+        }
+        return $recurrences;
+    }
+
+    public function testDailyEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_DAILY);
+        $r->setRecurInterval(2);
+        $r->setRecurEnd(new Horde_Date('2007-03-07 10:00:00'));
+        $this->assertEquals('D2 20070308T090000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=DAILY;INTERVAL=2;UNTIL=20070308T090000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-03-03 10:00:00',
+                                  '2007-03-05 10:00:00',
+                                  '2007-03-07 10:00:00'),
+                            $this->_getRecurrences($r));
+        $r->setRecurCount(4);
+    }
+
+    public function testDailyCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_DAILY);
+        $r->setRecurInterval(2);
+        $r->setRecurCount(4);
+        $this->assertEquals('D2 #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=DAILY;INTERVAL=2;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-03-03 10:00:00',
+                                  '2007-03-05 10:00:00',
+                                  '2007-03-07 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testWeeklyEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
+        $r->setRecurOnDay(Horde_Date::MASK_THURSDAY);
+        $r->setRecurInterval(1);
+        $r->setRecurEnd(new Horde_Date('2007-03-29 10:00:00'));
+        $this->assertEquals('W1 TH 20070330T080000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=WEEKLY;INTERVAL=1;BYDAY=TH;UNTIL=20070330T080000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-03-08 10:00:00',
+                                  '2007-03-15 10:00:00',
+                                  '2007-03-22 10:00:00',
+                                  '2007-03-29 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testWeeklyCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
+        $r->setRecurOnDay(Horde_Date::MASK_THURSDAY);
+        $r->setRecurInterval(1);
+        $r->setRecurCount(4);
+        $this->assertEquals('W1 TH #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=WEEKLY;INTERVAL=1;BYDAY=TH;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-03-08 10:00:00',
+                                  '2007-03-15 10:00:00',
+                                  '2007-03-22 10:00:00'),
+                            $this->_getRecurrences($r));
+        $r->setRecurInterval(2);
+        $this->assertEquals('W2 TH #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=WEEKLY;INTERVAL=2;BYDAY=TH;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-03-15 10:00:00',
+                                  '2007-03-29 10:00:00',
+                                  '2007-04-12 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testMonthlyEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_DATE);
+        $r->setRecurInterval(1);
+        $r->setRecurEnd(new Horde_Date('2007-05-01 10:00:00'));
+        $this->assertEquals('MD1 1 20070502T080000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;UNTIL=20070502T080000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-04-01 10:00:00',
+                                  '2007-05-01 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testMonthlyCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_DATE);
+        $r->setRecurInterval(1);
+        $r->setRecurCount(4);
+        $this->assertEquals('MD1 1 #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-04-01 10:00:00',
+                                  '2007-05-01 10:00:00',
+                                  '2007-06-01 10:00:00'),
+                            $this->_getRecurrences($r));
+        $r->setRecurInterval(2);
+        $this->assertEquals('MD2 1 #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=2;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-05-01 10:00:00',
+                                  '2007-07-01 10:00:00',
+                                  '2007-09-01 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testMonthlyDayEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
+        $r->setRecurInterval(1);
+        $r->setRecurEnd(new Horde_Date('2007-05-01 10:00:00'));
+        $this->assertEquals('MP1 1+ TH 20070502T080000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;BYDAY=1TH;UNTIL=20070502T080000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-04-05 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testMonthlyDayCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
+        $r->setRecurInterval(1);
+        $r->setRecurCount(4);
+        $this->assertEquals('MP1 1+ TH #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;BYDAY=1TH;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2007-04-05 10:00:00',
+                                  '2007-05-03 10:00:00',
+                                  '2007-06-07 10:00:00'),
+                            $this->_getRecurrences($r));
+
+        $r = new Horde_Date_Recurrence('2008-03-14 12:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
+        $r->setRecurCount(2);
+        $this->assertEquals('MP1 2+ FR #2', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;BYDAY=2FR;COUNT=2', $r->toRRule20($this->ical));
+    }
+
+    public function testYearlyDateEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
+        $r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
+        $this->assertEquals('YM1 3 20090302T090000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;UNTIL=20090302T090000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-03-01 10:00:00',
+                                  '2009-03-01 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testYearlyDateCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
+        $r->setRecurCount(4);
+        $this->assertEquals('YM1 3 #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-03-01 10:00:00',
+                                  '2009-03-01 10:00:00',
+                                  '2010-03-01 10:00:00'),
+                            $this->_getRecurrences($r));
+
+        $r = new Horde_Date_Recurrence('2007-04-25 12:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
+        $r->setRecurEnd(new Horde_Date('2011-04-25 23:00:00'));
+        $r->setRecurInterval(2);
+        $this->assertEquals('2009-04-25 12:00:00', (string)$r->nextRecurrence(new Horde_Date('2009-03-30 00:00:00')));
+
+        $r = new Horde_Date_Recurrence('2008-02-29 00:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
+        $r->setRecurInterval(1);
+        $this->assertEquals('2012-02-29 00:00:00', (string)$r->nextRecurrence(new Horde_Date('2008-03-01 00:00:00')));
+    }
+
+    public function testYearlyDayEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DAY);
+        $r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
+        $this->assertEquals('YD1 60 20090302T090000Z', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;BYYEARDAY=60;UNTIL=20090302T090000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-02-29 10:00:00',
+                                  '2009-03-01 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testYearlyDayCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DAY);
+        $r->setRecurCount(4);
+        $this->assertEquals('YD1 60 #4', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;BYYEARDAY=60;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-02-29 10:00:00',
+                                  '2009-03-01 10:00:00',
+                                  '2010-03-01 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testYearlyWeekEnd()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_WEEKDAY);
+        $r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
+        $this->assertEquals('', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;BYDAY=1TH;BYMONTH=3;UNTIL=20090302T090000Z', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-03-06 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
+    public function testYearlyWeekCount()
+    {
+        $r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
+        $r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_WEEKDAY);
+        $r->setRecurCount(4);
+        $this->assertEquals('', $r->toRRule10($this->ical));
+        $this->assertEquals('FREQ=YEARLY;INTERVAL=1;BYDAY=1TH;BYMONTH=3;COUNT=4', $r->toRRule20($this->ical));
+        $this->assertEquals(array('2007-03-01 10:00:00',
+                                  '2008-03-06 10:00:00',
+                                  '2009-03-05 10:00:00',
+                                  '2010-03-04 10:00:00'),
+                            $this->_getRecurrences($r));
+    }
+
     public function testHash()
     {
         $d = new Horde_Date(1970, 1, 1);
@@ -156,23 +412,6 @@ class Horde_Date_RecurrenceTest extends PHPUnit_Framework_TestCase
 }
 
 /*
-function recur($r)
-{
-    $ical = new Horde_iCalendar();
-    echo $r->toRRule10($ical) . "\n";
-    echo $r->toRRule20($ical) . "\n";
-    $protect = 0;
-    $next = new Horde_Date('2007-03-01 00:00:00');
-    while ($next = $r->nextRecurrence($next)) {
-        if (++$protect > 10) {
-            die('Infinite loop');
-        }
-        echo (string)$next . "\n";
-        $next->mday++;
-    }
-    var_dump($next);
-    echo "\n";
-}
 
 function dump($rrule, $version)
 {
@@ -193,80 +432,6 @@ function dump($rrule, $version)
     echo "\n";
 }
 
-$r = new Horde_Date_Recurrence('2007-03-01 10:00:00');
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_DAILY);
-$r->setRecurInterval(2);
-$r->setRecurEnd(new Horde_Date('2007-03-07 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
-$r->setRecurOnDay(Horde_Date::MASK_THURSDAY);
-$r->setRecurInterval(1);
-$r->setRecurEnd(new Horde_Date('2007-03-29 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-$r->setRecurInterval(2);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_DATE);
-$r->setRecurInterval(1);
-$r->setRecurEnd(new Horde_Date('2007-05-01 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-$r->setRecurInterval(2);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
-$r->setRecurInterval(1);
-$r->setRecurEnd(new Horde_Date('2007-05-01 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
-$r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DAY);
-$r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-
-$r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_WEEKDAY);
-$r->setRecurEnd(new Horde_Date('2009-03-01 10:00:00'));
-recur($r);
-$r->setRecurCount(4);
-recur($r);
-
-$r = new Horde_Date_Recurrence('2007-04-25 12:00:00');
-$r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
-$r->setRecurEnd(new Horde_Date('2011-04-25 23:00:00'));
-$r->setRecurInterval(2);
-$next = new Horde_Date('2009-03-30 00:00:00');
-$next = $r->nextRecurrence($next);
-echo (string)$next . "\n\n";
-
-$r = new Horde_Date_Recurrence('2008-02-29 00:00:00');
-$r->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY_DATE);
-$r->setRecurInterval(1);
-$next = new Horde_Date('2008-03-01 00:00:00');
-$next = $r->nextRecurrence($next);
-echo (string)$next . "\n\n";
-
-$r = new Horde_Date_Recurrence('2008-03-14 12:00:00');
-$r->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
-$r->setRecurCount(2);
-$ical = new Horde_iCalendar();
-echo $r->toRRule10($ical) . "\n";
-echo $r->toRRule20($ical) . "\n\n";
 
 $rrule1 = array('D2 20070307',
                 'D2 20070308T090000Z',
@@ -321,134 +486,6 @@ foreach ($rrule2 as $rrule) {
 
 ?>
 --EXPECT--
-D2 20070308T090000Z
-FREQ=DAILY;INTERVAL=2;UNTIL=20070308T090000Z
-2007-03-01 10:00:00
-2007-03-03 10:00:00
-2007-03-05 10:00:00
-2007-03-07 10:00:00
-bool(false)
-
-D2 #4
-FREQ=DAILY;INTERVAL=2;COUNT=4
-2007-03-01 10:00:00
-2007-03-03 10:00:00
-2007-03-05 10:00:00
-2007-03-07 10:00:00
-bool(false)
-
-W1 TH 20070330T080000Z
-FREQ=WEEKLY;INTERVAL=1;BYDAY=TH;UNTIL=20070330T080000Z
-2007-03-01 10:00:00
-2007-03-08 10:00:00
-2007-03-15 10:00:00
-2007-03-22 10:00:00
-2007-03-29 10:00:00
-bool(false)
-
-W1 TH #4
-FREQ=WEEKLY;INTERVAL=1;BYDAY=TH;COUNT=4
-2007-03-01 10:00:00
-2007-03-08 10:00:00
-2007-03-15 10:00:00
-2007-03-22 10:00:00
-bool(false)
-
-W2 TH #4
-FREQ=WEEKLY;INTERVAL=2;BYDAY=TH;COUNT=4
-2007-03-01 10:00:00
-2007-03-15 10:00:00
-2007-03-29 10:00:00
-2007-04-12 10:00:00
-bool(false)
-
-MD1 1 20070502T080000Z
-FREQ=MONTHLY;INTERVAL=1;UNTIL=20070502T080000Z
-2007-03-01 10:00:00
-2007-04-01 10:00:00
-2007-05-01 10:00:00
-bool(false)
-
-MD1 1 #4
-FREQ=MONTHLY;INTERVAL=1;COUNT=4
-2007-03-01 10:00:00
-2007-04-01 10:00:00
-2007-05-01 10:00:00
-2007-06-01 10:00:00
-bool(false)
-
-MD2 1 #4
-FREQ=MONTHLY;INTERVAL=2;COUNT=4
-2007-03-01 10:00:00
-2007-05-01 10:00:00
-2007-07-01 10:00:00
-2007-09-01 10:00:00
-bool(false)
-
-MP1 1+ TH 20070502T080000Z
-FREQ=MONTHLY;INTERVAL=1;BYDAY=1TH;UNTIL=20070502T080000Z
-2007-03-01 10:00:00
-2007-04-05 10:00:00
-bool(false)
-
-MP1 1+ TH #4
-FREQ=MONTHLY;INTERVAL=1;BYDAY=1TH;COUNT=4
-2007-03-01 10:00:00
-2007-04-05 10:00:00
-2007-05-03 10:00:00
-2007-06-07 10:00:00
-bool(false)
-
-YM1 3 20090302T090000Z
-FREQ=YEARLY;INTERVAL=1;UNTIL=20090302T090000Z
-2007-03-01 10:00:00
-2008-03-01 10:00:00
-2009-03-01 10:00:00
-bool(false)
-
-YM1 3 #4
-FREQ=YEARLY;INTERVAL=1;COUNT=4
-2007-03-01 10:00:00
-2008-03-01 10:00:00
-2009-03-01 10:00:00
-2010-03-01 10:00:00
-bool(false)
-
-YD1 60 20090302T090000Z
-FREQ=YEARLY;INTERVAL=1;BYYEARDAY=60;UNTIL=20090302T090000Z
-2007-03-01 10:00:00
-2008-02-29 10:00:00
-2009-03-01 10:00:00
-bool(false)
-
-YD1 60 #4
-FREQ=YEARLY;INTERVAL=1;BYYEARDAY=60;COUNT=4
-2007-03-01 10:00:00
-2008-02-29 10:00:00
-2009-03-01 10:00:00
-2010-03-01 10:00:00
-bool(false)
-
-
-FREQ=YEARLY;INTERVAL=1;BYDAY=1TH;BYMONTH=3;UNTIL=20090302T090000Z
-2007-03-01 10:00:00
-2008-03-06 10:00:00
-bool(false)
-
-
-FREQ=YEARLY;INTERVAL=1;BYDAY=1TH;BYMONTH=3;COUNT=4
-2007-03-01 10:00:00
-2008-03-06 10:00:00
-2009-03-05 10:00:00
-2010-03-04 10:00:00
-bool(false)
-
-2009-04-25 12:00:00
-
-2012-02-29 00:00:00
-
-MP1 2+ FR #2
-FREQ=MONTHLY;INTERVAL=1;BYDAY=2FR;COUNT=2
 
 int(1)
 int(2)