Skip to content

Commit fb4a17e

Browse files
committed
Improve null tests
1 parent 18ce038 commit fb4a17e

File tree

2 files changed

+85
-24
lines changed

2 files changed

+85
-24
lines changed

src/Type/ArrayKeyType.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,25 @@ public function cast(mixed $value, Context $context): string|int
4343
return $value;
4444
}
4545

46-
if (\is_float($value)) {
46+
if (!$context->isStrictTypesEnabled()) {
4747
try {
4848
/** @var int */
4949
return $this->int->cast($value, $context);
5050
} catch (ValueExceptionInterface) {
51+
// NaN, -INF and INF cannot be converted to
52+
// array-key implicitly without losses.
53+
if (\is_float($value) && !\is_finite($value)) {
54+
throw InvalidValueException::createFromContext(
55+
value: $value,
56+
context: $context,
57+
);
58+
}
59+
5160
/** @var string */
5261
return $this->string->cast($value, $context);
5362
}
5463
}
5564

56-
if (!$context->isStrictTypesEnabled()) {
57-
/** @var string */
58-
return $this->string->cast($value, $context);
59-
}
60-
6165
throw InvalidValueException::createFromContext(
6266
value: $value,
6367
context: $context,

tests/Feature/Type/null.feature

Lines changed: 75 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,63 +10,120 @@ Feature: Checking the "null" (TypeLang\Mapper\Type\NullType) type behavior
1010
Then match of "<value>" must return <is_matched>
1111
Examples:
1212
| value | is_matched |
13+
# default checks
14+
## int
15+
| 42 | false |
1316
| 1 | false |
1417
| 0 | false |
1518
| -1 | false |
16-
| 42 | false |
17-
| 42.1 | false |
19+
| -42 | false |
20+
## numeric int string
21+
| "42" | false |
22+
| "1" | false |
23+
| "0" | false |
24+
| "-1" | false |
25+
| "-42" | false |
26+
## float
27+
| 42.5 | false |
28+
| 42.0 | false |
1829
| 1.0 | false |
1930
| 0.0 | false |
2031
| -1.0 | false |
32+
| -42.0 | false |
33+
| -42.5 | false |
34+
## numeric float string
35+
| "42.5" | false |
36+
| "42.0" | false |
37+
| "1.0" | false |
38+
| "0.0" | false |
39+
| "-1.0" | false |
40+
| "-42.0" | false |
41+
| "-42.5" | false |
42+
## extra float
2143
| INF | false |
2244
| -INF | false |
2345
| NAN | false |
24-
| "1" | false |
25-
| "0" | false |
26-
| "string" | false |
27-
| "true" | false |
28-
| "false" | false |
29-
| "" | false |
46+
## null
3047
| null | true |
48+
## bool
3149
| true | false |
3250
| false | false |
51+
## bool string
52+
| "true" | false |
53+
| "false" | false |
54+
## string
55+
| "non empty" | false |
56+
| "" | false |
57+
## array
3358
| [] | false |
34-
| [1] | false |
59+
| [0 => 23] | false |
60+
| ['key' => 42] | false |
61+
## object
3562
| (object)[] | false |
63+
## enum
3664
| TypeLang\Mapper\Tests\Stub\IntBackedEnumStub::CASE | false |
3765
| TypeLang\Mapper\Tests\Stub\StringBackedEnumStub::CASE | false |
3866
| TypeLang\Mapper\Tests\Stub\UnitEnumStub::CASE | false |
3967

68+
4069
Scenario Outline: Casting "<value>"
4170
When normalize
4271
Then cast of "<value>" must return <result>
4372
When denormalize
4473
Then cast of "<value>" must return <result>
4574
Examples:
4675
| value | result |
76+
# default checks
77+
## int
78+
| 42 | <error: Passed value 42 is invalid> |
4779
| 1 | <error: Passed value 1 is invalid> |
4880
| 0 | <error: Passed value 0 is invalid> |
4981
| -1 | <error: Passed value -1 is invalid> |
50-
| 42 | <error: Passed value 42 is invalid> |
51-
| 42.1 | <error: Passed value 42.1 is invalid> |
82+
| -42 | <error: Passed value -42 is invalid> |
83+
## numeric int string
84+
| "42" | <error: Passed value "42" is invalid> |
85+
| "1" | <error: Passed value "1" is invalid> |
86+
| "0" | <error: Passed value "0" is invalid> |
87+
| "-1" | <error: Passed value "-1" is invalid> |
88+
| "-42" | <error: Passed value "-42" is invalid> |
89+
## float
90+
| 42.5 | <error: Passed value 42.5 is invalid> |
91+
| 42.0 | <error: Passed value 42 is invalid> |
5292
| 1.0 | <error: Passed value 1 is invalid> |
5393
| 0.0 | <error: Passed value 0 is invalid> |
5494
| -1.0 | <error: Passed value -1 is invalid> |
95+
| -42.0 | <error: Passed value -42 is invalid> |
96+
| -42.5 | <error: Passed value -42.5 is invalid> |
97+
## numeric float string
98+
| "42.5" | <error: Passed value "42.5" is invalid> |
99+
| "42.0" | <error: Passed value "42.0" is invalid> |
100+
| "1.0" | <error: Passed value "1.0" is invalid> |
101+
| "0.0" | <error: Passed value "0.0" is invalid> |
102+
| "-1.0" | <error: Passed value "-1.0" is invalid> |
103+
| "-42.0" | <error: Passed value "-42.0" is invalid> |
104+
| "-42.5" | <error: Passed value "-42.5" is invalid> |
105+
## extra float
55106
| INF | <error: Passed value INF is invalid> |
56107
| -INF | <error: Passed value -INF is invalid> |
57108
| NAN | <error: Passed value NAN is invalid> |
58-
| "1" | <error: Passed value "1" is invalid> |
59-
| "0" | <error: Passed value "0" is invalid> |
60-
| "string" | <error: Passed value "string" is invalid> |
61-
| "true" | <error: Passed value "true" is invalid> |
62-
| "false" | <error: Passed value "false" is invalid> |
63-
| "" | <error: Passed value "" is invalid> |
109+
## null
64110
| null | null |
111+
## bool
65112
| true | <error: Passed value true is invalid> |
66113
| false | <error: Passed value false is invalid> |
114+
## bool string
115+
| "true" | <error: Passed value "true" is invalid> |
116+
| "false" | <error: Passed value "false" is invalid> |
117+
## string
118+
| "non empty" | <error: Passed value "non empty" is invalid> |
119+
| "" | <error: Passed value "" is invalid> |
120+
## array
67121
| [] | <error: Passed value [] is invalid> |
68-
| [1] | <error: Passed value [1] is invalid> |
122+
| [0 => 23] | <error: Passed value [23] is invalid> |
123+
| ['key' => 42] | <error: Passed value {"key": 42} is invalid> |
124+
## object
69125
| (object)[] | <error: Passed value {} is invalid> |
126+
## enum
70127
| TypeLang\Mapper\Tests\Stub\IntBackedEnumStub::CASE | <error: Passed value {"name": "CASE", "value": 3735928559} is invalid> |
71128
| TypeLang\Mapper\Tests\Stub\StringBackedEnumStub::CASE | <error: Passed value {"name": "CASE", "value": "case"} is invalid> |
72129
| TypeLang\Mapper\Tests\Stub\UnitEnumStub::CASE | <error: Passed value {"name": "CASE"} is invalid> |

0 commit comments

Comments
 (0)