test(aot): 添加AOT编译相关测试用例

- 添加对象克隆功能测试,验证clone关键字的正确性
- 添加复合赋值运算符测试,覆盖数组、对象属性等场景
- 添加exit/die语言结构测试,验证程序退出行为
- 添加嵌套闭包功能测试,验证闭包作用域和链式调用
pull/1/head
韩天峰 3 months ago
parent 33725b87d3
commit 184090ec84
  1. 35
      tests/aot/clone.phpt
  2. 62
      tests/aot/compound-assign.phpt
  3. 35
      tests/aot/exit-test.phpt
  4. 56
      tests/aot/nested-closures.phpt

@ -0,0 +1,35 @@
--TEST--
Clone keyword for object cloning
--FILE--
<?php
class Counter {
public int $value;
public function __construct(int $v) {
$this->value = $v;
}
public function increment(): void {
$this->value++;
}
}
function main() {
$original = new Counter(10);
$original->increment();
$cloned = clone $original;
$cloned->increment();
$cloned->increment();
var_dump($original->value);
var_dump($cloned->value);
var_dump($original->value !== $cloned->value);
}
?>
--EXPECT--
int(11)
int(13)
bool(true)

@ -0,0 +1,62 @@
--TEST--
Compound assignment in expressions
--FILE--
<?php
class Counter {
public int $val = 0;
}
function main() {
// Array dim fetch with assignment operators
$arr = [1, 2, 3];
$arr[0] += 10;
$arr[1] *= 3;
$arr[2] -= 1;
var_dump($arr);
// Property with assignment operators
$obj = new Counter();
$obj->val += 5;
$obj->val *= 2;
$obj->val -= 3;
$obj->val %= 4;
var_dump($obj->val);
// Chained assignments
$a = $b = $c = 10;
var_dump($a);
var_dump($b);
var_dump($c);
// Reference assignment
$y = 2;
$z = &$y;
$y = 5;
var_dump($z);
// Global variable with assignment
global $config;
$config = ["debug" => true];
var_dump($config["debug"]);
echo "done\n";
}
?>
--EXPECT--
array(3) {
[0]=>
int(11)
[1]=>
int(6)
[2]=>
int(2)
}
int(3)
int(10)
int(10)
int(10)
int(5)
bool(true)
done

@ -0,0 +1,35 @@
--TEST--
exit/die language constructs
--FILE--
<?php
function testExit(int $code): void {
if ($code > 0) {
echo "should not reach here\n";
}
echo "code is zero\n";
}
function processValue(mixed $val): string {
if (!is_string($val)) {
die("not a string");
}
return "string: " . $val;
}
function main() {
testExit(0);
$result = processValue("hello");
var_dump($result);
$status = 42;
$x = $status == 0 ? 'zero' : 'non-zero';
var_dump($x);
}
?>
--EXPECT--
code is zero
string(13) "string: hello"
string(8) "non-zero"

@ -0,0 +1,56 @@
--TEST--
Nested closures and closure scope
--FILE--
<?php
function makeMultiplier(int $factor): Closure {
return function (int $value) use ($factor): int {
return $value * $factor;
};
}
function makeAdder(int $base): Closure {
return function (int $value) use ($base): int {
return $value + $base;
};
}
function makeFormatter(string $prefix): Closure {
return function (string $name) use ($prefix): string {
return $prefix . ": " . $name;
};
}
function makeChain(int $x): Closure {
return function (int $y) use ($x): Closure {
return function (int $z) use ($x, $y): int {
return $x + $y + $z;
};
};
}
function main() {
$double = makeMultiplier(2);
$add5 = makeAdder(5);
var_dump($double(10));
var_dump($add5(10));
$result = $add5($double(3));
var_dump($result);
$format = makeFormatter("User");
var_dump($format("Alice"));
$chain = makeChain(1);
$chain2 = $chain(2);
var_dump($chain2(3));
}
?>
--EXPECT--
int(20)
int(15)
int(11)
string(11) "User: Alice"
int(6)
Loading…
Cancel
Save