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.'));
 }
示例#2
0
 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);
 }