Skip to content

Commit e8345af

Browse files
committed
Add number coercion cases from ajv matrix
1 parent 68d56b3 commit e8345af

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

src/JsonSchema/Constraints/TypeConstraint.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,23 @@ protected function toNumber($value)
263263
if (is_numeric($value)) {
264264
return $value + 0; // cast to number
265265
}
266+
if (is_bool($value) || is_null($value)) {
267+
return (int) $value;
268+
}
269+
if ($this->getTypeCheck()->isArray($value) && count($value) === 1) {
270+
reset($value);
271+
272+
return $this->toNumber(current($value));
273+
}
266274

267275
return $value;
268276
}
269277

270278
protected function toInteger($value)
271279
{
272280
$numberValue = $this->toNumber($value);
273-
if ((int) $numberValue == $numberValue) {
274-
return (int) $value; // cast to number
281+
if (is_numeric($numberValue) && (int) $numberValue == $numberValue) {
282+
return (int) $numberValue; // cast to number
275283
}
276284

277285
return $value;

tests/Constraints/CoerciveTest.php

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,22 @@ public function testValidCoerceCases($input, $schema, $errors = array())
5555
$validator->validate($value, $schema, $checkMode);
5656

5757
$this->assertTrue(gettype($value->number) == 'double');
58+
$this->assertTrue(gettype($value->boolNumber) == 'integer');
59+
$this->assertTrue(gettype($value->nullNumber) == 'integer');
60+
$this->assertTrue(gettype($value->arrayNumber) == 'double');
5861
$this->assertTrue(gettype($value->integer) == 'integer');
5962
$this->assertTrue(gettype($value->negativeInteger) == 'integer');
6063
$this->assertTrue(gettype($value->boolean) == 'boolean');
6164

62-
$this->assertTrue($value->number === 1.5);
63-
$this->assertTrue($value->integer === 1);
64-
$this->assertTrue($value->negativeInteger === -2);
65-
$this->assertTrue($value->boolean === true);
66-
6765
$this->assertTrue(gettype($value->multitype1) == 'boolean');
6866
$this->assertTrue(gettype($value->multitype2) == 'double');
6967
$this->assertTrue(gettype($value->multitype3) == 'integer');
7068
$this->assertTrue(gettype($value->multitype4) == 'string');
7169

7270
$this->assertTrue($value->number === 1.5);
71+
$this->assertTrue($value->boolNumber === 1);
72+
$this->assertTrue($value->nullNumber === 0);
73+
$this->assertTrue($value->arrayNumber === 1.5);
7374
$this->assertTrue($value->integer === 1);
7475
$this->assertTrue($value->negativeInteger === -2);
7576
$this->assertTrue($value->boolean === true);
@@ -124,6 +125,9 @@ public function getValidCoerceTests()
124125
'{
125126
"string":"string test",
126127
"number":"1.5",
128+
"boolNumber":true,
129+
"nullNumber":null,
130+
"arrayNumber":["1.5"],
127131
"integer":"1",
128132
"negativeInteger":"-2",
129133
"boolean":"true",
@@ -152,6 +156,9 @@ public function getValidCoerceTests()
152156
"properties":{
153157
"string":{"type":"string"},
154158
"number":{"type":"number"},
159+
"boolNumber":{"type":"number"},
160+
"nullNumber":{"type":"number"},
161+
"arrayNumber":{"type":"number"},
155162
"integer":{"type":"integer"},
156163
"negativeInteger":{"type":"integer"},
157164
"boolean":{"type":"boolean"},
@@ -285,6 +292,18 @@ public function getInvalidCoerceTests()
285292
"additionalProperties":false
286293
}',
287294
),
295+
array( // #7
296+
'{
297+
"integer":"5f"
298+
}',
299+
'{
300+
"type":"object",
301+
"properties": {
302+
"integer":{"type":"integer"}
303+
},
304+
"additionalProperties":false
305+
}',
306+
),
288307
);
289308
}
290309
}

0 commit comments

Comments
 (0)