Skip to content

Commit 48512ac

Browse files
committed
Modified tests to support "assertWillBeTransformed", "assertTransformerLoadedFromCache" and "assertTransformerNotApplied"
1 parent a709c2a commit 48512ac

File tree

8 files changed

+319
-19
lines changed

8 files changed

+319
-19
lines changed

tests/ClassLoaderMockTrait.php

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

tests/Functional/Workflow/ApplicationTest.php

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Okapi\CodeTransformer\Exception\Transformer\SyntaxError;
66
use Okapi\CodeTransformer\Service\CacheStateManager;
7+
use Okapi\CodeTransformer\Tests\ClassLoaderMockTrait;
78
use Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
89
use Okapi\CodeTransformer\Tests\Stubs\Kernel\ApplicationKernel;
910
use Okapi\CodeTransformer\Tests\Stubs\Transformer\StringTransformer;
@@ -15,18 +16,31 @@
1516
#[RunClassInSeparateProcess]
1617
class ApplicationTest extends TestCase
1718
{
19+
use ClassLoaderMockTrait;
20+
21+
/**
22+
* Cached test in {@see CachedApplicationTest::testKernel()}
23+
*/
1824
public function testKernel(): void
1925
{
2026
Util::clearCache();
2127

2228
$this->assertFalse(ApplicationKernel::isInitialized());
2329
ApplicationKernel::init(cacheDir: Util::CACHE_DIR);
2430
$this->assertTrue(ApplicationKernel::isInitialized());
31+
32+
$this->assertFileDoesNotExist(Util::CACHE_STATES_FILE);
2533
}
2634

35+
/**
36+
* Cached test in {@see CachedApplicationTest::testStringClass()}
37+
*/
2738
public function testStringClass(): void
2839
{
29-
$stringClass = new ClassesToTransform\StringClass();
40+
$class = ClassesToTransform\StringClass::class;
41+
$this->assertWillBeTransformed($class);
42+
43+
$stringClass = new $class();
3044
$this->assertSame('Hello from Code Transformer!', $stringClass->test());
3145

3246
$file = __DIR__ . '/../../Stubs/ClassesToTransform/StringClass.php';
@@ -36,14 +50,15 @@ public function testStringClass(): void
3650
}
3751

3852
/**
39-
* True test in {@see CachedApplicationTest::testNoChangesClass()}
53+
* Cached test in {@see CachedApplicationTest::testNoChangesClass()}
4054
*/
4155
public function testNoChangesClass(): void
4256
{
43-
/** @noinspection PhpUnusedLocalVariableInspection */
44-
$noChangesClass = new ClassesToTransform\NoChangesClass();
57+
$class = ClassesToTransform\NoChangesClass::class;
58+
$this->assertWillBeTransformed($class);
4559

46-
$this->expectNotToPerformAssertions();
60+
/** @noinspection PhpUnusedLocalVariableInspection */
61+
$noChangesClass = new $class();
4762
}
4863

4964
public function testSyntaxErrorClass(): void
@@ -55,31 +70,55 @@ public function testSyntaxErrorClass(): void
5570
}
5671

5772
/**
58-
* True test in {@see CachedApplicationTest::testChangedClass()}
73+
* Cached test in {@see CachedApplicationTest::testChangedClass()}
5974
*/
6075
public function testChangedClass(): void
6176
{
77+
$class = ClassesToTransform\ChangedClass::class;
78+
$this->assertWillBeTransformed($class);
79+
6280
/** @noinspection PhpUnusedLocalVariableInspection */
63-
$changedClass = new ClassesToTransform\ChangedClass();
81+
$changedClass = new $class();
6482
$this->assertSame('Hello from Code Transformer!', $changedClass->test());
6583
}
6684

6785
/**
68-
* True test in {@see CachedApplicationTest::testDeleteCacheFileClass()}
86+
* Cached test in {@see CachedApplicationTest::testDeleteCacheFileClass()}
6987
*/
7088
public function testDeleteCacheFileClass(): void
7189
{
72-
$deleteCacheFileClass = new ClassesToTransform\DeleteCacheFileClass();
90+
$class = ClassesToTransform\DeleteCacheFileClass::class;
91+
$this->assertWillBeTransformed($class);
92+
93+
$deleteCacheFileClass = new $class();
7394
$this->assertSame('Hello World!', $deleteCacheFileClass->test());
7495
}
7596

