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
22 changes: 22 additions & 0 deletions Zend/tests/context_managers/basic.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
using() calls enter and exit
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager() as $value) {
echo "In using() block\n";
var_dump($value);
}

echo "After using() block\n";

?>
--EXPECTF--
Manager::enterContext()
In using() block
object(stdClass)#%d (0) {
}
Manager::exitContext(null)
After using() block
22 changes: 22 additions & 0 deletions Zend/tests/context_managers/basic_manager.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

class Manager implements ContextManager
{
public function __construct(private bool $rethrow = true)
{
}

public function enterContext(): mixed
{
echo __METHOD__, "()\n";
return new stdClass;
}

public function exitContext(?\Throwable $e = null): ?bool
{
echo __METHOD__, "(", ($e ? get_class($e) . '(' . $e->getMessage() . ')' : 'null'), ")\n";
return !$this->rethrow;
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
'break' in using() jumps out of the block, considered a success
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager() as $value) {
echo "In using() block\n";
break;
echo "Not executed\n";
var_dump($value);
}

echo "After using() block\n";

?>
--EXPECT--
Manager::enterContext()
In using() block
Manager::exitContext(null)
After using() block
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
'continue' in using() jumps out of the block, considered a success, warns like 'switch'
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager() as $value) {
echo "In using() block\n";
continue;
echo "Not executed\n";
var_dump($value);
}

echo "After using() block\n";

?>
--EXPECTF--
Warning: "continue" targeting using is equivalent to "break" in %s on line %d
Manager::enterContext()
In using() block
Manager::exitContext(null)
After using() block
23 changes: 23 additions & 0 deletions Zend/tests/context_managers/exitContext_can_swallow_exception.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
using() does not rethrow exception when exitContext() returns true
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager(false) as $value) {
echo "In using() block\n";
var_dump($value);
throw new Exception('exception in using block');
}

echo "After using() block\n";

?>
--EXPECTF--
Manager::enterContext()
In using() block
object(stdClass)#%d (0) {
}
Manager::exitContext(Exception(exception in using block))
After using() block
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
'goto' in using() jumps out of the block, considered a success
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager() as $value) {
echo "In using() block\n";
goto out;
echo "Not executed\n";
var_dump($value);
}
out:

echo "After using() block\n";

?>
--EXPECT--
Manager::enterContext()
In using() block
Manager::exitContext(null)
After using() block
38 changes: 38 additions & 0 deletions Zend/tests/context_managers/using_restores_cv_001.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
using() restores CV
--FILE--
<?php

require 'basic_manager.inc';

class A {}

$value = new A;
$value2 = $value;

echo "# \$value before using():\n";
var_dump($value);

using (new Manager() as $value) {
echo "# \$value in using():\n";
var_dump($value);
}

echo "# \$value after using():\n";
var_dump($value);
var_dump($value === $value2);

?>
--EXPECTF--
# $value before using():
object(A)#%d (0) {
}
Manager::enterContext()
# $value in using():
object(stdClass)#%d (0) {
}
Manager::exitContext(null)
# $value after using():
object(A)#%d (0) {
}
bool(true)
24 changes: 24 additions & 0 deletions Zend/tests/context_managers/using_restores_cv_002.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
--TEST--
using() restores CV iff it was set
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager() as $value) {
var_dump($value);
}

echo "\$value is set after using():\n";
var_dump(isset($value));
var_dump(array_key_exists('value', get_defined_vars()));

?>
--EXPECTF--
Manager::enterContext()
object(stdClass)#%d (0) {
}
Manager::exitContext(null)
$value is set after using():
bool(false)
bool(false)
44 changes: 44 additions & 0 deletions Zend/tests/context_managers/using_restores_cv_003.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
--TEST--
using() restores CV and preserves references
--FILE--
<?php

require 'basic_manager.inc';

class A {}
class B {}

$value = new A;
$value2 = &$value;

echo "# \$value before using():\n";
var_dump($value);

using (new Manager() as $value) {
echo "# \$value in using():\n";
var_dump($value);
$value = null;
}

echo "# \$value after using():\n";
var_dump($value);
$value = new B;

echo "# \$value2 references \$value:\n";
var_dump($value2 === $value);

?>
--EXPECTF--
# $value before using():
object(A)#%d (0) {
}
Manager::enterContext()
# $value in using():
object(stdClass)#%d (0) {
}
Manager::exitContext(null)
# $value after using():
object(A)#%d (0) {
}
# $value2 references $value:
bool(true)
19 changes: 19 additions & 0 deletions Zend/tests/context_managers/variable_is_optional.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--TEST--
Variable on the rhs of 'as' is optional
--FILE--
<?php

require 'basic_manager.inc';

using (new Manager()) {
echo "In using() block\n";
}

echo "After using() block\n";

?>
--EXPECT--
Manager::enterContext()
In using() block
Manager::exitContext(null)
After using() block
20 changes: 20 additions & 0 deletions Zend/tests/context_managers/with_boxes_resources.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
using() boxes resources in ResourceContextManager
--FILE--
<?php

$fd = fopen("php://memory", "r");
using ($fd as $value) {
echo "In using() block\n";
var_dump($value);
}

echo "After using() block\n";
var_dump($fd);

?>
--EXPECTF--
In using() block
resource(%d) of type (stream)
After using() block
resource(%d) of type (Unknown)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
using() calls exitContext($exception) on exception and re-throws by default
--FILE--
<?php

require 'basic_manager.inc';

try {
using (new Manager() as $value) {
echo "In using() block\n";
var_dump($value);
throw new Exception('exception in using block');
}
} catch (Exception $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}

echo "After using() block\n";

?>
--EXPECTF--
Manager::enterContext()
In using() block
object(stdClass)#%d (0) {
}
Manager::exitContext(Exception(exception in using block))
Exception: exception in using block
After using() block
28 changes: 28 additions & 0 deletions Zend/tests/context_managers/with_handles_throwable.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
using() handles Throwable
--FILE--
<?php

require 'basic_manager.inc';

try {
using (new Manager() as $value) {
echo "In using() block\n";
var_dump($value);
throw new Error('error in using block');
}
} catch (Error $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}

echo "After using() block\n";

?>
--EXPECTF--
Manager::enterContext()
In using() block
object(stdClass)#%d (0) {
}
Manager::exitContext(Error(error in using block))
Error: error in using block
After using() block
22 changes: 22 additions & 0 deletions Zend/tests/context_managers/with_keyword_is_semi_reserved.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
'using' keyword is semi reserved
--FILE--
<?php

class Test {
const WITH = 1;
public $using;
function using ($using) {}
}

$using = 1;

// Not allowed:
// function using() {}
// class using {}
// const WITH = 1;

?>
==DONE==
--EXPECT--
==DONE==
Loading