Changeset View
Changeset View
Standalone View
Standalone View
src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php
<?php | <?php | ||||
final class PhutilICSParserTestCase extends PhutilTestCase { | final class PhutilICSParserTestCase extends PhutilTestCase { | ||||
public function testICSParser() { | public function testICSParser() { | ||||
$root = $this->parseICSDocument('simple.ics'); | $event = $this->parseICSSingleEvent('simple.ics'); | ||||
$documents = $root->getDocuments(); | |||||
$this->assertEqual(1, count($documents)); | |||||
$document = head($documents); | |||||
$events = $document->getEvents(); | |||||
$this->assertEqual(1, count($events)); | |||||
$event = head($events); | |||||
$this->assertEqual( | $this->assertEqual( | ||||
array( | array( | ||||
array( | array( | ||||
'name' => 'CREATED', | 'name' => 'CREATED', | ||||
'parameters' => array(), | 'parameters' => array(), | ||||
'value' => array( | 'value' => array( | ||||
'type' => 'DATE-TIME', | 'type' => 'DATE-TIME', | ||||
'value' => array( | 'value' => array( | ||||
Show All 9 Lines | $this->assertEqual( | ||||
'type' => 'TEXT', | 'type' => 'TEXT', | ||||
'value' => array( | 'value' => array( | ||||
'1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', | '1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', | ||||
), | ), | ||||
'raw' => '1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', | 'raw' => '1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', | ||||
), | ), | ||||
), | ), | ||||
array( | array( | ||||
'name' => 'DTSTART', | |||||
'parameters' => array( | |||||
array( | |||||
'name' => 'TZID', | |||||
'values' => array( | |||||
array( | |||||
'value' => 'America/Los_Angeles', | |||||
'quoted' => false, | |||||
), | |||||
), | |||||
), | |||||
), | |||||
'value' => array( | |||||
'type' => 'DATE-TIME', | |||||
'value' => array( | |||||
'20160915T090000', | |||||
), | |||||
'raw' => '20160915T090000', | |||||
), | |||||
), | |||||
array( | |||||
'name' => 'DTEND', | 'name' => 'DTEND', | ||||
'parameters' => array( | 'parameters' => array( | ||||
array( | array( | ||||
'name' => 'TZID', | 'name' => 'TZID', | ||||
'values' => array( | 'values' => array( | ||||
array( | array( | ||||
'value' => 'America/Los_Angeles', | 'value' => 'America/Los_Angeles', | ||||
'quoted' => false, | 'quoted' => false, | ||||
Show All 10 Lines | $this->assertEqual( | ||||
), | ), | ||||
), | ), | ||||
array( | array( | ||||
'name' => 'SUMMARY', | 'name' => 'SUMMARY', | ||||
'parameters' => array(), | 'parameters' => array(), | ||||
'value' => array( | 'value' => array( | ||||
'type' => 'TEXT', | 'type' => 'TEXT', | ||||
'value' => array( | 'value' => array( | ||||
'Example Event', | 'Simple Event', | ||||
), | |||||
'raw' => 'Simple Event', | |||||
), | |||||
), | |||||
array( | |||||
'name' => 'DESCRIPTION', | |||||
'parameters' => array(), | |||||
'value' => array( | |||||
'type' => 'TEXT', | |||||
'value' => array( | |||||
'This is a simple event.', | |||||
), | ), | ||||
'raw' => 'Example Event', | 'raw' => 'This is a simple event.', | ||||
), | ), | ||||
), | ), | ||||
), | ), | ||||
$event->getAttribute('ics.properties')); | $event->getAttribute('ics.properties')); | ||||
$this->assertEqual( | |||||
'Simple Event', | |||||
$event->getName()); | |||||
$this->assertEqual( | |||||
'This is a simple event.', | |||||
$event->getDescription()); | |||||
$this->assertEqual( | |||||
1473955200, | |||||
$event->getStartDateTime()->getEpoch()); | |||||
$this->assertEqual( | |||||
1473955200 + phutil_units('1 hour in seconds'), | |||||
$event->getEndDateTime()->getEpoch()); | |||||
} | |||||
public function testICSFloatingTime() { | |||||
// This tests "floating" event times, which have no absolute time and are | |||||
// supposed to be interpreted using the viewer's timezone. It also uses | |||||
// a duration, and the duration needs to float along with the viewer | |||||
// timezone. | |||||
$event = $this->parseICSSingleEvent('floating.ics'); | |||||
$start = $event->getStartDateTime(); | |||||
$caught = null; | |||||
try { | |||||
$start->getEpoch(); | |||||
} catch (Exception $ex) { | |||||
$caught = $ex; | |||||
} | |||||
$this->assertTrue( | |||||
($caught instanceof Exception), | |||||
pht('Expected exception for floating time with no viewer timezone.')); | |||||
$newyears_utc = strtotime('2015-01-01 00:00:00 UTC'); | |||||
$this->assertEqual(1420070400, $newyears_utc); | |||||
$start->setViewerTimezone('UTC'); | |||||
$this->assertEqual( | |||||
$newyears_utc, | |||||
$start->getEpoch()); | |||||
$start->setViewerTimezone('America/Los_Angeles'); | |||||
$this->assertEqual( | |||||
$newyears_utc + phutil_units('8 hours in seconds'), | |||||
$start->getEpoch()); | |||||
$start->setViewerTimezone('America/New_York'); | |||||
$this->assertEqual( | |||||
$newyears_utc + phutil_units('5 hours in seconds'), | |||||
$start->getEpoch()); | |||||
$end = $event->getEndDateTime(); | |||||
$end->setViewerTimezone('UTC'); | |||||
$this->assertEqual( | |||||
$newyears_utc + phutil_units('24 hours in seconds'), | |||||
$end->getEpoch()); | |||||
$end->setViewerTimezone('America/Los_Angeles'); | |||||
$this->assertEqual( | |||||
$newyears_utc + phutil_units('32 hours in seconds'), | |||||
$end->getEpoch()); | |||||
$end->setViewerTimezone('America/New_York'); | |||||
$this->assertEqual( | |||||
$newyears_utc + phutil_units('29 hours in seconds'), | |||||
$end->getEpoch()); | |||||
} | |||||
public function testICSDuration() { | |||||
$event = $this->parseICSSingleEvent('duration.ics'); | |||||
// Raw value is "20160719T095722Z". | |||||
$start_epoch = strtotime('2016-07-19 09:57:22 UTC'); | |||||
$this->assertEqual(1468922242, $start_epoch); | |||||
// Raw value is "P1DT17H4M23S". | |||||
$duration = | |||||
phutil_units('1 day in seconds') + | |||||
phutil_units('17 hours in seconds') + | |||||
phutil_units('4 minutes in seconds') + | |||||
phutil_units('23 seconds in seconds'); | |||||
$this->assertEqual( | |||||
$start_epoch, | |||||
$event->getStartDateTime()->getEpoch()); | |||||
$this->assertEqual( | |||||
$start_epoch + $duration, | |||||
$event->getEndDateTime()->getEpoch()); | |||||
} | } | ||||
public function testICSParserErrors() { | public function testICSParserErrors() { | ||||
$map = array( | $map = array( | ||||
'err-missing-end.ics' => PhutilICSParser::PARSE_MISSING_END, | 'err-missing-end.ics' => PhutilICSParser::PARSE_MISSING_END, | ||||
'err-bad-base64.ics' => PhutilICSParser::PARSE_BAD_BASE64, | 'err-bad-base64.ics' => PhutilICSParser::PARSE_BAD_BASE64, | ||||
'err-bad-boolean.ics' => PhutilICSParser::PARSE_BAD_BOOLEAN, | 'err-bad-boolean.ics' => PhutilICSParser::PARSE_BAD_BOOLEAN, | ||||
'err-extra-end.ics' => PhutilICSParser::PARSE_EXTRA_END, | 'err-extra-end.ics' => PhutilICSParser::PARSE_EXTRA_END, | ||||
'err-initial-unfold.ics' => PhutilICSParser::PARSE_INITIAL_UNFOLD, | 'err-initial-unfold.ics' => PhutilICSParser::PARSE_INITIAL_UNFOLD, | ||||
'err-malformed-double-quote.ics' => | 'err-malformed-double-quote.ics' => | ||||
PhutilICSParser::PARSE_MALFORMED_DOUBLE_QUOTE, | PhutilICSParser::PARSE_MALFORMED_DOUBLE_QUOTE, | ||||
'err-malformed-parameter.ics' => | 'err-malformed-parameter.ics' => | ||||
PhutilICSParser::PARSE_MALFORMED_PARAMETER_NAME, | PhutilICSParser::PARSE_MALFORMED_PARAMETER_NAME, | ||||
'err-malformed-property.ics' => | 'err-malformed-property.ics' => | ||||
PhutilICSParser::PARSE_MALFORMED_PROPERTY, | PhutilICSParser::PARSE_MALFORMED_PROPERTY, | ||||
'err-missing-value.ics' => PhutilICSParser::PARSE_MISSING_VALUE, | 'err-missing-value.ics' => PhutilICSParser::PARSE_MISSING_VALUE, | ||||
'err-mixmatched-sections.ics' => | 'err-mixmatched-sections.ics' => | ||||
PhutilICSParser::PARSE_MISMATCHED_SECTIONS, | PhutilICSParser::PARSE_MISMATCHED_SECTIONS, | ||||
'err-root-property.ics' => PhutilICSParser::PARSE_ROOT_PROPERTY, | 'err-root-property.ics' => PhutilICSParser::PARSE_ROOT_PROPERTY, | ||||
'err-unescaped-backslash.ics' => | 'err-unescaped-backslash.ics' => | ||||
PhutilICSParser::PARSE_UNESCAPED_BACKSLASH, | PhutilICSParser::PARSE_UNESCAPED_BACKSLASH, | ||||
'err-unexpected-child.ics' => PhutilICSParser::PARSE_UNEXPECTED_CHILD, | 'err-unexpected-child.ics' => PhutilICSParser::PARSE_UNEXPECTED_CHILD, | ||||
'err-unexpected-text.ics' => PhutilICSParser::PARSE_UNEXPECTED_TEXT, | 'err-unexpected-text.ics' => PhutilICSParser::PARSE_UNEXPECTED_TEXT, | ||||
'err-multiple-parameters.ics' => | |||||
PhutilICSParser::PARSE_MULTIPLE_PARAMETERS, | |||||
'err-empty-datetime.ics' => | |||||
PhutilICSParser::PARSE_EMPTY_DATETIME, | |||||
'err-many-datetime.ics' => | |||||
PhutilICSParser::PARSE_MANY_DATETIME, | |||||
'err-bad-datetime.ics' => | |||||
PhutilICSParser::PARSE_BAD_DATETIME, | |||||
'err-bad-tzid.ics' => | |||||
PhutilICSParser::PARSE_BAD_TZID, | |||||
'err-empty-duration.ics' => | |||||
PhutilICSParser::PARSE_EMPTY_DURATION, | |||||
'err-many-duration.ics' => | |||||
PhutilICSParser::PARSE_MANY_DURATION, | |||||
'err-bad-duration.ics' => | |||||
PhutilICSParser::PARSE_BAD_DURATION, | |||||
'simple.ics' => null, | 'simple.ics' => null, | ||||
'good-boolean.ics' => null, | 'good-boolean.ics' => null, | ||||
'multiple-vcalendars.ics' => null, | 'multiple-vcalendars.ics' => null, | ||||
); | ); | ||||
foreach ($map as $test_file => $expect) { | foreach ($map as $test_file => $expect) { | ||||
$caught = null; | $caught = null; | ||||
Show All 25 Lines | foreach ($map as $test_file => $expect) { | ||||
$test_file); | $test_file); | ||||
} | } | ||||
$this->assertEqual($expect, $code, $explain); | $this->assertEqual($expect, $code, $explain); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
private function parseICSSingleEvent($name) { | |||||
$root = $this->parseICSDocument($name); | |||||
$documents = $root->getDocuments(); | |||||
$this->assertEqual(1, count($documents)); | |||||
$document = head($documents); | |||||
$events = $document->getEvents(); | |||||
$this->assertEqual(1, count($events)); | |||||
return head($events); | |||||
} | |||||
private function parseICSDocument($name) { | private function parseICSDocument($name) { | ||||
$path = dirname(__FILE__).'/data/'.$name; | $path = dirname(__FILE__).'/data/'.$name; | ||||
$data = Filesystem::readFile($path); | $data = Filesystem::readFile($path); | ||||
return id(new PhutilICSParser()) | return id(new PhutilICSParser()) | ||||
->parseICSData($data); | ->parseICSData($data); | ||||
} | } | ||||
} | } |