1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\Xml; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehlerclass WriterTest extends \PHPUnit_Framework_TestCase { 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehler protected $writer; 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler function setUp() { 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler $this->writer = new Writer(); 12*a1a3b679SAndreas Boehler $this->writer->namespaceMap = [ 13*a1a3b679SAndreas Boehler 'http://sabredav.org/ns' => 's', 14*a1a3b679SAndreas Boehler ]; 15*a1a3b679SAndreas Boehler $this->writer->openMemory(); 16*a1a3b679SAndreas Boehler $this->writer->setIndent(true); 17*a1a3b679SAndreas Boehler $this->writer->startDocument(); 18*a1a3b679SAndreas Boehler 19*a1a3b679SAndreas Boehler } 20*a1a3b679SAndreas Boehler 21*a1a3b679SAndreas Boehler function compare($input, $output) { 22*a1a3b679SAndreas Boehler 23*a1a3b679SAndreas Boehler $this->writer->write($input); 24*a1a3b679SAndreas Boehler $this->assertEquals($output, $this->writer->outputMemory()); 25*a1a3b679SAndreas Boehler 26*a1a3b679SAndreas Boehler } 27*a1a3b679SAndreas Boehler 28*a1a3b679SAndreas Boehler 29*a1a3b679SAndreas Boehler function testSimple() { 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler $this->compare([ 32*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => 'text', 33*a1a3b679SAndreas Boehler ], <<<HI 34*a1a3b679SAndreas Boehler<?xml version="1.0"?> 35*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns">text</s:root> 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas BoehlerHI 38*a1a3b679SAndreas Boehler ); 39*a1a3b679SAndreas Boehler 40*a1a3b679SAndreas Boehler } 41*a1a3b679SAndreas Boehler 42*a1a3b679SAndreas Boehler /** 43*a1a3b679SAndreas Boehler * @depends testSimple 44*a1a3b679SAndreas Boehler */ 45*a1a3b679SAndreas Boehler function testSimpleQuotes() { 46*a1a3b679SAndreas Boehler 47*a1a3b679SAndreas Boehler $this->compare([ 48*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => '"text"', 49*a1a3b679SAndreas Boehler ], <<<HI 50*a1a3b679SAndreas Boehler<?xml version="1.0"?> 51*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns">"text"</s:root> 52*a1a3b679SAndreas Boehler 53*a1a3b679SAndreas BoehlerHI 54*a1a3b679SAndreas Boehler ); 55*a1a3b679SAndreas Boehler 56*a1a3b679SAndreas Boehler } 57*a1a3b679SAndreas Boehler 58*a1a3b679SAndreas Boehler function testSimpleAttributes() { 59*a1a3b679SAndreas Boehler 60*a1a3b679SAndreas Boehler $this->compare([ 61*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 62*a1a3b679SAndreas Boehler 'value' => 'text', 63*a1a3b679SAndreas Boehler 'attributes' => [ 64*a1a3b679SAndreas Boehler 'attr1' => 'attribute value', 65*a1a3b679SAndreas Boehler ], 66*a1a3b679SAndreas Boehler ], 67*a1a3b679SAndreas Boehler ], <<<HI 68*a1a3b679SAndreas Boehler<?xml version="1.0"?> 69*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns" attr1="attribute value">text</s:root> 70*a1a3b679SAndreas Boehler 71*a1a3b679SAndreas BoehlerHI 72*a1a3b679SAndreas Boehler ); 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler } 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler function testMixedSyntax() { 77*a1a3b679SAndreas Boehler $this->compare([ 78*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 79*a1a3b679SAndreas Boehler 'single' => 'value', 80*a1a3b679SAndreas Boehler 'multiple' => [ 81*a1a3b679SAndreas Boehler [ 82*a1a3b679SAndreas Boehler 'name' => 'foo', 83*a1a3b679SAndreas Boehler 'value' => 'bar', 84*a1a3b679SAndreas Boehler ], 85*a1a3b679SAndreas Boehler [ 86*a1a3b679SAndreas Boehler 'name' => 'foo', 87*a1a3b679SAndreas Boehler 'value' => 'foobar', 88*a1a3b679SAndreas Boehler ], 89*a1a3b679SAndreas Boehler ], 90*a1a3b679SAndreas Boehler 'attributes' => [ 91*a1a3b679SAndreas Boehler 'value' => null, 92*a1a3b679SAndreas Boehler 'attributes' => [ 93*a1a3b679SAndreas Boehler 'foo' => 'bar', 94*a1a3b679SAndreas Boehler ], 95*a1a3b679SAndreas Boehler ], 96*a1a3b679SAndreas Boehler [ 97*a1a3b679SAndreas Boehler 'name' => 'verbose', 98*a1a3b679SAndreas Boehler 'value' => 'syntax', 99*a1a3b679SAndreas Boehler 'attributes' => [ 100*a1a3b679SAndreas Boehler 'foo' => 'bar', 101*a1a3b679SAndreas Boehler ], 102*a1a3b679SAndreas Boehler ], 103*a1a3b679SAndreas Boehler ], 104*a1a3b679SAndreas Boehler ], <<<HI 105*a1a3b679SAndreas Boehler<?xml version="1.0"?> 106*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 107*a1a3b679SAndreas Boehler <single>value</single> 108*a1a3b679SAndreas Boehler <multiple> 109*a1a3b679SAndreas Boehler <foo>bar</foo> 110*a1a3b679SAndreas Boehler <foo>foobar</foo> 111*a1a3b679SAndreas Boehler </multiple> 112*a1a3b679SAndreas Boehler <attributes foo="bar"/> 113*a1a3b679SAndreas Boehler <verbose foo="bar">syntax</verbose> 114*a1a3b679SAndreas Boehler</s:root> 115*a1a3b679SAndreas Boehler 116*a1a3b679SAndreas BoehlerHI 117*a1a3b679SAndreas Boehler ); 118*a1a3b679SAndreas Boehler } 119*a1a3b679SAndreas Boehler 120*a1a3b679SAndreas Boehler function testNull() { 121*a1a3b679SAndreas Boehler 122*a1a3b679SAndreas Boehler $this->compare([ 123*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => null, 124*a1a3b679SAndreas Boehler ], <<<HI 125*a1a3b679SAndreas Boehler<?xml version="1.0"?> 126*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"/> 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas BoehlerHI 129*a1a3b679SAndreas Boehler ); 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler } 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler function testArrayFormat2() { 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler $this->compare([ 136*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 137*a1a3b679SAndreas Boehler [ 138*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}elem1', 139*a1a3b679SAndreas Boehler 'value' => 'text', 140*a1a3b679SAndreas Boehler 'attributes' => [ 141*a1a3b679SAndreas Boehler 'attr1' => 'attribute value', 142*a1a3b679SAndreas Boehler ], 143*a1a3b679SAndreas Boehler ], 144*a1a3b679SAndreas Boehler ], 145*a1a3b679SAndreas Boehler ], <<<HI 146*a1a3b679SAndreas Boehler<?xml version="1.0"?> 147*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 148*a1a3b679SAndreas Boehler <s:elem1 attr1="attribute value">text</s:elem1> 149*a1a3b679SAndreas Boehler</s:root> 150*a1a3b679SAndreas Boehler 151*a1a3b679SAndreas BoehlerHI 152*a1a3b679SAndreas Boehler ); 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler } 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler function testCustomNamespace() { 157*a1a3b679SAndreas Boehler 158*a1a3b679SAndreas Boehler $this->compare([ 159*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 160*a1a3b679SAndreas Boehler '{urn:foo}elem1' => 'bar', 161*a1a3b679SAndreas Boehler ], 162*a1a3b679SAndreas Boehler ], <<<HI 163*a1a3b679SAndreas Boehler<?xml version="1.0"?> 164*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 165*a1a3b679SAndreas Boehler <x1:elem1 xmlns:x1="urn:foo">bar</x1:elem1> 166*a1a3b679SAndreas Boehler</s:root> 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas BoehlerHI 169*a1a3b679SAndreas Boehler ); 170*a1a3b679SAndreas Boehler 171*a1a3b679SAndreas Boehler } 172*a1a3b679SAndreas Boehler 173*a1a3b679SAndreas Boehler function testEmptyNamespace() { 174*a1a3b679SAndreas Boehler 175*a1a3b679SAndreas Boehler // Empty namespaces are allowed, so we should support this. 176*a1a3b679SAndreas Boehler $this->compare([ 177*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 178*a1a3b679SAndreas Boehler '{}elem1' => 'bar', 179*a1a3b679SAndreas Boehler ], 180*a1a3b679SAndreas Boehler ], <<<HI 181*a1a3b679SAndreas Boehler<?xml version="1.0"?> 182*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 183*a1a3b679SAndreas Boehler <elem1 xmlns="">bar</elem1> 184*a1a3b679SAndreas Boehler</s:root> 185*a1a3b679SAndreas Boehler 186*a1a3b679SAndreas BoehlerHI 187*a1a3b679SAndreas Boehler ); 188*a1a3b679SAndreas Boehler 189*a1a3b679SAndreas Boehler } 190*a1a3b679SAndreas Boehler 191*a1a3b679SAndreas Boehler function testAttributes() { 192*a1a3b679SAndreas Boehler 193*a1a3b679SAndreas Boehler $this->compare([ 194*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 195*a1a3b679SAndreas Boehler [ 196*a1a3b679SAndreas Boehler 'name' => '{http://sabredav.org/ns}elem1', 197*a1a3b679SAndreas Boehler 'value' => 'text', 198*a1a3b679SAndreas Boehler 'attributes' => [ 199*a1a3b679SAndreas Boehler 'attr1' => 'val1', 200*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}attr2' => 'val2', 201*a1a3b679SAndreas Boehler '{urn:foo}attr3' => 'val3', 202*a1a3b679SAndreas Boehler ], 203*a1a3b679SAndreas Boehler ], 204*a1a3b679SAndreas Boehler ], 205*a1a3b679SAndreas Boehler ], <<<HI 206*a1a3b679SAndreas Boehler<?xml version="1.0"?> 207*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 208*a1a3b679SAndreas Boehler <s:elem1 attr1="val1" s:attr2="val2" x1:attr3="val3" xmlns:x1="urn:foo">text</s:elem1> 209*a1a3b679SAndreas Boehler</s:root> 210*a1a3b679SAndreas Boehler 211*a1a3b679SAndreas BoehlerHI 212*a1a3b679SAndreas Boehler ); 213*a1a3b679SAndreas Boehler 214*a1a3b679SAndreas Boehler } 215*a1a3b679SAndreas Boehler 216*a1a3b679SAndreas Boehler /** 217*a1a3b679SAndreas Boehler * @expectedException \InvalidArgumentException 218*a1a3b679SAndreas Boehler */ 219*a1a3b679SAndreas Boehler function testInvalidFormat() { 220*a1a3b679SAndreas Boehler 221*a1a3b679SAndreas Boehler $this->compare([ 222*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => [ 223*a1a3b679SAndreas Boehler ['incorrect' => '0', 'keynames' => 1] 224*a1a3b679SAndreas Boehler ], 225*a1a3b679SAndreas Boehler ], ""); 226*a1a3b679SAndreas Boehler 227*a1a3b679SAndreas Boehler } 228*a1a3b679SAndreas Boehler 229*a1a3b679SAndreas Boehler function testBaseElement() { 230*a1a3b679SAndreas Boehler 231*a1a3b679SAndreas Boehler $this->compare([ 232*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => new Element\Base('hello') 233*a1a3b679SAndreas Boehler ], <<<HI 234*a1a3b679SAndreas Boehler<?xml version="1.0"?> 235*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns">hello</s:root> 236*a1a3b679SAndreas Boehler 237*a1a3b679SAndreas BoehlerHI 238*a1a3b679SAndreas Boehler ); 239*a1a3b679SAndreas Boehler 240*a1a3b679SAndreas Boehler } 241*a1a3b679SAndreas Boehler 242*a1a3b679SAndreas Boehler function testElementObj() { 243*a1a3b679SAndreas Boehler 244*a1a3b679SAndreas Boehler $this->compare([ 245*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => new Element\Mock() 246*a1a3b679SAndreas Boehler ], <<<HI 247*a1a3b679SAndreas Boehler<?xml version="1.0"?> 248*a1a3b679SAndreas Boehler<s:root xmlns:s="http://sabredav.org/ns"> 249*a1a3b679SAndreas Boehler <s:elem1>hiiii!</s:elem1> 250*a1a3b679SAndreas Boehler</s:root> 251*a1a3b679SAndreas Boehler 252*a1a3b679SAndreas BoehlerHI 253*a1a3b679SAndreas Boehler ); 254*a1a3b679SAndreas Boehler 255*a1a3b679SAndreas Boehler } 256*a1a3b679SAndreas Boehler 257*a1a3b679SAndreas Boehler function testEmptyNamespacePrefix() { 258*a1a3b679SAndreas Boehler 259*a1a3b679SAndreas Boehler $this->writer->namespaceMap['http://sabredav.org/ns'] = null; 260*a1a3b679SAndreas Boehler $this->compare([ 261*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}root' => new Element\Mock() 262*a1a3b679SAndreas Boehler ], <<<HI 263*a1a3b679SAndreas Boehler<?xml version="1.0"?> 264*a1a3b679SAndreas Boehler<root xmlns="http://sabredav.org/ns"> 265*a1a3b679SAndreas Boehler <elem1>hiiii!</elem1> 266*a1a3b679SAndreas Boehler</root> 267*a1a3b679SAndreas Boehler 268*a1a3b679SAndreas BoehlerHI 269*a1a3b679SAndreas Boehler ); 270*a1a3b679SAndreas Boehler 271*a1a3b679SAndreas Boehler } 272*a1a3b679SAndreas Boehler 273*a1a3b679SAndreas Boehler function testWriteElement() { 274*a1a3b679SAndreas Boehler 275*a1a3b679SAndreas Boehler $this->writer->writeElement("{http://sabredav.org/ns}foo", 'content'); 276*a1a3b679SAndreas Boehler 277*a1a3b679SAndreas Boehler $output = <<<HI 278*a1a3b679SAndreas Boehler<?xml version="1.0"?> 279*a1a3b679SAndreas Boehler<s:foo xmlns:s="http://sabredav.org/ns">content</s:foo> 280*a1a3b679SAndreas Boehler 281*a1a3b679SAndreas BoehlerHI; 282*a1a3b679SAndreas Boehler 283*a1a3b679SAndreas Boehler $this->assertEquals($output, $this->writer->outputMemory()); 284*a1a3b679SAndreas Boehler 285*a1a3b679SAndreas Boehler 286*a1a3b679SAndreas Boehler } 287*a1a3b679SAndreas Boehler 288*a1a3b679SAndreas Boehler function testWriteElementComplex() { 289*a1a3b679SAndreas Boehler 290*a1a3b679SAndreas Boehler $this->writer->writeElement("{http://sabredav.org/ns}foo", new Element\KeyValue(['{http://sabredav.org/ns}bar' => 'test'])); 291*a1a3b679SAndreas Boehler 292*a1a3b679SAndreas Boehler $output = <<<HI 293*a1a3b679SAndreas Boehler<?xml version="1.0"?> 294*a1a3b679SAndreas Boehler<s:foo xmlns:s="http://sabredav.org/ns"> 295*a1a3b679SAndreas Boehler <s:bar>test</s:bar> 296*a1a3b679SAndreas Boehler</s:foo> 297*a1a3b679SAndreas Boehler 298*a1a3b679SAndreas BoehlerHI; 299*a1a3b679SAndreas Boehler 300*a1a3b679SAndreas Boehler $this->assertEquals($output, $this->writer->outputMemory()); 301*a1a3b679SAndreas Boehler 302*a1a3b679SAndreas Boehler } 303*a1a3b679SAndreas Boehler 304*a1a3b679SAndreas Boehler /** 305*a1a3b679SAndreas Boehler * @expectedException \InvalidArgumentException 306*a1a3b679SAndreas Boehler */ 307*a1a3b679SAndreas Boehler function testWriteBadObject() { 308*a1a3b679SAndreas Boehler 309*a1a3b679SAndreas Boehler $this->writer->write(new \StdClass()); 310*a1a3b679SAndreas Boehler 311*a1a3b679SAndreas Boehler } 312*a1a3b679SAndreas Boehler 313*a1a3b679SAndreas Boehler function testStartElementSimple() { 314*a1a3b679SAndreas Boehler 315*a1a3b679SAndreas Boehler $this->writer->startElement("foo"); 316*a1a3b679SAndreas Boehler $this->writer->endElement(); 317*a1a3b679SAndreas Boehler 318*a1a3b679SAndreas Boehler $output = <<<HI 319*a1a3b679SAndreas Boehler<?xml version="1.0"?> 320*a1a3b679SAndreas Boehler<foo xmlns:s="http://sabredav.org/ns"/> 321*a1a3b679SAndreas Boehler 322*a1a3b679SAndreas BoehlerHI; 323*a1a3b679SAndreas Boehler 324*a1a3b679SAndreas Boehler $this->assertEquals($output, $this->writer->outputMemory()); 325*a1a3b679SAndreas Boehler 326*a1a3b679SAndreas Boehler 327*a1a3b679SAndreas Boehler } 328*a1a3b679SAndreas Boehler} 329