1
0
mirror of https://github.com/rlanvin/php-rrule.git synced 2025-02-20 09:54:16 +01:00

Adding examples from the RFC as tests

And fixing the bugs exposed by these tests.
This commit is contained in:
rlanvin 2015-06-27 13:50:28 +03:00
parent 1d53a3d49d
commit fd31af6ae4
2 changed files with 552 additions and 4 deletions

View File

@ -578,7 +578,7 @@ class RRule implements \Iterator, \ArrayAccess
if ( $this->byminute && ! in_array((int) $date->format('i'), $this->byminute) ) {
return false;
}
if ( $this->bysecond && ! in_array((int) $date->format('s'), $this->byhour) ) {
if ( $this->bysecond && ! in_array((int) $date->format('s'), $this->bysecond) ) {
return false;
}
@ -606,7 +606,7 @@ class RRule implements \Iterator, \ArrayAccess
}
if ( $this->bymonthday || $this->bymonthday_negative ) {
$monthday_negative = -1 * ($month_len - $day - 1);
$monthday_negative = -1 * ($month_len - $day + 1);
if ( ! in_array($day, $this->bymonthday) && ! in_array($monthday_negative, $this->bymonthday_negative) ) {
return false;
@ -804,6 +804,12 @@ class RRule implements \Iterator, \ArrayAccess
/**
* Some serious magic is happening here.
* This method will calculate the yeardays corresponding to each Nth weekday
* (in BYDAY rule part).
* For example, in Jan 1998, in a MONTHLY interval, "1SU,-1SU" (first Sunday
* and last Sunday) would be transformed into [3=>true,24=>true] because
* the first Sunday of Jan 1998 is yearday 3 (counting from 0) and the
* last Sunday of Jan 1998 is yearday 24 (counting from 0).
*/
protected function buildNthWeekdayMask($year, $month, $day, array & $masks)
{
@ -814,7 +820,7 @@ class RRule implements \Iterator, \ArrayAccess
if ( $this->freq == self::YEARLY ) {
if ( $this->bymonth ) {
foreach ( $this->bymonth as $bymonth ) {
$ranges[] = [$masks['last_day_of_month'][$bymonth-1], $masks['last_day_of_month'][$bymonth]];
$ranges[] = [$masks['last_day_of_month'][$bymonth-1], $masks['last_day_of_month'][$bymonth]-1];
}
}
else {
@ -822,7 +828,7 @@ class RRule implements \Iterator, \ArrayAccess
}
}
elseif ( $this->freq == self::MONTHLY ) {
$ranges[] = [$masks['last_day_of_month'][$month-1], $masks['last_day_of_month'][$month]];
$ranges[] = [$masks['last_day_of_month'][$month-1], $masks['last_day_of_month'][$month]-1];
}
if ( $ranges ) {
@ -840,6 +846,7 @@ class RRule implements \Iterator, \ArrayAccess
$i = $first + ($nth - 1) * 7;
$i = $i + (7 - $masks['yearday_to_weekday'][$i] + $weekday) % 7;
}
if ( $i >= $first && $i <= $last ) {
$masks['yearday_is_nth_weekday'][$i] = true;
}

View File

@ -328,6 +328,547 @@ class RRuleTest extends PHPUnit_Framework_TestCase
// date_create('1997-09-03'),
// date_create('1997-09-03')])
/**
* Examples given in the RFC.
*/
public function rfcExamples()
{
return array(
// Daily, for 10 occurrences.
array(
['freq' => 'daily', 'count' => 10, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-03 09:00:00'),
date_create('1997-09-04 09:00:00'),
date_create('1997-09-05 09:00:00'),
date_create('1997-09-06 09:00:00'),
date_create('1997-09-07 09:00:00'),
date_create('1997-09-08 09:00:00'),
date_create('1997-09-09 09:00:00'),
date_create('1997-09-10 09:00:00'),
date_create('1997-09-11 09:00:00')]
),
// Daily until December 24, 1997
array(
['freq' => 'daily', 'dtstart' => '1997-09-02 09:00:00', 'until' => '1997-12-24 00:00:00'],
[date_create('1997-09-02 09:00:00'), date_create('1997-09-03 09:00:00'),
date_create('1997-09-04 09:00:00'), date_create('1997-09-05 09:00:00'),
date_create('1997-09-06 09:00:00'), date_create('1997-09-07 09:00:00'),
date_create('1997-09-08 09:00:00'), date_create('1997-09-09 09:00:00'),
date_create('1997-09-10 09:00:00'), date_create('1997-09-11 09:00:00'),
date_create('1997-09-12 09:00:00'), date_create('1997-09-13 09:00:00'),
date_create('1997-09-14 09:00:00'), date_create('1997-09-15 09:00:00'),
date_create('1997-09-16 09:00:00'), date_create('1997-09-17 09:00:00'),
date_create('1997-09-18 09:00:00'), date_create('1997-09-19 09:00:00'),
date_create('1997-09-20 09:00:00'), date_create('1997-09-21 09:00:00'),
date_create('1997-09-22 09:00:00'), date_create('1997-09-23 09:00:00'),
date_create('1997-09-24 09:00:00'), date_create('1997-09-25 09:00:00'),
date_create('1997-09-26 09:00:00'), date_create('1997-09-27 09:00:00'),
date_create('1997-09-28 09:00:00'), date_create('1997-09-29 09:00:00'),
date_create('1997-09-30 09:00:00'), date_create('1997-10-01 09:00:00'),
date_create('1997-10-02 09:00:00'), date_create('1997-10-03 09:00:00'),
date_create('1997-10-04 09:00:00'), date_create('1997-10-05 09:00:00'),
date_create('1997-10-06 09:00:00'), date_create('1997-10-07 09:00:00'),
date_create('1997-10-08 09:00:00'), date_create('1997-10-09 09:00:00'),
date_create('1997-10-10 09:00:00'), date_create('1997-10-11 09:00:00'),
date_create('1997-10-12 09:00:00'), date_create('1997-10-13 09:00:00'),
date_create('1997-10-14 09:00:00'), date_create('1997-10-15 09:00:00'),
date_create('1997-10-16 09:00:00'), date_create('1997-10-17 09:00:00'),
date_create('1997-10-18 09:00:00'), date_create('1997-10-19 09:00:00'),
date_create('1997-10-20 09:00:00'), date_create('1997-10-21 09:00:00'),
date_create('1997-10-22 09:00:00'), date_create('1997-10-23 09:00:00'),
date_create('1997-10-24 09:00:00'), date_create('1997-10-25 09:00:00'),
date_create('1997-10-26 09:00:00'), date_create('1997-10-27 09:00:00'),
date_create('1997-10-28 09:00:00'), date_create('1997-10-29 09:00:00'),
date_create('1997-10-30 09:00:00'), date_create('1997-10-31 09:00:00'),
date_create('1997-11-01 09:00:00'),
date_create('1997-11-02 09:00:00'), date_create('1997-11-03 09:00:00'),
date_create('1997-11-04 09:00:00'), date_create('1997-11-05 09:00:00'),
date_create('1997-11-06 09:00:00'), date_create('1997-11-07 09:00:00'),
date_create('1997-11-08 09:00:00'), date_create('1997-11-09 09:00:00'),
date_create('1997-11-10 09:00:00'), date_create('1997-11-11 09:00:00'),
date_create('1997-11-12 09:00:00'), date_create('1997-11-13 09:00:00'),
date_create('1997-11-14 09:00:00'), date_create('1997-11-15 09:00:00'),
date_create('1997-11-16 09:00:00'), date_create('1997-11-17 09:00:00'),
date_create('1997-11-18 09:00:00'), date_create('1997-11-19 09:00:00'),
date_create('1997-11-20 09:00:00'), date_create('1997-11-21 09:00:00'),
date_create('1997-11-22 09:00:00'), date_create('1997-11-23 09:00:00'),
date_create('1997-11-24 09:00:00'), date_create('1997-11-25 09:00:00'),
date_create('1997-11-26 09:00:00'), date_create('1997-11-27 09:00:00'),
date_create('1997-11-28 09:00:00'), date_create('1997-11-29 09:00:00'),
date_create('1997-11-30 09:00:00'), date_create('1997-12-01 09:00:00'),
date_create('1997-12-02 09:00:00'), date_create('1997-12-03 09:00:00'),
date_create('1997-12-04 09:00:00'), date_create('1997-12-05 09:00:00'),
date_create('1997-12-06 09:00:00'), date_create('1997-12-07 09:00:00'),
date_create('1997-12-08 09:00:00'), date_create('1997-12-09 09:00:00'),
date_create('1997-12-10 09:00:00'), date_create('1997-12-11 09:00:00'),
date_create('1997-12-12 09:00:00'), date_create('1997-12-13 09:00:00'),
date_create('1997-12-14 09:00:00'), date_create('1997-12-15 09:00:00'),
date_create('1997-12-16 09:00:00'), date_create('1997-12-17 09:00:00'),
date_create('1997-12-18 09:00:00'), date_create('1997-12-19 09:00:00'),
date_create('1997-12-20 09:00:00'), date_create('1997-12-21 09:00:00'),
date_create('1997-12-22 09:00:00'), date_create('1997-12-23 09:00:00')]
),
// Every other day, 5 occurrences.
array(
['freq' => 'daily', 'interval' => 2, 'count' => 5, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-04 09:00:00'),
date_create('1997-09-06 09:00:00'),
date_create('1997-09-08 09:00:00'),
date_create('1997-09-10 09:00:00')]
),
// Every 10 days, 5 occurrences.
array(
['freq' => 'daily', 'interval' => 10, 'count' => 5, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-12 09:00:00'),
date_create('1997-09-22 09:00:00'),
date_create('1997-10-02 09:00:00'),
date_create('1997-10-12 09:00:00')]
),
// Everyday in January, for 3 years.
array(
['freq' => 'yearly', 'bymonth' => 1, 'byday' => 'MO,TU,WE,TH,FR,SA,SU', 'dtstart' => '1997-09-02 09:00:00', 'until' => '2000-01-31 09:00:00'],
[date_create('1998-01-01 09:00:00'),
date_create('1998-01-02 09:00:00'), date_create('1998-01-03 09:00:00'),
date_create('1998-01-04 09:00:00'), date_create('1998-01-05 09:00:00'),
date_create('1998-01-06 09:00:00'), date_create('1998-01-07 09:00:00'),
date_create('1998-01-08 09:00:00'), date_create('1998-01-09 09:00:00'),
date_create('1998-01-10 09:00:00'), date_create('1998-01-11 09:00:00'),
date_create('1998-01-12 09:00:00'), date_create('1998-01-13 09:00:00'),
date_create('1998-01-14 09:00:00'), date_create('1998-01-15 09:00:00'),
date_create('1998-01-16 09:00:00'), date_create('1998-01-17 09:00:00'),
date_create('1998-01-18 09:00:00'), date_create('1998-01-19 09:00:00'),
date_create('1998-01-20 09:00:00'), date_create('1998-01-21 09:00:00'),
date_create('1998-01-22 09:00:00'), date_create('1998-01-23 09:00:00'),
date_create('1998-01-24 09:00:00'), date_create('1998-01-25 09:00:00'),
date_create('1998-01-26 09:00:00'), date_create('1998-01-27 09:00:00'),
date_create('1998-01-28 09:00:00'), date_create('1998-01-29 09:00:00'),
date_create('1998-01-30 09:00:00'), date_create('1998-01-31 09:00:00'),
date_create('1999-01-01 09:00:00'),
date_create('1999-01-02 09:00:00'), date_create('1999-01-03 09:00:00'),
date_create('1999-01-04 09:00:00'), date_create('1999-01-05 09:00:00'),
date_create('1999-01-06 09:00:00'), date_create('1999-01-07 09:00:00'),
date_create('1999-01-08 09:00:00'), date_create('1999-01-09 09:00:00'),
date_create('1999-01-10 09:00:00'), date_create('1999-01-11 09:00:00'),
date_create('1999-01-12 09:00:00'), date_create('1999-01-13 09:00:00'),
date_create('1999-01-14 09:00:00'), date_create('1999-01-15 09:00:00'),
date_create('1999-01-16 09:00:00'), date_create('1999-01-17 09:00:00'),
date_create('1999-01-18 09:00:00'), date_create('1999-01-19 09:00:00'),
date_create('1999-01-20 09:00:00'), date_create('1999-01-21 09:00:00'),
date_create('1999-01-22 09:00:00'), date_create('1999-01-23 09:00:00'),
date_create('1999-01-24 09:00:00'), date_create('1999-01-25 09:00:00'),
date_create('1999-01-26 09:00:00'), date_create('1999-01-27 09:00:00'),
date_create('1999-01-28 09:00:00'), date_create('1999-01-29 09:00:00'),
date_create('1999-01-30 09:00:00'), date_create('1999-01-31 09:00:00'),
date_create('2000-01-01 09:00:00'),
date_create('2000-01-02 09:00:00'), date_create('2000-01-03 09:00:00'),
date_create('2000-01-04 09:00:00'), date_create('2000-01-05 09:00:00'),
date_create('2000-01-06 09:00:00'), date_create('2000-01-07 09:00:00'),
date_create('2000-01-08 09:00:00'), date_create('2000-01-09 09:00:00'),
date_create('2000-01-10 09:00:00'), date_create('2000-01-11 09:00:00'),
date_create('2000-01-12 09:00:00'), date_create('2000-01-13 09:00:00'),
date_create('2000-01-14 09:00:00'), date_create('2000-01-15 09:00:00'),
date_create('2000-01-16 09:00:00'), date_create('2000-01-17 09:00:00'),
date_create('2000-01-18 09:00:00'), date_create('2000-01-19 09:00:00'),
date_create('2000-01-20 09:00:00'), date_create('2000-01-21 09:00:00'),
date_create('2000-01-22 09:00:00'), date_create('2000-01-23 09:00:00'),
date_create('2000-01-24 09:00:00'), date_create('2000-01-25 09:00:00'),
date_create('2000-01-26 09:00:00'), date_create('2000-01-27 09:00:00'),
date_create('2000-01-28 09:00:00'), date_create('2000-01-29 09:00:00'),
date_create('2000-01-30 09:00:00'), date_create('2000-01-31 09:00:00')]
),
// Same thing, in another way
array(
['freq' => 'daily', 'bymonth' => 1, 'dtstart' => '1997-09-02 09:00:00', 'until' => '2000-01-31 09:00:00'],
[date_create('1998-01-01 09:00:00'),
date_create('1998-01-02 09:00:00'), date_create('1998-01-03 09:00:00'),
date_create('1998-01-04 09:00:00'), date_create('1998-01-05 09:00:00'),
date_create('1998-01-06 09:00:00'), date_create('1998-01-07 09:00:00'),
date_create('1998-01-08 09:00:00'), date_create('1998-01-09 09:00:00'),
date_create('1998-01-10 09:00:00'), date_create('1998-01-11 09:00:00'),
date_create('1998-01-12 09:00:00'), date_create('1998-01-13 09:00:00'),
date_create('1998-01-14 09:00:00'), date_create('1998-01-15 09:00:00'),
date_create('1998-01-16 09:00:00'), date_create('1998-01-17 09:00:00'),
date_create('1998-01-18 09:00:00'), date_create('1998-01-19 09:00:00'),
date_create('1998-01-20 09:00:00'), date_create('1998-01-21 09:00:00'),
date_create('1998-01-22 09:00:00'), date_create('1998-01-23 09:00:00'),
date_create('1998-01-24 09:00:00'), date_create('1998-01-25 09:00:00'),
date_create('1998-01-26 09:00:00'), date_create('1998-01-27 09:00:00'),
date_create('1998-01-28 09:00:00'), date_create('1998-01-29 09:00:00'),
date_create('1998-01-30 09:00:00'), date_create('1998-01-31 09:00:00'),
date_create('1999-01-01 09:00:00'),
date_create('1999-01-02 09:00:00'), date_create('1999-01-03 09:00:00'),
date_create('1999-01-04 09:00:00'), date_create('1999-01-05 09:00:00'),
date_create('1999-01-06 09:00:00'), date_create('1999-01-07 09:00:00'),
date_create('1999-01-08 09:00:00'), date_create('1999-01-09 09:00:00'),
date_create('1999-01-10 09:00:00'), date_create('1999-01-11 09:00:00'),
date_create('1999-01-12 09:00:00'), date_create('1999-01-13 09:00:00'),
date_create('1999-01-14 09:00:00'), date_create('1999-01-15 09:00:00'),
date_create('1999-01-16 09:00:00'), date_create('1999-01-17 09:00:00'),
date_create('1999-01-18 09:00:00'), date_create('1999-01-19 09:00:00'),
date_create('1999-01-20 09:00:00'), date_create('1999-01-21 09:00:00'),
date_create('1999-01-22 09:00:00'), date_create('1999-01-23 09:00:00'),
date_create('1999-01-24 09:00:00'), date_create('1999-01-25 09:00:00'),
date_create('1999-01-26 09:00:00'), date_create('1999-01-27 09:00:00'),
date_create('1999-01-28 09:00:00'), date_create('1999-01-29 09:00:00'),
date_create('1999-01-30 09:00:00'), date_create('1999-01-31 09:00:00'),
date_create('2000-01-01 09:00:00'),
date_create('2000-01-02 09:00:00'), date_create('2000-01-03 09:00:00'),
date_create('2000-01-04 09:00:00'), date_create('2000-01-05 09:00:00'),
date_create('2000-01-06 09:00:00'), date_create('2000-01-07 09:00:00'),
date_create('2000-01-08 09:00:00'), date_create('2000-01-09 09:00:00'),
date_create('2000-01-10 09:00:00'), date_create('2000-01-11 09:00:00'),
date_create('2000-01-12 09:00:00'), date_create('2000-01-13 09:00:00'),
date_create('2000-01-14 09:00:00'), date_create('2000-01-15 09:00:00'),
date_create('2000-01-16 09:00:00'), date_create('2000-01-17 09:00:00'),
date_create('2000-01-18 09:00:00'), date_create('2000-01-19 09:00:00'),
date_create('2000-01-20 09:00:00'), date_create('2000-01-21 09:00:00'),
date_create('2000-01-22 09:00:00'), date_create('2000-01-23 09:00:00'),
date_create('2000-01-24 09:00:00'), date_create('2000-01-25 09:00:00'),
date_create('2000-01-26 09:00:00'), date_create('2000-01-27 09:00:00'),
date_create('2000-01-28 09:00:00'), date_create('2000-01-29 09:00:00'),
date_create('2000-01-30 09:00:00'), date_create('2000-01-31 09:00:00')]
),
// Weekly for 10 occurrences:
array(
['freq' => 'weekly', 'count' => 10, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-09 09:00:00'),
date_create('1997-09-16 09:00:00'),
date_create('1997-09-23 09:00:00'),
date_create('1997-09-30 09:00:00'),
date_create('1997-10-07 09:00:00'),
date_create('1997-10-14 09:00:00'),
date_create('1997-10-21 09:00:00'),
date_create('1997-10-28 09:00:00'),
date_create('1997-11-04 09:00:00')]
),
// Every other week, 6 occurrences.
array(
['freq' => 'weekly', 'interval' => 2, 'count' => 6, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-16 09:00:00'),
date_create('1997-09-30 09:00:00'),
date_create('1997-10-14 09:00:00'),
date_create('1997-10-28 09:00:00'),
date_create('1997-11-11 09:00:00')]
),
// Weekly on Tuesday and Thursday for 5 weeks, week starting on Sunday.
array(
['freq' => 'weekly', 'count' => 10, 'wkst' => 'SU', 'byday' => 'TU,TH', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-04 09:00:00'),
date_create('1997-09-09 09:00:00'),
date_create('1997-09-11 09:00:00'),
date_create('1997-09-16 09:00:00'),
date_create('1997-09-18 09:00:00'),
date_create('1997-09-23 09:00:00'),
date_create('1997-09-25 09:00:00'),
date_create('1997-09-30 09:00:00'),
date_create('1997-10-02 09:00:00')]
),
// Every other week on Tuesday and Thursday, for 8 occurrences, week starting on Sunday
array(
['freq' => 'weekly', 'interval' => 2, 'count' => 8, 'wkst' => 'SU', 'byday' => 'TU,TH', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-04 09:00:00'),
date_create('1997-09-16 09:00:00'),
date_create('1997-09-18 09:00:00'),
date_create('1997-09-30 09:00:00'),
date_create('1997-10-02 09:00:00'),
date_create('1997-10-14 09:00:00'),
date_create('1997-10-16 09:00:00')]
),
// Monthly on the 1st Friday for ten occurrences.
array(
['freq' => 'monthly', 'count' => 10, 'byday' => '1FR', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-05 09:00:00'),
date_create('1997-10-03 09:00:00'),
date_create('1997-11-07 09:00:00'),
date_create('1997-12-05 09:00:00'),
date_create('1998-01-02 09:00:00'),
date_create('1998-02-06 09:00:00'),
date_create('1998-03-06 09:00:00'),
date_create('1998-04-03 09:00:00'),
date_create('1998-05-01 09:00:00'),
date_create('1998-06-05 09:00:00')]
),
// Every other month on the 1st and last Sunday of the month for 10 occurrences.
array(
['freq' => 'monthly', 'interval' => 2, 'count' => 10, 'byday' => '1SU,-1SU', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-07 09:00:00'),
date_create('1997-09-28 09:00:00'),
date_create('1997-11-02 09:00:00'),
date_create('1997-11-30 09:00:00'),
date_create('1998-01-04 09:00:00'),
date_create('1998-01-25 09:00:00'),
date_create('1998-03-01 09:00:00'),
date_create('1998-03-29 09:00:00'),
date_create('1998-05-03 09:00:00'),
date_create('1998-05-31 09:00:00')]
),
// Monthly on the second to last Monday of the month for 6 months.
array(
['freq' => 'monthly', 'count' => 6, 'byday' => '-2MO', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-22 09:00:00'),
date_create('1997-10-20 09:00:00'),
date_create('1997-11-17 09:00:00'),
date_create('1997-12-22 09:00:00'),
date_create('1998-01-19 09:00:00'),
date_create('1998-02-16 09:00:00')]
),
// Monthly on the third to the last day of the month, for 6 months.
array(
['freq' => 'monthly', 'count' => 6, 'bymonthday' => '-3', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-28 09:00:00'),
date_create('1997-10-29 09:00:00'),
date_create('1997-11-28 09:00:00'),
date_create('1997-12-29 09:00:00'),
date_create('1998-01-29 09:00:00'),
date_create('1998-02-26 09:00:00')]
),
// Monthly on the 2nd and 15th of the month for 5 occurrences.
array(
['freq' => 'monthly', 'count' => 5, 'bymonthday' => '2,15', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-15 09:00:00'),
date_create('1997-10-02 09:00:00'),
date_create('1997-10-15 09:00:00'),
date_create('1997-11-02 09:00:00')]
),
// Monthly on the first and last day of the month for 3 occurrences.
array(
['freq' => 'monthly', 'count' => 5, 'bymonthday' => '-1,1', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-30 09:00:00'),
date_create('1997-10-01 09:00:00'),
date_create('1997-10-31 09:00:00'),
date_create('1997-11-01 09:00:00'),
date_create('1997-11-30 09:00:00')]
),
// Every 18 months on the 10th thru 15th of the month for 10 occurrences.
array(
['freq' => 'monthly', 'count' => 10, 'interval' => 18, 'bymonthday' => range(10,15), 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-10 09:00:00'),
date_create('1997-09-11 09:00:00'),
date_create('1997-09-12 09:00:00'),
date_create('1997-09-13 09:00:00'),
date_create('1997-09-14 09:00:00'),
date_create('1997-09-15 09:00:00'),
date_create('1999-03-10 09:00:00'),
date_create('1999-03-11 09:00:00'),
date_create('1999-03-12 09:00:00'),
date_create('1999-03-13 09:00:00')]
),
// Every Tuesday, every other month, 6 occurences.
array(
['freq' => 'monthly', 'count' => 6, 'interval' => 2, 'byday' => 'TU', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-02 09:00:00'),
date_create('1997-09-09 09:00:00'),
date_create('1997-09-16 09:00:00'),
date_create('1997-09-23 09:00:00'),
date_create('1997-09-30 09:00:00'),
date_create('1997-11-04 09:00:00')]
),
// Yearly in June and July for 10 occurrences.
array(
['freq' => 'yearly', 'count' => 10, 'bymonth' => '6,7', 'dtstart' => '1997-06-10 09:00:00'],
[date_create('1997-06-10 09:00:00'),date_create('1997-07-10 09:00:00'),
date_create('1998-06-10 09:00:00'),date_create('1998-07-10 09:00:00'),
date_create('1999-06-10 09:00:00'),date_create('1999-07-10 09:00:00'),
date_create('2000-06-10 09:00:00'),date_create('2000-07-10 09:00:00'),
date_create('2001-06-10 09:00:00'),date_create('2001-07-10 09:00:00')]
),
// Every 3rd year on the 1st, 100th and 200th day for 4 occurrences.
array(
['freq' => 'yearly', 'count' => 4, 'interval' => '3', 'byyearday' => '1,100,200', 'dtstart' => '1997-01-01 09:00:00'],
[date_create('1997-01-01 09:00:00'),
date_create('1997-04-10 09:00:00'),
date_create('1997-07-19 09:00:00'),
date_create('2000-01-01 09:00:00')]
),
// Every 20th Monday of the year, 3 occurrences.
array(
['freq' => 'yearly', 'count' => 3, 'byday' => '20MO', 'dtstart' => '1997-05-19 09:00:00'],
[date_create('1997-05-19 09:00:00'),
date_create('1998-05-18 09:00:00'),
date_create('1999-05-17 09:00:00')]
),
// Monday of week number 20 (where the default start of the week is Monday), 3 occurrences.
array(
['freq' => 'yearly', 'count' => 3, 'byweekno' => 20, 'byday' => 'MO', 'dtstart' => '1997-05-12 09:00:00'],
[date_create('1997-05-12 09:00:00'),
date_create('1998-05-11 09:00:00'),
date_create('1999-05-17 09:00:00')]
),
// Every Thursday in March
array(
['freq' => 'yearly', 'byday' => 'TH', 'bymonth' => 3, 'dtstart' => '1997-03-13 09:00:00', 'until' => '2000-01-01'],
[date_create('1997-03-13 09:00:00'),
date_create('1997-03-20 09:00:00'),
date_create('1997-03-27 09:00:00'),
date_create('1998-03-05 09:00:00'),
date_create('1998-03-12 09:00:00'),
date_create('1998-03-19 09:00:00'),
date_create('1998-03-26 09:00:00'),
date_create('1999-03-04 09:00:00'),
date_create('1999-03-11 09:00:00'),
date_create('1999-03-18 09:00:00'),
date_create('1999-03-25 09:00:00')]
),
// Every Thursday, but only during June, July, and August
array(
['freq' => 'yearly', 'byday' => 'TH', 'bymonth' => [6,7,8], 'dtstart' => '1997-01-01 09:00:00', 'until' => '1999-01-01'],
[date_create('1997-06-05 09:00:00'),
date_create('1997-06-12 09:00:00'),
date_create('1997-06-19 09:00:00'),
date_create('1997-06-26 09:00:00'),
date_create('1997-07-03 09:00:00'),
date_create('1997-07-10 09:00:00'),
date_create('1997-07-17 09:00:00'),
date_create('1997-07-24 09:00:00'),
date_create('1997-07-31 09:00:00'),
date_create('1997-08-07 09:00:00'),
date_create('1997-08-14 09:00:00'),
date_create('1997-08-21 09:00:00'),
date_create('1997-08-28 09:00:00'),
date_create('1998-06-04 09:00:00'),
date_create('1998-06-11 09:00:00'),
date_create('1998-06-18 09:00:00'),
date_create('1998-06-25 09:00:00'),
date_create('1998-07-02 09:00:00'),
date_create('1998-07-09 09:00:00'),
date_create('1998-07-16 09:00:00'),
date_create('1998-07-23 09:00:00'),
date_create('1998-07-30 09:00:00'),
date_create('1998-08-06 09:00:00'),
date_create('1998-08-13 09:00:00'),
date_create('1998-08-20 09:00:00'),
date_create('1998-08-27 09:00:00')]
),
// Every Friday the 13th, 4 occurrences.
array(
['freq' => 'yearly', 'byday' => 'FR', 'bymonthday' => 13, 'count' => 4, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1998-02-13 09:00:00'),
date_create('1998-03-13 09:00:00'),
date_create('1998-11-13 09:00:00'),
date_create('1999-08-13 09:00:00')]
),
// The first Saturday that follows the first Sunday of the month
array(
['freq' => 'monthly', 'byday' => 'SA', 'bymonthday' => [7,8,9,10,11,12,13], 'count' => 10, 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-09-13 09:00:00'),
date_create('1997-10-11 09:00:00'),
date_create('1997-11-08 09:00:00'),
date_create('1997-12-13 09:00:00'),
date_create('1998-01-10 09:00:00'),
date_create('1998-02-07 09:00:00'),
date_create('1998-03-07 09:00:00'),
date_create('1998-04-11 09:00:00'),
date_create('1998-05-09 09:00:00'),
date_create('1998-06-13 09:00:00')]
),
// Every four years, the first Tuesday after a Monday in November, 3 occurrences (U.S. Presidential Election day):
array(
['freq' => 'yearly', 'interval' => 4, 'bymonth' => 11, 'byday' => 'TU', 'bymonthday' => [2,3,4,5,6,7,8], 'count' => 3, 'dtstart' => '1996-11-05 09:00:00'],
[date_create('1996-11-05 09:00:00'),
date_create('2000-11-07 09:00:00'),
date_create('2004-11-02 09:00:00')]
),
// The 3rd instance into the month of one of Tuesday, Wednesday or Thursday, for the next 3 months:
array(
['freq' => 'monthly', 'byday' => 'TU,WE,TH', 'bysetpos' => 3, 'count' => 3, 'dtstart' => '1997-09-04 09:00:00'],
[date_create('1997-09-04 09:00:00'),
date_create('1997-10-07 09:00:00'),
date_create('1997-11-06 09:00:00')]
),
// The 2nd to last weekday of the month, 3 occurrences.
array(
['freq' => 'monthly', 'byday' => 'MO,TU,WE,TH,FR', 'bysetpos' => -2, 'count' => 3, 'dtstart' => '1997-09-29 09:00:00'],
[date_create('1997-09-29 09:00:00'),
date_create('1997-10-30 09:00:00'),
date_create('1997-11-27 09:00:00')]
),
// todo HOURLY, MINUTELY, SECONDLY
);
}
/**
* @dataProvider rfcExamples
*/
public function testRfcExamples($rule, $occurrences)
{
$rule = new RRule($rule);
$this->assertEquals($occurrences, $rule->getOccurrences());
foreach ( $occurrences as $date ) {
$this->assertTrue($rule->occursAt($date), 'RRule occurs at: '.$date->format('r'));
}
}
/**
* Just some more random rules found here and there. Some of them
* might not bring any additional value to the tests to be honest, but
* it's good to test them anyway.
*/
public function variousRules()
{
return array(
array(
['freq' => 'daily', 'count' => 3, 'byday' => 'TU,TH', 'dtstart' => '2007-01-01'],
[date_create('2007-01-02'), date_create('2007-01-04'), date_create('2007-01-09')]
),
array(
['freq' => 'weekly', 'count' => 3, 'byday' => 'TU,TH', 'dtstart' => '2007-01-01'],
[date_create('2007-01-02'), date_create('2007-01-04'), date_create('2007-01-09')]
),
array(
['freq' => 'daily', 'count' => 3, 'byday' => 'TU,TH', 'dtstart' => '2007-01-01', 'bysetpos' => 1],
[date_create('2007-01-02'), date_create('2007-01-04'), date_create('2007-01-09')]
),
array(
['freq' => 'weekly', 'count' => 3, 'byday' => 'TU,TH', 'dtstart' => '2007-01-01', 'bysetpos' => 1],
[date_create('2007-01-02'), date_create('2007-01-09'), date_create('2007-01-16')]
),
// The week number 1 may be in the last year.
array(
['freq' => 'yearly', 'count' => 3, 'byweekno' => 1, 'byday' => 'MO', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-12-29 09:00:00'),
date_create('1999-01-04 09:00:00'),
date_create('2000-01-03 09:00:00')]
),
// And the week numbers greater than 51 may be in the next year.
array(
['freq' => 'yearly', 'count' => 3, 'byweekno' => 52, 'byday' => 'SU', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1997-12-28 09:00:00'),
date_create('1998-12-27 09:00:00'),
date_create('2000-01-02 09:00:00')]
),
// Only some years have week number 53
array(
['freq' => 'yearly', 'count' => 3, 'byweekno' => 53, 'byday' => 'MO', 'dtstart' => '1997-09-02 09:00:00'],
[date_create('1998-12-28 09:00:00'),
date_create('2004-12-27 09:00:00'),
date_create('2009-12-28 09:00:00')]
)
);
}
/**
* @dataProvider variousRules
*/
public function testVariousRules($rule, $occurrences)
{
$rule = new RRule($rule);
$this->assertEquals($occurrences, $rule->getOccurrences());
foreach ( $occurrences as $date ) {
$this->assertTrue($rule->occursAt($date), 'RRule occurs at: '.$date->format('r'));
}
}
/**
* Test that occursAt doesn't return true for wrong dates
*/
public function notOccurrences()
{
return array(