* Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) * * Licensed under The Open Group Test Suite License * Redistributions of files must retain the above copyright notice. * * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) * @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests * @package cake * @subpackage cake.tests.cases.libs * @since CakePHP(tm) v 1.2.0.5432 * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License */ App::import('Core', 'Xml'); /** * Test XML Class * * @package cake * @subpackage cake.tests.cases.libs */ class TestXml extends Xml { /** * Return the protected _header instance variable * * @return string Header */ public function getHeader() { return $this->_header; } } /** * XmlTest class * * @package cake * @subpackage cake.tests.cases.libs */ class XmlTest extends CakeTestCase { /** * setUp method * * @access public * @return void */ function setUp() { $manager =& new XmlManager(); $manager->namespaces = array(); } /** * testRootTagParsing method * * @access public * @return void */ function testRootTagParsing() { $input = '<' . '?xml version="1.0" encoding="UTF-8" ?' . '>' . "\n" . '' .'' .'' .''; $xml = new Xml($input); $this->assertEqual($xml->children[0]->name, 'plugin'); $this->assertEqual($xml->children[0]->children[0]->name, 'current'); $this->assertEqual($xml->toString(true), $input); } /** * testSerialization method * * @access public * @return void */ function testSerialization() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education') ) ); $xml = new Xml($input); $result = preg_replace("/\n/",'', $xml->toString(false)); $expected = '1Touch Screen Kiosk1Financial2<client_id>2</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style><id /><name /></style><job_type><id>2</id><name>Awareness Campaign</name></job_type><industry><id>2</id><name>Education</name></industry></project>'; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } /** * testNestedArraySerialization method * * @access public * @return void */ function testSerializationNestedArray() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial'), 'BusinessSolution' => array(array('id' => 6, 'name' => 'Convert Sales')), 'MediaType' => array( array('id' => 15, 'name' => 'Print'), array('id' => 7, 'name' => 'Web Demo'), array('id' => 6, 'name' => 'CD-ROM') ) ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), 'BusinessSolution' => array( array('id' => 4, 'name' => 'Build Relationship'), array('id' => 6, 'name' => 'Convert Sales') ), 'MediaType' => array( array('id' => 17, 'name' => 'Web'), array('id' => 6, 'name' => 'CD-ROM') ) ) ); $expected = '<project><id>1</id><title /><client_id>1</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>1</job_type_id><industry_id>1</industry_id><modified /><created /><style><id /><name /></style><job_type><id>1</id><name>Touch Screen Kiosk</name></job_type><industry><id>1</id><name>Financial</name></industry><business_solution><id>6</id><name>Convert Sales</name></business_solution><media_type><id>15</id><name>Print</name></media_type><media_type><id>7</id><name>Web Demo</name></media_type><media_type><id>6</id><name>CD-ROM</name></media_type></project><project><id>2</id><title /><client_id>2</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style><id /><name /></style><job_type><id>2</id><name>Awareness Campaign</name></job_type><industry><id>2</id><name>Education</name></industry><business_solution><id>4</id><name>Build Relationship</name></business_solution><business_solution><id>6</id><name>Convert Sales</name></business_solution><media_type><id>17</id><name>Web</name></media_type><media_type><id>6</id><name>CD-ROM</name></media_type></project>'; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } /** * Prove that serialization with a given root node works * as expected. * * @access public * @return void * @link https://trac.cakephp.org/ticket/6294 */ function testArraySerializationWithRoot() { $input = array( array('Shirt' => array('id' => 1, 'color' => 'green')), array('Shirt' => array('id' => 2, 'color' => 'blue')), ); $expected = '<collection><shirt id="1" color="green" />'; $expected .= '<shirt id="2" color="blue" /></collection>'; $Xml = new Xml($input, array('root' => 'collection')); $result = $Xml->toString(array('header' => false)); $this->assertEqual($expected, $result); } /** * testCloneNode * * @access public * @return void */ function testCloneNode() { $node =& new XmlNode('element', 'myValue'); $twin =& $node->cloneNode(); $this->assertEqual($node, $twin); } /** * testNextSibling * * @access public * @return void */ function testNextSibling() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '1.89', 'industry_id' => '1.56', 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '2.2', 'industry_id' => 2.2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $xml =& new Xml($input, array('format' => 'tags')); $node =& $xml->children[0]->children[0]; $nextSibling =& $node->nextSibling(); $this->assertEqual($nextSibling, $xml->children[0]->children[1]); $nextSibling2 =& $nextSibling->nextSibling(); $this->assertEqual($nextSibling2, $xml->children[0]->children[2]); $noFriends =& $xml->children[0]->children[12]; $this->assertNull($noFriends->nextSibling()); } /** * testPreviousSibling * * @access public * @return void */ function testPreviousSibling() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '1.89', 'industry_id' => '1.56', 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '2.2', 'industry_id' => 2.2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $xml =& new Xml($input, array('format' => 'tags')); $node =& $xml->children[0]->children[1]; $prevSibling =& $node->previousSibling(); $this->assertEqual($prevSibling, $xml->children[0]->children[0]); $this->assertNull($prevSibling->previousSibling()); } /** * testAddAndRemoveAttributes * * @access public * @return void */ function testAddAndRemoveAttributes() { $node =& new XmlElement('myElement', 'superValue'); $this->assertTrue(empty($node->attributes)); $attrs = array( 'id' => 'test', 'show' => 1, 'is_spotlight' => 1, ); $node->addAttribute($attrs); $this->assertEqual($node->attributes, $attrs); $node =& new XmlElement('myElement', 'superValue'); $node->addAttribute('test', 'value'); $this->assertTrue(isset($node->attributes['test'])); $node =& new XmlElement('myElement', 'superValue'); $obj =& new StdClass(); $obj->class = 'info'; $obj->id = 'primaryInfoBox'; $node->addAttribute($obj); $expected = array( 'class' => 'info', 'id' => 'primaryInfoBox', ); $this->assertEqual($node->attributes, $expected); $result = $node->removeAttribute('class'); $this->assertTrue($result); $this->assertFalse(isset($node->attributes['class'])); $result = $node->removeAttribute('missing'); $this->assertFalse($result); } /** * Tests that XML documents with non-standard spacing (i.e. leading whitespace, whole document * on one line) still parse properly. * * @return void */ function testParsingWithNonStandardWhitespace() { $raw = '<?xml version="1.0" encoding="ISO-8859-1" ?><prices><price>1.0</price></prices>'; $array = array('Prices' => array('price' => 1.0)); $xml = new TestXml($raw); $this->assertEqual($xml->toArray(), $array); $this->assertEqual($xml->getHeader(), 'xml version="1.0" encoding="ISO-8859-1"'); $xml = new TestXml(' ' . $raw); $this->assertEqual($xml->toArray(), $array); $this->assertEqual($xml->getHeader(), 'xml version="1.0" encoding="ISO-8859-1"'); $xml = new TestXml("\n" . $raw); $this->assertEqual($xml->toArray(), $array); $this->assertEqual($xml->getHeader(), 'xml version="1.0" encoding="ISO-8859-1"'); } /* Not implemented yet */ /* function testChildFilter() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial'), 'BusinessSolution' => array(array('id' => 6, 'name' => 'Convert Sales')), 'MediaType' => array( array('id' => 15, 'name' => 'Print'), array('id' => 7, 'name' => 'Web Demo'), array('id' => 6, 'name' => 'CD-ROM') ) ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), 'BusinessSolution' => array( array('id' => 4, 'name' => 'Build Relationship'), array('id' => 6, 'name' => 'Convert Sales') ), 'MediaType' => array( array('id' => 17, 'name' => 'Web'), array('id' => 6, 'name' => 'CD-ROM') ) ) ); $xml = new Xml($input, array('format' => 'tags', 'tags' => array( 'MediaType' => array('value' => 'id', 'children' => false), 'JobType' => array('children' => array()), 'Industry' => array('children' => array('name')), 'show' => false ))); $result = $xml->toString(array('header' => false, 'cdata' => false)); $expected = '<project><id>1</id><title /><client_id>1</client_id><is_spotlight /><style_id>0</style_id><job_type_id>1</job_type_id><industry_id>1</industry_id><modified /><created /><style><id /><name /></style><job_type><id>1</id><name>Touch Screen Kiosk</name></job_type><industry><name>Financial</name></industry><business_solution><id>6</id><name>Convert Sales</name></business_solution><media_type>15</media_type><media_type>7</media_type><media_type>6</media_type></project><project><id>2</id><title /><client_id>2</client_id><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style><id /><name /></style><job_type><id>2</id><name>Awareness Campaign</name></job_type><industry><name>Education</name></industry><business_solution><id>4</id><name>Build Relationship</name></business_solution><business_solution><id>6</id><name>Convert Sales</name></business_solution><media_type>17</media_type><media_type>6</media_type></project>'; $this->assertEqual($expected, $result); } */ /* Broken due to a Set class issue */ /* function testMixedArray() { $input = array('OptionGroup' => array( array('name' => 'OptA', 'id' => 12, 'OptA 1', 'OptA 2', 'OptA 3', 'OptA 4', 'OptA 5', 'OptA 6'), array('name' => 'OptB', 'id' => 12, 'OptB 1', 'OptB 2', 'OptB 3', 'OptB 4', 'OptB 5', 'OptB 6') )); $expected = '<option_group><name>OptA</name><id>12</id><option_group>OptA 1</option_group><option_group>OptA 2</option_group><option_group>OptA 3</option_group><option_group>OptA 4</option_group><option_group>OptA 5</option_group><option_group>OptA 6</option_group></option_group><option_group><name>OptB</name><id>12</id><option_group>OptB 1</option_group><option_group>OptB 2</option_group><option_group>OptB 3</option_group><option_group>OptB 4</option_group><option_group>OptB 5</option_group><option_group>OptB 6</option_group></option_group>'; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } */ /* function testMixedNestedArray() { $input = array( 'OptionA' => array( 'name' => 'OptA', 'id' => 12, 'opt' => array('OptA 1', 'OptA 2', 'OptA 3', 'OptA 4', 'OptA 5', 'OptA 6') ), 'OptionB' => array( 'name' => 'OptB', 'id' => 12, 'opt' => array('OptB 1', 'OptB 2', 'OptB 3', 'OptB 4', 'OptB 5', 'OptB 6') ) ); $expected = '<option_a><name>OptA</name><id>12</id><opt>OptA 1</opt><opt>OptA 2</opt><opt>OptA 3</opt><opt>OptA 4</opt><opt>OptA 5</opt><opt>OptA 6</opt></option_a><option_b><name>OptB</name><id>12</id><opt>OptB 1</opt><opt>OptB 2</opt><opt>OptB 3</opt><opt>OptB 4</opt><opt>OptB 5</opt><opt>OptB 6</opt></option_b>'; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } */ /* function testMixedArrayAttributes() { $input = array('OptionGroup' => array( array( 'name' => 'OptA', 'id' => 12, array('opt' => 'OptA 1'), array('opt' => 'OptA 2'), array('opt' => 'OptA 3'), array('opt' => 'OptA 4'), array('opt' => 'OptA 5'), array('opt' => 'OptA 6') ), array( 'name' => 'OptB', 'id' => 12, array('opt' => 'OptB 1'), array('opt' => 'OptB 2'), array('opt' => 'OptB 3'), array('opt' => 'OptB 4'), array('opt' => 'OptB 5'), array('opt' => 'OptB 6') ) )); $expected = '<option_group name="OptA" id="12"><opt>OptA 1</opt><opt>OptA 2</opt><opt>OptA 3</opt><opt>OptA 4</opt><opt>OptA 5</opt><opt>OptA 6</opt></option_group><option_group name="OptB" id="12"><opt>OptB 1</opt><opt>OptB 2</opt><opt>OptB 3</opt><opt>OptB 4</opt><opt>OptB 5</opt><opt>OptB 6</opt></option_group>'; $options = array('tags' => array('option_group' => array('attributes' => array('id', 'name')))); $xml = new Xml($input, $options); $result = $xml->toString(false); $this->assertEqual($expected, $result); } */ /* Not implemented yet */ /* function testTagMap() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $expected = '<project id="1"><title /><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>1</job_type_id><industry_id>1</industry_id><modified /><created /><style id=""><name /></style><jobtype id="1">Touch Screen Kiosk</jobtype><industry id="1"><name>Financial</name></industry></project><project id="2"><title /><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style id=""><name /></style><jobtype id="2">Awareness Campaign</jobtype><industry id="2"><name>Education</name></industry></project>'; $xml = new Xml($input, array('tags' => array( 'Project' => array('attributes' => array('id')), 'style' => array('attributes' => array('id')), 'JobType' => array('name' => 'jobtype', 'attributes' => array('id'), 'value' => 'name'), 'Industry' => array('attributes' => array('id')) ))); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } */ /** * testAllCData method * * @access public * @return void */ function testAllCData() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '1.89', 'industry_id' => '1.56', 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => '1', 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => '2.2', 'industry_id' => 2.2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $expected = '<project><id>1</id><title /><client_id>1</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>1.89</job_type_id><industry_id>1.56</industry_id><modified /><created /><style><id /><name /></style><job_type><id>1</id><name><![CDATA[Touch Screen Kiosk]]></name></job_type><industry><id>1</id><name><![CDATA[Financial]]></name></industry></project><project><id>2</id><title /><client_id>2</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2.2</job_type_id><industry_id>2.2</industry_id><modified><![CDATA[2007-11-26 14:48:36]]></modified><created /><style><id /><name /></style><job_type><id>2</id><name><![CDATA[Awareness Campaign]]></name></job_type><industry><id>2</id><name><![CDATA[Education]]></name></industry></project>'; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => true)); $this->assertEqual($expected, $result); } /* PHP-native Unicode support pending */ /* function testConvertEntities() { $input = array('project' => 'écît'); $xml = new Xml($input); $result = $xml->toString(array('header' => false, 'cdata' => false, 'convertEntities' => true)); $expected = '<project>écît</project>'; $this->assertEqual($result, $expected); } */ /** * testWhitespace method * * @access public * @return void */ function testWhitespace() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $expected = "\n\t<project>\n\t\t<id>\n\t\t\t1\n\t\t</id>\n\t\t<title />\n\t\t<client_id>\n\t\t\t1\n\t\t</client_id>\n\t\t<show>\n\t\t\t1\n\t\t</show>\n\t\t<is_spotlight />\n\t\t<style_id>\n\t\t\t0\n\t\t</style_id>\n\t\t<job_type_id>\n\t\t\t1\n\t\t</job_type_id>\n\t\t<industry_id>\n\t\t\t1\n\t\t</industry_id>\n\t\t<modified />\n\t\t<created />\n\t\t<style>\n\t\t\t<id />\n\t\t\t<name />\n\t\t</style>\n\t\t<job_type>\n\t\t\t<id>\n\t\t\t\t1\n\t\t\t</id>\n\t\t\t<name>\n\t\t\t\tTouch Screen Kiosk\n\t\t\t</name>\n\t\t</job_type>\n\t\t<industry>\n\t\t\t<id>\n\t\t\t\t1\n\t\t\t</id>\n\t\t\t<name>\n\t\t\t\tFinancial\n\t\t\t</name>\n\t\t</industry>\n\t</project>\n\t<project>\n\t\t<id>\n\t\t\t2\n\t\t</id>\n\t\t<title />\n\t\t<client_id>\n\t\t\t2\n\t\t</client_id>\n\t\t<show>\n\t\t\t1\n\t\t</show>\n\t\t<is_spotlight />\n\t\t<style_id>\n\t\t\t0\n\t\t</style_id>\n\t\t<job_type_id>\n\t\t\t2\n\t\t</job_type_id>\n\t\t<industry_id>\n\t\t\t2\n\t\t</industry_id>\n\t\t<modified>\n\t\t\t2007-11-26 14:48:36\n\t\t</modified>\n\t\t<created />\n\t\t<style>\n\t\t\t<id />\n\t\t\t<name />\n\t\t</style>\n\t\t<job_type>\n\t\t\t<id>\n\t\t\t\t2\n\t\t\t</id>\n\t\t\t<name>\n\t\t\t\tAwareness Campaign\n\t\t\t</name>\n\t\t</job_type>\n\t\t<industry>\n\t\t\t<id>\n\t\t\t\t2\n\t\t\t</id>\n\t\t\t<name>\n\t\t\t\tEducation\n\t\t\t</name>\n\t\t</industry>\n\t</project>\n"; $xml = new Xml($input, array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false, 'whitespace' => true)); $this->assertEqual($expected, $result); } /** * testSetSerialization method * * @access public * @return void */ function testSetSerialization() { $input = array( array( 'Project' => array('id' => 1, 'title' => null, 'client_id' => 1, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 1, 'industry_id' => 1, 'modified' => null, 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 1, 'name' => 'Touch Screen Kiosk'), 'Industry' => array('id' => 1, 'name' => 'Financial') ), array( 'Project' => array('id' => 2, 'title' => null, 'client_id' => 2, 'show' => 1, 'is_spotlight' => null, 'style_id' => 0, 'job_type_id' => 2, 'industry_id' => 2, 'modified' => '2007-11-26 14:48:36', 'created' => null), 'Style' => array('id' => null, 'name' => null), 'JobType' => array('id' => 2, 'name' => 'Awareness Campaign'), 'Industry' => array('id' => 2, 'name' => 'Education'), ) ); $expected = '<project><id>1</id><title /><client_id>1</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>1</job_type_id><industry_id>1</industry_id><modified /><created /><style><id /><name /></style><job_type><id>1</id><name>Touch Screen Kiosk</name></job_type><industry><id>1</id><name>Financial</name></industry></project><project><id>2</id><title /><client_id>2</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style><id /><name /></style><job_type><id>2</id><name>Awareness Campaign</name></job_type><industry><id>2</id><name>Education</name></industry></project>'; $xml = new Xml(Set::map($input), array('format' => 'tags')); $result = $xml->toString(array('header' => false, 'cdata' => false)); $this->assertEqual($expected, $result); } /** * ensure that normalize does not add _name_ elements that come from Set::map sometimes. * * @return void */ function testNormalizeNotAdding_name_Element() { $input = array( 'output' => array( 'Vouchers' => array( array('Voucher' => array('id' => 1)), array('Voucher' => array('id' => 2)), ), ) ); $xml = new Xml($input, array('attributes' => false, 'format' => 'tags')); $this->assertFalse(isset($xml->children[0]->children[0]->children[1]), 'Too many children %s'); $this->assertEqual($xml->children[0]->children[0]->children[0]->name, 'voucher'); } /** * testSimpleParsing method * * @access public * @return void */ function testSimpleParsing() { $source = '<response><hello><![CDATA[happy world]]></hello><goodbye><![CDATA[cruel world]]></goodbye></response>'; $xml = new Xml($source); $result = $xml->toString(); $this->assertEqual($source, $result); } /** * test that elements with empty tag values do not collapse and corrupt data structures * * @access public * @return void */ function testElementCollapsing() { $xmlDataThatFails = '<resultpackage> <result qid="46b1c46ed6208"><![CDATA[46b1c46ed3af9]]></result> <result qid="46b1c46ed332a"><![CDATA[]]></result> <result qid="46b1c46ed90e6"><![CDATA[46b1c46ed69d8]]></result> <result qid="46b1c46ed71a7"><![CDATA[46b1c46ed5a38]]></result> <result qid="46b1c46ed8146"><![CDATA[46b1c46ed98b6]]></result> <result qid="46b1c46ed7978"><![CDATA[]]></result> <result qid="46b1c46ed4a98"><![CDATA[]]></result> <result qid="46b1c46ed42c8"><![CDATA[]]></result> <result qid="46b1c46ed5268"><![CDATA[46b1c46ed8917]]></result> </resultpackage>'; $Xml = new Xml(); $Xml->load('<?xml version="1.0" encoding="UTF-8" ?>' . $xmlDataThatFails); $result = $Xml->toArray(false); $this->assertTrue(is_array($result)); $expected = array( 'resultpackage' => array( 'result' => array( 0 => array( 'value' => '46b1c46ed3af9', 'qid' => '46b1c46ed6208'), 1 => array( 'qid' => '46b1c46ed332a'), 2 => array( 'value' => '46b1c46ed69d8', 'qid' => '46b1c46ed90e6'), 3 => array( 'value' => '46b1c46ed5a38', 'qid' => '46b1c46ed71a7'), 4 => array( 'value' => '46b1c46ed98b6', 'qid' => '46b1c46ed8146'), 5 => array( 'qid' => '46b1c46ed7978'), 6 => array( 'qid' => '46b1c46ed4a98'), 7 => array( 'qid' => '46b1c46ed42c8'), 8 => array( 'value' => '46b1c46ed8917', 'qid' => '46b1c46ed5268'), ) )); $this->assertEqual( count($result['resultpackage']['result']), count($expected['resultpackage']['result']), 'Incorrect array length %s'); $this->assertFalse( isset($result['resultpackage']['result'][0][0]['qid']), 'Nested array exists, data is corrupt. %s'); $this->assertEqual($result, $expected); } /** * test that empty values do not casefold collapse * * @see http://code.cakephp.org/tickets/view/8 * @return void */ function testCaseFoldingWithEmptyValues() { $filledValue = '<method name="set_user_settings"> <title>update user information 1 1 varchar(45) '; $xml =& new XML($filledValue); $expected = array( 'Method' => array( 'name' => 'set_user_settings', 'title' => 'update user information', 'user' => '1', 'User' => array( 'id' => 1, 'name' => 'varchar(45)', ), ) ); $result = $xml->toArray(); $this->assertEqual($result, $expected); $emptyValue =' update user information 1 varchar(45) '; $xml =& new XML($emptyValue); $expected = array( 'Method' => array( 'name' => 'set_user_settings', 'title' => 'update user information', 'user' => array(), 'User' => array( 'id' => 1, 'name' => 'varchar(45)', ), ) ); $result = $xml->toArray(); $this->assertEqual($result, $expected); } /** * testMixedParsing method * * @access public * @return void */ function testMixedParsing() { $source = ''; $xml = new Xml($source); $result = $xml->toString(); $this->assertEqual($source, $result); } /** * testComplexParsing method * * @access public * @return void */ function testComplexParsing() { $source = '1<client_id>1</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>1</job_type_id><industry_id>1</industry_id><modified /><created /><style><id /><name /></style><job_type><id>1</id><name>Touch Screen Kiosk</name></job_type><industry><id>1</id><name>Financial</name></industry></project><project><id>2</id><title /><client_id>2</client_id><show>1</show><is_spotlight /><style_id>0</style_id><job_type_id>2</job_type_id><industry_id>2</industry_id><modified>2007-11-26 14:48:36</modified><created /><style><id /><name /></style><job_type><id>2</id><name>Awareness Campaign</name></job_type><industry><id>2</id><name>Education</name></industry></project></projects>'; $xml = new Xml($source); $result = $xml->toString(array('cdata' => false)); $this->assertEqual($source, $result); } /** * testNamespaceParsing method * * @access public * @return void */ function testNamespaceParsing() { $source = '<a:container xmlns:a="http://example.com/a" xmlns:b="http://example.com/b" xmlns:c="http://example.com/c" xmlns:d="http://example.com/d" xmlns:e="http://example.com/e"><b:rule test=""><c:result>value</c:result></b:rule><d:rule test=""><e:result>value</e:result></d:rule></a:container>'; $xml = new Xml($source); $result = $xml->toString(array('cdata' => false)); $this->assertEqual($source, $result); $children = $xml->children('container'); $this->assertEqual($children[0]->namespace, 'a'); $children = $children[0]->children('rule'); $this->assertEqual($children[0]->namespace, 'b'); } /** * testNamespaces method * * @access public * @return void */ function testNamespaces() { $source = '<a:container xmlns:a="http://example.com/a" xmlns:b="http://example.com/b" xmlns:c="http://example.com/c" xmlns:d="http://example.com/d" xmlns:e="http://example.com/e"><b:rule test=""><c:result>value</c:result></b:rule><d:rule test=""><e:result>value</e:result></d:rule></a:container>'; $xml = new Xml($source); $expects = '<a:container xmlns:a="http://example.com/a" xmlns:b="http://example.com/b" xmlns:c="http://example.com/c" xmlns:d="http://example.com/d" xmlns:e="http://example.com/e" xmlns:f="http://example.com/f"><b:rule test=""><c:result>value</c:result></b:rule><d:rule test=""><e:result>value</e:result></d:rule></a:container>'; $_xml =& XmlManager::getInstance(); $xml->addNamespace('f', 'http://example.com/f'); $result = $xml->toString(array('cdata' => false)); $this->assertEqual($expects, $result); } /** * testEscapeCharSerialization method * * @access public * @return void */ function testEscapeCharSerialization() { $xml = new Xml(array('text' => 'JavaScript & DHTML'), array('attributes' => false, 'format' => 'attributes')); $result = $xml->toString(false); $expected = '<std_class text="JavaScript & DHTML" />'; $this->assertEqual($expected, $result); } /** * testCompleteEscapeCharSerialization method * * @access public * @return void */ function testCompleteEscapeCharSerialization() { $xml = new Xml(array('text' => '<>&"\''), array('attributes' => false, 'format' => 'attributes')); $result = $xml->toString(false); $expected = '<std_class text="<>&"'" />'; $this->assertEqual($expected, $result); } /** * testToArray method * * @access public * @return void */ function testToArray() { App::import('Set'); $string = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rss version="2.0"> <channel> <title>Cake PHP Google Group http://groups.google.com/group/cake-php Search this group before posting anything. There are over 20,000 posts and it&#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database. en constructng result array when using findall http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array( http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f bmil...@gmail.com(bpscrugs) Fri, 28 Dec 2007 00:44:14 UT Re: share views between actions? http://groups.google.com/group/cake-php/msg/8b350d898707dad8 Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I'll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other http://groups.google.com/group/cake-php/msg/8b350d898707dad8 subtropolis.z...@gmail.com(subtropolis zijn) Fri, 28 Dec 2007 00:45:01 UT '; $xml = new Xml($string); $result = $xml->toArray(); $expected = array('Rss' => array( 'version' => '2.0', 'Channel' => array( 'title' => 'Cake PHP Google Group', 'link' => 'http://groups.google.com/group/cake-php', 'description' => 'Search this group before posting anything. There are over 20,000 posts and it's very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.', 'language' => 'en', 'Item' => array( array( 'title' => 'constructng result array when using findall', 'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f', 'description' => "i'm using cakephp to construct a logical data model array that will be
passed to a flex app. I have the following model association:
ServiceDay->(hasMany)ServiceTi me->(hasMany)ServiceTimePrice. So what
the current output from my findall is something like this example:

Array(
[0] => Array(", 'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'), 'author' => 'bmil...@gmail.com(bpscrugs)', 'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT', ), array( 'title' => 'Re: share views between actions?', 'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8', 'description' => 'Then perhaps you might do us all a favour and refrain from replying to
things you do not understand. That goes especially for asinine comments.
Indeed.
To sum up:
No comment.
In my day, a simple "RTFM" would suffice. I\'ll keep in mind to ignore any
further responses from you.
You (and I) were referring to the *online documentation*, not other', 'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'), 'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)', 'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT' ) ) ) )); $this->assertEqual($result, $expected); $string =''; $xml = new Xml($string); $result = $xml->toArray(); $expected = array('Data' => array('Post' => array('title' => 'Title of this post', 'description' => 'cool'))); $this->assertEqual($result, $expected); $xml = new Xml('An example of a correctly reversed XMLNode'); $result = Set::reverse($xml); $expected = array( 'Example' => array( 'Item' => array( 'title' => 'An example of a correctly reversed XMLNode', 'desc' => array(), ) ) ); $this->assertIdentical($result, $expected); $xml = new Xml('title1title2'); $result = $xml->toArray(); $expected = array( 'Example' => array( 'Item' => array( 'attr' => '123', 'Titles' => array( 'Title' => array('title1', 'title2') ) ) ) ); $this->assertIdentical($result, $expected); $xml = new Xml('listtextforitems'); $result = $xml->toArray(); $expected = array( 'Example' => array( 'attr' => 'ex_attr', 'Item' => array( 'attr' => '123', 'titles' => 'list', 'value' => 'textforitems' ) ) ); $this->assertIdentical($result, $expected); $xml = new Xml('listtextforitems'); $example = $xml->child('example'); $item = $example->child('item'); $result = $item->toArray(); $expected = array( 'attr' => '123', 'titles' => 'list', 'value' => 'textforitems' ); $this->assertIdentical($result, $expected); $string = ' Cake PHP Google Group http://groups.google.com/group/cake-php Search this group before posting anything. There are over 20,000 posts and it&#39;s very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database. en constructng result array when using findall http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f i'm using cakephp to construct a logical data model array that will be <br> passed to a flex app. I have the following model association: <br> ServiceDay-&gt;(hasMany)ServiceTi me-&gt;(hasMany)ServiceTimePrice. So what <br> the current output from my findall is something like this example: <br> <p>Array( <br> [0] =&gt; Array( cakephp http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f bmil...@gmail.com(bpscrugs) Fri, 28 Dec 2007 00:44:14 UT Re: share views between actions? http://groups.google.com/group/cake-php/msg/8b350d898707dad8 Then perhaps you might do us all a favour and refrain from replying to <br> things you do not understand. That goes especially for asinine comments. <br> Indeed. <br> To sum up: <br> No comment. <br> In my day, a simple &quot;RTFM&quot; would suffice. I'll keep in mind to ignore any <br> further responses from you. <br> You (and I) were referring to the *online documentation*, not other cakephp http://groups.google.com/group/cake-php/msg/8b350d898707dad8 subtropolis.z...@gmail.com(subtropolis zijn) Fri, 28 Dec 2007 00:45:01 UT '; $xml = new Xml($string); $result = $xml->toArray(); $expected = array('Rss' => array( 'version' => '2.0', 'Channel' => array( 'title' => 'Cake PHP Google Group', 'link' => 'http://groups.google.com/group/cake-php', 'description' => 'Search this group before posting anything. There are over 20,000 posts and it's very likely your question was answered before. Visit the IRC channel #cakephp at irc.freenode.net for live chat with users and developers of Cake. If you post, tell us the version of Cake, PHP, and database.', 'language' => 'en', 'Item' => array( array( 'title' => 'constructng result array when using findall', 'link' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f', 'description' => "i'm using cakephp to construct a logical data model array that will be
passed to a flex app. I have the following model association:
ServiceDay->(hasMany)ServiceTi me->(hasMany)ServiceTimePrice. So what
the current output from my findall is something like this example:

Array(
[0] => Array(", 'creator' => 'cakephp', 'Category' => array('cakephp', 'model'), 'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/49bc00f3bc651b4f'), 'author' => 'bmil...@gmail.com(bpscrugs)', 'pubDate' => 'Fri, 28 Dec 2007 00:44:14 UT', ), array( 'title' => 'Re: share views between actions?', 'link' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8', 'description' => 'Then perhaps you might do us all a favour and refrain from replying to
things you do not understand. That goes especially for asinine comments.
Indeed.
To sum up:
No comment.
In my day, a simple "RTFM" would suffice. I\'ll keep in mind to ignore any
further responses from you.
You (and I) were referring to the *online documentation*, not other', 'creator' => 'cakephp', 'Category' => array('cakephp', 'model'), 'guid' => array('isPermaLink' => 'true', 'value' => 'http://groups.google.com/group/cake-php/msg/8b350d898707dad8'), 'author' => 'subtropolis.z...@gmail.com(subtropolis zijn)', 'pubDate' => 'Fri, 28 Dec 2007 00:45:01 UT' ) ) ) )); $this->assertEqual($result, $expected); $text = " 1 2 3 4 "; $xml = new Xml($text); $result = $xml->toArray(); $expected = array('Course' => array( 'Comps' => array( 'Comp' => array( 1, 2, 3, 4 ) ) )); $this->assertEqual($result, $expected); $text = ' xri://$xrds*simple 2008-04-13T07:34:58Z http://oauth.net/core/1.0/endpoint/authorize http://oauth.net/core/1.0/parameters/auth-header http://oauth.net/core/1.0/parameters/uri-query https://ma.gnolia.com/oauth/authorize http://ma.gnolia.com/oauth/authorize xri://$xrds*simple http://oauth.net/discovery/1.0 #oauth '; $xml = new Xml($text); $result = $xml->toArray(); $expected = array('XRDS' => array( 'xmlns' => 'xri://$xrds', 'XRD' => array( array( 'xml:id' => 'oauth', 'xmlns' => 'xri://$XRD*($v*2.0)', 'version' => '2.0', 'Type' => 'xri://$xrds*simple', 'Expires' => '2008-04-13T07:34:58Z', 'Service' => array( 'Type' => array( 'http://oauth.net/core/1.0/endpoint/authorize', 'http://oauth.net/core/1.0/parameters/auth-header', 'http://oauth.net/core/1.0/parameters/uri-query' ), 'URI' => array( array( 'value' => 'https://ma.gnolia.com/oauth/authorize', 'priority' => '10', ), array( 'value' => 'http://ma.gnolia.com/oauth/authorize', 'priority' => '20' ) ) ) ), array( 'xmlns' => 'xri://$XRD*($v*2.0)', 'version' => '2.0', 'Type' => 'xri://$xrds*simple', 'Service' => array( 'priority' => '10', 'Type' => 'http://oauth.net/discovery/1.0', 'URI' => '#oauth' ) ) ) )); $this->assertEqual($result, $expected); $text = ' '; $xml = new Xml($text); $result = $xml->toArray(); $expected = array( 'Root' => array( 'Child' => array( array('id' => 1, 'other' => 1), array('id' => 2, 'other' => 1), array('id' => 3, 'other' => 1), array('id' => 4, 'other' => 1), array('id' => 5, 'other' => 1) ) ) ); $this->assertEqual($result, $expected); $text = '

'; $xml = new Xml($text); $result = $xml->toArray(); $expected = array( 'Main' => array( 'First' => array( array('label' => 'first type node 1'), array('label' => 'first type node 2') ), 'Second' => array('label'=>'second type node') ) ); $this->assertIdentical($result,$expected); $text = '
'; $xml = new Xml($text); $result = $xml->toArray(); $expected = array( 'Main' => array( 'First' => array( array('label' => 'first type node 1'), array('label' => 'first type node 2') ), 'Second' => array('label'=>'second type node'), 'Collection' => array( 'Fifth' => array('label' => 'fifth type node'), 'Third' => array( array('label' => 'third type node 1'), array('label' => 'third type node 2'), array('label' => 'third type node 3'), ), 'Fourth' => array('label' => 'fourth type node'), ) ) ); $this->assertIdentical($result,$expected); } /** * testAppend method * * @access public * @return void */ function testAppend() { $parentNode = new XmlNode('ourParentNode'); $parentNode->append( new XmlNode('ourChildNode')); $first =& $parentNode->first(); $this->assertEqual($first->name, 'ourChildNode'); $string = 'ourChildNode'; $parentNode = new XmlNode('ourParentNode'); $parentNode->append($string); $last =& $parentNode->last(); $this->assertEqual($last->name, 'ourChildNode'); $this->expectError(); $parentNode->append($parentNode); } /** * testNamespacing method * * @access public * @return void */ function testNamespacing() { $node = new Xml(''); $node->addNamespace('cake', 'http://cakephp.org'); $this->assertEqual($node->toString(), ''); $this->assertTrue($node->removeNamespace('cake')); $this->assertEqual($node->toString(), ''); $node = new Xml(''); $this->assertTrue($node->removeNamespace('cake')); $this->assertEqual($node->toString(), ''); $node->addNamespace('cake', 'http://cakephp.org'); $this->assertEqual($node->toString(), ''); } /** * testCamelize method * * @access public * @return void */ function testCamelize() { $xmlString = 'examples.getStateName' . '41'; $Xml = new Xml($xmlString); $expected = array( 'methodCall' => array( 'methodName' => 'examples.getStateName', 'params' => array( 'param' => array('value' => array('i4' => 41))))); $this->assertEqual($expected, $Xml->toArray(false)); $Xml = new Xml($xmlString); $expected = array( 'MethodCall' => array( 'methodName' => 'examples.getStateName', 'Params' => array( 'Param' => array('Value' => array('i4' => 41))))); $this->assertEqual($expected, $Xml->toArray()); } /** * testNumericDataHandling method * * @access public * @return void */ function testNumericDataHandling() { $data = '012345'; $node = new Xml(); $node->load($data); $node->parse(); $result = $node->first(); $result = $result->children("data"); $result = $result[0]->first(); $this->assertEqual($result->value, '012345'); } /** * test that creating an xml object does not leak memory * * @return void */ function testMemoryLeakInConstructor() { if ($this->skipIf(!function_exists('memory_get_usage'), 'Cannot test memory leaks without memory_get_usage')) { return; } $data = 'TEST'; $start = memory_get_usage(); for ($i = 0; $i <= 300; $i++) { $test =& new XML($data); $test->__destruct(); unset($test); } $end = memory_get_usage(); $this->assertWithinMargin($start, $end, 3600, 'Memory leaked %s'); } } ?>