97+
/**
98+
* Cached test in {@see CachedApplicationTest::testMultipleTransformers()}
99+
*/
76100
public function testMultipleTransformers(): void
77101
{
78-
$multipleTransformersClass = new ClassesToTransform\MultipleTransformersClass();
102+
$class = ClassesToTransform\MultipleTransformersClass::class;
103+
$this->assertWillBeTransformed($class);
104+
105+
$multipleTransformersClass = new $class();
79106
$this->assertSame('Hello from Code Transformer!', $multipleTransformersClass->test());
80107
$this->assertSame("You can't get me!", $multipleTransformersClass->privateProperty);
81108
}
82109

110+
/**
111+
* Cached test in {@see CachedApplicationTest::testAddedTransformer()}
112+
*/
113+
public function testAddedTransformer(): void
114+
{
115+
$class = ClassesToTransform\AddedTransformerClass::class;
116+
$this->assertWillBeTransformed($class);
117+
118+
$addedTransformerClass = new $class();
119+
$this->assertSame('Hello Code Transformer!', $addedTransformerClass->test());
120+
}
121+
83122
public function testDestructor(): void
84123
{
85124
$cacheStateManager = CacheStateManager::getInstance();

tests/Functional/Workflow/CachedApplicationTest.php

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

33
namespace Okapi\CodeTransformer\Tests\Functional\Workflow;
44

5+
use Okapi\CodeTransformer\Tests\ClassLoaderMockTrait;
56
use Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
7+
use Okapi\CodeTransformer\Tests\Stubs\Kernel\CachedKernel;
68
use Okapi\CodeTransformer\Tests\Util;
79
use Okapi\Filesystem\Filesystem;
810
use PHPUnit\Framework\TestCase;
@@ -13,13 +15,13 @@
1315
*/
1416
class CachedApplicationTest extends TestCase
1517
{
18+
use ClassLoaderMockTrait;
19+
1620
public function testKernel(): void
1721
{
18-
\Okapi\CodeTransformer\Tests\Stubs\Kernel\ApplicationKernel::init(
19-
cacheDir: Util::CACHE_DIR,
20-
);
21-
22-
$this->assertTrue(\Okapi\CodeTransformer\Tests\Stubs\Kernel\ApplicationKernel::isInitialized());
22+
$this->assertFalse(CachedKernel::isInitialized());
23+
CachedKernel::init(cacheDir: Util::CACHE_DIR);
24+
$this->assertTrue(CachedKernel::isInitialized());
2325

2426
$this->assertFileExists(Util::CACHE_STATES_FILE);
2527
}
@@ -35,23 +37,38 @@ public function testCachedFile(): void
3537
$this->assertStringContainsString('$iAmAppended = true;', $file);
3638
}
3739

40+
/**
41+
* Cached by {@see ApplicationTest::testStringClass()}
42+
*/
3843
public function testStringClass(): void
3944
{
40-
$stringClass = new ClassesToTransform\StringClass();
45+
$class = ClassesToTransform\StringClass::class;
46+
$this->assertTransformerLoadedFromCache($class);
47+
48+
$stringClass = new $class();
4149
$this->assertSame('Hello from Code Transformer!', $stringClass->test());
4250
}
4351

52+
/**
53+
* Cached by {@see ApplicationTest::testNoChangesClass()}
54+
*/
4455
public function testNoChangesClass(): void
4556
{
57+
$class = ClassesToTransform\NoChangesClass::class;
58+
$this->assertTransformerNotApplied($class);
59+
4660
/** @noinspection PhpUnusedLocalVariableInspection */
47-
$stringClass = new ClassesToTransform\StringClass();
61+
$stringClass = new $class();
4862

4963
$originalFilePath = __DIR__ . '/../../Stubs/ClassesToTransform/NoChangesClass.php';
5064
$cachedFilePath = Util::CACHE_DIR . '/transformed/tests/Stubs/ClassesToTransform/NoChangesClass.php';
5165
$this->assertFileExists($originalFilePath);
5266
$this->assertFileDoesNotExist($cachedFilePath);
5367
}
5468

69+
/**
70+
* Cached by {@see ApplicationTest::testChangedClass()}
71+
*/
5572
public function testChangedClass(): void
5673
{
5774
$originalFilePath = __DIR__ . '/../../Stubs/ClassesToTransform/ChangedClass.php';
@@ -68,7 +85,10 @@ public function testChangedClass(): void
6885

6986
Filesystem::writeFile($originalFilePath, $changedFileContent);
7087

71-
$changedClass = new ClassesToTransform\ChangedClass();
88+
$class = ClassesToTransform\ChangedClass::class;
89+
$this->assertWillBeTransformed($class);
90+
91+
$changedClass = new $class();
7292
$this->assertSame('Hello Changed World from Code Transformer!', $changedClass->test());
7393
} catch (Throwable $e) {
7494
$exception = $e;
@@ -82,6 +102,9 @@ public function testChangedClass(): void
82102
}
83103
}
84104

