Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,8 @@ tmp-php.ini
/.idea/
/.vscode/
/.zed/
/.history/
/.lh/

# ------------------------------------------------------------------------------
# Additional test build files
Expand Down
20 changes: 20 additions & 0 deletions Zend/tests/defer/defer_001.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
Basic defer functionality
--FILE--
<?php
function test_basic_defer() {
echo "Start\n";

defer {
echo "Deferred\n";
}

echo "End\n";
}

test_basic_defer();
?>
--EXPECT--
Start
End
Deferred
28 changes: 28 additions & 0 deletions Zend/tests/defer/defer_002.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
Multiple defers execute in LIFO order
--FILE--
<?php
function test_multiple_defers() {
echo "Start\n";

defer {
echo "Defer 1\n";
}

echo "Middle\n";

defer {
echo "Defer 2\n";
}

echo "End\n";
}

test_multiple_defers();
?>
--EXPECT--
Start
Middle
End
Defer 2
Defer 1
23 changes: 23 additions & 0 deletions Zend/tests/defer/defer_003.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
Defer executes on return
--FILE--
<?php
function test_defer_on_return() {
echo "Start\n";

defer {
echo "Cleanup\n";
}

echo "Before return\n";
return "Result";
}

$result = test_defer_on_return();
echo "Got: $result\n";
?>
--EXPECT--
Start
Before return
Cleanup
Got: Result
21 changes: 21 additions & 0 deletions Zend/tests/defer/defer_004.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
--TEST--
Defer with variable access
--FILE--
<?php
function test_defer_with_variables() {
$file = "test.txt";
echo "Opening $file\n";

defer {
echo "Closing $file\n";
}

echo "Processing\n";
}

test_defer_with_variables();
?>
--EXPECT--
Opening test.txt
Processing
Closing test.txt
20 changes: 20 additions & 0 deletions Zend/tests/defer/defer_005.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
Defer executes on exception
--FILE--
<?php
function test() {
defer {
echo "Defer executed\n";
}
throw new Exception("Test exception");
}

try {
test();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Defer executed
Caught: Test exception
40 changes: 40 additions & 0 deletions Zend/tests/defer/defer_006.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
--TEST--
Defer with loops and early return
--FILE--
<?php
function test($n) {
echo "Test $n start\n";

defer {
echo "Defer for test $n\n";
}

for ($i = 0; $i < 5; $i++) {
echo "Loop $i\n";
if ($i == 2) {
return "Early return from $n";
}
}

return "Normal return from $n";
}

$result1 = test(1);
echo "Result: $result1\n";

$result2 = test(2);
echo "Result: $result2\n";
?>
--EXPECT--
Test 1 start
Loop 0
Loop 1
Loop 2
Defer for test 1
Result: Early return from 1
Test 2 start
Loop 0
Loop 1
Loop 2
Defer for test 2
Result: Early return from 2
34 changes: 34 additions & 0 deletions Zend/tests/defer/defer_007.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--TEST--
Defer with references and modifications
--FILE--
<?php
function test() {
$counter = 0;
echo "Initial counter: $counter\n";

defer {
global $counter;
$counter += 10;
echo "Defer 1: counter = $counter\n";
}

defer {
global $counter;
$counter += 5;
echo "Defer 2: counter = $counter\n";
}

$counter = 100;
echo "Modified counter: $counter\n";
}

$counter = 0;
test();
echo "Final counter: $counter\n";
?>
--EXPECT--
Initial counter: 0
Modified counter: 100
Defer 2: counter = 5
Defer 1: counter = 15
Final counter: 15
28 changes: 28 additions & 0 deletions Zend/tests/defer/defer_008.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
Multiple defers execute on exception in LIFO order
--FILE--
<?php
function test() {
defer {
echo "Defer 1\n";
}
defer {
echo "Defer 2\n";
}
defer {
echo "Defer 3\n";
}
throw new Exception("Test");
}

try {
test();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Defer 3
Defer 2
Defer 1
Caught: Test
28 changes: 28 additions & 0 deletions Zend/tests/defer/defer_009.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
Defer with nested function calls and exceptions
--FILE--
<?php
function inner() {
defer {
echo "Inner defer\n";
}
throw new Exception("Inner exception");
}

function outer() {
defer {
echo "Outer defer\n";
}
inner();
}

try {
outer();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Inner defer
Outer defer
Caught: Inner exception
23 changes: 23 additions & 0 deletions Zend/tests/defer/defer_010.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
Defer can access exception variable
--FILE--
<?php
function test() {
$value = "test value";

defer {
echo "Defer: $value\n";
}

throw new Exception("Test");
}

try {
test();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Defer: test value
Caught: Test
29 changes: 29 additions & 0 deletions Zend/tests/defer/defer_011.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
--TEST--
Defer executes even when exception thrown in loop
--FILE--
<?php
function test() {
defer {
echo "Defer executed\n";
}

for ($i = 0; $i < 5; $i++) {
echo "Loop $i\n";
if ($i == 2) {
throw new Exception("Loop exception");
}
}
}

try {
test();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Loop 0
Loop 1
Loop 2
Defer executed
Caught: Loop exception
22 changes: 22 additions & 0 deletions Zend/tests/defer/defer_012.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
Exception in defer block replaces original exception
--FILE--
<?php
function test() {
defer {
echo "Defer throwing new exception\n";
throw new Exception("Defer exception");
}

throw new Exception("Original exception");
}

try {
test();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
}
?>
--EXPECT--
Defer throwing new exception
Caught: Defer exception
40 changes: 40 additions & 0 deletions Zend/tests/defer/defer_013.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
--TEST--
Defer with recursive function calls
--FILE--
<?php
function factorial($n, $depth = 0) {
$indent = str_repeat(" ", $depth);
echo "{$indent}factorial($n) start\n";

defer {
$indent = str_repeat(" ", $depth);
echo "{$indent}factorial($n) defer\n";
}

if ($n <= 1) {
echo "{$indent}factorial($n) base case\n";
return 1;
}

$result = $n * factorial($n - 1, $depth + 1);
echo "{$indent}factorial($n) = $result\n";
return $result;
}

$result = factorial(4);
echo "Final result: $result\n";
?>
--EXPECT--
factorial(4) start
factorial(3) start
factorial(2) start
factorial(1) start
factorial(1) base case
factorial(1) defer
factorial(2) = 2
factorial(2) defer
factorial(3) = 6
factorial(3) defer
factorial(4) = 24
factorial(4) defer
Final result: 24
Loading
Loading