TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.8 KiB
93 lines
2.8 KiB
<?php
|
|
|
|
namespace TypePhp\Tests;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use TypePhp\CompilerTest;
|
|
|
|
class CompilerBaseAdapterTest extends TestCase
|
|
{
|
|
private string $testDir;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
$this->testDir = sys_get_temp_dir() . '/compiler_test_' . uniqid();
|
|
mkdir($this->testDir, 0777, true);
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
parent::tearDown();
|
|
if (is_dir($this->testDir)) {
|
|
// 递归删除测试目录
|
|
$this->removeDirectory($this->testDir);
|
|
}
|
|
}
|
|
|
|
private function removeDirectory(string $dir): void
|
|
{
|
|
if (!is_dir($dir)) {
|
|
return;
|
|
}
|
|
|
|
$files = array_diff(scandir($dir), ['.', '..']);
|
|
foreach ($files as $file) {
|
|
$path = $dir . DIRECTORY_SEPARATOR . $file;
|
|
is_dir($path) ? $this->removeDirectory($path) : unlink($path);
|
|
}
|
|
rmdir($dir);
|
|
}
|
|
|
|
/**
|
|
* 测试 CompilerBase 初始化新架构
|
|
*/
|
|
public function testCompilerBaseInitializesNewArchitecture(): void
|
|
{
|
|
$compiler = CompilerTest::create($this->testDir);
|
|
|
|
// 使用反射检查新架构是否已初始化
|
|
$reflection = new \ReflectionClass($compiler);
|
|
|
|
$platformProp = $reflection->getProperty('platform');
|
|
$platformProp->setAccessible(true);
|
|
$platform = $platformProp->getValue($compiler);
|
|
|
|
$backendProp = $reflection->getProperty('compilerBackend');
|
|
$backendProp->setAccessible(true);
|
|
$backend = $backendProp->getValue($compiler);
|
|
|
|
// 新架构应该被初始化(除非检测失败)
|
|
$this->assertNotNull($platform, 'Platform should be initialized');
|
|
$this->assertNotNull($backend, 'Backend should be initialized');
|
|
}
|
|
|
|
/**
|
|
* 测试平台检测方法一致性
|
|
*/
|
|
public function testPlatformDetectionConsistency(): void
|
|
{
|
|
$compiler = CompilerTest::create($this->testDir);
|
|
|
|
$reflection = new \ReflectionClass($compiler);
|
|
|
|
// 获取旧的 isWindows 方法
|
|
$isWindowsMethod = $reflection->getMethod('isWindows');
|
|
$isWindowsMethod->setAccessible(true);
|
|
$isWindowsOld = $isWindowsMethod->invoke($compiler);
|
|
|
|
// 获取新的 platform 属性
|
|
$platformProp = $reflection->getProperty('platform');
|
|
$platformProp->setAccessible(true);
|
|
$platform = $platformProp->getValue($compiler);
|
|
|
|
if ($platform !== null) {
|
|
$isWindowsNew = $platform instanceof \TypePhp\Platform\Windows;
|
|
|
|
// 新旧方法应该一致
|
|
$this->assertEquals($isWindowsOld, $isWindowsNew,
|
|
'Old and new platform detection should be consistent');
|
|
}
|
|
}
|
|
|
|
}
|
|
|