test(compiler): 添加类方法重写顺序测试用例

- 创建 class-method-override-order.php 测试文件,包含子类先于父类定义的场景
- 实现 ClassMethodOverrideTest 类,验证编译器对类方法重写的双向递归处理
- 添加 testChildBeforeParentOverride 方法,测试父子类方法重写关系的正确识别
- 验证父类方法被正确标记为被子类覆盖的状态
- 确保子类方法未被错误标记为已覆盖状态
- 通过反射访问编译器内部的 classMethodOverride 属性进行断言验证
pull/1/head
韩天峰 3 months ago
parent f803a0fd41
commit 207bc6b48b
  1. 22
      phpunit/code/class-method-override-order.php
  2. 28
      phpunit/src/ClassMethodOverrideTest.php

@ -0,0 +1,22 @@
<?php
// 子类先于父类定义,测试 classMethodOverride 的双向递归是否正确
class ChildOverride extends ParentBase {
public function bar(): void {
echo "Child\n";
}
}
class ParentBase {
public function run(): void {
$this->bar();
}
public function bar(): void {
echo "Parent\n";
}
}
function main(): void {
$o = new ChildOverride();
$o->run();
}

@ -0,0 +1,28 @@
<?php
use PhpAot\Php\CompilerTest;
class ClassMethodOverrideTest extends \BaseTest
{
public function testChildBeforeParentOverride(): void
{
$compiler = CompilerTest::create(ROOT_PATH);
$testFile = __DIR__ . '/../code/class-method-override-order.php';
$compiler->addFiles([$testFile]);
$compiler->prepareFile($testFile);
$ref = new ReflectionClass($compiler);
$prop = $ref->getProperty('classMethodOverride');
$classMethodOverride = $prop->getValue($compiler);
$parentMethodLower = strtolower('ParentBase::bar');
$childMethodLower = strtolower('ChildOverride::bar');
$this->assertArrayHasKey($parentMethodLower, $classMethodOverride, 'ParentBase::bar should be registered');
$this->assertArrayHasKey($childMethodLower, $classMethodOverride, 'ChildOverride::bar should be registered');
// 父类方法应被标记为已被子类覆盖
$this->assertTrue($classMethodOverride[$parentMethodLower], 'ParentBase::bar should be marked as overridden by child');
// 子类方法未被覆盖
$this->assertFalse($classMethodOverride[$childMethodLower], 'ChildOverride::bar should not be marked as overridden');
}
}
Loading…
Cancel
Save