diff --git a/src/Codeception/Util/JsonArray.php b/src/Codeception/Util/JsonArray.php index d0592c0..288d827 100644 --- a/src/Codeception/Util/JsonArray.php +++ b/src/Codeception/Util/JsonArray.php @@ -121,11 +121,33 @@ private function arrayToXml(DOMDocument $doc, DOMNode $node, array $array): void if (is_array($value)) { $this->arrayToXml($doc, $subNode, $value); } else { - $subNode->nodeValue = htmlspecialchars((string)$value); + $this->setValue($subNode, $value); } } } + private function setValue($subNode, $value) { + switch(gettype($value)) { + case 'boolean': + $subNode->nodeValue = $value?'true':'false'; + $subNode->setAttribute('type', 'boolean'); + break; + case 'integer': + case 'double': + $subNode->nodeValue = (string) $value; + $subNode->setAttribute('type', 'number'); + break; + case 'NULL': + $subNode->nodeValue = ''; + $subNode->setAttribute('type', 'null'); + break; + default: + $subNode->nodeValue = htmlspecialchars((string) $value); + $subNode->setAttribute('type', 'string'); + break; + } + } + private function getValidTagNameForInvalidKey($key) { static $map = []; diff --git a/tests/unit/Codeception/Util/JsonArrayTest.php b/tests/unit/Codeception/Util/JsonArrayTest.php index 19c0023..5343421 100644 --- a/tests/unit/Codeception/Util/JsonArrayTest.php +++ b/tests/unit/Codeception/Util/JsonArrayTest.php @@ -21,7 +21,7 @@ protected function _before() public function testXmlConversion() { $this->assertStringContainsString( - 'Bug should be fixedDavert', + 'Bug should be fixedDavert', $this->jsonArray->toXml()->saveXML() ); } @@ -32,17 +32,33 @@ public function testXmlArrayConversion2() '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); - $this->assertStringContainsString('wed-dev', $jsonArray->toXml()->saveXML()); + $this->assertStringContainsString('wed-dev', $jsonArray->toXml()->saveXML()); $this->assertSame(2, $jsonArray->filterByXPath('//user')->length); } public function testXPathEvaluation() { - $this->assertSame(true, $this->jsonArray->evaluateXPath('count(//ticket/title)>0')); - $this->assertEquals(1.0 , $this->jsonArray->evaluateXPath('count(//ticket/user/name)')); - $this->assertSame(true, $this->jsonArray->evaluateXPath("count(//user/name[text() = 'Davert']) > 0")); + $this->assertTrue($this->jsonArray->evaluateXPath('count(//ticket/title)>0')); + $this->assertEquals(1, $this->jsonArray->evaluateXPath('count(//ticket/user/name)')); + $this->assertTrue($this->jsonArray->evaluateXPath("count(//user/name[text() = 'Davert']) > 0")); } + public function testXPathTypes() + { + $jsonArray = new JsonArray( + '{"boolean":true, "number": -1.2780E+2, "null": null, "string": "i\'am a sentence"}' + ); + $this->assertEquals(0, $jsonArray->evaluateXPath("count(//*[text() = 'false'])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//boolean[text() = 'true'])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//boolean[@type = 'boolean'])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[text() = -127.80])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[text() = -1.2780E+2])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//number[@type = 'number'])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//null[@type = 'null'])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//null[text() = ''])")); + $this->assertEquals(1, $jsonArray->evaluateXPath("count(//string[@type = 'string'])")); + } + public function testXPathLocation() { $this->assertGreaterThan(0, $this->jsonArray->filterByXPath('//ticket/title')->length); @@ -83,8 +99,8 @@ public function testConvertsBareJson() public function testInvalidXmlTag() { $jsonArray = new JsonArray('{"a":{"foo/bar":1,"":2},"b":{"foo/bar":1,"":2},"baz":2}'); - $expectedXml = '12' - . '122'; + $expectedXml = '12' + . '122'; $this->assertStringContainsString($expectedXml, $jsonArray->toXml()->saveXML()); } @@ -92,7 +108,7 @@ public function testConvertsArrayHavingSingleElement() { $jsonArray = new JsonArray('{"success": 1}'); $expectedXml = '' - . "\n1\n"; + . "\n1\n"; $this->assertSame($expectedXml, $jsonArray->toXml()->saveXML()); } @@ -100,7 +116,7 @@ public function testConvertsArrayHavingTwoElements() { $jsonArray = new JsonArray('{"success": 1, "info": "test"}'); $expectedXml = '' - . "\n1test\n"; + . "\n1test\n"; $this->assertSame($expectedXml, $jsonArray->toXml()->saveXML()); } @@ -108,7 +124,7 @@ public function testConvertsArrayHavingSingleSubArray() { $jsonArray = new JsonArray('{"array": {"success": 1}}'); $expectedXml = '' - . "\n1\n"; + . "\n1\n"; $this->assertSame($expectedXml, $jsonArray->toXml()->saveXML()); } }