Skip to content

Commit 18efb94

Browse files
committed
Add ReferencesResolver tests
1 parent 6589035 commit 18efb94

File tree

10 files changed

+198
-15
lines changed

10 files changed

+198
-15
lines changed

src/Mapper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
2020
use TypeLang\Mapper\Runtime\Repository\InMemoryTypeRepository;
2121
use TypeLang\Mapper\Runtime\Repository\LoggableTypeRepository;
22-
use TypeLang\Mapper\Runtime\Repository\Reference\NativeReferencesReader;
22+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\NativeReferencesReader;
2323
use TypeLang\Mapper\Runtime\Repository\TraceableTypeRepository;
2424
use TypeLang\Mapper\Runtime\Repository\TypeRepository;
2525
use TypeLang\Mapper\Runtime\Repository\TypeRepositoryInterface;

src/Runtime/Repository/Reference/NativeReferencesReader.php renamed to src/Runtime/Repository/Reference/Reader/NativeReferencesReader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Runtime\Repository\Reference\Reader;
66

77
final class NativeReferencesReader implements ReferencesReaderInterface
88
{

src/Runtime/Repository/Reference/NullReferencesReader.php renamed to src/Runtime/Repository/Reference/Reader/NullReferencesReader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Runtime\Repository\Reference\Reader;
66

77
final class NullReferencesReader implements ReferencesReaderInterface
88
{

src/Runtime/Repository/Reference/ReferencesReaderInterface.php renamed to src/Runtime/Repository/Reference/Reader/ReferencesReaderInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Runtime\Repository\Reference\Reader;
66

77
interface ReferencesReaderInterface
88
{

src/Runtime/Repository/ReferencesResolver.php renamed to src/Runtime/Repository/Reference/ReferencesResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Runtime\Repository;
5+
namespace TypeLang\Mapper\Runtime\Repository\Reference;
66

7-
use TypeLang\Mapper\Runtime\Repository\Reference\ReferencesReaderInterface;
7+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\ReferencesReaderInterface;
88
use TypeLang\Parser\Node\Name;
99
use TypeLang\Parser\Node\Stmt\TypeStatement;
1010
use TypeLang\Parser\TypeResolver;

src/Runtime/Repository/TypeRepository.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
use TypeLang\Mapper\Exception\Definition\TypeNotFoundException;
88
use TypeLang\Mapper\Platform\PlatformInterface;
99
use TypeLang\Mapper\Runtime\Parser\TypeParserInterface;
10-
use TypeLang\Mapper\Runtime\Repository\Reference\NativeReferencesReader;
11-
use TypeLang\Mapper\Runtime\Repository\Reference\ReferencesReaderInterface;
10+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\NativeReferencesReader;
11+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\ReferencesReaderInterface;
12+
use TypeLang\Mapper\Runtime\Repository\Reference\ReferencesResolver;
1213
use TypeLang\Mapper\Type\Builder\TypeBuilderInterface;
1314
use TypeLang\Mapper\Type\TypeInterface;
1415
use TypeLang\Parser\Node\Stmt\TypeStatement;

tests/Runtime/Repository/Reference/InterfaceCompatibilityTest.php renamed to tests/Runtime/Repository/Reference/Reader/InterfaceCompatibilityTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference\Reader;
66

77
use PHPUnit\Framework\Attributes\DoesNotPerformAssertions;
8-
use TypeLang\Mapper\Runtime\Repository\Reference\ReferencesReaderInterface;
8+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\ReferencesReaderInterface;
9+
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\ReferenceTestCase;
910

1011
final class InterfaceCompatibilityTest extends ReferenceTestCase
1112
{

tests/Runtime/Repository/Reference/NativeReaderTest.php renamed to tests/Runtime/Repository/Reference/Reader/NativeReaderTest.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference\Reader;
66

77
use PHPUnit\Framework\Attributes\Before;
8-
use TypeLang\Mapper\Runtime\Repository\Reference\NativeReferencesReader;
9-
use TypeLang\Mapper\Runtime\Repository\Reference\ReferencesReaderInterface;
8+
use PHPUnit\Framework\Attributes\CoversClass;
9+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\NativeReferencesReader;
10+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\ReferencesReaderInterface;
11+
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\ReferenceTestCase;
1012
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\Stub\ClassWithGroupUsesStub;
1113
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\Stub\MultipleNamespacesClassStub;
1214
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\Stub\SimpleClassStub;
1315

16+
#[CoversClass(NativeReferencesReader::class)]
1417
final class NativeReaderTest extends ReferenceTestCase
1518
{
1619
private readonly ReferencesReaderInterface $reader;

tests/Runtime/Repository/Reference/NullReaderTest.php renamed to tests/Runtime/Repository/Reference/Reader/NullReaderTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
declare(strict_types=1);
44

5-
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference;
5+
namespace TypeLang\Mapper\Tests\Runtime\Repository\Reference\Reader;
66

7-
use TypeLang\Mapper\Runtime\Repository\Reference\NullReferencesReader;
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use TypeLang\Mapper\Runtime\Repository\Reference\Reader\NullReferencesReader;
9+
use TypeLang\Mapper\Tests\Runtime\Repository\Reference\ReferenceTestCase;
810

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

0 commit comments

Comments
 (0)