Browse Source

Refactor to separate methods.

mscherer 2 years ago
parent
commit
1f0e3bb265
2 changed files with 64 additions and 13 deletions
  1. 60 9
      src/Validation/Validation.php
  2. 4 4
      tests/TestCase/Validation/ValidationTest.php

+ 60 - 9
src/Validation/Validation.php

@@ -791,18 +791,69 @@ class Validation
     /**
      * Checks that the value is a valid backed enum instance or value.
      *
-     * Valid Options
-     *
-     *  - only => enum case or array of enum cases that are valid
-     *  - except => enum case or array of enum cases that are not valid
-     *
      * @param mixed $check Value to check
      * @param class-string<\BackedEnum> $enumClassName The valid backed enum class name
-     * @param array<string, mixed> $options
      * @return bool Success
      * @since 5.0.3
      */
-    public static function enum(mixed $check, string $enumClassName, array $options = []): bool
+    public static function enum(mixed $check, string $enumClassName): bool
+    {
+        return static::checkEnum($check, $enumClassName);
+    }
+
+    /**
+     * Checks that the value is a valid backed enum instance or value.
+     *
+     * @param mixed $check Value to check
+     * @param list<\BackedEnum> $cases Array of enum cases that are valid.
+     * @return bool Success
+     * @since 5.1.0
+     */
+    public static function enumOnly(mixed $check, array $cases): bool
+    {
+        if ($cases === []) {
+            throw new InvalidArgumentException('At least one case needed for `enumOnly()` validation.');
+        }
+
+        $firstKey = array_key_first($cases);
+        $firstValue = $cases[$firstKey];
+        $enumClassName = get_class($firstValue);
+
+        $options = ['only' => $cases];
+
+        return static::checkEnum($check, $enumClassName, $options);
+    }
+
+    /**
+     * Checks that the value is a valid backed enum instance or value.
+     *
+     * @param mixed $check Value to check
+     * @param list<\BackedEnum> $cases Array of enum cases that are not valid.
+     * @return bool Success
+     * @since 5.1.0
+     */
+    public static function enumExcept(mixed $check, array $cases): bool
+    {
+        if ($cases === []) {
+            throw new InvalidArgumentException('At least one case needed for `enumOnly()` validation.');
+        }
+
+        $firstKey = array_key_first($cases);
+        $firstValue = $cases[$firstKey];
+        $enumClassName = get_class($firstValue);
+
+        $options = ['except' => $cases];
+
+        return static::checkEnum($check, $enumClassName, $options);
+    }
+
+    /**
+     * @param mixed $check
+     * @param class-string<\BackedEnum> $enumClassName
+     * @param array<string, mixed> $options
+     * @return bool
+     */
+    protected static function checkEnum(mixed $check, string $enumClassName, array $options = []): bool
     {
         if (
             $check instanceof $enumClassName &&
@@ -871,7 +922,7 @@ class Validation
 
             /** @var \BackedEnum $only */
             foreach ($options['only'] as $only) {
-                if ($only->value === $enum->value) {
+                if ($only === $enum) {
                     return true;
                 }
             }
@@ -886,7 +937,7 @@ class Validation
 
             /** @var \BackedEnum $except */
             foreach ($options['except'] as $except) {
-                if ($except->value === $enum->value) {
+                if ($except === $enum) {
                     return false;
                 }
             }

+ 4 - 4
tests/TestCase/Validation/ValidationTest.php

@@ -2029,14 +2029,14 @@ class ValidationTest extends TestCase
 
     public function testEnumOnly(): void
     {
-        $this->assertTrue(Validation::enum(ArticleStatus::Published, ArticleStatus::class, ['only' => ArticleStatus::Published]));
-        $this->assertFalse(Validation::enum(ArticleStatus::Published, ArticleStatus::class, ['only' => ArticleStatus::Unpublished]));
+        $this->assertTrue(Validation::enumOnly(ArticleStatus::Published, [ArticleStatus::Published]));
+        $this->assertFalse(Validation::enumOnly(ArticleStatus::Published, [ArticleStatus::Unpublished]));
     }
 
     public function testEnumExcept(): void
     {
-        $this->assertFalse(Validation::enum(ArticleStatus::Published, ArticleStatus::class, ['except' => ArticleStatus::Published]));
-        $this->assertTrue(Validation::enum(ArticleStatus::Published, ArticleStatus::class, ['except' => ArticleStatus::Unpublished]));
+        $this->assertFalse(Validation::enumExcept(ArticleStatus::Published, [ArticleStatus::Published]));
+        $this->assertTrue(Validation::enumExcept(ArticleStatus::Published, [ArticleStatus::Unpublished]));
     }
 
     public function testEnumNonBacked(): void