99use Constructo \Support \Set ;
1010use Constructo \Support \Value ;
1111use Random \RandomException ;
12+ use ReflectionEnum ;
13+ use ReflectionEnumUnitCase ;
1214use ReflectionNamedType ;
1315use ReflectionParameter ;
1416
@@ -24,26 +26,28 @@ public function resolve(ReflectionParameter $parameter, Set $presets): ?Value
2426 return parent ::resolve ($ parameter , $ presets );
2527 }
2628 $ enum = $ type ->getName ();
27- return enum_exists ($ enum )
28- ? $ this ->resolveEnumValue ($ enum , $ parameter , $ presets )
29- : parent ::resolve ($ parameter , $ presets );
29+ if (! enum_exists ($ enum )) {
30+ return parent ::resolve ($ parameter , $ presets );
31+ }
32+ $ reflectionEnum = new ReflectionEnum ($ enum );
33+ return $ this ->resolveEnumValue ($ reflectionEnum , $ parameter , $ presets );
3034 }
3135
3236 /**
3337 * @throws RandomException
3438 */
35- private function resolveEnumValue (string $ enum , ReflectionParameter $ parameter , Set $ presets ): ?Value
39+ private function resolveEnumValue (ReflectionEnum $ reflectionEnum , ReflectionParameter $ parameter , Set $ presets ): ?Value
3640 {
37- if (! is_subclass_of ($ enum , BackedEnum::class)) {
41+ /** @var ReflectionEnumUnitCase[] $enumCases */
42+ $ enumCases = $ reflectionEnum ->getCases ();
43+ if (empty ($ enumCases )) {
3844 return parent ::resolve ($ parameter , $ presets );
3945 }
4046
41- $ enumValues = $ enum :: cases ();
42- if (empty ( $ enumValues ) ) {
43- return parent :: resolve ( $ parameter , $ presets );
47+ $ case = $ enumCases [ random_int ( 0 , count ( $ enumCases ) - 1 )]-> getValue ();
48+ if ($ case instanceof BackedEnum ) {
49+ return new Value ( $ case -> value );
4450 }
45-
46- $ randomValue = $ enumValues [random_int (0 , count ($ enumValues ) - 1 )]->value ;
47- return new Value ($ randomValue );
51+ return new Value ($ case );
4852 }
4953}
0 commit comments