Skip to content

Commit 1d23cc6

Browse files
committed
Added tests
1 parent d1fac85 commit 1d23cc6

24 files changed

+623
-2
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@
44
# Composer
55
vendor/
66
composer.lock
7+
8+
# PHPUnit
9+
tests/coverage/
10+
tests/cache/
11+
.phpunit.result.cache

composer.json

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,36 @@
1818
"php",
1919
"php-code"
2020
],
21+
"scripts": {
22+
"test": "phpunit",
23+
"test-coverage": "phpunit --coverage-html tests/coverage"
24+
},
2125
"require": {
2226
"php": ">=8.1",
27+
"microsoft/tolerant-php-parser": "^0.1.2",
28+
"okapi/filesystem": "^1.0",
29+
"okapi/path": "^1.0",
2330
"okapi/singleton": "^1.0",
24-
"okapi/path": "^1.0"
31+
"okapi/wildcards": "^1.0"
32+
},
33+
"require-dev": {
34+
"phpunit/phpunit": "dev-main",
35+
"symfony/var-dumper": "^6.2"
2536
},
2637
"autoload": {
2738
"psr-4": {
2839
"Okapi\\CodeTransformer\\": "src/"
2940
}
30-
}
41+
},
42+
"autoload-dev": {
43+
"psr-4": {
44+
"Okapi\\CodeTransformer\\Tests\\": "tests/"
45+
}
46+
},
47+
"repositories": [
48+
{
49+
"type": "vcs",
50+
"url": "https://github.com/WalterWoshid/phpunit"
51+
}
52+
]
3153
}

phpunit.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
5+
colors="true"
6+
>
7+
<testsuites>
8+
<testsuite name="Tests">
9+
<directory>tests/</directory>
10+
</testsuite>
11+
</testsuites>
12+
13+
<coverage>
14+
<include>
15+
<directory suffix=".php">src/</directory>
16+
</include>
17+
</coverage>
18+
</phpunit>

