GetComponents(['VEVENT' => true]); $result = array(); foreach ($expansion as $k => $instance) { // The same logic used in freebusy-functions (apart from default timezone // handling, which isn't really under test here) $start_date = new RepeatRuleDateTime($instance->GetProperty('DTSTART')); $duration = $instance->GetProperty('DURATION'); $duration = (!isset($duration) ? 'P1D' : $duration->Value()); $end_date = clone($start_date); $end_date->modify($duration); array_push($result, $start_date->UTC() .'/'. $end_date->UTC()); } sort($result); return $result; } final class ExpansionTest extends TestCase { const expected_freebusyish_for_base = [ '20190121T000000Z/20190121T010000Z', '20190122T000000Z/20190122T010000Z', '20190123T000000Z/20190123T010000Z', '20190124T000000Z/20190124T010000Z', ]; public function testUnmodifiedCal() { global $base_cal; self::assertEquals( self::expected_freebusyish_for_base, get_freebusyish($base_cal) ); } public function testTueRenamed() { global $tuesday_renamed_cal; self::assertEquals( self::expected_freebusyish_for_base, get_freebusyish($tuesday_renamed_cal) ); } public function testTueRenamedSwapped() { global $tuesday_renamed_cal_order_swapped; self::assertEquals( self::expected_freebusyish_for_base, get_freebusyish($tuesday_renamed_cal_order_swapped) ); } }