-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathClassLoaderMockTrait.php
94 lines (76 loc) · 2.76 KB
/
ClassLoaderMockTrait.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
namespace Okapi\CodeTransformer\Tests;
use Okapi\CodeTransformer\Core\AutoloadInterceptor\ClassLoader;
use Okapi\CodeTransformer\Core\CachedStreamFilter;
use Okapi\CodeTransformer\Core\StreamFilter;
use Okapi\CodeTransformer\Core\StreamFilter\FilterInjector;
use Okapi\Path\Path;
use PHPUnit\Framework\Assert;
use ReflectionProperty;
trait ClassLoaderMockTrait
{
private ?ClassLoader $classLoader = null;
private function findClassMock(string $class): string
{
if (!isset($this->classLoader)) {
$this->findClassLoader();
}
return $this->classLoader->findFile($class);
}
private function findOriginalClassMock(string $class): string
{
if (!isset($this->classLoader)) {
$this->findClassLoader();
}
$original = new ReflectionProperty(ClassLoader::class, 'originalClassLoader');
$original = $original->getValue($this->classLoader);
return $original->findFile($class);
}
private function findClassLoader(): void
{
foreach (spl_autoload_functions() as $function) {
if (is_array($function) && $function[0] instanceof ClassLoader) {
$this->classLoader = $function[0];
break;
}
}
}
public function assertWillBeTransformed(string $className): void
{
$originalFilePath = Path::resolve($this->findOriginalClassMock($className));
$transformPath =
FilterInjector::PHP_FILTER_READ .
StreamFilter::FILTER_ID . '/resource=' .
$originalFilePath;
$filePathMock = $this->findClassMock($className);
Assert::assertEquals(
$transformPath,
$filePathMock,
"$className will not be transformed",
);
}
public function assertTransformerLoadedFromCache(string $className): void
{
$filePath = Path::resolve($this->findOriginalClassMock($className));
$cachePath =
FilterInjector::PHP_FILTER_READ .
CachedStreamFilter::CACHED_FILTER_ID . '/resource=' .
$filePath;
$filePathMock = $this->findClassMock($className);
Assert::assertEquals(
$cachePath,
$filePathMock,
$className . ' will not be loaded from cache',
);
}
public function assertTransformerNotApplied(string $className): void
{
$originalFilePath = Path::resolve($this->findOriginalClassMock($className));
$filePathMock = $this->findClassMock($className);
Assert::assertEquals(
$originalFilePath,
$filePathMock,
$className . ' will be transformed',
);
}
}