From ecfc74489b56e9495f9c2fb57b7b74027002e64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Re=CC=81mi=20Pelhate?= Date: Fri, 5 Sep 2025 12:14:50 +0200 Subject: [PATCH 1/2] Add more options to enum doubles --- src/PHPUnit/Doubles/Enums/IntBackedEnum.php | 1 + src/PHPUnit/Doubles/Enums/StringBackedEnum.php | 1 + src/PHPUnit/Doubles/Enums/UnitEnum.php | 1 + 3 files changed, 3 insertions(+) diff --git a/src/PHPUnit/Doubles/Enums/IntBackedEnum.php b/src/PHPUnit/Doubles/Enums/IntBackedEnum.php index dbecbed..b6573d7 100644 --- a/src/PHPUnit/Doubles/Enums/IntBackedEnum.php +++ b/src/PHPUnit/Doubles/Enums/IntBackedEnum.php @@ -9,4 +9,5 @@ enum IntBackedEnum: int case One = 1; case Two = 2; case Three = 3; + case Four = 4; } diff --git a/src/PHPUnit/Doubles/Enums/StringBackedEnum.php b/src/PHPUnit/Doubles/Enums/StringBackedEnum.php index dadf537..50e6c2d 100644 --- a/src/PHPUnit/Doubles/Enums/StringBackedEnum.php +++ b/src/PHPUnit/Doubles/Enums/StringBackedEnum.php @@ -9,4 +9,5 @@ enum StringBackedEnum: string case One = 'One'; case Two = 'Two'; case Three = 'Three'; + case Four = 'Four'; } diff --git a/src/PHPUnit/Doubles/Enums/UnitEnum.php b/src/PHPUnit/Doubles/Enums/UnitEnum.php index 639b922..6bd24fb 100644 --- a/src/PHPUnit/Doubles/Enums/UnitEnum.php +++ b/src/PHPUnit/Doubles/Enums/UnitEnum.php @@ -9,4 +9,5 @@ enum UnitEnum case One; case Two; case Three; + case Four; } From c1157d8d92bf932e6e972e445159a5ee355737c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Re=CC=81mi=20Pelhate?= Date: Fri, 5 Sep 2025 12:15:05 +0200 Subject: [PATCH 2/2] Add EnumCase::except() provider --- src/PHPUnit/DataProviders/EnumCase.php | 21 +++++++++++++++++++++ src/PHPUnit/DataProviders/EnumCaseTest.php | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/PHPUnit/DataProviders/EnumCase.php b/src/PHPUnit/DataProviders/EnumCase.php index 096836b..dc65fbf 100644 --- a/src/PHPUnit/DataProviders/EnumCase.php +++ b/src/PHPUnit/DataProviders/EnumCase.php @@ -6,11 +6,14 @@ use LogicException; use ReflectionEnum; +use ReflectionEnumUnitCase; use UnitEnum; use ValueError; use function array_filter; +use function array_map; use function array_rand; +use function array_reduce; use function count; use function in_array; @@ -78,4 +81,22 @@ public static function options(UnitEnum ...$options): iterable yield "$case->name" => [new self($case, ...$options)]; } } + + /** + * @param class-string $enumFQCN + * @return iterable>> + */ + public static function except(string $enumFQCN, UnitEnum ...$except): iterable + { + $options = array_map(function (ReflectionEnumUnitCase $reflection) use ($except): ?UnitEnum { + $case = $reflection->getValue(); + + return match (in_array($case, $except, true)) { + true => null, + false => $case, + }; + }, new ReflectionEnum($enumFQCN)->getCases()); + + yield from self::options(...array_filter($options)); + } } diff --git a/src/PHPUnit/DataProviders/EnumCaseTest.php b/src/PHPUnit/DataProviders/EnumCaseTest.php index 7f005ff..e2d22bb 100644 --- a/src/PHPUnit/DataProviders/EnumCaseTest.php +++ b/src/PHPUnit/DataProviders/EnumCaseTest.php @@ -164,4 +164,20 @@ public function itCanProvideFromGivenOptions(string $enumFQCN): void $this->assertContains($case[0]->instance, $expected); }); } + + #[Test] + #[DataProvider('enumFQCNs')] /** @param class-string $enumFQCN */ + public function itCanProvideFromEnumFQCNsExceptSomeCases(string $enumFQCN): void + { + $options = $enumFQCN::cases(); + [$keep, $except] = collect($options)->shuffle()->split(2); + + $cases = iterator_to_array(EnumCase::except($enumFQCN, ...$except)); + + $this->assertCount(count($keep), $cases); + collect($cases)->each(function (array $case) use ($keep): void { + $this->assertInstanceOf(EnumCase::class, $case[0]); + $this->assertContains($case[0]->instance, $keep); + }); + } }