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());
}
}