2323namespace PackageFactory \ComponentEngine \Test \Unit \TypeSystem \Resolver \Access ;
2424
2525use PackageFactory \ComponentEngine \Parser \Ast \AccessNode ;
26+ use PackageFactory \ComponentEngine \Parser \Ast \EnumDeclarationNode ;
2627use PackageFactory \ComponentEngine \Parser \Ast \ExpressionNode ;
2728use PackageFactory \ComponentEngine \Test \Unit \TypeSystem \Scope \Fixtures \DummyScope ;
2829use PackageFactory \ComponentEngine \TypeSystem \Resolver \Access \AccessTypeResolver ;
30+ use PackageFactory \ComponentEngine \TypeSystem \ScopeInterface ;
31+ use PackageFactory \ComponentEngine \TypeSystem \Type \EnumType \EnumMemberType ;
32+ use PackageFactory \ComponentEngine \TypeSystem \Type \EnumType \EnumStaticType ;
2933use PackageFactory \ComponentEngine \TypeSystem \Type \StringType \StringType ;
34+ use PackageFactory \ComponentEngine \TypeSystem \TypeInterface ;
3035use PHPUnit \Framework \TestCase ;
3136
3237final class AccessTypeResolverTest extends TestCase
@@ -35,8 +40,52 @@ public function invalidAccessExamples(): iterable
3540 {
3641 yield 'access property on primitive string ' => [
3742 'someString.bar ' ,
38- '@TODO: Cannot access on type PackageFactory\ComponentEngine\TypeSystem\Type\StringType\StringType '
43+ '@TODO Error : Cannot access on type PackageFactory\ComponentEngine\TypeSystem\Type\StringType\StringType '
3944 ];
45+
46+ yield 'access invalid property on enum ' => [
47+ 'SomeEnum.NonExistent ' ,
48+ '@TODO cannot access member NonExistent of enum SomeEnum '
49+ ];
50+ }
51+
52+ private function resolveAccessType (string $ accessAsString , ScopeInterface $ scope ): TypeInterface
53+ {
54+ $ accessTypeResolver = new AccessTypeResolver (
55+ scope: $ scope
56+ );
57+ $ accessNode = ExpressionNode::fromString ($ accessAsString )->root ;
58+ assert ($ accessNode instanceof AccessNode);
59+ return $ accessTypeResolver ->resolveTypeOf ($ accessNode );
60+ }
61+
62+ /**
63+ * @test
64+ */
65+ public function access (): void
66+ {
67+ $ someEnum = EnumStaticType::fromEnumDeclarationNode (
68+ EnumDeclarationNode::fromString (
69+ 'enum SomeEnum { A("Hi") } '
70+ )
71+ );
72+
73+ $ scope = new DummyScope ([
74+ 'SomeEnum ' => $ someEnum
75+ ]);
76+
77+ $ accessType = $ this ->resolveAccessType (
78+ 'SomeEnum.A ' ,
79+ $ scope
80+ );
81+
82+ $ this ->assertInstanceOf (EnumMemberType::class, $ accessType );
83+
84+ $ this ->assertTrue ($ accessType ->enumType ->is ($ someEnum ));
85+
86+ $ this ->assertEquals ("A " , $ accessType ->memberName );
87+
88+ $ this ->assertTrue ($ accessType ->memberValueType ->is (StringType::get ()));
4089 }
4190
4291 /**
@@ -46,9 +95,15 @@ public function invalidAccessExamples(): iterable
4695 public function invalidAccessResultsInError (string $ accessAsString , string $ expectedErrorMessage ): void
4796 {
4897 $ this ->expectExceptionMessage ($ expectedErrorMessage );
49-
98+
99+ $ someEnum = EnumStaticType::fromEnumDeclarationNode (
100+ EnumDeclarationNode::fromString (
101+ 'enum SomeEnum { A } '
102+ )
103+ );
50104 $ scope = new DummyScope ([
51- 'someString ' => StringType::get ()
105+ 'someString ' => StringType::get (),
106+ 'SomeEnum ' => $ someEnum
52107 ]);
53108 $ accessTypeResolver = new AccessTypeResolver (
54109 scope: $ scope
0 commit comments