|
4 | 4 |
|
5 | 5 | namespace TypeLang\Mapper\Tests\Mapping\Reference; |
6 | 6 |
|
| 7 | +use PHPUnit\Framework\Attributes\TestDox; |
7 | 8 | use TypeLang\Mapper\Mapping\Reference\Reader\ReferencesReaderInterface; |
8 | 9 | use TypeLang\Mapper\Mapping\Reference\ReferencesResolver; |
9 | 10 | use TypeLang\Mapper\Tests\Mapping\Reference\Stub\SimpleClassStub; |
|
12 | 13 |
|
13 | 14 | final class ReferencesResolverTest extends ReferenceTestCase |
14 | 15 | { |
15 | | - public function testResolveWithSimpleNameInSameNamespace(): void |
| 16 | + private function getResolver(array $useStatements = []): ReferencesResolver |
16 | 17 | { |
17 | 18 | $reader = $this->createMock(ReferencesReaderInterface::class); |
18 | | - $reader->method('getUseStatements')->willReturn([]); |
19 | 19 |
|
20 | | - $resolver = new ReferencesResolver($reader); |
21 | | - $statement = new NamedTypeNode('TestClass'); |
22 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
| 20 | + $reader->method('getUseStatements') |
| 21 | + ->willReturn($useStatements); |
| 22 | + |
| 23 | + return new ReferencesResolver($reader); |
| 24 | + } |
| 25 | + |
| 26 | + #[TestDox('if no "use" stmt, then the namespace must be same as the class')] |
| 27 | + public function testResolveWithSimpleNameInSameNamespace(): void |
| 28 | + { |
| 29 | + $needle = new NamedTypeNode('TestClass'); |
| 30 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
23 | 31 |
|
24 | | - $result = $resolver->resolve($statement, $context); |
| 32 | + $result = $this->getResolver() |
| 33 | + ->resolve($needle, $haystack); |
25 | 34 |
|
26 | 35 | self::assertInstanceOf(NamedTypeNode::class, $result); |
27 | | - self::assertSame('TestClass', $result->name->toString()); |
| 36 | + self::assertSame('TypeLang\Mapper\Tests\Mapping\Reference\Stub\TestClass', $result->name->toString()); |
28 | 37 | } |
29 | 38 |
|
30 | 39 | public function testResolveWithUseStatement(): void |
31 | 40 | { |
32 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
33 | | - $reader->method('getUseStatements')->willReturn([ |
| 41 | + $needle = new NamedTypeNode('Any'); |
| 42 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
| 43 | + |
| 44 | + $result = $this->getResolver([ |
34 | 45 | 'Any' => 'Some\\Any', |
35 | 46 | 'Example' => 'Some\\Any\\Test', |
36 | | - ]); |
37 | | - |
38 | | - $resolver = new ReferencesResolver($reader); |
39 | | - $statement = new NamedTypeNode('Any'); |
40 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
41 | | - |
42 | | - $result = $resolver->resolve($statement, $context); |
| 47 | + ]) |
| 48 | + ->resolve($needle, $haystack); |
43 | 49 |
|
44 | 50 | self::assertInstanceOf(NamedTypeNode::class, $result); |
45 | 51 | self::assertSame('Some\\Any', $result->name->toString()); |
46 | 52 | } |
47 | 53 |
|
48 | 54 | public function testResolveWithAliasedUseStatement(): void |
49 | 55 | { |
50 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
51 | | - $reader->method('getUseStatements')->willReturn([ |
52 | | - 'Example' => 'Some\\Any\\Test', |
53 | | - ]); |
| 56 | + $needle = new NamedTypeNode('Example'); |
| 57 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
54 | 58 |
|
55 | | - $resolver = new ReferencesResolver($reader); |
56 | | - $statement = new NamedTypeNode('Example'); |
57 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
58 | | - |
59 | | - $result = $resolver->resolve($statement, $context); |
| 59 | + $result = $this->getResolver([ |
| 60 | + 'Example' => 'Some\\Any\\Test', |
| 61 | + ]) |
| 62 | + ->resolve($needle, $haystack); |
60 | 63 |
|
61 | 64 | self::assertInstanceOf(NamedTypeNode::class, $result); |
62 | 65 | self::assertSame('Some\\Any\\Test', $result->name->toString()); |
63 | 66 | } |
64 | 67 |
|
65 | 68 | public function testResolveWithNamespaceKeyword(): void |
66 | 69 | { |
67 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
68 | | - $reader->method('getUseStatements')->willReturn([]); |
69 | | - |
70 | | - $resolver = new ReferencesResolver($reader); |
71 | | - $statement = new NamedTypeNode('namespace\\TestClass'); |
72 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
| 70 | + $needle = new NamedTypeNode('namespace\\TestClass'); |
| 71 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
73 | 72 |
|
74 | | - $result = $resolver->resolve($statement, $context); |
| 73 | + $result = $this->getResolver() |
| 74 | + ->resolve($needle, $haystack); |
75 | 75 |
|
76 | 76 | self::assertInstanceOf(NamedTypeNode::class, $result); |
77 | 77 | self::assertSame('TypeLang\\Mapper\\Tests\\Mapping\\Reference\\Stub\\TestClass', $result->name->toString()); |
78 | 78 | } |
79 | 79 |
|
80 | 80 | public function testResolveWithNamespaceKeywordInGlobalNamespace(): void |
81 | 81 | { |
82 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
83 | | - $reader->method('getUseStatements')->willReturn([]); |
84 | | - |
85 | | - $resolver = new ReferencesResolver($reader); |
86 | | - $statement = new NamedTypeNode('namespace\\TestClass'); |
87 | | - $context = new \ReflectionClass(\stdClass::class); // stdClass is in global namespace |
| 82 | + $needle = new NamedTypeNode('namespace\\TestClass'); |
| 83 | + $haystack = new \ReflectionClass(\stdClass::class); // stdClass is in global namespace |
88 | 84 |
|
89 | | - $result = $resolver->resolve($statement, $context); |
| 85 | + $result = $this->getResolver() |
| 86 | + ->resolve($needle, $haystack); |
90 | 87 |
|
91 | 88 | self::assertInstanceOf(NamedTypeNode::class, $result); |
92 | 89 | self::assertSame('TestClass', $result->name->toString()); |
93 | 90 | } |
94 | 91 |
|
95 | 92 | public function testResolveWithFullyQualifiedName(): void |
96 | 93 | { |
97 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
98 | | - $reader->method('getUseStatements')->willReturn([]); |
99 | | - |
100 | | - $resolver = new ReferencesResolver($reader); |
101 | | - $statement = new NamedTypeNode(new FullQualifiedName('\\Some\\Fully\\Qualified\\Class')); |
102 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
| 94 | + $needle = new NamedTypeNode(new FullQualifiedName('\\Some\\Fully\\Qualified\\Class')); |
| 95 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
103 | 96 |
|
104 | | - $result = $resolver->resolve($statement, $context); |
| 97 | + $result = $this->getResolver() |
| 98 | + ->resolve($needle, $haystack); |
105 | 99 |
|
106 | 100 | self::assertInstanceOf(NamedTypeNode::class, $result); |
107 | 101 | self::assertSame('\\Some\\Fully\\Qualified\\Class', $result->name->toString()); |
108 | 102 | } |
109 | 103 |
|
110 | | - public function testResolveWithNonExistentClassInNamespace(): void |
111 | | - { |
112 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
113 | | - $reader->method('getUseStatements')->willReturn([]); |
114 | | - |
115 | | - $resolver = new ReferencesResolver($reader); |
116 | | - $statement = new NamedTypeNode('NonExistentClass'); |
117 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
118 | | - |
119 | | - $result = $resolver->resolve($statement, $context); |
120 | | - |
121 | | - // Should return original statement if class doesn't exist in namespace |
122 | | - self::assertInstanceOf(NamedTypeNode::class, $result); |
123 | | - self::assertSame('NonExistentClass', $result->name->toString()); |
124 | | - } |
125 | | - |
126 | 104 | public function testResolveWithComplexNamespaceKeyword(): void |
127 | 105 | { |
128 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
129 | | - $reader->method('getUseStatements')->willReturn([]); |
130 | | - |
131 | | - $resolver = new ReferencesResolver($reader); |
132 | | - $statement = new NamedTypeNode('namespace\\Sub\\Namespace\\TestClass'); |
133 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
| 106 | + $needle = new NamedTypeNode('namespace\\Sub\\Namespace\\TestClass'); |
| 107 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
134 | 108 |
|
135 | | - $result = $resolver->resolve($statement, $context); |
| 109 | + $result = $this->getResolver() |
| 110 | + ->resolve($needle, $haystack); |
136 | 111 |
|
137 | 112 | self::assertInstanceOf(NamedTypeNode::class, $result); |
138 | 113 | self::assertSame('TypeLang\\Mapper\\Tests\\Mapping\\Reference\\Stub\\Sub\\Namespace\\TestClass', $result->name->toString()); |
139 | 114 | } |
140 | 115 |
|
141 | 116 | public function testResolveWithMixedUseStatements(): void |
142 | 117 | { |
143 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
144 | | - $reader->method('getUseStatements')->willReturn([ |
| 118 | + $needle = new NamedTypeNode('GlobalClass'); |
| 119 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
| 120 | + |
| 121 | + $result = $this->getResolver([ |
145 | 122 | 'Any' => 'Some\\Any', |
146 | 123 | 'Example' => 'Some\\Any\\Test', |
147 | 124 | 'GlobalClass', // No alias, just the class name |
148 | | - ]); |
149 | | - |
150 | | - $resolver = new ReferencesResolver($reader); |
151 | | - $statement = new NamedTypeNode('Example'); |
152 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
153 | | - |
154 | | - $result = $resolver->resolve($statement, $context); |
| 125 | + ]) |
| 126 | + ->resolve($needle, $haystack); |
155 | 127 |
|
156 | 128 | self::assertInstanceOf(NamedTypeNode::class, $result); |
157 | | - self::assertSame('Some\\Any\\Test', $result->name->toString()); |
| 129 | + self::assertSame('GlobalClass', $result->name->toString()); |
158 | 130 | } |
159 | 131 |
|
160 | 132 | public function testResolvePreservesOriginalStatementWhenNoResolutionNeeded(): void |
161 | 133 | { |
162 | | - $reader = $this->createMock(ReferencesReaderInterface::class); |
163 | | - $reader->method('getUseStatements')->willReturn([]); |
164 | | - |
165 | | - $resolver = new ReferencesResolver($reader); |
166 | | - $statement = new NamedTypeNode('\\Fully\\Qualified\\Class'); |
167 | | - $context = new \ReflectionClass(SimpleClassStub::class); |
| 134 | + $needle = new NamedTypeNode('\\Fully\\Qualified\\Class'); |
| 135 | + $haystack = new \ReflectionClass(SimpleClassStub::class); |
168 | 136 |
|
169 | | - $result = $resolver->resolve($statement, $context); |
| 137 | + $result = $this->getResolver() |
| 138 | + ->resolve($needle, $haystack); |
170 | 139 |
|
171 | | - self::assertSame($statement, $result); |
| 140 | + self::assertSame($needle, $result); |
172 | 141 | } |
173 | 142 | } |
0 commit comments