diff --git a/src/Checker/MixedChecker.php b/src/Checker/MixedChecker.php index 94dba24..c6cc613 100644 --- a/src/Checker/MixedChecker.php +++ b/src/Checker/MixedChecker.php @@ -12,6 +12,8 @@ final class MixedChecker extends AbstractChecker implements SingletonInterface public const MESSAGES = [ 'cardNumber' => '[[Please enter valid card number.]]', 'match' => '[[Fields {1} and {2} do not match.]]', + 'accepted' => '[[Is not accepted.]]', + 'declined' => '[[Is not declined.]]', ]; /** @@ -56,4 +58,20 @@ public function match(mixed $value, string $field, bool $strict = false): bool return $value == $this->getValidator()->getValue($field, null); } + + /** + * This is useful for validating "Terms of Service" acceptance or similar fields. + */ + public function accepted(mixed $value): bool + { + return in_array($value, [true, 1, '1', 'yes', 'on'], true); + } + + /** + * Opposite version of `accepted`. + */ + public function declined(mixed $value): bool + { + return in_array($value, [false, 0, '0', 'no', 'off'], true); + } } diff --git a/tests/src/Unit/Checkers/MixedTest.php b/tests/src/Unit/Checkers/MixedTest.php index 358cd6d..b3853a7 100644 --- a/tests/src/Unit/Checkers/MixedTest.php +++ b/tests/src/Unit/Checkers/MixedTest.php @@ -5,14 +5,14 @@ namespace Spiral\Validator\Tests\Unit\Checkers; use PHPUnit\Framework\TestCase; -use Spiral\Validator\Checker\MixedChecker; use Spiral\Validation\ValidatorInterface; +use Spiral\Validator\Checker\MixedChecker; final class MixedTest extends TestCase { /** * @dataProvider cardsProvider - * @param bool $expected + * @param bool $expected * @param mixed $card */ public function testCardNumber(bool $expected, $card): void @@ -63,4 +63,70 @@ public function cardsProvider(): array [false, []], ]; } + + /** + * @dataProvider dataAccepted + */ + public function testAccepted(mixed $value, bool $expectedResult = true): void + { + $checker = new MixedChecker(); + self::assertSame($expectedResult, $checker->accepted($value)); + } + + public function dataAccepted(): iterable + { + yield [true]; + yield [1]; + yield ['1']; + yield ['yes']; + yield ['on']; + // declined values + yield [false, false]; + yield [0, false]; + yield ['0', false]; + yield ['no', false]; + yield ['off', false]; + // invalid values + yield [2, false]; + yield ['2', false]; + yield ['', false]; + yield [" \n \t ", false]; + yield [null, false]; + yield [1.0, false]; + yield [[], false]; + yield [new \stdClass(), false]; + } + + /** + * @dataProvider dataDeclined + */ + public function testDeclined(mixed $value, bool $expectedResult = true): void + { + $checker = new MixedChecker(); + self::assertSame($expectedResult, $checker->declined($value)); + } + + public function dataDeclined(): iterable + { + yield [false]; + yield [0]; + yield ['0']; + yield ['no']; + yield ['off']; + // accepted values + yield [true, false]; + yield [1, false]; + yield ['1', false]; + yield ['yes', false]; + yield ['on', false]; + // invalid values + yield [2, false]; + yield ['2', false]; + yield ['', false]; + yield [" \n \t ", false]; + yield [null, false]; + yield [1.0, false]; + yield [[], false]; + yield [new \stdClass(), false]; + } }