105+
/**
106+
* Cached by {@see ApplicationTest::testDeleteCacheFileClass()}
107+
*/
85108
public function testDeleteCacheFileClass(): void
86109
{
87110
$cachedFilePath = Util::CACHE_DIR . '/transformed/tests/Stubs/ClassesToTransform/DeleteCacheFileClass.php';
@@ -90,12 +113,40 @@ public function testDeleteCacheFileClass(): void
90113
Filesystem::rm($cachedFilePath);
91114
$this->assertFileDoesNotExist($cachedFilePath);
92115

93-
$deleteCacheFileClass = new ClassesToTransform\DeleteCacheFileClass();
116+
$class = ClassesToTransform\DeleteCacheFileClass::class;
117+
$this->assertWillBeTransformed($class);
118+
119+
$deleteCacheFileClass = new $class();
94120
$this->assertSame('Hello World!', $deleteCacheFileClass->test());
95121

96122
$this->assertFileExists($cachedFilePath);
97123
}
98124

125+
/**
126+
* Cached by {@see ApplicationTest::testMultipleTransformers()}
127+
*/
128+
public function testMultipleTransformers(): void
129+
{
130+
$class = ClassesToTransform\MultipleTransformersClass::class;
131+
$this->assertTransformerLoadedFromCache($class);
132+
133+
$multipleTransformersClass = new $class();
134+
$this->assertSame('Hello from Code Transformer!', $multipleTransformersClass->test());
135+
$this->assertSame("You can't get me!", $multipleTransformersClass->privateProperty);
136+
}
137+
138+
/**
139+
* Cached by {@see ApplicationTest::testAddedTransformer()}
140+
*/
141+
public function testAddedTransformer(): void
142+
{
143+
$class = ClassesToTransform\AddedTransformerClass::class;
144+
$this->assertWillBeTransformed($class);
145+
146+
$addedTransformerClass = new $class();
147+
$this->assertSame('Hello from Code Transformer!', $addedTransformerClass->test());
148+
}
149+
99150
public function testClearCache(): void
100151
{
101152
Util::clearCache();
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class AddedTransformerClass
6+
{
7+
public function test(): string
8+
{
9+
$hello = 'Hello';
10+
$world = 'World';
11+
12+
return "$hello $world!";
13+
}
14+
}

tests/Stubs/Kernel/ApplicationKernel.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Okapi\CodeTransformer\Tests\Stubs\Kernel;
44

55
use Okapi\CodeTransformer\CodeTransformerKernel;
6+
use Okapi\CodeTransformer\Tests\Stubs\Transformer\AddedTransformer1;
67
use Okapi\CodeTransformer\Tests\Stubs\Transformer\ChangedTransformer;
78
use Okapi\CodeTransformer\Tests\Stubs\Transformer\DeleteCacheFileTransformer;
89
use Okapi\CodeTransformer\Tests\Stubs\Transformer\NoChangesTransformer;
@@ -19,5 +20,6 @@ class ApplicationKernel extends CodeTransformerKernel
1920
ChangedTransformer::class,
2021
DeleteCacheFileTransformer::class,
2122
UnPrivateTransformer::class,
23+
AddedTransformer1::class,
2224
];
2325
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\Kernel;
4+
5+
use Okapi\CodeTransformer\Service\TransformerContainer;
6+
use Okapi\CodeTransformer\Tests\Stubs\Transformer\AddedTransformer2;
7+
8+
class CachedKernel extends ApplicationKernel
9+
{
10+
protected array $addedTransformers = [
11+
AddedTransformer2::class,
12+
];
13+
14+
/** @noinspection PhpMissingParentConstructorInspection */
15+
public function __construct()
16+
{
17+
TransformerContainer::addTransformers($this->addedTransformers);
18+
}
19+
}

0 commit comments

Comments
 (0)