*/
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);
}
/*
-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)
{
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',
?>
--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)