tests/Functional/DirectKernelTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Functional;
4+
5+
use Okapi\CodeTransformer\CodeTransformerKernel;
6+
use Okapi\CodeTransformer\Exception\Kernel\DirectKernelInitializationException;
7+
use Okapi\CodeTransformer\Tests\Util;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class DirectKernelTest extends TestCase
11+
{
12+
public function testDirectKernelInitialization(): void
13+
{
14+
$this->expectException(DirectKernelInitializationException::class);
15+
16+
CodeTransformerKernel::init(
17+
cacheDir: Util::CACHE_DIR,
18+
debug: true,
19+
);
20+
}
21+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Functional;
4+
5+
use Okapi\CodeTransformer\Exception\Transformer\InvalidTransformerClassException;
6+
use Okapi\CodeTransformer\Exception\Transformer\TransformerNotFoundException;
7+
use Okapi\CodeTransformer\Tests\Stubs\Kernel\TransformerDoesNotExistKernel;
8+
use Okapi\CodeTransformer\Tests\Stubs\Kernel\TransformerDoesNotExtendTransformerKernel;
9+
use Okapi\CodeTransformer\Tests\Util;
10+
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
11+
use PHPUnit\Framework\TestCase;
12+
13+
#[RunTestsInSeparateProcesses]
14+
class InvalidTransformerClassTest extends TestCase
15+
{
16+
public function testTransformerNotFound(): void
17+
{
18+
$this->expectException(TransformerNotFoundException::class);
19+
20+
TransformerDoesNotExistKernel::init(cacheDir: Util::CACHE_DIR);
21+
}
22+
23+
public function testTransformerDoesNotExtendTransformer(): void
24+
{
25+
$this->expectException(InvalidTransformerClassException::class);
26+
27+
TransformerDoesNotExtendTransformerKernel::init(cacheDir: Util::CACHE_DIR);
28+
}
29+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Functional\Workflow;
4+
5+
use Okapi\CodeTransformer\Exception\Transformer\SyntaxError;
6+
use Okapi\CodeTransformer\Service\CacheStateManager;
7+
use Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
8+
use Okapi\CodeTransformer\Tests\Stubs\Kernel\ApplicationKernel;
9+
use Okapi\CodeTransformer\Tests\Stubs\Transformer\StringTransformer;
10+
use Okapi\CodeTransformer\Tests\Util;
11+
use Okapi\Filesystem\Filesystem;
12+
use PHPUnit\Framework\Attributes\RunClassInSeparateProcess;
13+
use PHPUnit\Framework\TestCase;
14+
15+
#[RunClassInSeparateProcess]
16+
class ApplicationTest extends TestCase
17+
{
18+
public function testKernel(): void
19+
{
20+
Util::clearCache();
21+
22+
$this->assertFalse(ApplicationKernel::isInitialized());
23+
ApplicationKernel::init(cacheDir: Util::CACHE_DIR);
24+
$this->assertTrue(ApplicationKernel::isInitialized());
25+
}
26+
27+
public function testStringClass(): void
28+
{
29+
$stringClass = new ClassesToTransform\StringClass();
30+
$this->assertSame('Hello from Code Transformer!', $stringClass->test());
31+
32+
$file = __DIR__ . '/../../Stubs/ClassesToTransform/StringClass.php';
33+
$content = Filesystem::readFile($file);
34+
35+
$this->assertEquals($content, StringTransformer::$originalSourceCode);
36+
}
37+
38+
/**
39+
* True test in {@see CachedApplicationTest::testNoChangesClass()}
40+
*/
41+
public function testNoChangesClass(): void
42+
{
43+
/** @noinspection PhpUnusedLocalVariableInspection */
44+
$noChangesClass = new ClassesToTransform\NoChangesClass();
45+
46+
$this->expectNotToPerformAssertions();
47+
}
48+
49+
public function testSyntaxErrorClass(): void
50+
{
51+
$this->expectException(SyntaxError::class);
52+
53+
/** @noinspection PhpUnusedLocalVariableInspection */
54+
$syntaxErrorClass = new ClassesToTransform\SyntaxErrorClass();
55+
}
56+
57+
/**
58+
* True test in {@see CachedApplicationTest::testChangedClass()}
59+
*/
60+
public function testChangedClass(): void
61+
{
62+
/** @noinspection PhpUnusedLocalVariableInspection */
63+
$changedClass = new ClassesToTransform\ChangedClass();
64+
$this->assertSame('Hello from Code Transformer!', $changedClass->test());
65+
}
66+
67+
/**
68+
* True test in {@see CachedApplicationTest::testDeleteCacheFileClass()}
69+
*/
70+
public function testDeleteCacheFileClass(): void
71+
{
72+
$deleteCacheFileClass = new ClassesToTransform\DeleteCacheFileClass();
73+
$this->assertSame('Hello World!', $deleteCacheFileClass->test());
74+
}
75+
76+
public function testMultipleTransformers(): void
77+
{
78+
$multipleTransformersClass = new ClassesToTransform\MultipleTransformersClass();
79+
$this->assertSame('Hello from Code Transformer!', $multipleTransformersClass->test());
80+
$this->assertSame("You can't get me!", $multipleTransformersClass->privateProperty);
81+
}
82+
83+
public function testDestructor(): void
84+
{
85+
$cacheStateManager = CacheStateManager::getInstance();
86+
87+
$this->assertFileDoesNotExist(Util::CACHE_STATES_FILE);
88+
$cacheStateManager->__destruct();
89+
$this->assertFileExists(Util::CACHE_STATES_FILE);
90+
91+
$file = require Util::CACHE_STATES_FILE;
92+
93+
$key = 'CODE_TRANSFORMER_APP_DIR\\tests\\Stubs\\ClassesToTransform\\StringClass.php';
94+
$this->assertArrayHasKey($key, $file);
95+
$this->assertArrayHasKey('cachedFilePath', $file[$key]);
96+
$this->assertEquals('CODE_TRANSFORMER_APP_DIR\tests\cache\transformed\tests\Stubs\ClassesToTransform\StringClass.php', $file[$key]['cachedFilePath']);
97+
$this->assertArrayHasKey('transformedTime', $file[$key]);
98+
$this->assertIsInt($file[$key]['transformedTime']);
99+
$this->assertArrayHasKey('transformerFilePaths', $file[$key]);
100+
$this->assertIsArray($file[$key]['transformerFilePaths']);
101+
$this->assertGreaterThan(0, count($file[$key]['transformerFilePaths']));
102+
}
103+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Functional\Workflow;
4+
5+
use Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
6+
use Okapi\CodeTransformer\Tests\Util;
7+
use Okapi\Filesystem\Filesystem;
8+
use PHPUnit\Framework\TestCase;
9+
use Throwable;
10+
11+
/**
12+
* This test has to be run after ApplicationTest.
13+
*/
14+
class CachedApplicationTest extends TestCase
15+
{
16+
public function testKernel(): void
17+
{
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());
23+
24+
$this->assertFileExists(Util::CACHE_STATES_FILE);
25+
}
26+
27+
public function testCachedFile(): void
28+
{
29+
$cachedFilePath = Util::CACHE_DIR . '/transformed/tests/Stubs/ClassesToTransform/StringClass.php';
30+
31+
$this->assertFileExists($cachedFilePath);
32+
$file = Filesystem::readFile($cachedFilePath);
33+
34+
$this->assertStringContainsString('Hello from Code Transformer!', $file);
35+
$this->assertStringContainsString('$iAmAppended = true;', $file);
36+
}
37+
38+
public function testStringClass(): void
39+
{
40+
$stringClass = new ClassesToTransform\StringClass();
41+
$this->assertSame('Hello from Code Transformer!', $stringClass->test());
42+
}
43+
44+
public function testNoChangesClass(): void
45+
{
46+
/** @noinspection PhpUnusedLocalVariableInspection */
47+
$stringClass = new ClassesToTransform\StringClass();
48+
49+
$originalFilePath = __DIR__ . '/../../Stubs/ClassesToTransform/NoChangesClass.php';
50+
$cachedFilePath = Util::CACHE_DIR . '/transformed/tests/Stubs/ClassesToTransform/NoChangesClass.php';
51+
$this->assertFileExists($originalFilePath);
52+
$this->assertFileDoesNotExist($cachedFilePath);
53+
}
54+
55+
public function testChangedClass(): void
56+
{
57+
$originalFilePath = __DIR__ . '/../../Stubs/ClassesToTransform/ChangedClass.php';
58+
59+
$originalFileContent = Filesystem::readFile($originalFilePath);
60+
61+
$exception = null;
62+
try {
63+
$changedFileContent = str_replace(
64+
'Hello World!',
65+
'Hello Changed World!',
66+
$originalFileContent,
67+
);
68+
69+
Filesystem::writeFile($originalFilePath, $changedFileContent);
70+
71+
$changedClass = new ClassesToTransform\ChangedClass();
72+
$this->assertSame('Hello Changed World from Code Transformer!', $changedClass->test());
73+
} catch (Throwable $e) {
74+
$exception = $e;
75+
}
76+
77+
Filesystem::writeFile($originalFilePath, $originalFileContent);
78+
79+
if ($exception !== null) {
80+
/** @noinspection PhpUnhandledExceptionInspection */
81+
throw $exception;
82+
}
83+
}
84+
85+
public function testDeleteCacheFileClass(): void
86+
{
87+
$cachedFilePath = Util::CACHE_DIR . '/transformed/tests/Stubs/ClassesToTransform/DeleteCacheFileClass.php';
88+
89+
$this->assertFileExists($cachedFilePath);
90+
Filesystem::rm($cachedFilePath);
91+
$this->assertFileDoesNotExist($cachedFilePath);
92+
93+
$deleteCacheFileClass = new ClassesToTransform\DeleteCacheFileClass();
94+
$this->assertSame('Hello World!', $deleteCacheFileClass->test());
95+
96+
$this->assertFileExists($cachedFilePath);
97+
}
98+
99+
public function testClearCache(): void
100+
{
101+
Util::clearCache();
102+
103+
$this->expectNotToPerformAssertions();
104+
}
105+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class ChangedClass
6+
{
7+
public function test(): string
8+
{
9+
return 'Hello World!';
10+
}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class DeleteCacheFileClass
6+
{
7+
public function test(): string
8+
{
9+
return 'Hello World!';
10+
}
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/** @noinspection ALL */
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class MultipleTransformersClass
6+
{
7+
private string $privateProperty = "You can't get me!";
8+
9+
private function test(): string
10+
{
11+
return 'Hello World!';
12+
}
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class NoChangesClass
6+
{
7+
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class StringClass
6+
{
7+
public function test(): string
8+
{
9+
return 'Hello World!';
10+
}
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Tests\Stubs\ClassesToTransform;
4+
5+
class SyntaxErrorClass
6+
{
7+
8+
}

0 commit comments

Comments
 (0)