Skip to content

Commit 3488270

Browse files
committed
Fix comparisons with NAN
1 parent f23349f commit 3488270

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

src/Assert.php

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public static function float($value, $message = '')
162162
*/
163163
public static function numeric($value, $message = '')
164164
{
165-
if (!\is_numeric($value)) {
165+
if (!\is_numeric($value) || \is_float($value) && \is_nan($value)) {
166166
static::reportInvalidArgument(\sprintf(
167167
$message ?: 'Expected a numeric. Got: %s',
168168
static::typeToString($value)
@@ -889,6 +889,14 @@ public static function notSame($value, $expect, $message = '')
889889
*/
890890
public static function greaterThan($value, $limit, $message = '')
891891
{
892+
if (is_numeric($value)) {
893+
self::numeric($value);
894+
}
895+
896+
if (is_numeric($value)) {
897+
self::numeric($limit);
898+
}
899+
892900
if ($value <= $limit) {
893901
static::reportInvalidArgument(\sprintf(
894902
$message ?: 'Expected a value greater than %2$s. Got: %s',
@@ -909,6 +917,14 @@ public static function greaterThan($value, $limit, $message = '')
909917
*/
910918
public static function greaterThanEq($value, $limit, $message = '')
911919
{
920+
if (is_numeric($value)) {
921+
self::numeric($value);
922+
}
923+
924+
if (is_numeric($limit)) {
925+
self::numeric($limit);
926+
}
927+
912928
if ($value < $limit) {
913929
static::reportInvalidArgument(\sprintf(
914930
$message ?: 'Expected a value greater than or equal to %2$s. Got: %s',
@@ -929,6 +945,14 @@ public static function greaterThanEq($value, $limit, $message = '')
929945
*/
930946
public static function lessThan($value, $limit, $message = '')
931947
{
948+
if (is_numeric($value)) {
949+
self::numeric($value);
950+
}
951+
952+
if (is_numeric($limit)) {
953+
self::numeric($limit);
954+
}
955+
932956
if ($value >= $limit) {
933957
static::reportInvalidArgument(\sprintf(
934958
$message ?: 'Expected a value less than %2$s. Got: %s',
@@ -949,6 +973,14 @@ public static function lessThan($value, $limit, $message = '')
949973
*/
950974
public static function lessThanEq($value, $limit, $message = '')
951975
{
976+
if (is_numeric($value)) {
977+
self::numeric($value);
978+
}
979+
980+
if (is_numeric($limit)) {
981+
self::numeric($limit);
982+
}
983+
952984
if ($value > $limit) {
953985
static::reportInvalidArgument(\sprintf(
954986
$message ?: 'Expected a value less than or equal to %2$s. Got: %s',
@@ -972,6 +1004,18 @@ public static function lessThanEq($value, $limit, $message = '')
9721004
*/
9731005
public static function range($value, $min, $max, $message = '')
9741006
{
1007+
if (is_numeric($value)) {
1008+
self::numeric($value);
1009+
}
1010+
1011+
if (is_numeric($min)) {
1012+
self::numeric($min);
1013+
}
1014+
1015+
if (is_numeric($max)) {
1016+
self::numeric($max);
1017+
}
1018+
9751019
if ($value < $min || $value > $max) {
9761020
static::reportInvalidArgument(\sprintf(
9771021
$message ?: 'Expected a value between %2$s and %3$s. Got: %s',
@@ -1401,6 +1445,8 @@ public static function length($value, $length, $message = '')
14011445
*/
14021446
public static function minLength($value, $min, $message = '')
14031447
{
1448+
assert::numeric($min);
1449+
14041450
if (static::strlen($value) < $min) {
14051451
static::reportInvalidArgument(\sprintf(
14061452
$message ?: 'Expected a value to contain at least %2$s characters. Got: %s',
@@ -1423,6 +1469,8 @@ public static function minLength($value, $min, $message = '')
14231469
*/
14241470
public static function maxLength($value, $max, $message = '')
14251471
{
1472+
self::numeric($max);
1473+
14261474
if (static::strlen($value) > $max) {
14271475
static::reportInvalidArgument(\sprintf(
14281476
$message ?: 'Expected a value to contain at most %2$s characters. Got: %s',
@@ -1446,6 +1494,9 @@ public static function maxLength($value, $max, $message = '')
14461494
*/
14471495
public static function lengthBetween($value, $min, $max, $message = '')
14481496
{
1497+
self::numeric($min);
1498+
self::numeric($max);
1499+
14491500
$length = static::strlen($value);
14501501

14511502
if ($length < $min || $length > $max) {
@@ -1805,6 +1856,8 @@ public static function count($array, $number, $message = '')
18051856
*/
18061857
public static function minCount($array, $min, $message = '')
18071858
{
1859+
self::numeric($min);
1860+
18081861
if (\count($array) < $min) {
18091862
static::reportInvalidArgument(\sprintf(
18101863
$message ?: 'Expected an array to contain at least %2$d elements. Got: %d',
@@ -1825,6 +1878,8 @@ public static function minCount($array, $min, $message = '')
18251878
*/
18261879
public static function maxCount($array, $max, $message = '')
18271880
{
1881+
self::numeric($max);
1882+
18281883
if (\count($array) > $max) {
18291884
static::reportInvalidArgument(\sprintf(
18301885
$message ?: 'Expected an array to contain at most %2$d elements. Got: %d',
@@ -1846,6 +1901,9 @@ public static function maxCount($array, $max, $message = '')
18461901
*/
18471902
public static function countBetween($array, $min, $max, $message = '')
18481903
{
1904+
self::numeric($min);
1905+
self::numeric($max);
1906+
18491907
$count = \count($array);
18501908

18511909
if ($count < $min || $count > $max) {

tests/AssertTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public function getTests()
6060
$normalList = array('foo' => 'b', 3);
6161
unset($normalList['foo']);
6262

63+
$pastDate = (new DateTime())->modify('-1 year');
64+
$todayDate = new DateTime();
65+
$futureDate = (new DateTime())->modify('+1 year');
66+
6367
return array(
6468
array('string', array('value'), true),
6569
array('string', array(''), true),
@@ -95,6 +99,8 @@ public function getTests()
9599
array('numeric', array(123), true),
96100
array('numeric', array('123'), true),
97101
array('numeric', array('foo'), false),
102+
array('numeric', array(NAN), false),
103+
array('numeric', array('NAN'), false),
98104
array('natural', array(0), true),
99105
array('natural', array(1), true),
100106
array('natural', array(-1), false),
@@ -233,18 +239,47 @@ public function getTests()
233239
array('notSame', array(1, true), true),
234240
array('greaterThan', array(1, 0), true),
235241
array('greaterThan', array(0, 0), false),
242+
array('greaterThan', array(NAN, 1), false),
243+
array('greaterThan', array(1, NAN), false),
244+
array('greaterThan', array(NAN, NAN), false),
245+
array('greaterThan', array($futureDate, $pastDate), true),
246+
array('greaterThan', array($pastDate, $futureDate), false),
247+
array('greaterThan', array($pastDate, $pastDate), false),
236248
array('greaterThanEq', array(2, 1), true),
237249
array('greaterThanEq', array(1, 1), true),
238250
array('greaterThanEq', array(0, 1), false),
251+
array('greaterThanEq', array(NAN, 1), false),
252+
array('greaterThanEq', array($futureDate, $pastDate), true),
253+
array('greaterThanEq', array($pastDate, $pastDate), true),
254+
array('greaterThanEq', array($pastDate, $futureDate), false),
239255
array('lessThan', array(0, 1), true),
240256
array('lessThan', array(1, 1), false),
257+
array('lessThan', array(NAN, 1), false),
258+
array('lessThan', array(1, NAN), false),
259+
array('lessThan', array(NAN, NAN), false),
260+
array('lessThan', array($pastDate, $futureDate), true),
261+
array('lessThan', array($pastDate, $pastDate), false),
262+
array('lessThan', array($futureDate, $pastDate), false),
241263
array('lessThanEq', array(0, 1), true),
242264
array('lessThanEq', array(1, 1), true),
243265
array('lessThanEq', array(2, 1), false),
266+
array('lessThanEq', array(NAN, 1), false),
267+
array('lessThanEq', array(1, NAN), false),
268+
array('lessThanEq', array(NAN, NAN), false),
269+
array('lessThanEq', array($pastDate, $futureDate), true),
270+
array('lessThanEq', array($pastDate, $pastDate), true),
271+
array('lessThanEq', array($futureDate, $pastDate), false),
244272
array('range', array(1, 1, 2), true),
245273
array('range', array(2, 1, 2), true),
246274
array('range', array(0, 1, 2), false),
247275
array('range', array(3, 1, 2), false),
276+
array('range', array(NAN, 1, 2), false),
277+
array('range', array(2, NAN, 2), false),
278+
array('range', array(2, 1, NAN), false),
279+
array('range', array(2, NAN, NAN), false),
280+
array('range', array($todayDate, $pastDate, $futureDate), true),
281+
array('range', array($todayDate, $pastDate, $pastDate), false),
282+
array('range', array($pastDate, $todayDate, $futureDate), false),
248283
array('oneOf', array(1, array(1, 2, 3)), true),
249284
array('oneOf', array(1, array('1', '2', '3')), false),
250285
array('inArray', array(1, array(1, 2, 3)), true),
@@ -390,15 +425,18 @@ public function getTests()
390425
array('upper', array(''), false),
391426
array('length', array('abcd', 4), true),
392427
array('length', array('abc', 4), false),
428+
array('length', array('abc', NAN), false),
393429
array('length', array('abcde', 4), false),
394430
array('length', array('äbcd', 4), true, true),
395431
array('length', array('äbc', 4), false, true),
396432
array('length', array('äbcde', 4), false, true),
397433
array('length', array('あbcd', 4), true, true), // 'HIRAGANA LETTER A' (U+3042)
434+
array('length', array('あbcd', 4), NAN, true),
398435
array('length', array('あbc', 4), false, true),
399436
array('length', array('あbcde', 4), false, true),
400437
array('minLength', array('abcd', 4), true),
401438
array('minLength', array('abcde', 4), true),
439+
array('minLength', array('abcde', NAN), false),
402440
array('minLength', array('abc', 4), false),
403441
array('minLength', array('äbcd', 4), true, true),
404442
array('minLength', array('äbcde', 4), true, true),
@@ -408,16 +446,21 @@ public function getTests()
408446
array('minLength', array('あbc', 4), false, true),
409447
array('maxLength', array('abcd', 4), true),
410448
array('maxLength', array('abc', 4), true),
449+
array('maxLength', array('abc', NAN), false),
411450
array('maxLength', array('abcde', 4), false),
412451
array('maxLength', array('äbcd', 4), true, true),
413452
array('maxLength', array('äbc', 4), true, true),
414453
array('maxLength', array('äbcde', 4), false, true),
415454
array('maxLength', array('あbcd', 4), true, true),
416455
array('maxLength', array('あbc', 4), true, true),
456+
array('maxLength', array('あbc', NAN), false, true),
417457
array('maxLength', array('あbcde', 4), false, true),
418458
array('lengthBetween', array('abcd', 3, 5), true),
419459
array('lengthBetween', array('abc', 3, 5), true),
420460
array('lengthBetween', array('abcde', 3, 5), true),
461+
array('lengthBetween', array('abcde', 3, NAN), false),
462+
array('lengthBetween', array('abcde', NAN, 5), false),
463+
array('lengthBetween', array('abcde', NAN, NAN), false),
421464
array('lengthBetween', array('ab', 3, 5), false),
422465
array('lengthBetween', array('abcdef', 3, 5), false),
423466
array('lengthBetween', array('äbcd', 3, 5), true, true),
@@ -428,6 +471,9 @@ public function getTests()
428471
array('lengthBetween', array('あbcd', 3, 5), true, true),
429472
array('lengthBetween', array('あbc', 3, 5), true, true),
430473
array('lengthBetween', array('あbcde', 3, 5), true, true),
474+
array('lengthBetween', array('あbcde', NAN, 5), false, true),
475+
array('lengthBetween', array('あbcde', 3, NAN), false, true),
476+
array('lengthBetween', array('あbcde', NAN, NAN), false, true),
431477
array('lengthBetween', array('あb', 3, 5), false, true),
432478
array('lengthBetween', array('あbcdef', 3, 5), false, true),
433479
array('fileExists', array(__FILE__), true),
@@ -486,18 +532,24 @@ public function getTests()
486532
array('validArrayKey', array(new ToStringClass('testString')), false),
487533
array('validArrayKey', array(self::getResource()), false),
488534
array('count', array(array(0, 1, 2), 3), true),
535+
array('count', array(array(0, 1, 2), NAN), false),
489536
array('count', array(array(0, 1, 2), 2), false),
490537
array('minCount', array(array(0), 2), false),
491538
array('minCount', array(array(0, 1), 2), true),
492539
array('minCount', array(array(0, 1, 2), 2), true),
540+
array('minCount', array(array(0, 1, 2), NAN), false),
493541
array('maxCount', array(array(0, 1, 2), 2), false),
494542
array('maxCount', array(array(0, 1), 2), true),
495543
array('maxCount', array(array(0), 2), true),
544+
array('maxCount', array(array(0), NAN), false),
496545
array('countBetween', array(array(0, 1, 2), 4, 5), false),
497546
array('countBetween', array(array(0, 1, 2), 3, 5), true),
498547
array('countBetween', array(array(0, 1, 2), 1, 2), false),
499548
array('countBetween', array(array(0, 1, 2), 2, 5), true),
500549
array('countBetween', array(array(0, 1, 2), 2, 3), true),
550+
array('countBetween', array(array(0, 1, 2), NAN, 3), false),
551+
array('countBetween', array(array(0, 1, 2), 2, NAN), false),
552+
array('countBetween', array(array(0, 1, 2), NAN, NAN), false),
501553
array('isList', array(array(1, 2, 3)), true),
502554
array('isList', array(array()), true),
503555
array('isList', array(array(0 => 1, 2 => 3)), false),

0 commit comments

Comments
 (0)