Skip to content

Commit 61eafc7

Browse files
committed
Enhance tests for full coverage.
1 parent 24800df commit 61eafc7

File tree

2 files changed

+196
-17
lines changed

2 files changed

+196
-17
lines changed

tests/src/ClassFilesIATest.php

Lines changed: 172 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Ock\ClassFilesIterator\ClassFilesIA\ClassFilesIA_Concat;
77
use Ock\ClassFilesIterator\ClassFilesIA\ClassFilesIA_Empty;
88
use Ock\ClassFilesIterator\ClassFilesIA\ClassFilesIA_NamespaceDirectoryPsr4;
9+
use Ock\ClassFilesIterator\NamespaceDirectory;
910
use Ock\ClassFilesIterator\Tests\Fixtures\Acme\Animal\GreySquirrel;
1011
use Ock\ClassFilesIterator\Tests\Fixtures\Acme\Animal\RedSquirrel;
1112
use Ock\ClassFilesIterator\Tests\Fixtures\Acme\Plant\PlantInterface;
@@ -15,46 +16,200 @@
1516

1617
class ClassFilesIATest extends TestCase {
1718

19+
use ExceptionTestTrait;
20+
21+
public function testCreate(): void {
22+
$f = fn (string $namespace) => ClassFilesIA_NamespaceDirectoryPsr4::create('path/to', $namespace);
23+
$c = fn (string $terminated_namespace) => new ClassFilesIA_NamespaceDirectoryPsr4('path/to', $terminated_namespace);
24+
$this->assertEquals($c(''), $f(''));
25+
$this->assertEquals($c('Acme\\'), $f('Acme'));
26+
$this->assertEquals($c('Acme\\Zoo\\'), $f('Acme\\Zoo'));
27+
}
28+
29+
public function testCreateFromClass(): void {
30+
$f = ClassFilesIA_NamespaceDirectoryPsr4::createFromClass(...);
31+
$this->assertEquals(
32+
new ClassFilesIA_NamespaceDirectoryPsr4(__DIR__, __NAMESPACE__ . '\\'),
33+
$f(self::class),
34+
);
35+
$this->assertEquals(
36+
new ClassFilesIA_NamespaceDirectoryPsr4(
37+
__DIR__ . '/Fixtures/Acme/Plant/Tree',
38+
__NAMESPACE__ . '\Fixtures\Acme\Plant\Tree\\',
39+
),
40+
$f(Fig::class, 0),
41+
);
42+
$this->assertEquals(
43+
new ClassFilesIA_NamespaceDirectoryPsr4(
44+
__DIR__ . '/Fixtures/Acme',
45+
__NAMESPACE__ . '\Fixtures\Acme\\',
46+
),
47+
$f(Fig::class, 2),
48+
);
49+
$this->assertEquals(
50+
new ClassFilesIA_NamespaceDirectoryPsr4(
51+
__DIR__,
52+
__NAMESPACE__ . '\\',
53+
),
54+
$f(Fig::class, -3),
55+
);
56+
// @phpstan-ignore argument.type
57+
$this->callAndAssertException(\ReflectionException::class, fn () => $f(__NAMESPACE__ . '\\NonExistingClass'));
58+
$this->callAndAssertException(\RuntimeException::class, fn () => $f(Fig::class, 5));
59+
$this->callAndAssertException(\RuntimeException::class, fn () => $f(Fig::class, -2));
60+
}
61+
62+
public function testCreateFromNsdirObject(): void {
63+
$f = fn (string $dir) => ClassFilesIA_NamespaceDirectoryPsr4::createFromNsdirObject(NamespaceDirectory::create($dir, 'Acme\Zoo'));
64+
$c = fn (string $dir) => new ClassFilesIA_NamespaceDirectoryPsr4($dir, 'Acme\Zoo\\');
65+
$this->assertEquals($c(__DIR__), $f(__DIR__));
66+
$this->assertEquals(new ClassFilesIA_Empty(), $f(__DIR__ . '/non/existing/subdir'));
67+
}
68+
69+
public function testWithRealpathRoot(): void {
70+
$c = fn (string $dir) => new ClassFilesIA_NamespaceDirectoryPsr4($dir, 'Acme\Zoo\\');
71+
$realpath = realpath(__DIR__) ?: $this->fail();
72+
$crooked_path = __DIR__ . '/../src';
73+
$this->assertFalse(str_ends_with($realpath, '/../src'));
74+
$obj_with_realpath = $c($realpath);
75+
$this->assertEquals($obj_with_realpath, $c($crooked_path)->withRealpathRoot());
76+
77+
// A new clone is returned even though values are the same.
78+
// Perhaps this will change in the future.
79+
$this->assertEquals($obj_with_realpath, $obj_with_realpath->withRealpathRoot());
80+
$this->assertNotSame($obj_with_realpath, $obj_with_realpath->withRealpathRoot());
81+
82+
// Test effect on the iterator.
83+
$this->assertSame($realpath, dirname($obj_with_realpath->getIterator()->key()));
84+
$this->assertSame($crooked_path, dirname($c($crooked_path)->getIterator()->key()));
85+
}
86+
1887
/**
1988
* @throws \ReflectionException
2089
*/
21-
public function testClassFilesIA(): void {
90+
public function testGetIterator(): void {
2291
$classFilesIA = ClassFilesIA_NamespaceDirectoryPsr4::createFromClass(
2392
PlantInterface::class,
2493
1);
2594
$classFiles = iterator_to_array($classFilesIA->getIterator());
26-
asort($classFiles);
2795
$this->assertSame([
2896
__DIR__ . '/Fixtures/Acme/Animal/GreySquirrel.php' => GreySquirrel::class,
2997
__DIR__ . '/Fixtures/Acme/Animal/RedSquirrel.php' => RedSquirrel::class,
3098
__DIR__ . '/Fixtures/Acme/Plant/PlantInterface.php' => PlantInterface::class,
3199
__DIR__ . '/Fixtures/Acme/Plant/Tree/Fig.php' => Fig::class,
32100
__DIR__ . '/Fixtures/Acme/Plant/VenusFlyTrap.php' => VenusFlyTrap::class,
33101
], $classFiles);
102+
$this->callAndAssertException(\RuntimeException::class, ClassFilesIA_NamespaceDirectoryPsr4::create(__DIR__ . '/non/existing/subdir', 'Acme\\Zoo')->getIterator()->valid(...));
34103
}
35104

36-
public function testClassFilesIAEmpty(): void {
105+
public function testEmpty(): void {
37106
$classFilesIA = new ClassFilesIA_Empty();
38-
$classFiles = iterator_to_array($classFilesIA->getIterator());
39-
asort($classFiles);
40-
$this->assertSame([], $classFiles);
107+
$this->assertFalse($classFilesIA->getIterator()->valid());
108+
$this->assertSame($classFilesIA, $classFilesIA->withRealpathRoot());
41109
}
42110

43111
/**
44112
* @throws \ReflectionException
45113
*/
46-
public function testClassFilesIAMultiple(): void {
47-
$classFilesIAs = [];
48-
$classFilesIAs[] = ClassFilesIA::psr4FromClass(Fig::class);
49-
$classFilesIAs[] = ClassFilesIA::psr4FromClass(GreySquirrel::class);
50-
$classFilesIA = new ClassFilesIA_Concat($classFilesIAs);
51-
$classFiles = iterator_to_array($classFilesIA->getIterator());
52-
asort($classFiles);
114+
public function testConcat(): void {
115+
$concat = new ClassFilesIA_Concat([
116+
ClassFilesIA::psr4FromClass(Fig::class),
117+
ClassFilesIA::psr4FromClass(GreySquirrel::class),
118+
// Insert a duplicated segment.
119+
ClassFilesIA::psr4FromClass(Fig::class),
120+
]);
121+
$actual = [];
122+
foreach ($concat as $file => $class) {
123+
$actual[] = [$file, $class];
124+
}
53125
$this->assertSame([
54-
__DIR__ . '/Fixtures/Acme/Animal/GreySquirrel.php' => GreySquirrel::class,
55-
__DIR__ . '/Fixtures/Acme/Animal/RedSquirrel.php' => RedSquirrel::class,
56-
__DIR__ . '/Fixtures/Acme/Plant/Tree/Fig.php' => Fig::class,
57-
], $classFiles);
126+
[__DIR__ . '/Fixtures/Acme/Plant/Tree/Fig.php', Fig::class],
127+
[__DIR__ . '/Fixtures/Acme/Animal/GreySquirrel.php', GreySquirrel::class],
128+
[__DIR__ . '/Fixtures/Acme/Animal/RedSquirrel.php', RedSquirrel::class],
129+
[__DIR__ . '/Fixtures/Acme/Plant/Tree/Fig.php', Fig::class],
130+
], $actual);
131+
132+
$this->assertEquals(
133+
new ClassFilesIA_Concat([
134+
ClassFilesIA::psr4(realpath(__DIR__) ?: '?', 'Acme\Zoo'),
135+
ClassFilesIA::psr4(realpath(__DIR__ . '/Fixtures') ?: '?', 'Acme\Zoo'),
136+
]),
137+
(new ClassFilesIA_Concat([
138+
ClassFilesIA::psr4(__DIR__ . '/../src', 'Acme\Zoo'),
139+
ClassFilesIA::psr4(__DIR__ . '/../src/Fixtures', 'Acme\Zoo'),
140+
]))->withRealpathRoot(),
141+
);
142+
}
143+
144+
public function testFactoryPsr4(): void {
145+
$this->assertEquals(
146+
new ClassFilesIA_NamespaceDirectoryPsr4('path/to', 'Acme\Zoo\\'),
147+
ClassFilesIA::psr4('path/to', 'Acme\Zoo'),
148+
);
149+
}
150+
151+
public function testFactoryPsr4Up(): void {
152+
$f = ClassFilesIA::psr4Up(...);
153+
$fn = fn (int ...$args) => $f('path/to/Animal', 'Acme\Zoo\Animal', ...$args);
154+
$this->assertEquals($default = NamespaceDirectory::create(
155+
'path/to/Animal',
156+
'Acme\Zoo\Animal',
157+
), $fn());
158+
$this->assertEquals($default, $fn(0));
159+
$this->assertEquals(NamespaceDirectory::create(
160+
'path/to',
161+
'Acme\Zoo',
162+
), $fn(1));
163+
$this->assertEquals(NamespaceDirectory::create(
164+
'path/to',
165+
'Acme\Zoo',
166+
), $fn(-2));
167+
}
168+
169+
public function testFactoryPsr4FromClass(): void {
170+
foreach ([
171+
ClassFilesIA::psr4FromClass(...),
172+
ClassFilesIA::psr4FromKnownClass(...),
173+
] as $f) {
174+
$fn = fn (int ...$args) => $f(Fig::class, ...$args);
175+
$this->assertEquals($default = NamespaceDirectory::create(
176+
__DIR__ . '/Fixtures/Acme/Plant/Tree',
177+
__NAMESPACE__ . '\Fixtures\Acme\Plant\Tree',
178+
), $fn());
179+
$this->assertEquals($default, $fn(0));
180+
$this->assertEquals(NamespaceDirectory::create(
181+
__DIR__ . '/Fixtures/Acme/Plant',
182+
__NAMESPACE__ . '\Fixtures\Acme\Plant',
183+
), $fn(1));
184+
$this->assertEquals(NamespaceDirectory::create(
185+
__DIR__,
186+
__NAMESPACE__,
187+
), $fn(-3));
188+
}
189+
}
190+
191+
public function testFactoryMultiple(): void {
192+
$parts = [new ClassFilesIA_Empty()];
193+
$this->assertEquals(
194+
new ClassFilesIA_Concat($parts),
195+
ClassFilesIA::multiple($parts),
196+
);
197+
}
198+
199+
public function testFactoryPsr4FromClasses(): void {
200+
$this->assertEquals(
201+
new ClassFilesIA_Concat([
202+
NamespaceDirectory::create(__DIR__, __NAMESPACE__),
203+
NamespaceDirectory::create(
204+
__DIR__ . '/Fixtures/Acme/Plant/Tree',
205+
__NAMESPACE__ . '\Fixtures\Acme\Plant\Tree',
206+
),
207+
]),
208+
ClassFilesIA::psr4FromClasses([
209+
self::class,
210+
Fig::class,
211+
]),
212+
);
58213
}
59214

60215
}

tests/src/ClassNamesIATest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Ock\ClassFilesIterator\Tests;
4+
5+
use Ock\ClassFilesIterator\ClassNamesIA\ClassNamesIA_Array;
6+
use Ock\ClassFilesIterator\Tests\Fixtures\Acme\Animal\RedSquirrel;
7+
use Ock\ClassFilesIterator\Tests\Fixtures\Acme\Plant\Tree\Fig;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class ClassNamesIATest extends TestCase {
11+
12+
use ExceptionTestTrait;
13+
14+
public function testArray(): void {
15+
$classes = [
16+
'a' => Fig::class,
17+
RedSquirrel::class,
18+
];
19+
$this->assertSame($classes, iterator_to_array(
20+
new ClassNamesIA_Array($classes),
21+
));
22+
}
23+
24+
}

0 commit comments

Comments
 (0)