1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\VObject\Parser; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse 6*a1a3b679SAndreas Boehler Sabre\VObject; 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehlerclass JsonTest extends \PHPUnit_Framework_TestCase { 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehler function testRoundTripJCard() { 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehler $input = array( 13*a1a3b679SAndreas Boehler "vcard", 14*a1a3b679SAndreas Boehler array( 15*a1a3b679SAndreas Boehler array( 16*a1a3b679SAndreas Boehler "version", 17*a1a3b679SAndreas Boehler new \StdClass(), 18*a1a3b679SAndreas Boehler "text", 19*a1a3b679SAndreas Boehler "4.0" 20*a1a3b679SAndreas Boehler ), 21*a1a3b679SAndreas Boehler array( 22*a1a3b679SAndreas Boehler "prodid", 23*a1a3b679SAndreas Boehler new \StdClass(), 24*a1a3b679SAndreas Boehler "text", 25*a1a3b679SAndreas Boehler "-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN", 26*a1a3b679SAndreas Boehler ), 27*a1a3b679SAndreas Boehler array( 28*a1a3b679SAndreas Boehler "uid", 29*a1a3b679SAndreas Boehler new \StdClass(), 30*a1a3b679SAndreas Boehler "text", 31*a1a3b679SAndreas Boehler "foo", 32*a1a3b679SAndreas Boehler ), 33*a1a3b679SAndreas Boehler array( 34*a1a3b679SAndreas Boehler "bday", 35*a1a3b679SAndreas Boehler new \StdClass(), 36*a1a3b679SAndreas Boehler "date-and-or-time", 37*a1a3b679SAndreas Boehler "1985-04-07", 38*a1a3b679SAndreas Boehler ), 39*a1a3b679SAndreas Boehler array( 40*a1a3b679SAndreas Boehler "rev", 41*a1a3b679SAndreas Boehler new \StdClass(), 42*a1a3b679SAndreas Boehler "timestamp", 43*a1a3b679SAndreas Boehler "1995-10-31T22:27:10Z", 44*a1a3b679SAndreas Boehler ), 45*a1a3b679SAndreas Boehler array( 46*a1a3b679SAndreas Boehler "lang", 47*a1a3b679SAndreas Boehler new \StdClass(), 48*a1a3b679SAndreas Boehler "language-tag", 49*a1a3b679SAndreas Boehler "nl", 50*a1a3b679SAndreas Boehler ), 51*a1a3b679SAndreas Boehler array( 52*a1a3b679SAndreas Boehler "n", 53*a1a3b679SAndreas Boehler new \StdClass(), 54*a1a3b679SAndreas Boehler "text", 55*a1a3b679SAndreas Boehler array("Last", "First", "Middle", "", ""), 56*a1a3b679SAndreas Boehler ), 57*a1a3b679SAndreas Boehler array( 58*a1a3b679SAndreas Boehler "tel", 59*a1a3b679SAndreas Boehler (object)array( 60*a1a3b679SAndreas Boehler "group" => "item1", 61*a1a3b679SAndreas Boehler ), 62*a1a3b679SAndreas Boehler "text", 63*a1a3b679SAndreas Boehler "+1 555 123456", 64*a1a3b679SAndreas Boehler ), 65*a1a3b679SAndreas Boehler array( 66*a1a3b679SAndreas Boehler "x-ab-label", 67*a1a3b679SAndreas Boehler (object)array( 68*a1a3b679SAndreas Boehler "group" => "item1", 69*a1a3b679SAndreas Boehler ), 70*a1a3b679SAndreas Boehler "unknown", 71*a1a3b679SAndreas Boehler "Walkie Talkie", 72*a1a3b679SAndreas Boehler ), 73*a1a3b679SAndreas Boehler array( 74*a1a3b679SAndreas Boehler "adr", 75*a1a3b679SAndreas Boehler new \StdClass(), 76*a1a3b679SAndreas Boehler "text", 77*a1a3b679SAndreas Boehler array( 78*a1a3b679SAndreas Boehler "", 79*a1a3b679SAndreas Boehler "", 80*a1a3b679SAndreas Boehler array("My Street", "Left Side", "Second Shack"), 81*a1a3b679SAndreas Boehler "Hometown", 82*a1a3b679SAndreas Boehler "PA", 83*a1a3b679SAndreas Boehler "18252", 84*a1a3b679SAndreas Boehler "U.S.A", 85*a1a3b679SAndreas Boehler ), 86*a1a3b679SAndreas Boehler ), 87*a1a3b679SAndreas Boehler array( 88*a1a3b679SAndreas Boehler "bday", 89*a1a3b679SAndreas Boehler (object)array( 90*a1a3b679SAndreas Boehler 'x-param' => array(1,2), 91*a1a3b679SAndreas Boehler ), 92*a1a3b679SAndreas Boehler "date", 93*a1a3b679SAndreas Boehler "1979-12-25", 94*a1a3b679SAndreas Boehler ), 95*a1a3b679SAndreas Boehler array( 96*a1a3b679SAndreas Boehler "bday", 97*a1a3b679SAndreas Boehler new \StdClass(), 98*a1a3b679SAndreas Boehler "date-time", 99*a1a3b679SAndreas Boehler "1979-12-25T02:00:00", 100*a1a3b679SAndreas Boehler ), 101*a1a3b679SAndreas Boehler array( 102*a1a3b679SAndreas Boehler "x-truncated", 103*a1a3b679SAndreas Boehler new \StdClass(), 104*a1a3b679SAndreas Boehler "date", 105*a1a3b679SAndreas Boehler "--12-25", 106*a1a3b679SAndreas Boehler ), 107*a1a3b679SAndreas Boehler array( 108*a1a3b679SAndreas Boehler "x-time-local", 109*a1a3b679SAndreas Boehler new \StdClass(), 110*a1a3b679SAndreas Boehler "time", 111*a1a3b679SAndreas Boehler "12:30:00" 112*a1a3b679SAndreas Boehler ), 113*a1a3b679SAndreas Boehler array( 114*a1a3b679SAndreas Boehler "x-time-utc", 115*a1a3b679SAndreas Boehler new \StdClass(), 116*a1a3b679SAndreas Boehler "time", 117*a1a3b679SAndreas Boehler "12:30:00Z" 118*a1a3b679SAndreas Boehler ), 119*a1a3b679SAndreas Boehler array( 120*a1a3b679SAndreas Boehler "x-time-offset", 121*a1a3b679SAndreas Boehler new \StdClass(), 122*a1a3b679SAndreas Boehler "time", 123*a1a3b679SAndreas Boehler "12:30:00-08:00" 124*a1a3b679SAndreas Boehler ), 125*a1a3b679SAndreas Boehler array( 126*a1a3b679SAndreas Boehler "x-time-reduced", 127*a1a3b679SAndreas Boehler new \StdClass(), 128*a1a3b679SAndreas Boehler "time", 129*a1a3b679SAndreas Boehler "23" 130*a1a3b679SAndreas Boehler ), 131*a1a3b679SAndreas Boehler array( 132*a1a3b679SAndreas Boehler "x-time-truncated", 133*a1a3b679SAndreas Boehler new \StdClass(), 134*a1a3b679SAndreas Boehler "time", 135*a1a3b679SAndreas Boehler "--30" 136*a1a3b679SAndreas Boehler ), 137*a1a3b679SAndreas Boehler array( 138*a1a3b679SAndreas Boehler "x-karma-points", 139*a1a3b679SAndreas Boehler new \StdClass(), 140*a1a3b679SAndreas Boehler "integer", 141*a1a3b679SAndreas Boehler 42 142*a1a3b679SAndreas Boehler ), 143*a1a3b679SAndreas Boehler array( 144*a1a3b679SAndreas Boehler "x-grade", 145*a1a3b679SAndreas Boehler new \StdClass(), 146*a1a3b679SAndreas Boehler "float", 147*a1a3b679SAndreas Boehler 1.3 148*a1a3b679SAndreas Boehler ), 149*a1a3b679SAndreas Boehler array( 150*a1a3b679SAndreas Boehler "tz", 151*a1a3b679SAndreas Boehler new \StdClass(), 152*a1a3b679SAndreas Boehler "utc-offset", 153*a1a3b679SAndreas Boehler "-05:00", 154*a1a3b679SAndreas Boehler ), 155*a1a3b679SAndreas Boehler ), 156*a1a3b679SAndreas Boehler ); 157*a1a3b679SAndreas Boehler 158*a1a3b679SAndreas Boehler $parser = new Json(json_encode($input)); 159*a1a3b679SAndreas Boehler $vobj = $parser->parse(); 160*a1a3b679SAndreas Boehler 161*a1a3b679SAndreas Boehler $version = VObject\Version::VERSION; 162*a1a3b679SAndreas Boehler 163*a1a3b679SAndreas Boehler 164*a1a3b679SAndreas Boehler $result = $vobj->serialize(); 165*a1a3b679SAndreas Boehler $expected = <<<VCF 166*a1a3b679SAndreas BoehlerBEGIN:VCARD 167*a1a3b679SAndreas BoehlerVERSION:4.0 168*a1a3b679SAndreas BoehlerPRODID:-//Sabre//Sabre VObject $version//EN 169*a1a3b679SAndreas BoehlerUID:foo 170*a1a3b679SAndreas BoehlerBDAY:1985-04-07 171*a1a3b679SAndreas BoehlerREV:1995-10-31T22:27:10Z 172*a1a3b679SAndreas BoehlerLANG:nl 173*a1a3b679SAndreas BoehlerN:Last;First;Middle;; 174*a1a3b679SAndreas Boehleritem1.TEL:+1 555 123456 175*a1a3b679SAndreas Boehleritem1.X-AB-LABEL:Walkie Talkie 176*a1a3b679SAndreas BoehlerADR:;;My Street,Left Side,Second Shack;Hometown;PA;18252;U.S.A 177*a1a3b679SAndreas BoehlerBDAY;X-PARAM=1,2;VALUE=DATE:1979-12-25 178*a1a3b679SAndreas BoehlerBDAY;VALUE=DATE-TIME:1979-12-25T02:00:00 179*a1a3b679SAndreas BoehlerX-TRUNCATED;VALUE=DATE:--12-25 180*a1a3b679SAndreas BoehlerX-TIME-LOCAL;VALUE=TIME:12:30:00 181*a1a3b679SAndreas BoehlerX-TIME-UTC;VALUE=TIME:12:30:00Z 182*a1a3b679SAndreas BoehlerX-TIME-OFFSET;VALUE=TIME:12:30:00-08:00 183*a1a3b679SAndreas BoehlerX-TIME-REDUCED;VALUE=TIME:23 184*a1a3b679SAndreas BoehlerX-TIME-TRUNCATED;VALUE=TIME:--30 185*a1a3b679SAndreas BoehlerX-KARMA-POINTS;VALUE=INTEGER:42 186*a1a3b679SAndreas BoehlerX-GRADE;VALUE=FLOAT:1.3 187*a1a3b679SAndreas BoehlerTZ;VALUE=UTC-OFFSET:-05:00 188*a1a3b679SAndreas BoehlerEND:VCARD 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas BoehlerVCF; 191*a1a3b679SAndreas Boehler $this->assertEquals($expected, str_replace("\r", "", $result)); 192*a1a3b679SAndreas Boehler 193*a1a3b679SAndreas Boehler $this->assertEquals( 194*a1a3b679SAndreas Boehler $input, 195*a1a3b679SAndreas Boehler $vobj->jsonSerialize() 196*a1a3b679SAndreas Boehler ); 197*a1a3b679SAndreas Boehler 198*a1a3b679SAndreas Boehler } 199*a1a3b679SAndreas Boehler 200*a1a3b679SAndreas Boehler function testRoundTripJCal() { 201*a1a3b679SAndreas Boehler 202*a1a3b679SAndreas Boehler $input = array( 203*a1a3b679SAndreas Boehler "vcalendar", 204*a1a3b679SAndreas Boehler array( 205*a1a3b679SAndreas Boehler array( 206*a1a3b679SAndreas Boehler "version", 207*a1a3b679SAndreas Boehler new \StdClass(), 208*a1a3b679SAndreas Boehler "text", 209*a1a3b679SAndreas Boehler "2.0" 210*a1a3b679SAndreas Boehler ), 211*a1a3b679SAndreas Boehler array( 212*a1a3b679SAndreas Boehler "prodid", 213*a1a3b679SAndreas Boehler new \StdClass(), 214*a1a3b679SAndreas Boehler "text", 215*a1a3b679SAndreas Boehler "-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN", 216*a1a3b679SAndreas Boehler ), 217*a1a3b679SAndreas Boehler array( 218*a1a3b679SAndreas Boehler "calscale", 219*a1a3b679SAndreas Boehler new \StdClass(), 220*a1a3b679SAndreas Boehler "text", 221*a1a3b679SAndreas Boehler "GREGORIAN" 222*a1a3b679SAndreas Boehler ), 223*a1a3b679SAndreas Boehler ), 224*a1a3b679SAndreas Boehler array( 225*a1a3b679SAndreas Boehler array("vevent", 226*a1a3b679SAndreas Boehler array( 227*a1a3b679SAndreas Boehler array( 228*a1a3b679SAndreas Boehler "uid", new \StdClass(), "text", "foo", 229*a1a3b679SAndreas Boehler ), 230*a1a3b679SAndreas Boehler array( 231*a1a3b679SAndreas Boehler "dtstart", new \StdClass(), "date", "2013-05-26", 232*a1a3b679SAndreas Boehler ), 233*a1a3b679SAndreas Boehler array( 234*a1a3b679SAndreas Boehler "duration", new \StdClass(), "duration", "P1D", 235*a1a3b679SAndreas Boehler ), 236*a1a3b679SAndreas Boehler array( 237*a1a3b679SAndreas Boehler "categories", new \StdClass(), "text", "home", "testing", 238*a1a3b679SAndreas Boehler ), 239*a1a3b679SAndreas Boehler array( 240*a1a3b679SAndreas Boehler "created", new \StdClass(), "date-time", "2013-05-26T18:10:00Z", 241*a1a3b679SAndreas Boehler ), 242*a1a3b679SAndreas Boehler array( 243*a1a3b679SAndreas Boehler "attach", new \StdClass(), "binary", base64_encode('attachment') 244*a1a3b679SAndreas Boehler ), 245*a1a3b679SAndreas Boehler array( 246*a1a3b679SAndreas Boehler "attendee", new \StdClass(), "cal-address", "mailto:armin@example.org", 247*a1a3b679SAndreas Boehler ), 248*a1a3b679SAndreas Boehler array( 249*a1a3b679SAndreas Boehler "geo", new \StdClass(), "float", array(51.96668, 7.61876), 250*a1a3b679SAndreas Boehler ), 251*a1a3b679SAndreas Boehler array( 252*a1a3b679SAndreas Boehler "sequence", new \StdClass(), "integer", 5 253*a1a3b679SAndreas Boehler ), 254*a1a3b679SAndreas Boehler array( 255*a1a3b679SAndreas Boehler "freebusy", new \StdClass(), "period", array("2013-05-26T21:02:13", "PT1H"), array("2013-06-26T12:00:00", "2013-06-26T13:00:00"), 256*a1a3b679SAndreas Boehler ), 257*a1a3b679SAndreas Boehler array( 258*a1a3b679SAndreas Boehler "url", new \StdClass(), "uri", "http://example.org/", 259*a1a3b679SAndreas Boehler ), 260*a1a3b679SAndreas Boehler array( 261*a1a3b679SAndreas Boehler "tzoffsetfrom", new \StdClass(), "utc-offset", "+05:00", 262*a1a3b679SAndreas Boehler ), 263*a1a3b679SAndreas Boehler array( 264*a1a3b679SAndreas Boehler "rrule", new \StdClass(), "recur", array( 265*a1a3b679SAndreas Boehler 'freq' => 'WEEKLY', 266*a1a3b679SAndreas Boehler 'byday' => array('MO', 'TU'), 267*a1a3b679SAndreas Boehler ), 268*a1a3b679SAndreas Boehler ), 269*a1a3b679SAndreas Boehler array( 270*a1a3b679SAndreas Boehler "x-bool", new \StdClass(), "boolean", true 271*a1a3b679SAndreas Boehler ), 272*a1a3b679SAndreas Boehler array( 273*a1a3b679SAndreas Boehler "x-time", new \StdClass(), "time", "08:00:00", 274*a1a3b679SAndreas Boehler ), 275*a1a3b679SAndreas Boehler array( 276*a1a3b679SAndreas Boehler "attendee", 277*a1a3b679SAndreas Boehler (object)array( 278*a1a3b679SAndreas Boehler "cn" => "Dominik", 279*a1a3b679SAndreas Boehler "partstat" => "DECLINED", 280*a1a3b679SAndreas Boehler ), 281*a1a3b679SAndreas Boehler "cal-address", 282*a1a3b679SAndreas Boehler "mailto:dominik@example.org" 283*a1a3b679SAndreas Boehler ), 284*a1a3b679SAndreas Boehler array( 285*a1a3b679SAndreas Boehler "request-status", 286*a1a3b679SAndreas Boehler new \StdClass(), 287*a1a3b679SAndreas Boehler "text", 288*a1a3b679SAndreas Boehler array("2.0", "Success"), 289*a1a3b679SAndreas Boehler ), 290*a1a3b679SAndreas Boehler array( 291*a1a3b679SAndreas Boehler "request-status", 292*a1a3b679SAndreas Boehler new \StdClass(), 293*a1a3b679SAndreas Boehler "text", 294*a1a3b679SAndreas Boehler array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"), 295*a1a3b679SAndreas Boehler ), 296*a1a3b679SAndreas Boehler ), 297*a1a3b679SAndreas Boehler array( 298*a1a3b679SAndreas Boehler array("valarm", 299*a1a3b679SAndreas Boehler array( 300*a1a3b679SAndreas Boehler array( 301*a1a3b679SAndreas Boehler "action", new \StdClass(), "text", "DISPLAY", 302*a1a3b679SAndreas Boehler ), 303*a1a3b679SAndreas Boehler ), 304*a1a3b679SAndreas Boehler array(), 305*a1a3b679SAndreas Boehler ), 306*a1a3b679SAndreas Boehler ), 307*a1a3b679SAndreas Boehler ) 308*a1a3b679SAndreas Boehler ), 309*a1a3b679SAndreas Boehler ); 310*a1a3b679SAndreas Boehler 311*a1a3b679SAndreas Boehler $parser = new Json(json_encode($input)); 312*a1a3b679SAndreas Boehler $vobj = $parser->parse(); 313*a1a3b679SAndreas Boehler $result = $vobj->serialize(); 314*a1a3b679SAndreas Boehler 315*a1a3b679SAndreas Boehler $version = VObject\Version::VERSION; 316*a1a3b679SAndreas Boehler 317*a1a3b679SAndreas Boehler $expected = <<<VCF 318*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 319*a1a3b679SAndreas BoehlerVERSION:2.0 320*a1a3b679SAndreas BoehlerPRODID:-//Sabre//Sabre VObject $version//EN 321*a1a3b679SAndreas BoehlerCALSCALE:GREGORIAN 322*a1a3b679SAndreas BoehlerBEGIN:VEVENT 323*a1a3b679SAndreas BoehlerUID:foo 324*a1a3b679SAndreas BoehlerDTSTART;VALUE=DATE:20130526 325*a1a3b679SAndreas BoehlerDURATION:P1D 326*a1a3b679SAndreas BoehlerCATEGORIES:home,testing 327*a1a3b679SAndreas BoehlerCREATED:20130526T181000Z 328*a1a3b679SAndreas BoehlerATTACH;VALUE=BINARY:YXR0YWNobWVudA== 329*a1a3b679SAndreas BoehlerATTENDEE:mailto:armin@example.org 330*a1a3b679SAndreas BoehlerGEO:51.96668;7.61876 331*a1a3b679SAndreas BoehlerSEQUENCE:5 332*a1a3b679SAndreas BoehlerFREEBUSY:20130526T210213/PT1H,20130626T120000/20130626T130000 333*a1a3b679SAndreas BoehlerURL:http://example.org/ 334*a1a3b679SAndreas BoehlerTZOFFSETFROM:+05:00 335*a1a3b679SAndreas BoehlerRRULE:FREQ=WEEKLY;BYDAY=MO,TU 336*a1a3b679SAndreas BoehlerX-BOOL;VALUE=BOOLEAN:TRUE 337*a1a3b679SAndreas BoehlerX-TIME;VALUE=TIME:08:00:00 338*a1a3b679SAndreas BoehlerATTENDEE;CN=Dominik;PARTSTAT=DECLINED:mailto:dominik@example.org 339*a1a3b679SAndreas BoehlerREQUEST-STATUS:2.0;Success 340*a1a3b679SAndreas BoehlerREQUEST-STATUS:3.7;Invalid Calendar User;ATTENDEE:mailto:jsmith@example.org 341*a1a3b679SAndreas BoehlerBEGIN:VALARM 342*a1a3b679SAndreas BoehlerACTION:DISPLAY 343*a1a3b679SAndreas BoehlerEND:VALARM 344*a1a3b679SAndreas BoehlerEND:VEVENT 345*a1a3b679SAndreas BoehlerEND:VCALENDAR 346*a1a3b679SAndreas Boehler 347*a1a3b679SAndreas BoehlerVCF; 348*a1a3b679SAndreas Boehler $this->assertEquals($expected, str_replace("\r", "", $result)); 349*a1a3b679SAndreas Boehler 350*a1a3b679SAndreas Boehler $this->assertEquals( 351*a1a3b679SAndreas Boehler $input, 352*a1a3b679SAndreas Boehler $vobj->jsonSerialize() 353*a1a3b679SAndreas Boehler ); 354*a1a3b679SAndreas Boehler 355*a1a3b679SAndreas Boehler } 356*a1a3b679SAndreas Boehler 357*a1a3b679SAndreas Boehler function testParseStreamArg() { 358*a1a3b679SAndreas Boehler 359*a1a3b679SAndreas Boehler $input = array( 360*a1a3b679SAndreas Boehler "vcard", 361*a1a3b679SAndreas Boehler array( 362*a1a3b679SAndreas Boehler array( 363*a1a3b679SAndreas Boehler "FN", new \StdClass(), 'text', "foo", 364*a1a3b679SAndreas Boehler ), 365*a1a3b679SAndreas Boehler ), 366*a1a3b679SAndreas Boehler ); 367*a1a3b679SAndreas Boehler 368*a1a3b679SAndreas Boehler $stream = fopen('php://memory','r+'); 369*a1a3b679SAndreas Boehler fwrite($stream, json_encode($input)); 370*a1a3b679SAndreas Boehler rewind($stream); 371*a1a3b679SAndreas Boehler 372*a1a3b679SAndreas Boehler $result = VObject\Reader::readJson($stream,0); 373*a1a3b679SAndreas Boehler $this->assertEquals('foo', $result->FN->getValue()); 374*a1a3b679SAndreas Boehler 375*a1a3b679SAndreas Boehler } 376*a1a3b679SAndreas Boehler 377*a1a3b679SAndreas Boehler /** 378*a1a3b679SAndreas Boehler * @expectedException \Sabre\VObject\ParseException 379*a1a3b679SAndreas Boehler */ 380*a1a3b679SAndreas Boehler function testParseInvalidData() { 381*a1a3b679SAndreas Boehler 382*a1a3b679SAndreas Boehler $json = new Json(); 383*a1a3b679SAndreas Boehler $input = array( 384*a1a3b679SAndreas Boehler "vlist", 385*a1a3b679SAndreas Boehler array( 386*a1a3b679SAndreas Boehler array( 387*a1a3b679SAndreas Boehler "FN", new \StdClass(), 'text', "foo", 388*a1a3b679SAndreas Boehler ), 389*a1a3b679SAndreas Boehler ), 390*a1a3b679SAndreas Boehler ); 391*a1a3b679SAndreas Boehler 392*a1a3b679SAndreas Boehler $json->parse(json_encode($input), 0); 393*a1a3b679SAndreas Boehler 394*a1a3b679SAndreas Boehler } 395*a1a3b679SAndreas Boehler} 396