Skip to content

Commit

Permalink
Add PHP version requirements
Browse files Browse the repository at this point in the history
  • Loading branch information
valentinbonneaud committed Dec 15, 2021
1 parent bb55eac commit ae4a32d
Show file tree
Hide file tree
Showing 3 changed files with 266 additions and 4 deletions.
140 changes: 139 additions & 1 deletion tests/VObject/Recur/FastForwardBeforeTest.php
Expand Up @@ -272,6 +272,9 @@ public function testFastForwardBeforeMonthlyBasic()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP < 8.1
*/
public function testFastForwardBeforeMonthly31thDay()
{
$timezone = 'America/New_York';
Expand All @@ -282,7 +285,7 @@ public function testFastForwardBeforeMonthly31thDay()

$this->fastForward($rrule, $ffDate);

$expected = (new DateTime('midnight', new DateTimeZone('America/New_York')))
$expected = (new DateTime('midnight', new DateTimeZone($timezone)))
->setDate(18000, 1, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());
Expand Down Expand Up @@ -318,6 +321,70 @@ public function testFastForwardBeforeMonthly31thDay()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP >= 8.1
*/
public function testFastForwardBeforeMonthly31thDayPHP81()
{
$timezone = 'America/New_York';
$startDate = new \DateTime('1970-01-31 00:00:00', new \DateTimeZone($timezone));
$ffDate = new \DateTime('midnight', new DateTimeZone('zulu'));
$ffDate->setDate(18000, 2, 1);
$rrule = new RRuleIterator('FREQ=MONTHLY', $startDate);

$this->fastForward($rrule, $ffDate);

$expected = (new \DateTime('midnight', new DateTimeZone($timezone)))
->setDate(18000, 1, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// march
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 3, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// may
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 5, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// july
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 7, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// august
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 8, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// october
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 10, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// december
$rrule->next();
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(18000, 12, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP < 8.1
*/
public function testFastForwardBeforeMonthlyAdvanced()
{
$timezone = 'America/New_York';
Expand Down Expand Up @@ -371,6 +438,77 @@ public function testFastForwardBeforeMonthlyAdvanced()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP >= 8.1
*/
public function testFastForwardBeforeMonthlyAdvancedPHP81()
{
$timezone = 'America/New_York';
$startDate = new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone));
$ffDate = new \DateTime('midnight', new DateTimeZone('zulu'));
$ffDate->setDate(8000, 1, 6);
// every 2 months on the 1st Monday, 2nd Tuesday, 3rd Wednesday and 4th Thursday
$rrule = new RRuleIterator('FREQ=MONTHLY;INTERVAL=2;BYDAY=1MO,2TU,3WE,4TH', $startDate);

$this->fastForward($rrule, $ffDate);

// monday
$expected = (new DateTime('midnight', new DateTimeZone($timezone)))
->setDate(8000, 1, 3)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// tuesday
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 1, 11)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// wednesday
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 1, 19)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// thursday
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 1, 27)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// monday march
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 3, 6)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// tuesday
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 3, 14)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// wednesday (this month starts on wednesday so that's just the next day)
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 3, 15)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// thursday
$expected += 8 * 24 * 60 * 60;
$expected = (new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone)))
->setDate(8000, 3, 23)
->getTimestamp();
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

public function testFastForwardBeforeDailyBasic()
{
$timezone = 'America/New_York';
Expand Down
110 changes: 110 additions & 0 deletions tests/VObject/Recur/FastForwardTest.php
Expand Up @@ -244,6 +244,9 @@ public function testFastForwardMonthlyBasic()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP < 8.1
*/
public function testFastForwardMonthly31thDay()
{
$timezone = 'America/New_York';
Expand Down Expand Up @@ -290,6 +293,58 @@ public function testFastForwardMonthly31thDay()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP >= 8.1
*/
public function testFastForwardMonthly31thDayPHP81()
{
$timezone = 'America/New_York';
$startDate = new \DateTime('1970-01-31 00:00:00', new \DateTimeZone($timezone));
$ffDate = new \DateTime('midnight', new DateTimeZone('zulu'));
$ffDate->setDate(18000, 1, 1);
$rrule = new RRuleIterator('FREQ=MONTHLY', $startDate);

$this->fastForward($rrule, $ffDate);

$expected = (new DateTime('midnight', new DateTimeZone('America/New_York')))
->setDate(18000, 1, 31)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// march
$rrule->next();
$expected += (29 + 31) * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// may
$rrule->next();
$expected += (30 + 31) * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// july
$rrule->next();
$expected += (30 + 31) * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// august
$rrule->next();
$expected += 31 * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// october
$rrule->next();
$expected += (30 + 31) * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// december
$rrule->next();
$expected += (30 + 31) * 24 * 60 * 60;
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP < 8.1
*/
public function testFastForwardMonthlyAdvanced()
{
$timezone = 'America/New_York';
Expand Down Expand Up @@ -342,6 +397,61 @@ public function testFastForwardMonthlyAdvanced()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP >= 8.1
*/
public function testFastForwardMonthlyAdvancedPHP81()
{
$timezone = 'America/New_York';
$startDate = new \DateTime('1970-01-31 00:00:00', new DateTimeZone($timezone));
$ffDate = new \DateTime('midnight', new DateTimeZone('zulu'));
$ffDate->setDate(8000, 1, 1);
$rrule = new RRuleIterator('FREQ=MONTHLY;INTERVAL=2;BYDAY=1MO,2TU,3WE,4TH', $startDate);

$this->fastForward($rrule, $ffDate);

// monday
$expected = (new DateTime('midnight', new DateTimeZone($timezone)))
->setDate(8000, 1, 3)
->getTimestamp();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// tuesday
$expected += 8 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// wednesday
$expected += 8 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// thursday
$expected += 8 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// monday march
$expected += (29 + 10) * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// tuesday
$expected += 8 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// wednesday (this month starts on wednesday so that's just the next day)
$expected += 1 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());

// thursday
$expected += 8 * 24 * 60 * 60;
$rrule->next();
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

public function testFastForwardDailyBasic()
{
$timezone = 'America/New_York';
Expand Down
20 changes: 17 additions & 3 deletions tests/VObject/Recur/FastForwardToEndTest.php
Expand Up @@ -186,9 +186,7 @@ public function testFastForwardToEndUntilMonthlyBasic()
}

/**
* FIXME fails in <=PHP 7.1.
*
* @requires PHP 7.2
* @requires PHP < 8.1
*/
public function testFastForwardToEndCountMonthly31thDay()
{
Expand All @@ -204,6 +202,22 @@ public function testFastForwardToEndCountMonthly31thDay()
$this->assertEquals($expected, $rrule->current()->getTimestamp());
}

/**
* @requires PHP >= 8.1
*/
public function testFastForwardToEndCountMonthly31thDayPHP81()
{
$startDate = new \DateTime('1970-01-31 00:00:00', new \DateTimeZone('America/New_York'));
$rrule = new RRuleIterator('FREQ=MONTHLY;COUNT=10000', $startDate);

// We do not enforce the timing in case of a count rule as we cannot optimize it
$this->fastForwardToEnd($rrule, false);

$expected = (new DateTime('midnight', new DateTimeZone('America/New_York')))
->setDate(3398, 7, 31);
$this->assertEquals($expected->getTimestamp(), $rrule->current()->getTimestamp());
}

public function testFastForwardToEndUntilMonthly31thDay()
{
$startDate = new \DateTime('1970-01-31 00:00:00', new \DateTimeZone('America/New_York'));
Expand Down

0 comments on commit ae4a32d

Please sign in to comment.