1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\Xml\Element; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\Xml\Reader; 6*a1a3b679SAndreas Boehleruse Sabre\Xml\Writer; 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehlerclass KeyValueTest extends \PHPUnit_Framework_TestCase { 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehler function testDeserialize() { 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehler $input = <<<BLA 13*a1a3b679SAndreas Boehler<?xml version="1.0"?> 14*a1a3b679SAndreas Boehler<root xmlns="http://sabredav.org/ns"> 15*a1a3b679SAndreas Boehler <struct> 16*a1a3b679SAndreas Boehler <elem1 /> 17*a1a3b679SAndreas Boehler <elem2>hi</elem2> 18*a1a3b679SAndreas Boehler <elem3> 19*a1a3b679SAndreas Boehler <elem4>foo</elem4> 20*a1a3b679SAndreas Boehler <elem5>foo & bar</elem5> 21*a1a3b679SAndreas Boehler </elem3> 22*a1a3b679SAndreas Boehler <elem6>Hi<!-- ignore me -->there</elem6> 23*a1a3b679SAndreas Boehler </struct> 24*a1a3b679SAndreas Boehler <struct /> 25*a1a3b679SAndreas Boehler <otherThing> 26*a1a3b679SAndreas Boehler <elem1 /> 27*a1a3b679SAndreas Boehler </otherThing> 28*a1a3b679SAndreas Boehler</root> 29*a1a3b679SAndreas BoehlerBLA; 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler $reader = new Reader(); 32*a1a3b679SAndreas Boehler $reader->elementMap = [ 33*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}struct' => 'Sabre\\Xml\\Element\\KeyValue', 34*a1a3b679SAndreas Boehler ]; 35*a1a3b679SAndreas Boehler $reader->xml($input); 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas Boehler $output = $reader->parse(); 38*a1a3b679SAndreas Boehler 39*a1a3b679SAndreas Boehler $this->assertEquals([ 40*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}root', 41*a1a3b679SAndreas Boehler 'value' => [ 42*a1a3b679SAndreas Boehler [ 43*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}struct', 44*a1a3b679SAndreas Boehler 'value' => [ 45*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem1' => null, 46*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem2' => 'hi', 47*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem3' => [ 48*a1a3b679SAndreas Boehler [ 49*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}elem4', 50*a1a3b679SAndreas Boehler 'value' => 'foo', 51*a1a3b679SAndreas Boehler 'attributes' => [], 52*a1a3b679SAndreas Boehler ], 53*a1a3b679SAndreas Boehler [ 54*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}elem5', 55*a1a3b679SAndreas Boehler 'value' => 'foo & bar', 56*a1a3b679SAndreas Boehler 'attributes' => [], 57*a1a3b679SAndreas Boehler ], 58*a1a3b679SAndreas Boehler ], 59*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem6' => 'Hithere', 60*a1a3b679SAndreas Boehler ], 61*a1a3b679SAndreas Boehler 'attributes' => [], 62*a1a3b679SAndreas Boehler ], 63*a1a3b679SAndreas Boehler [ 64*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}struct', 65*a1a3b679SAndreas Boehler 'value' => [], 66*a1a3b679SAndreas Boehler 'attributes' => [], 67*a1a3b679SAndreas Boehler ], 68*a1a3b679SAndreas Boehler [ 69*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}otherThing', 70*a1a3b679SAndreas Boehler 'value' => [ 71*a1a3b679SAndreas Boehler [ 72*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}elem1', 73*a1a3b679SAndreas Boehler 'value' => null, 74*a1a3b679SAndreas Boehler 'attributes' => [], 75*a1a3b679SAndreas Boehler ], 76*a1a3b679SAndreas Boehler ], 77*a1a3b679SAndreas Boehler 'attributes' => [], 78*a1a3b679SAndreas Boehler ], 79*a1a3b679SAndreas Boehler ], 80*a1a3b679SAndreas Boehler 'attributes' => [], 81*a1a3b679SAndreas Boehler ], $output); 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler } 84*a1a3b679SAndreas Boehler 85*a1a3b679SAndreas Boehler /** 86*a1a3b679SAndreas Boehler * This test was added to find out why an element gets eaten by the 87*a1a3b679SAndreas Boehler * SabreDAV MKCOL parser. 88*a1a3b679SAndreas Boehler */ 89*a1a3b679SAndreas Boehler function testElementEater() { 90*a1a3b679SAndreas Boehler 91*a1a3b679SAndreas Boehler $input = <<<BLA 92*a1a3b679SAndreas Boehler<?xml version="1.0"?> 93*a1a3b679SAndreas Boehler<mkcol xmlns="DAV:"> 94*a1a3b679SAndreas Boehler <set> 95*a1a3b679SAndreas Boehler <prop> 96*a1a3b679SAndreas Boehler <resourcetype><collection /></resourcetype> 97*a1a3b679SAndreas Boehler <displayname>bla</displayname> 98*a1a3b679SAndreas Boehler </prop> 99*a1a3b679SAndreas Boehler </set> 100*a1a3b679SAndreas Boehler</mkcol> 101*a1a3b679SAndreas BoehlerBLA; 102*a1a3b679SAndreas Boehler 103*a1a3b679SAndreas Boehler $reader = new Reader(); 104*a1a3b679SAndreas Boehler $reader->elementMap = [ 105*a1a3b679SAndreas Boehler '{DAV:}set' => 'Sabre\\Xml\\Element\\KeyValue', 106*a1a3b679SAndreas Boehler '{DAV:}prop' => 'Sabre\\Xml\\Element\\KeyValue', 107*a1a3b679SAndreas Boehler '{DAV:}resourcetype' => 'Sabre\\Xml\\Element\\Elements', 108*a1a3b679SAndreas Boehler ]; 109*a1a3b679SAndreas Boehler $reader->xml($input); 110*a1a3b679SAndreas Boehler 111*a1a3b679SAndreas Boehler $expected = [ 112*a1a3b679SAndreas Boehler 'name' => '{DAV:}mkcol', 113*a1a3b679SAndreas Boehler 'value' => [ 114*a1a3b679SAndreas Boehler [ 115*a1a3b679SAndreas Boehler 'name' => '{DAV:}set', 116*a1a3b679SAndreas Boehler 'value' => [ 117*a1a3b679SAndreas Boehler '{DAV:}prop' => [ 118*a1a3b679SAndreas Boehler '{DAV:}resourcetype' => [ 119*a1a3b679SAndreas Boehler '{DAV:}collection', 120*a1a3b679SAndreas Boehler ], 121*a1a3b679SAndreas Boehler '{DAV:}displayname' => 'bla', 122*a1a3b679SAndreas Boehler ], 123*a1a3b679SAndreas Boehler ], 124*a1a3b679SAndreas Boehler 'attributes' => [], 125*a1a3b679SAndreas Boehler ], 126*a1a3b679SAndreas Boehler ], 127*a1a3b679SAndreas Boehler 'attributes' => [], 128*a1a3b679SAndreas Boehler ]; 129*a1a3b679SAndreas Boehler 130*a1a3b679SAndreas Boehler $this->assertEquals($expected, $reader->parse()); 131*a1a3b679SAndreas Boehler 132*a1a3b679SAndreas Boehler } 133*a1a3b679SAndreas Boehler 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler function testSerialize() { 136*a1a3b679SAndreas Boehler 137*a1a3b679SAndreas Boehler $value = [ 138*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem1' => null, 139*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem2' => 'textValue', 140*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem3' => [ 141*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem4' => 'text2', 142*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem5' => null, 143*a1a3b679SAndreas Boehler ], 144*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem6' => 'text3', 145*a1a3b679SAndreas Boehler ]; 146*a1a3b679SAndreas Boehler 147*a1a3b679SAndreas Boehler $writer = new Writer(); 148*a1a3b679SAndreas Boehler $writer->namespaceMap = [ 149*a1a3b679SAndreas Boehler 'http://sabredav.org/ns' => null 150*a1a3b679SAndreas Boehler ]; 151*a1a3b679SAndreas Boehler $writer->openMemory(); 152*a1a3b679SAndreas Boehler $writer->startDocument('1.0'); 153*a1a3b679SAndreas Boehler $writer->setIndent(true); 154*a1a3b679SAndreas Boehler $writer->write([ 155*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => new KeyValue($value), 156*a1a3b679SAndreas Boehler ]); 157*a1a3b679SAndreas Boehler 158*a1a3b679SAndreas Boehler $output = $writer->outputMemory(); 159*a1a3b679SAndreas Boehler 160*a1a3b679SAndreas Boehler $expected = <<<XML 161*a1a3b679SAndreas Boehler<?xml version="1.0"?> 162*a1a3b679SAndreas Boehler<root xmlns="http://sabredav.org/ns"> 163*a1a3b679SAndreas Boehler <elem1/> 164*a1a3b679SAndreas Boehler <elem2>textValue</elem2> 165*a1a3b679SAndreas Boehler <elem3> 166*a1a3b679SAndreas Boehler <elem4>text2</elem4> 167*a1a3b679SAndreas Boehler <elem5/> 168*a1a3b679SAndreas Boehler </elem3> 169*a1a3b679SAndreas Boehler <elem6>text3</elem6> 170*a1a3b679SAndreas Boehler</root> 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas BoehlerXML; 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler $this->assertEquals($expected, $output); 175*a1a3b679SAndreas Boehler 176*a1a3b679SAndreas Boehler } 177*a1a3b679SAndreas Boehler 178*a1a3b679SAndreas Boehler /** 179*a1a3b679SAndreas Boehler * I discovered that when there's no whitespace between elements, elements 180*a1a3b679SAndreas Boehler * can get skipped. 181*a1a3b679SAndreas Boehler */ 182*a1a3b679SAndreas Boehler function testElementSkipProblem() { 183*a1a3b679SAndreas Boehler 184*a1a3b679SAndreas Boehler $input = <<<BLA 185*a1a3b679SAndreas Boehler<?xml version="1.0" encoding="utf-8"?> 186*a1a3b679SAndreas Boehler<root xmlns="http://sabredav.org/ns"> 187*a1a3b679SAndreas Boehler<elem3>val3</elem3><elem4>val4</elem4><elem5>val5</elem5></root> 188*a1a3b679SAndreas BoehlerBLA; 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler $reader = new Reader(); 191*a1a3b679SAndreas Boehler $reader->elementMap = [ 192*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => 'Sabre\\Xml\\Element\\KeyValue', 193*a1a3b679SAndreas Boehler ]; 194*a1a3b679SAndreas Boehler $reader->xml($input); 195*a1a3b679SAndreas Boehler 196*a1a3b679SAndreas Boehler $output = $reader->parse(); 197*a1a3b679SAndreas Boehler 198*a1a3b679SAndreas Boehler $this->assertEquals([ 199*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}root', 200*a1a3b679SAndreas Boehler 'value' => [ 201*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem3' => 'val3', 202*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem4' => 'val4', 203*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}elem5' => 'val5', 204*a1a3b679SAndreas Boehler ], 205*a1a3b679SAndreas Boehler 'attributes' => [], 206*a1a3b679SAndreas Boehler ], $output); 207*a1a3b679SAndreas Boehler 208*a1a3b679SAndreas Boehler } 209*a1a3b679SAndreas Boehler 210*a1a3b679SAndreas Boehler} 211