diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 361b7e58de66..6b96d74356b0 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -3,6 +3,7 @@ namespace Illuminate\Validation\Concerns; use Brick\Math\BigDecimal; +use Brick\Math\BigNumber; use Brick\Math\Exception\MathException as BrickMathException; use DateTime; use DateTimeInterface; @@ -436,9 +437,10 @@ public function validateBetween($attribute, $value, $parameters) { $this->requireParameterCount(2, $parameters, 'between'); - $size = $this->getSize($attribute, $value); - - return $size >= $parameters[0] && $size <= $parameters[1]; + return with( + BigNumber::of($this->getSize($attribute, $value)), + fn ($size) => $size->isGreaterThanOrEqualTo($parameters[0]) && $size->isLessThanOrEqualTo($parameters[1]) + ); } /** @@ -1080,7 +1082,7 @@ public function validateGt($attribute, $value, $parameters) $this->shouldBeNumeric($attribute, 'Gt'); if (is_null($comparedToValue) && (is_numeric($value) && is_numeric($parameters[0]))) { - return $this->getSize($attribute, $value) > $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isGreaterThan($parameters[0]); } if (is_numeric($parameters[0])) { @@ -1088,7 +1090,7 @@ public function validateGt($attribute, $value, $parameters) } if ($this->hasRule($attribute, $this->numericRules) && is_numeric($value) && is_numeric($comparedToValue)) { - return $value > $comparedToValue; + return BigNumber::of($value)->isGreaterThan($comparedToValue); } if (! $this->isSameType($value, $comparedToValue)) { @@ -1115,7 +1117,7 @@ public function validateLt($attribute, $value, $parameters) $this->shouldBeNumeric($attribute, 'Lt'); if (is_null($comparedToValue) && (is_numeric($value) && is_numeric($parameters[0]))) { - return $this->getSize($attribute, $value) < $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isLessThan($parameters[0]); } if (is_numeric($parameters[0])) { @@ -1123,7 +1125,7 @@ public function validateLt($attribute, $value, $parameters) } if ($this->hasRule($attribute, $this->numericRules) && is_numeric($value) && is_numeric($comparedToValue)) { - return $value < $comparedToValue; + return BigNumber::of($value)->isLessThan($comparedToValue); } if (! $this->isSameType($value, $comparedToValue)) { @@ -1150,7 +1152,7 @@ public function validateGte($attribute, $value, $parameters) $this->shouldBeNumeric($attribute, 'Gte'); if (is_null($comparedToValue) && (is_numeric($value) && is_numeric($parameters[0]))) { - return $this->getSize($attribute, $value) >= $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isGreaterThanOrEqualTo($parameters[0]); } if (is_numeric($parameters[0])) { @@ -1158,7 +1160,7 @@ public function validateGte($attribute, $value, $parameters) } if ($this->hasRule($attribute, $this->numericRules) && is_numeric($value) && is_numeric($comparedToValue)) { - return $value >= $comparedToValue; + return BigNumber::of($value)->isGreaterThanOrEqualTo($comparedToValue); } if (! $this->isSameType($value, $comparedToValue)) { @@ -1185,7 +1187,7 @@ public function validateLte($attribute, $value, $parameters) $this->shouldBeNumeric($attribute, 'Lte'); if (is_null($comparedToValue) && (is_numeric($value) && is_numeric($parameters[0]))) { - return $this->getSize($attribute, $value) <= $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isLessThanOrEqualTo($parameters[0]); } if (is_numeric($parameters[0])) { @@ -1193,7 +1195,7 @@ public function validateLte($attribute, $value, $parameters) } if ($this->hasRule($attribute, $this->numericRules) && is_numeric($value) && is_numeric($comparedToValue)) { - return $value <= $comparedToValue; + return BigNumber::of($value)->isLessThanOrEqualTo($comparedToValue); } if (! $this->isSameType($value, $comparedToValue)) { @@ -1385,7 +1387,7 @@ public function validateMax($attribute, $value, $parameters) return false; } - return $this->getSize($attribute, $value) <= $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isLessThanOrEqualTo($parameters[0]); } /** @@ -1487,7 +1489,7 @@ public function validateMin($attribute, $value, $parameters) { $this->requireParameterCount(1, $parameters, 'min'); - return $this->getSize($attribute, $value) >= $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isGreaterThanOrEqualTo($parameters[0]); } /** @@ -2162,7 +2164,7 @@ public function validateSize($attribute, $value, $parameters) { $this->requireParameterCount(1, $parameters, 'size'); - return $this->getSize($attribute, $value) == $parameters[0]; + return BigNumber::of($this->getSize($attribute, $value))->isEqualTo($parameters[0]); } /** @@ -2321,7 +2323,7 @@ public function validateUuid($attribute, $value) * * @param string $attribute * @param mixed $value - * @return mixed + * @return int|float|string */ protected function getSize($attribute, $value) { diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 21b2da108d28..3b0bec1292c3 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -2767,6 +2767,93 @@ public function testValidateDecimal() $v = new Validator($trans, ['foo' => '1.23'], ['foo' => 'Decimal:0,1']); $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.8888888888'], ['foo' => 'Decimal:10']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Min:1.88888888888888888889']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Min:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Max:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Max:1.88888888888888888887']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Max:1.88888888888888888887']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Size:1.88888888888888888889']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Size:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889'], ['foo' => 'Decimal:20|Between:1.88888888888888888886,1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888887'], ['foo' => 'Decimal:20|Between:1.88888888888888888886,1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gt:1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889'], ['foo' => 'Decimal:20|Gt:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gt:bar']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gt:bar']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lt:1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888887'], ['foo' => 'Decimal:20|Lt:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lt:bar']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888887', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lt:bar']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888887'], ['foo' => 'Decimal:20|Gte:1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gte:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888887', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gte:bar']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Gte:bar']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889'], ['foo' => 'Decimal:20|Lte:1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lte:1.88888888888888888888']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lte:bar']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888', 'bar' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Lte:bar']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888889'], ['foo' => 'Decimal:20|Max:1.88888888888888888888']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.88888888888888888888'], ['foo' => 'Decimal:20|Max:1.88888888888888888888']); + $this->assertTrue($v->passes()); } public function testValidateInt()