Differential D20774 Diff 49536 src/applications/calendar/parser/data/__tests__/PhutilCalendarRecurrenceTestCase.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/calendar/parser/data/__tests__/PhutilCalendarRecurrenceTestCase.php
- This file was added.
<?php | |||||
final class PhutilCalendarRecurrenceTestCase extends PhutilTestCase { | |||||
public function testCalendarRecurrenceLists() { | |||||
$set = id(new PhutilCalendarRecurrenceSet()); | |||||
$result = $set->getEventsBetween(null, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
array(), | |||||
$result, | |||||
pht('Set with no sources.')); | |||||
$set = id(new PhutilCalendarRecurrenceSet()) | |||||
->addSource(new PhutilCalendarRecurrenceList()); | |||||
$result = $set->getEventsBetween(null, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
array(), | |||||
$result, | |||||
pht('Set with empty list source.')); | |||||
$list = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
); | |||||
$source = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list); | |||||
$set = id(new PhutilCalendarRecurrenceSet()) | |||||
->addSource($source); | |||||
$expect = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
); | |||||
$result = $set->getEventsBetween(null, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Simple date list.')); | |||||
$list_a = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
); | |||||
$list_b = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
); | |||||
$source_a = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list_a); | |||||
$source_b = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list_b); | |||||
$set = id(new PhutilCalendarRecurrenceSet()) | |||||
->addSource($source_a) | |||||
->addSource($source_b); | |||||
$expect = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
); | |||||
$result = $set->getEventsBetween(null, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Multiple date lists.')); | |||||
$list_a = array( | |||||
// This is Jan 1, 3, 5, 7, 8 and 10, but listed out-of-order. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), | |||||
); | |||||
$list_b = array( | |||||
// This is Jan 2, 4, 5, 8, but listed out of order. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), | |||||
); | |||||
$list_c = array( | |||||
// We're going to use this as an exception list. | |||||
// This is Jan 7 (listed in one other source), 8 (listed in two) | |||||
// and 9 (listed in none). | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160109T120000Z'), | |||||
); | |||||
$expect = array( | |||||
// From source A. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
// From source B. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
// From source A. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
// From source B. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), | |||||
// From source A and B. Should appear only once. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), | |||||
// The 6th appears in no source. | |||||
// The 7th, 8th and 9th are excluded. | |||||
// The 10th is from source A. | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), | |||||
); | |||||
$list_a = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list_a); | |||||
$list_b = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list_b); | |||||
$list_c = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list_c) | |||||
->setIsExceptionSource(true); | |||||
$date_set = id(new PhutilCalendarRecurrenceSet()) | |||||
->addSource($list_b) | |||||
->addSource($list_c) | |||||
->addSource($list_a); | |||||
$date_set->setViewerTimezone('UTC'); | |||||
$result = $date_set->getEventsBetween(null, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Set of all results in multiple lists with exclusions.')); | |||||
$expect = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
); | |||||
$result = $date_set->getEventsBetween(null, null, 1); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Multiple lists, one result.')); | |||||
$expect = array( | |||||
2 => PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
3 => PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), | |||||
); | |||||
$result = $date_set->getEventsBetween( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z')); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Multiple lists, time window.')); | |||||
} | |||||
public function testCalendarRecurrenceOffsets() { | |||||
$list = array( | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), | |||||
PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), | |||||
); | |||||
$source = id(new PhutilCalendarRecurrenceList()) | |||||
->setDates($list); | |||||
$set = id(new PhutilCalendarRecurrenceSet()) | |||||
->addSource($source); | |||||
$t1 = PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120001Z'); | |||||
$t2 = PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'); | |||||
$expect = array( | |||||
2 => $t2, | |||||
); | |||||
$result = $set->getEventsBetween($t1, null, 0xFFFF); | |||||
$this->assertEqual( | |||||
mpull($expect, 'getISO8601'), | |||||
mpull($result, 'getISO8601'), | |||||
pht('Correct event indexes with start date.')); | |||||
} | |||||
} |