From a1f007e9b99427fdc70f4bbb0a4091322f57365c Mon Sep 17 00:00:00 2001 From: Henrique Moody Date: Sun, 11 Jan 2026 08:55:25 +0100 Subject: [PATCH] Rename `AllOf` to `LogicAnd` The name `AllOf` was ambiguous and could be confused with iteration semantics. The new name `LogicAnd` clearly indicates this is a logical `AND` operation where all provided rules must pass for the same input value. This rename is part of a broader effort to improve the naming of composite rules in version 3.0, making them more intuitive and reducing potential confusion when implementing validation logic. --- docs/concrete-api.md | 2 +- docs/feature-guide.md | 2 +- docs/list-of-validators-by-category.md | 10 +++-- docs/validators/AnyOf.md | 2 +- docs/validators/Circuit.md | 2 +- docs/validators/{AllOf.md => LogicAnd.md} | 21 ++++++----- docs/validators/NoneOf.md | 2 +- docs/validators/OneOf.md | 2 +- docs/validators/When.md | 2 +- library/Mixins/AllBuilder.php | 8 +++- library/Mixins/AllChain.php | 4 +- library/Mixins/Builder.php | 4 +- library/Mixins/Chain.php | 4 +- library/Mixins/KeyBuilder.php | 14 +++---- library/Mixins/KeyChain.php | 14 +++---- library/Mixins/NotBuilder.php | 8 +++- library/Mixins/NotChain.php | 4 +- library/Mixins/NullOrBuilder.php | 12 +++--- library/Mixins/NullOrChain.php | 4 +- library/Mixins/PropertyBuilder.php | 14 +++---- library/Mixins/PropertyChain.php | 14 +++---- library/Mixins/UndefOrBuilder.php | 12 +++--- library/Mixins/UndefOrChain.php | 4 +- library/Transformers/Prefix.php | 2 +- library/ValidatorBuilder.php | 4 +- library/Validators/Between.php | 2 +- library/Validators/BetweenExclusive.php | 2 +- library/Validators/Core/Reducer.php | 4 +- .../Validators/{AllOf.php => LogicAnd.php} | 2 +- src-dev/Commands/UpdateDocLinksCommand.php | 2 +- .../{AllOfTest.php => LogicAndTest.php} | 16 ++++---- tests/unit/Validators/AllOfTest.php | 37 ------------------- tests/unit/Validators/Core/ReducerTest.php | 4 +- tests/unit/Validators/LogicAndTest.php | 37 +++++++++++++++++++ 34 files changed, 145 insertions(+), 132 deletions(-) rename docs/validators/{AllOf.md => LogicAnd.md} (62%) rename library/Validators/{AllOf.php => LogicAnd.php} (97%) rename tests/feature/Validators/{AllOfTest.php => LogicAndTest.php} (87%) delete mode 100644 tests/unit/Validators/AllOfTest.php create mode 100644 tests/unit/Validators/LogicAndTest.php diff --git a/docs/concrete-api.md b/docs/concrete-api.md index 051e089ea..6ff392b7a 100644 --- a/docs/concrete-api.md +++ b/docs/concrete-api.md @@ -39,7 +39,7 @@ use Respect\Validation\Validators; $usernameValidator = ValidatorBuilder::init( new Validators\Key( 'name', - new Validators\AllOf( + new Validators\LogicAnd( new Validators\Alnum(), new Validators\Not( new Validators\Spaced(), diff --git a/docs/feature-guide.md b/docs/feature-guide.md index 3c762ac24..53bbe1e98 100644 --- a/docs/feature-guide.md +++ b/docs/feature-guide.md @@ -41,7 +41,7 @@ Respect\Validation offers over 150 validators, many of which are designed to add - Validating **Array structures**: [KeySet](validators/KeySet.md). - Validating **Object properties**: [Property](validators/Property.md), [PropertyOptional](validators/PropertyOptional.md), [PropertyExists](validators/PropertyExists.md). - Using **Conditional validation**: [NullOr](validators/NullOr.md), [UndefOr](validators/UndefOr.md), [When](validators/When.md). -- Using **Grouped validation**: [AllOf](validators/AllOf.md), [AnyOf](validators/AnyOf.md), [NoneOf](validators/NoneOf.md), [OneOf](validators/OneOf.md) +- Using **Logical validation**: [LogicAnd](validators/LogicAnd.md), [AnyOf](validators/AnyOf.md), [NoneOf](validators/NoneOf.md), [OneOf](validators/OneOf.md) - Validating **Each** value in the input: [Each](validators/Each.md). - Validating the **Length** of the input: [Length](validators/Length.md). - Validating the **Maximum** value in the input: [Max](validators/Max.md). diff --git a/docs/list-of-validators-by-category.md b/docs/list-of-validators-by-category.md index a4bfbe685..564978c7f 100644 --- a/docs/list-of-validators-by-category.md +++ b/docs/list-of-validators-by-category.md @@ -58,9 +58,9 @@ ## Composite -- [AllOf](validators/AllOf.md) - [AnyOf](validators/AnyOf.md) - [Circuit](validators/Circuit.md) +- [LogicAnd](validators/LogicAnd.md) - [NoneOf](validators/NoneOf.md) - [OneOf](validators/OneOf.md) @@ -144,6 +144,10 @@ - [PostalCode](validators/PostalCode.md) - [SubdivisionCode](validators/SubdivisionCode.md) +## Logical + +- [LogicAnd](validators/LogicAnd.md) + ## Math - [Factor](validators/Factor.md) @@ -167,7 +171,6 @@ ## Nesting -- [AllOf](validators/AllOf.md) - [AnyOf](validators/AnyOf.md) - [Call](validators/Call.md) - [Circuit](validators/Circuit.md) @@ -175,6 +178,7 @@ - [Key](validators/Key.md) - [KeySet](validators/KeySet.md) - [Lazy](validators/Lazy.md) +- [LogicAnd](validators/LogicAnd.md) - [NoneOf](validators/NoneOf.md) - [Not](validators/Not.md) - [NullOr](validators/NullOr.md) @@ -303,7 +307,6 @@ ## Alphabetically - [All](validators/All.md) -- [AllOf](validators/AllOf.md) - [Alnum](validators/Alnum.md) - [Alpha](validators/Alpha.md) - [AlwaysInvalid](validators/AlwaysInvalid.md) @@ -392,6 +395,7 @@ - [Length](validators/Length.md) - [LessThan](validators/LessThan.md) - [LessThanOrEqual](validators/LessThanOrEqual.md) +- [LogicAnd](validators/LogicAnd.md) - [Lowercase](validators/Lowercase.md) - [Luhn](validators/Luhn.md) - [MacAddress](validators/MacAddress.md) diff --git a/docs/validators/AnyOf.md b/docs/validators/AnyOf.md index 82e0e7a09..637789d26 100644 --- a/docs/validators/AnyOf.md +++ b/docs/validators/AnyOf.md @@ -44,9 +44,9 @@ so `AnyOf()` returns true. See also: -- [AllOf](AllOf.md) - [Circuit](Circuit.md) - [ContainsAny](ContainsAny.md) +- [LogicAnd](LogicAnd.md) - [NoneOf](NoneOf.md) - [OneOf](OneOf.md) - [When](When.md) diff --git a/docs/validators/Circuit.md b/docs/validators/Circuit.md index b67a47961..5b85bc503 100644 --- a/docs/validators/Circuit.md +++ b/docs/validators/Circuit.md @@ -40,9 +40,9 @@ This validator does not have any templates, because it will always return the re See also: -- [AllOf](AllOf.md) - [AnyOf](AnyOf.md) - [Lazy](Lazy.md) +- [LogicAnd](LogicAnd.md) - [NoneOf](NoneOf.md) - [OneOf](OneOf.md) - [SubdivisionCode](SubdivisionCode.md) diff --git a/docs/validators/AllOf.md b/docs/validators/LogicAnd.md similarity index 62% rename from docs/validators/AllOf.md rename to docs/validators/LogicAnd.md index adb90f7f7..66b535ae6 100644 --- a/docs/validators/AllOf.md +++ b/docs/validators/LogicAnd.md @@ -1,16 +1,16 @@ -# AllOf +# LogicAnd -- `AllOf(Validator $validator1, Validator $validator2, Validator ...$validator)` +- `LogicAnd(Validator $validator1, Validator $validator2, Validator ...$validator)` -Will validate if all inner validators validates. +Validates that all inner validators pass, acting as a logical `and` operator. ```php -v::allOf(v::intVal(), v::positive())->isValid(15); // true +v::logicAnd(v::intVal(), v::positive())->isValid(15); // true ``` ## Templates -### `AllOf::TEMPLATE_SOME` +### `LogicAnd::TEMPLATE_SOME` Used when some validators must be failed. @@ -19,7 +19,7 @@ Used when some validators must be failed. | `default` | {{subject}} must pass the rules | | `inverted` | {{subject}} must pass the rules | -### `AllOf::TEMPLATE_ALL` +### `LogicAnd::TEMPLATE_ALL` Used when all validators have failed. @@ -37,14 +37,15 @@ Used when all validators have failed. ## Categorization - Composite +- Logical - Nesting ## Changelog -| Version | Description | -| ------: | -------------------------------------------- | -| 3.0.0 | Require at least two validators to be passed | -| 0.3.9 | Created | +| Version | Description | +| ------: | --------------------------------------------------------- | +| 3.0.0 | Require at least two validators and renamed to `LogicAnd` | +| 0.3.9 | Created as `AllOf` | --- diff --git a/docs/validators/NoneOf.md b/docs/validators/NoneOf.md index d525e2d04..e7c569e84 100644 --- a/docs/validators/NoneOf.md +++ b/docs/validators/NoneOf.md @@ -55,9 +55,9 @@ Used when all validators have passed. See also: -- [AllOf](AllOf.md) - [AnyOf](AnyOf.md) - [Circuit](Circuit.md) +- [LogicAnd](LogicAnd.md) - [Not](Not.md) - [OneOf](OneOf.md) - [When](When.md) diff --git a/docs/validators/OneOf.md b/docs/validators/OneOf.md index 54cca0a50..ae25a9d9f 100644 --- a/docs/validators/OneOf.md +++ b/docs/validators/OneOf.md @@ -56,8 +56,8 @@ Used when more than one validator has passed. See also: -- [AllOf](AllOf.md) - [AnyOf](AnyOf.md) - [Circuit](Circuit.md) +- [LogicAnd](LogicAnd.md) - [NoneOf](NoneOf.md) - [When](When.md) diff --git a/docs/validators/When.md b/docs/validators/When.md index 69f3f576e..556eacd2b 100644 --- a/docs/validators/When.md +++ b/docs/validators/When.md @@ -44,9 +44,9 @@ When `$else` is not defined use [AlwaysInvalid](AlwaysInvalid.md) See also: -- [AllOf](AllOf.md) - [AlwaysInvalid](AlwaysInvalid.md) - [AnyOf](AnyOf.md) - [Circuit](Circuit.md) +- [LogicAnd](LogicAnd.md) - [NoneOf](NoneOf.md) - [OneOf](OneOf.md) diff --git a/library/Mixins/AllBuilder.php b/library/Mixins/AllBuilder.php index 6a1c5e0b0..d28140d8f 100644 --- a/library/Mixins/AllBuilder.php +++ b/library/Mixins/AllBuilder.php @@ -14,8 +14,6 @@ interface AllBuilder { - public static function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public static function allAlnum(string ...$additionalChars): Chain; public static function allAlpha(string ...$additionalChars): Chain; @@ -195,6 +193,12 @@ public static function allLessThan(mixed $compareTo): Chain; public static function allLessThanOrEqual(mixed $compareTo): Chain; + public static function allLogicAnd( + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function allLowercase(): Chain; public static function allLuhn(): Chain; diff --git a/library/Mixins/AllChain.php b/library/Mixins/AllChain.php index f3d1a6ad2..8bcc34dbd 100644 --- a/library/Mixins/AllChain.php +++ b/library/Mixins/AllChain.php @@ -14,8 +14,6 @@ interface AllChain { - public function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public function allAlnum(string ...$additionalChars): Chain; public function allAlpha(string ...$additionalChars): Chain; @@ -195,6 +193,8 @@ public function allLessThan(mixed $compareTo): Chain; public function allLessThanOrEqual(mixed $compareTo): Chain; + public function allLogicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public function allLowercase(): Chain; public function allLuhn(): Chain; diff --git a/library/Mixins/Builder.php b/library/Mixins/Builder.php index 895096289..877c87eda 100644 --- a/library/Mixins/Builder.php +++ b/library/Mixins/Builder.php @@ -26,8 +26,6 @@ interface Builder extends { public static function all(Validator $validator): Chain; - public static function allOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public static function alnum(string ...$additionalChars): Chain; public static function alpha(string ...$additionalChars): Chain; @@ -219,6 +217,8 @@ public static function lessThan(mixed $compareTo): Chain; public static function lessThanOrEqual(mixed $compareTo): Chain; + public static function logicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public static function lowercase(): Chain; public static function luhn(): Chain; diff --git a/library/Mixins/Chain.php b/library/Mixins/Chain.php index aa05d64e0..001261da1 100644 --- a/library/Mixins/Chain.php +++ b/library/Mixins/Chain.php @@ -29,8 +29,6 @@ interface Chain extends { public function all(Validator $validator): Chain; - public function allOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public function alnum(string ...$additionalChars): Chain; public function alpha(string ...$additionalChars): Chain; @@ -222,6 +220,8 @@ public function lessThan(mixed $compareTo): Chain; public function lessThanOrEqual(mixed $compareTo): Chain; + public function logicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public function lowercase(): Chain; public function luhn(): Chain; diff --git a/library/Mixins/KeyBuilder.php b/library/Mixins/KeyBuilder.php index 1c0148631..048b36855 100644 --- a/library/Mixins/KeyBuilder.php +++ b/library/Mixins/KeyBuilder.php @@ -16,13 +16,6 @@ interface KeyBuilder { public static function keyAll(int|string $key, Validator $validator): Chain; - public static function keyAllOf( - int|string $key, - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public static function keyAlnum(int|string $key, string ...$additionalChars): Chain; public static function keyAlpha(int|string $key, string ...$additionalChars): Chain; @@ -214,6 +207,13 @@ public static function keyLessThan(int|string $key, mixed $compareTo): Chain; public static function keyLessThanOrEqual(int|string $key, mixed $compareTo): Chain; + public static function keyLogicAnd( + int|string $key, + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function keyLowercase(int|string $key): Chain; public static function keyLuhn(int|string $key): Chain; diff --git a/library/Mixins/KeyChain.php b/library/Mixins/KeyChain.php index 1fb2a3b1f..f38ed533d 100644 --- a/library/Mixins/KeyChain.php +++ b/library/Mixins/KeyChain.php @@ -16,13 +16,6 @@ interface KeyChain { public function keyAll(int|string $key, Validator $validator): Chain; - public function keyAllOf( - int|string $key, - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public function keyAlnum(int|string $key, string ...$additionalChars): Chain; public function keyAlpha(int|string $key, string ...$additionalChars): Chain; @@ -214,6 +207,13 @@ public function keyLessThan(int|string $key, mixed $compareTo): Chain; public function keyLessThanOrEqual(int|string $key, mixed $compareTo): Chain; + public function keyLogicAnd( + int|string $key, + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public function keyLowercase(int|string $key): Chain; public function keyLuhn(int|string $key): Chain; diff --git a/library/Mixins/NotBuilder.php b/library/Mixins/NotBuilder.php index 4b74cdd85..7f9ada239 100644 --- a/library/Mixins/NotBuilder.php +++ b/library/Mixins/NotBuilder.php @@ -16,8 +16,6 @@ interface NotBuilder { public static function notAll(Validator $validator): Chain; - public static function notAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public static function notAlnum(string ...$additionalChars): Chain; public static function notAlpha(string ...$additionalChars): Chain; @@ -207,6 +205,12 @@ public static function notLessThan(mixed $compareTo): Chain; public static function notLessThanOrEqual(mixed $compareTo): Chain; + public static function notLogicAnd( + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function notLowercase(): Chain; public static function notLuhn(): Chain; diff --git a/library/Mixins/NotChain.php b/library/Mixins/NotChain.php index b7451696b..221e6a287 100644 --- a/library/Mixins/NotChain.php +++ b/library/Mixins/NotChain.php @@ -16,8 +16,6 @@ interface NotChain { public function notAll(Validator $validator): Chain; - public function notAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public function notAlnum(string ...$additionalChars): Chain; public function notAlpha(string ...$additionalChars): Chain; @@ -207,6 +205,8 @@ public function notLessThan(mixed $compareTo): Chain; public function notLessThanOrEqual(mixed $compareTo): Chain; + public function notLogicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public function notLowercase(): Chain; public function notLuhn(): Chain; diff --git a/library/Mixins/NullOrBuilder.php b/library/Mixins/NullOrBuilder.php index 5b5b6b2d3..125035a6b 100644 --- a/library/Mixins/NullOrBuilder.php +++ b/library/Mixins/NullOrBuilder.php @@ -16,12 +16,6 @@ interface NullOrBuilder { public static function nullOrAll(Validator $validator): Chain; - public static function nullOrAllOf( - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public static function nullOrAlnum(string ...$additionalChars): Chain; public static function nullOrAlpha(string ...$additionalChars): Chain; @@ -219,6 +213,12 @@ public static function nullOrLessThan(mixed $compareTo): Chain; public static function nullOrLessThanOrEqual(mixed $compareTo): Chain; + public static function nullOrLogicAnd( + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function nullOrLowercase(): Chain; public static function nullOrLuhn(): Chain; diff --git a/library/Mixins/NullOrChain.php b/library/Mixins/NullOrChain.php index ac07de4ba..c99a96e83 100644 --- a/library/Mixins/NullOrChain.php +++ b/library/Mixins/NullOrChain.php @@ -16,8 +16,6 @@ interface NullOrChain { public function nullOrAll(Validator $validator): Chain; - public function nullOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public function nullOrAlnum(string ...$additionalChars): Chain; public function nullOrAlpha(string ...$additionalChars): Chain; @@ -207,6 +205,8 @@ public function nullOrLessThan(mixed $compareTo): Chain; public function nullOrLessThanOrEqual(mixed $compareTo): Chain; + public function nullOrLogicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public function nullOrLowercase(): Chain; public function nullOrLuhn(): Chain; diff --git a/library/Mixins/PropertyBuilder.php b/library/Mixins/PropertyBuilder.php index 3776fadf8..12c1337cc 100644 --- a/library/Mixins/PropertyBuilder.php +++ b/library/Mixins/PropertyBuilder.php @@ -16,13 +16,6 @@ interface PropertyBuilder { public static function propertyAll(string $propertyName, Validator $validator): Chain; - public static function propertyAllOf( - string $propertyName, - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public static function propertyAlnum(string $propertyName, string ...$additionalChars): Chain; public static function propertyAlpha(string $propertyName, string ...$additionalChars): Chain; @@ -218,6 +211,13 @@ public static function propertyLessThan(string $propertyName, mixed $compareTo): public static function propertyLessThanOrEqual(string $propertyName, mixed $compareTo): Chain; + public static function propertyLogicAnd( + string $propertyName, + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function propertyLowercase(string $propertyName): Chain; public static function propertyLuhn(string $propertyName): Chain; diff --git a/library/Mixins/PropertyChain.php b/library/Mixins/PropertyChain.php index 01d28304e..5794ce0d3 100644 --- a/library/Mixins/PropertyChain.php +++ b/library/Mixins/PropertyChain.php @@ -16,13 +16,6 @@ interface PropertyChain { public function propertyAll(string $propertyName, Validator $validator): Chain; - public function propertyAllOf( - string $propertyName, - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public function propertyAlnum(string $propertyName, string ...$additionalChars): Chain; public function propertyAlpha(string $propertyName, string ...$additionalChars): Chain; @@ -214,6 +207,13 @@ public function propertyLessThan(string $propertyName, mixed $compareTo): Chain; public function propertyLessThanOrEqual(string $propertyName, mixed $compareTo): Chain; + public function propertyLogicAnd( + string $propertyName, + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public function propertyLowercase(string $propertyName): Chain; public function propertyLuhn(string $propertyName): Chain; diff --git a/library/Mixins/UndefOrBuilder.php b/library/Mixins/UndefOrBuilder.php index 5c2db3c33..26cce74dc 100644 --- a/library/Mixins/UndefOrBuilder.php +++ b/library/Mixins/UndefOrBuilder.php @@ -16,12 +16,6 @@ interface UndefOrBuilder { public static function undefOrAll(Validator $validator): Chain; - public static function undefOrAllOf( - Validator $validator1, - Validator $validator2, - Validator ...$validators, - ): Chain; - public static function undefOrAlnum(string ...$additionalChars): Chain; public static function undefOrAlpha(string ...$additionalChars): Chain; @@ -217,6 +211,12 @@ public static function undefOrLessThan(mixed $compareTo): Chain; public static function undefOrLessThanOrEqual(mixed $compareTo): Chain; + public static function undefOrLogicAnd( + Validator $validator1, + Validator $validator2, + Validator ...$validators, + ): Chain; + public static function undefOrLowercase(): Chain; public static function undefOrLuhn(): Chain; diff --git a/library/Mixins/UndefOrChain.php b/library/Mixins/UndefOrChain.php index 01bafeeca..77131336d 100644 --- a/library/Mixins/UndefOrChain.php +++ b/library/Mixins/UndefOrChain.php @@ -16,8 +16,6 @@ interface UndefOrChain { public function undefOrAll(Validator $validator): Chain; - public function undefOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; - public function undefOrAlnum(string ...$additionalChars): Chain; public function undefOrAlpha(string ...$additionalChars): Chain; @@ -205,6 +203,8 @@ public function undefOrLessThan(mixed $compareTo): Chain; public function undefOrLessThanOrEqual(mixed $compareTo): Chain; + public function undefOrLogicAnd(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + public function undefOrLowercase(): Chain; public function undefOrLuhn(): Chain; diff --git a/library/Transformers/Prefix.php b/library/Transformers/Prefix.php index a6ecccca3..08667ba90 100644 --- a/library/Transformers/Prefix.php +++ b/library/Transformers/Prefix.php @@ -19,7 +19,7 @@ final class Prefix implements Transformer { private const array RULES_TO_SKIP = [ 'all', - 'allOf', + 'logicAnd', 'key', 'keyExists', 'keyOptional', diff --git a/library/ValidatorBuilder.php b/library/ValidatorBuilder.php index 646e94869..4238a667b 100644 --- a/library/ValidatorBuilder.php +++ b/library/ValidatorBuilder.php @@ -15,8 +15,8 @@ use Respect\Validation\Message\Renderer; use Respect\Validation\Message\StringFormatter; use Respect\Validation\Mixins\Builder; -use Respect\Validation\Validators\AllOf; use Respect\Validation\Validators\Core\Nameable; +use Respect\Validation\Validators\LogicAnd; use Throwable; use function count; @@ -59,7 +59,7 @@ public function evaluate(mixed $input): Result $validator = match (count($this->validators)) { 0 => throw new ComponentException('No validators have been added.'), 1 => current($this->validators), - default => new AllOf(...$this->validators), + default => new LogicAnd(...$this->validators), }; return $validator->evaluate($input); diff --git a/library/Validators/Between.php b/library/Validators/Between.php index 6fc307135..9d1559f05 100644 --- a/library/Validators/Between.php +++ b/library/Validators/Between.php @@ -31,7 +31,7 @@ public function __construct(mixed $minValue, mixed $maxValue) } parent::__construct( - new AllOf( + new LogicAnd( new GreaterThanOrEqual($minValue), new LessThanOrEqual($maxValue), ), diff --git a/library/Validators/BetweenExclusive.php b/library/Validators/BetweenExclusive.php index a064aed5a..febbca435 100644 --- a/library/Validators/BetweenExclusive.php +++ b/library/Validators/BetweenExclusive.php @@ -31,7 +31,7 @@ public function __construct(mixed $minimum, mixed $maximum) } parent::__construct( - new AllOf(new GreaterThan($minimum), new LessThan($maximum)), + new LogicAnd(new GreaterThan($minimum), new LessThan($maximum)), ['minValue' => $minimum, 'maxValue' => $maximum], ); } diff --git a/library/Validators/Core/Reducer.php b/library/Validators/Core/Reducer.php index c646ef719..88951a616 100644 --- a/library/Validators/Core/Reducer.php +++ b/library/Validators/Core/Reducer.php @@ -10,12 +10,12 @@ namespace Respect\Validation\Validators\Core; use Respect\Validation\Validator; -use Respect\Validation\Validators\AllOf; +use Respect\Validation\Validators\LogicAnd; final class Reducer extends Wrapper { public function __construct(Validator $validator1, Validator ...$validators) { - parent::__construct($validators === [] ? $validator1 : new AllOf($validator1, ...$validators)); + parent::__construct($validators === [] ? $validator1 : new LogicAnd($validator1, ...$validators)); } } diff --git a/library/Validators/AllOf.php b/library/Validators/LogicAnd.php similarity index 97% rename from library/Validators/AllOf.php rename to library/Validators/LogicAnd.php index eb1d7ccfa..0efca058e 100644 --- a/library/Validators/AllOf.php +++ b/library/Validators/LogicAnd.php @@ -31,7 +31,7 @@ '{{subject}} must pass all the rules', self::TEMPLATE_ALL, )] -final class AllOf extends Composite +final class LogicAnd extends Composite { public const string TEMPLATE_ALL = '__all__'; public const string TEMPLATE_SOME = '__some__'; diff --git a/src-dev/Commands/UpdateDocLinksCommand.php b/src-dev/Commands/UpdateDocLinksCommand.php index e56e34f70..1ac24bfa6 100644 --- a/src-dev/Commands/UpdateDocLinksCommand.php +++ b/src-dev/Commands/UpdateDocLinksCommand.php @@ -187,7 +187,7 @@ private function linkRelatedRules(string $docsDirectory, array $validators, Symf preg_match_all('/\[([^\]]+)\]\(([^\)]+)\.md\)/', $content, $matches); foreach ($matches[2] as $relatedRule) { $relatedRule = basename($relatedRule); - if ($relatedRule === '08-comparable-values' || $relatedRule === 'comparing-empty-values') { + if ($relatedRule === 'comparable-values' || $relatedRule === 'comparing-empty-values') { continue; } diff --git a/tests/feature/Validators/AllOfTest.php b/tests/feature/Validators/LogicAndTest.php similarity index 87% rename from tests/feature/Validators/AllOfTest.php rename to tests/feature/Validators/LogicAndTest.php index 0eb0e31fc..7e717bb66 100644 --- a/tests/feature/Validators/AllOfTest.php +++ b/tests/feature/Validators/LogicAndTest.php @@ -8,7 +8,7 @@ declare(strict_types=1); test('Default: fail, fail', catchAll( - fn() => v::allOf(v::intType(), v::negative())->assert('string'), + fn() => v::logicAnd(v::intType(), v::negative())->assert('string'), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('"string" must be an integer') ->and($fullMessage)->toBe(<<<'FULL_MESSAGE' @@ -24,7 +24,7 @@ )); test('Default: fail, pass', catchAll( - fn() => v::allOf(v::intType(), v::stringType())->assert('string'), + fn() => v::logicAnd(v::intType(), v::stringType())->assert('string'), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('"string" must be an integer') ->and($fullMessage)->toBe('- "string" must be an integer') @@ -32,7 +32,7 @@ )); test('Default: fail, fail, pass', catchAll( - fn() => v::allOf(v::intType(), v::positive(), v::stringType())->assert('string'), + fn() => v::logicAnd(v::intType(), v::positive(), v::stringType())->assert('string'), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('"string" must be an integer') ->and($fullMessage)->toBe(<<<'FULL_MESSAGE' @@ -48,7 +48,7 @@ )); test('Inverted: pass, pass', catchAll( - fn() => v::not(v::allOf(v::intType(), v::negative()))->assert(-1), + fn() => v::not(v::logicAnd(v::intType(), v::negative()))->assert(-1), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('-1 must not be an integer') ->and($fullMessage)->toBe(<<<'FULL_MESSAGE' @@ -64,7 +64,7 @@ )); test('Inverted: pass, fail, fail', catchAll( - fn() => v::allOf(v::intType(), v::alpha(), v::stringType())->assert(2), + fn() => v::logicAnd(v::intType(), v::alpha(), v::stringType())->assert(2), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('2 must contain only letters (a-z)') ->and($fullMessage)->toBe(<<<'FULL_MESSAGE' @@ -80,7 +80,7 @@ )); test('Wrapping "not"', catchAll( - fn() => v::allOf(v::not(v::intType()), v::greaterThan(2))->assert(4), + fn() => v::logicAnd(v::not(v::intType()), v::greaterThan(2))->assert(4), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('4 must not be an integer') ->and($fullMessage)->toBe('- 4 must not be an integer') @@ -88,7 +88,7 @@ )); test('With a single template', catchAll( - fn() => v::allOf(v::stringType(), v::arrayType())->assert(5, 'This is a single template'), + fn() => v::logicAnd(v::stringType(), v::arrayType())->assert(5, 'This is a single template'), fn(string $message, string $fullMessage, array $messages) => expect() ->and($message)->toBe('This is a single template') ->and($fullMessage)->toBe(<<<'FULL_MESSAGE' @@ -104,7 +104,7 @@ )); test('With multiple templates', catchAll( - fn() => v::allOf(v::stringType(), v::uppercase())->assert(5, [ + fn() => v::logicAnd(v::stringType(), v::uppercase())->assert(5, [ '__root__' => 'Two things are wrong', 'stringType' => 'Template for "stringType"', 'uppercase' => 'Template for "uppercase"', diff --git a/tests/unit/Validators/AllOfTest.php b/tests/unit/Validators/AllOfTest.php deleted file mode 100644 index 13b94df40..000000000 --- a/tests/unit/Validators/AllOfTest.php +++ /dev/null @@ -1,37 +0,0 @@ - - * SPDX-License-Identifier: MIT - */ - -declare(strict_types=1); - -namespace Respect\Validation\Validators; - -use PHPUnit\Framework\Attributes\CoversClass; -use PHPUnit\Framework\Attributes\Group; -use Respect\Validation\Test\RuleTestCase; -use Respect\Validation\Test\Validators\Stub; - -#[Group('validator')] -#[CoversClass(AllOf::class)] -final class AllOfTest extends RuleTestCase -{ - /** @return iterable */ - public static function providerForValidInput(): iterable - { - yield 'pass, pass' => [new AllOf(Stub::pass(1), Stub::pass(1)), []]; - yield 'pass, pass, pass' => [new AllOf(Stub::pass(1), Stub::pass(1), Stub::pass(1)), []]; - } - - /** @return iterable */ - public static function providerForInvalidInput(): iterable - { - yield 'pass, fail' => [new AllOf(Stub::pass(1), Stub::fail(1)), []]; - yield 'fail, pass' => [new AllOf(Stub::fail(1), Stub::pass(1)), []]; - yield 'pass, pass, fail' => [new AllOf(Stub::pass(1), Stub::pass(1), Stub::fail(1)), []]; - yield 'pass, fail, pass' => [new AllOf(Stub::pass(1), Stub::fail(1), Stub::pass(1)), []]; - yield 'fail, pass, pass' => [new AllOf(Stub::fail(1), Stub::pass(1), Stub::pass(1)), []]; - } -} diff --git a/tests/unit/Validators/Core/ReducerTest.php b/tests/unit/Validators/Core/ReducerTest.php index 3c4226ef7..e5a083c84 100644 --- a/tests/unit/Validators/Core/ReducerTest.php +++ b/tests/unit/Validators/Core/ReducerTest.php @@ -13,7 +13,7 @@ use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; use Respect\Validation\Test\Validators\Stub; -use Respect\Validation\Validators\AllOf; +use Respect\Validation\Validators\LogicAnd; #[CoversClass(Reducer::class)] final class ReducerTest extends TestCase @@ -39,6 +39,6 @@ public function shouldWrapWhenThereAreMultipleValidators(): void $reducer = new Reducer($validator1, $validator2, $validator3); $result = $reducer->evaluate(null); - self::assertEquals(new AllOf($validator1, $validator2, $validator3), $result->validator); + self::assertEquals(new LogicAnd($validator1, $validator2, $validator3), $result->validator); } } diff --git a/tests/unit/Validators/LogicAndTest.php b/tests/unit/Validators/LogicAndTest.php new file mode 100644 index 000000000..53c5c36cc --- /dev/null +++ b/tests/unit/Validators/LogicAndTest.php @@ -0,0 +1,37 @@ + + * SPDX-License-Identifier: MIT + */ + +declare(strict_types=1); + +namespace Respect\Validation\Validators; + +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\Group; +use Respect\Validation\Test\RuleTestCase; +use Respect\Validation\Test\Validators\Stub; + +#[Group('validator')] +#[CoversClass(LogicAnd::class)] +final class LogicAndTest extends RuleTestCase +{ + /** @return iterable */ + public static function providerForValidInput(): iterable + { + yield 'pass, pass' => [new LogicAnd(Stub::pass(1), Stub::pass(1)), []]; + yield 'pass, pass, pass' => [new LogicAnd(Stub::pass(1), Stub::pass(1), Stub::pass(1)), []]; + } + + /** @return iterable */ + public static function providerForInvalidInput(): iterable + { + yield 'pass, fail' => [new LogicAnd(Stub::pass(1), Stub::fail(1)), []]; + yield 'fail, pass' => [new LogicAnd(Stub::fail(1), Stub::pass(1)), []]; + yield 'pass, pass, fail' => [new LogicAnd(Stub::pass(1), Stub::pass(1), Stub::fail(1)), []]; + yield 'pass, fail, pass' => [new LogicAnd(Stub::pass(1), Stub::fail(1), Stub::pass(1)), []]; + yield 'fail, pass, pass' => [new LogicAnd(Stub::fail(1), Stub::pass(1), Stub::pass(1)), []]; + } +}