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(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z')); $list_b = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z')); $list_c = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160109T120000Z')); $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), 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(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), 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.')); }
private function newDateTimeFromProperty(array $parameters, array $value) { $value = $value['value']; if (!$value) { $this->raiseParseFailure(self::PARSE_EMPTY_DATETIME, pht('Expected DATE-TIME to have exactly one value, found none.')); } if (count($value) > 1) { $this->raiseParseFailure(self::PARSE_MANY_DATETIME, pht('Expected DATE-TIME to have exactly one value, found more than ' . 'one.')); } $value = head($value); $tzid = $this->getScalarParameterValue($parameters, 'TZID'); if (preg_match('/Z\\z/', $value)) { if ($tzid) { $this->raiseWarning(self::WARN_TZID_UTC, pht('DATE-TIME "%s" uses "Z" to specify UTC, but also has a TZID ' . 'parameter with value "%s". This violates RFC5545. The TZID ' . 'will be ignored, and the value will be interpreted as UTC.', $value, $tzid)); } $tzid = 'UTC'; } else { if ($tzid !== null) { $map = DateTimeZone::listIdentifiers(); $map = array_fuse($map); if (empty($map[$tzid])) { $this->raiseParseFailure(self::PARSE_BAD_TZID, pht('Timezone "%s" is not a recognized timezone.', $tzid)); } } } try { $datetime = PhutilCalendarAbsoluteDateTime::newFromISO8601($value, $tzid); } catch (Exception $ex) { $this->raiseParseFailure(self::PARSE_BAD_DATETIME, pht('Error parsing DATE-TIME: %s', $ex->getMessage())); } return $datetime; }
private function getNodeInstanceEpoch(PhutilCalendarEventNode $node) { $instance_iso = $node->getRecurrenceID(); if (strlen($instance_iso)) { $instance_datetime = PhutilCalendarAbsoluteDateTime::newFromISO8601($instance_iso); $instance_epoch = $instance_datetime->getEpoch(); } else { $instance_epoch = null; } return $instance_epoch; }
public function testICSWriterUsers() { $event = id(new PhutilCalendarEventNode())->setUID('office-party')->setName('Office Party')->setCreatedDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z'))->setModifiedDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z'))->setStartDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T200000Z'))->setEndDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T230000Z'))->setOrganizer(id(new PhutilCalendarUserNode())->setName('Big Boss')->setURI('mailto:big.boss@example.com'))->addAttendee(id(new PhutilCalendarUserNode())->setName('Milton')->setStatus(PhutilCalendarUserNode::STATUS_INVITED)->setURI('mailto:milton@example.com'))->addAttendee(id(new PhutilCalendarUserNode())->setName('Nancy')->setStatus(PhutilCalendarUserNode::STATUS_ACCEPTED)->setURI('mailto:nancy@example.com')); $ics_data = $this->writeICSSingleEvent($event); $this->assertICS('writer-office-party.ics', $ics_data); }