1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\VObject\Splitter; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\VObject; 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehlerclass ICalendarTest extends \PHPUnit_Framework_TestCase { 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler protected $version; 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler function setUp() { 12*a1a3b679SAndreas Boehler $this->version = VObject\Version::VERSION; 13*a1a3b679SAndreas Boehler } 14*a1a3b679SAndreas Boehler 15*a1a3b679SAndreas Boehler function createStream($data) { 16*a1a3b679SAndreas Boehler 17*a1a3b679SAndreas Boehler $stream = fopen('php://memory','r+'); 18*a1a3b679SAndreas Boehler fwrite($stream, $data); 19*a1a3b679SAndreas Boehler rewind($stream); 20*a1a3b679SAndreas Boehler return $stream; 21*a1a3b679SAndreas Boehler 22*a1a3b679SAndreas Boehler } 23*a1a3b679SAndreas Boehler 24*a1a3b679SAndreas Boehler function testICalendarImportValidEvent() { 25*a1a3b679SAndreas Boehler 26*a1a3b679SAndreas Boehler $data = <<<EOT 27*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 28*a1a3b679SAndreas BoehlerBEGIN:VEVENT 29*a1a3b679SAndreas BoehlerUID:foo 30*a1a3b679SAndreas BoehlerDTSTAMP:20140122T233226Z 31*a1a3b679SAndreas BoehlerDTSTART:20140101T070000Z 32*a1a3b679SAndreas BoehlerEND:VEVENT 33*a1a3b679SAndreas BoehlerEND:VCALENDAR 34*a1a3b679SAndreas BoehlerEOT; 35*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 38*a1a3b679SAndreas Boehler 39*a1a3b679SAndreas Boehler $return = ""; 40*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 41*a1a3b679SAndreas Boehler $return .= $object->serialize(); 42*a1a3b679SAndreas Boehler } 43*a1a3b679SAndreas Boehler $this->assertEquals(array(), VObject\Reader::read($return)->validate()); 44*a1a3b679SAndreas Boehler } 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler /** 47*a1a3b679SAndreas Boehler * @expectedException Sabre\VObject\ParseException 48*a1a3b679SAndreas Boehler */ 49*a1a3b679SAndreas Boehler function testICalendarImportWrongType() { 50*a1a3b679SAndreas Boehler 51*a1a3b679SAndreas Boehler $data = <<<EOT 52*a1a3b679SAndreas BoehlerBEGIN:VCARD 53*a1a3b679SAndreas BoehlerUID:foo1 54*a1a3b679SAndreas BoehlerEND:VCARD 55*a1a3b679SAndreas BoehlerBEGIN:VCARD 56*a1a3b679SAndreas BoehlerUID:foo2 57*a1a3b679SAndreas BoehlerEND:VCARD 58*a1a3b679SAndreas BoehlerEOT; 59*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 60*a1a3b679SAndreas Boehler 61*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 62*a1a3b679SAndreas Boehler 63*a1a3b679SAndreas Boehler } 64*a1a3b679SAndreas Boehler 65*a1a3b679SAndreas Boehler function testICalendarImportEndOfData() { 66*a1a3b679SAndreas Boehler $data = <<<EOT 67*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 68*a1a3b679SAndreas BoehlerBEGIN:VEVENT 69*a1a3b679SAndreas BoehlerUID:foo 70*a1a3b679SAndreas BoehlerDTSTAMP:20140122T233226Z 71*a1a3b679SAndreas BoehlerEND:VEVENT 72*a1a3b679SAndreas BoehlerEND:VCALENDAR 73*a1a3b679SAndreas BoehlerEOT; 74*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 77*a1a3b679SAndreas Boehler 78*a1a3b679SAndreas Boehler $return = ""; 79*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 80*a1a3b679SAndreas Boehler $return .= $object->serialize(); 81*a1a3b679SAndreas Boehler } 82*a1a3b679SAndreas Boehler $this->assertNull($object=$objects->getNext()); 83*a1a3b679SAndreas Boehler } 84*a1a3b679SAndreas Boehler 85*a1a3b679SAndreas Boehler /** 86*a1a3b679SAndreas Boehler * @expectedException Sabre\VObject\ParseException 87*a1a3b679SAndreas Boehler */ 88*a1a3b679SAndreas Boehler function testICalendarImportInvalidEvent() { 89*a1a3b679SAndreas Boehler $data = <<<EOT 90*a1a3b679SAndreas BoehlerEOT; 91*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 92*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler } 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler function testICalendarImportMultipleValidEvents() { 97*a1a3b679SAndreas Boehler 98*a1a3b679SAndreas Boehler $event[] = <<<EOT 99*a1a3b679SAndreas BoehlerBEGIN:VEVENT 100*a1a3b679SAndreas BoehlerUID:foo1 101*a1a3b679SAndreas BoehlerDTSTAMP:20140122T233226Z 102*a1a3b679SAndreas BoehlerDTSTART:20140101T050000Z 103*a1a3b679SAndreas BoehlerEND:VEVENT 104*a1a3b679SAndreas BoehlerEOT; 105*a1a3b679SAndreas Boehler 106*a1a3b679SAndreas Boehler$event[] = <<<EOT 107*a1a3b679SAndreas BoehlerBEGIN:VEVENT 108*a1a3b679SAndreas BoehlerUID:foo2 109*a1a3b679SAndreas BoehlerDTSTAMP:20140122T233226Z 110*a1a3b679SAndreas BoehlerDTSTART:20140101T060000Z 111*a1a3b679SAndreas BoehlerEND:VEVENT 112*a1a3b679SAndreas BoehlerEOT; 113*a1a3b679SAndreas Boehler 114*a1a3b679SAndreas Boehler $data = <<<EOT 115*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 116*a1a3b679SAndreas Boehler$event[0] 117*a1a3b679SAndreas Boehler$event[1] 118*a1a3b679SAndreas BoehlerEND:VCALENDAR 119*a1a3b679SAndreas Boehler 120*a1a3b679SAndreas BoehlerEOT; 121*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 124*a1a3b679SAndreas Boehler 125*a1a3b679SAndreas Boehler $return = ""; 126*a1a3b679SAndreas Boehler $i = 0; 127*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 128*a1a3b679SAndreas Boehler 129*a1a3b679SAndreas Boehler $expected = <<<EOT 130*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 131*a1a3b679SAndreas BoehlerVERSION:2.0 132*a1a3b679SAndreas BoehlerPRODID:-//Sabre//Sabre VObject $this->version//EN 133*a1a3b679SAndreas BoehlerCALSCALE:GREGORIAN 134*a1a3b679SAndreas Boehler$event[$i] 135*a1a3b679SAndreas BoehlerEND:VCALENDAR 136*a1a3b679SAndreas Boehler 137*a1a3b679SAndreas BoehlerEOT; 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler $return .= $object->serialize(); 140*a1a3b679SAndreas Boehler $expected = str_replace("\n", "\r\n", $expected); 141*a1a3b679SAndreas Boehler $this->assertEquals($expected, $object->serialize()); 142*a1a3b679SAndreas Boehler $i++; 143*a1a3b679SAndreas Boehler } 144*a1a3b679SAndreas Boehler $this->assertEquals(array(), VObject\Reader::read($return)->validate()); 145*a1a3b679SAndreas Boehler } 146*a1a3b679SAndreas Boehler 147*a1a3b679SAndreas Boehler function testICalendarImportEventWithoutUID() { 148*a1a3b679SAndreas Boehler 149*a1a3b679SAndreas Boehler $data = <<<EOT 150*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 151*a1a3b679SAndreas BoehlerVERSION:2.0 152*a1a3b679SAndreas BoehlerPRODID:-//Sabre//Sabre VObject $this->version//EN 153*a1a3b679SAndreas BoehlerCALSCALE:GREGORIAN 154*a1a3b679SAndreas BoehlerBEGIN:VEVENT 155*a1a3b679SAndreas BoehlerDTSTART:20140101T040000Z 156*a1a3b679SAndreas BoehlerDTSTAMP:20140122T233226Z 157*a1a3b679SAndreas BoehlerEND:VEVENT 158*a1a3b679SAndreas BoehlerEND:VCALENDAR 159*a1a3b679SAndreas Boehler 160*a1a3b679SAndreas BoehlerEOT; 161*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 162*a1a3b679SAndreas Boehler 163*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 164*a1a3b679SAndreas Boehler 165*a1a3b679SAndreas Boehler $return = ""; 166*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 167*a1a3b679SAndreas Boehler $return .= $object->serialize(); 168*a1a3b679SAndreas Boehler } 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler $messages = VObject\Reader::read($return)->validate(); 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas Boehler if ($messages) { 173*a1a3b679SAndreas Boehler $messages = array_map( 174*a1a3b679SAndreas Boehler function($item) { return $item['message']; }, 175*a1a3b679SAndreas Boehler $messages 176*a1a3b679SAndreas Boehler ); 177*a1a3b679SAndreas Boehler $this->fail('Validation errors: ' . implode("\n", $messages)); 178*a1a3b679SAndreas Boehler } else { 179*a1a3b679SAndreas Boehler $this->assertEquals(array(), $messages); 180*a1a3b679SAndreas Boehler } 181*a1a3b679SAndreas Boehler } 182*a1a3b679SAndreas Boehler 183*a1a3b679SAndreas Boehler function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() { 184*a1a3b679SAndreas Boehler 185*a1a3b679SAndreas Boehler $timezones = <<<EOT 186*a1a3b679SAndreas BoehlerBEGIN:VTIMEZONE 187*a1a3b679SAndreas BoehlerTZID:Europe/Berlin 188*a1a3b679SAndreas BoehlerBEGIN:DAYLIGHT 189*a1a3b679SAndreas BoehlerTZOFFSETFROM:+0100 190*a1a3b679SAndreas BoehlerRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 191*a1a3b679SAndreas BoehlerDTSTART:19810329T020000 192*a1a3b679SAndreas BoehlerTZNAME:MESZ 193*a1a3b679SAndreas BoehlerTZOFFSETTO:+0200 194*a1a3b679SAndreas BoehlerEND:DAYLIGHT 195*a1a3b679SAndreas BoehlerBEGIN:STANDARD 196*a1a3b679SAndreas BoehlerTZOFFSETFROM:+0200 197*a1a3b679SAndreas BoehlerRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 198*a1a3b679SAndreas BoehlerDTSTART:19961027T030000 199*a1a3b679SAndreas BoehlerTZNAME:MEZ 200*a1a3b679SAndreas BoehlerTZOFFSETTO:+0100 201*a1a3b679SAndreas BoehlerEND:STANDARD 202*a1a3b679SAndreas BoehlerEND:VTIMEZONE 203*a1a3b679SAndreas BoehlerBEGIN:VTIMEZONE 204*a1a3b679SAndreas BoehlerTZID:Europe/London 205*a1a3b679SAndreas BoehlerBEGIN:DAYLIGHT 206*a1a3b679SAndreas BoehlerTZOFFSETFROM:+0000 207*a1a3b679SAndreas BoehlerRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 208*a1a3b679SAndreas BoehlerDTSTART:19810329T010000 209*a1a3b679SAndreas BoehlerTZNAME:GMT+01:00 210*a1a3b679SAndreas BoehlerTZOFFSETTO:+0100 211*a1a3b679SAndreas BoehlerEND:DAYLIGHT 212*a1a3b679SAndreas BoehlerBEGIN:STANDARD 213*a1a3b679SAndreas BoehlerTZOFFSETFROM:+0100 214*a1a3b679SAndreas BoehlerRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 215*a1a3b679SAndreas BoehlerDTSTART:19961027T020000 216*a1a3b679SAndreas BoehlerTZNAME:GMT 217*a1a3b679SAndreas BoehlerTZOFFSETTO:+0000 218*a1a3b679SAndreas BoehlerEND:STANDARD 219*a1a3b679SAndreas BoehlerEND:VTIMEZONE 220*a1a3b679SAndreas BoehlerEOT; 221*a1a3b679SAndreas Boehler 222*a1a3b679SAndreas Boehler $event[] = <<<EOT 223*a1a3b679SAndreas BoehlerBEGIN:VEVENT 224*a1a3b679SAndreas BoehlerUID:foo1 225*a1a3b679SAndreas BoehlerDTSTAMP:20140122T232710Z 226*a1a3b679SAndreas BoehlerDTSTART:20140101T010000Z 227*a1a3b679SAndreas BoehlerEND:VEVENT 228*a1a3b679SAndreas BoehlerEOT; 229*a1a3b679SAndreas Boehler 230*a1a3b679SAndreas Boehler $event[] = <<<EOT 231*a1a3b679SAndreas BoehlerBEGIN:VEVENT 232*a1a3b679SAndreas BoehlerUID:foo2 233*a1a3b679SAndreas BoehlerDTSTAMP:20140122T232710Z 234*a1a3b679SAndreas BoehlerDTSTART:20140101T020000Z 235*a1a3b679SAndreas BoehlerEND:VEVENT 236*a1a3b679SAndreas BoehlerEOT; 237*a1a3b679SAndreas Boehler 238*a1a3b679SAndreas Boehler $event[] = <<<EOT 239*a1a3b679SAndreas BoehlerBEGIN:VEVENT 240*a1a3b679SAndreas BoehlerUID:foo3 241*a1a3b679SAndreas BoehlerDTSTAMP:20140122T232710Z 242*a1a3b679SAndreas BoehlerDTSTART:20140101T030000Z 243*a1a3b679SAndreas BoehlerEND:VEVENT 244*a1a3b679SAndreas BoehlerEOT; 245*a1a3b679SAndreas Boehler 246*a1a3b679SAndreas Boehler $data = <<<EOT 247*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 248*a1a3b679SAndreas Boehler$timezones 249*a1a3b679SAndreas Boehler$event[0] 250*a1a3b679SAndreas Boehler$event[1] 251*a1a3b679SAndreas Boehler$event[2] 252*a1a3b679SAndreas BoehlerEND:VCALENDAR 253*a1a3b679SAndreas Boehler 254*a1a3b679SAndreas BoehlerEOT; 255*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 256*a1a3b679SAndreas Boehler 257*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 258*a1a3b679SAndreas Boehler 259*a1a3b679SAndreas Boehler $return = ""; 260*a1a3b679SAndreas Boehler $i = 0; 261*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 262*a1a3b679SAndreas Boehler 263*a1a3b679SAndreas Boehler $expected = <<<EOT 264*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 265*a1a3b679SAndreas BoehlerVERSION:2.0 266*a1a3b679SAndreas BoehlerPRODID:-//Sabre//Sabre VObject $this->version//EN 267*a1a3b679SAndreas BoehlerCALSCALE:GREGORIAN 268*a1a3b679SAndreas Boehler$timezones 269*a1a3b679SAndreas Boehler$event[$i] 270*a1a3b679SAndreas BoehlerEND:VCALENDAR 271*a1a3b679SAndreas Boehler 272*a1a3b679SAndreas BoehlerEOT; 273*a1a3b679SAndreas Boehler $expected = str_replace("\n", "\r\n", $expected); 274*a1a3b679SAndreas Boehler 275*a1a3b679SAndreas Boehler $this->assertEquals($expected, $object->serialize()); 276*a1a3b679SAndreas Boehler $return .= $object->serialize(); 277*a1a3b679SAndreas Boehler $i++; 278*a1a3b679SAndreas Boehler 279*a1a3b679SAndreas Boehler } 280*a1a3b679SAndreas Boehler 281*a1a3b679SAndreas Boehler $this->assertEquals(array(), VObject\Reader::read($return)->validate()); 282*a1a3b679SAndreas Boehler } 283*a1a3b679SAndreas Boehler 284*a1a3b679SAndreas Boehler function testICalendarImportWithOutVTIMEZONES() { 285*a1a3b679SAndreas Boehler 286*a1a3b679SAndreas Boehler $data = <<<EOT 287*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 288*a1a3b679SAndreas BoehlerVERSION:2.0 289*a1a3b679SAndreas BoehlerPRODID:-//Apple Inc.//Mac OS X 10.8//EN 290*a1a3b679SAndreas BoehlerCALSCALE:GREGORIAN 291*a1a3b679SAndreas BoehlerBEGIN:VEVENT 292*a1a3b679SAndreas BoehlerCREATED:20120605T072109Z 293*a1a3b679SAndreas BoehlerUID:D6716295-C10F-4B20-82F9-E1A3026C7DCF 294*a1a3b679SAndreas BoehlerDTEND;VALUE=DATE:20120717 295*a1a3b679SAndreas BoehlerTRANSP:TRANSPARENT 296*a1a3b679SAndreas BoehlerSUMMARY:Start Vorbereitung 297*a1a3b679SAndreas BoehlerDTSTART;VALUE=DATE:20120716 298*a1a3b679SAndreas BoehlerDTSTAMP:20120605T072115Z 299*a1a3b679SAndreas BoehlerSEQUENCE:2 300*a1a3b679SAndreas BoehlerBEGIN:VALARM 301*a1a3b679SAndreas BoehlerX-WR-ALARMUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D 302*a1a3b679SAndreas BoehlerUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D 303*a1a3b679SAndreas BoehlerTRIGGER:-PT15H 304*a1a3b679SAndreas BoehlerX-APPLE-DEFAULT-ALARM:TRUE 305*a1a3b679SAndreas BoehlerATTACH;VALUE=URI:Basso 306*a1a3b679SAndreas BoehlerACTION:AUDIO 307*a1a3b679SAndreas BoehlerEND:VALARM 308*a1a3b679SAndreas BoehlerEND:VEVENT 309*a1a3b679SAndreas BoehlerEND:VCALENDAR 310*a1a3b679SAndreas Boehler 311*a1a3b679SAndreas BoehlerEOT; 312*a1a3b679SAndreas Boehler $tempFile = $this->createStream($data); 313*a1a3b679SAndreas Boehler 314*a1a3b679SAndreas Boehler $objects = new ICalendar($tempFile); 315*a1a3b679SAndreas Boehler 316*a1a3b679SAndreas Boehler $return = ""; 317*a1a3b679SAndreas Boehler while($object=$objects->getNext()) { 318*a1a3b679SAndreas Boehler $return .= $object->serialize(); 319*a1a3b679SAndreas Boehler } 320*a1a3b679SAndreas Boehler 321*a1a3b679SAndreas Boehler $messages = VObject\Reader::read($return)->validate(); 322*a1a3b679SAndreas Boehler $this->assertEquals(array(), $messages); 323*a1a3b679SAndreas Boehler } 324*a1a3b679SAndreas Boehler 325*a1a3b679SAndreas Boehler} 326