diff options
Diffstat (limited to 'Zend/tests/variadic')
| -rw-r--r-- | Zend/tests/variadic/adding_additional_optional_parameter.phpt | 17 | ||||
| -rw-r--r-- | Zend/tests/variadic/adding_additional_optional_parameter_error.phpt | 16 | ||||
| -rw-r--r-- | Zend/tests/variadic/basic.phpt | 57 | ||||
| -rw-r--r-- | Zend/tests/variadic/by_ref.phpt | 24 | ||||
| -rw-r--r-- | Zend/tests/variadic/by_ref_error.phpt | 12 | ||||
| -rw-r--r-- | Zend/tests/variadic/no_default_error.phpt | 10 | ||||
| -rw-r--r-- | Zend/tests/variadic/non_variadic_implements_variadic_error.phpt | 16 | ||||
| -rw-r--r-- | Zend/tests/variadic/only_last_error.phpt | 10 | ||||
| -rw-r--r-- | Zend/tests/variadic/optional_params.phpt | 49 | ||||
| -rw-r--r-- | Zend/tests/variadic/removing_parameter_error.phpt | 20 | ||||
| -rw-r--r-- | Zend/tests/variadic/typehint_error.phpt | 36 | ||||
| -rw-r--r-- | Zend/tests/variadic/typehint_suppressed_error.phpt | 33 | ||||
| -rw-r--r-- | Zend/tests/variadic/variadic_changed_byref_error.phpt | 16 | ||||
| -rw-r--r-- | Zend/tests/variadic/variadic_changed_typehint_error.phpt | 16 | ||||
| -rw-r--r-- | Zend/tests/variadic/variadic_implements_non_variadic.phpt | 17 |
15 files changed, 349 insertions, 0 deletions
diff --git a/Zend/tests/variadic/adding_additional_optional_parameter.phpt b/Zend/tests/variadic/adding_additional_optional_parameter.phpt new file mode 100644 index 0000000000..b4e797803d --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter.phpt @@ -0,0 +1,17 @@ +--TEST-- +It's possible to add additional optional arguments with matching signature +--FILE-- +<?php + +interface DB { + public function query($query, string ...$params); +} + +class MySQL implements DB { + public function query($query, string $extraParam = null, string ...$params) { } +} + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt new file mode 100644 index 0000000000..2f31d47dc6 --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Additional optional parameters must have a matching prototype +--FILE-- +<?php + +interface DB { + public function query($query, string ...$params); +} + +class MySQL implements DB { + public function query($query, int $extraParam = null, string ...$params) { } +} + +?> +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/basic.phpt b/Zend/tests/variadic/basic.phpt new file mode 100644 index 0000000000..810d4756aa --- /dev/null +++ b/Zend/tests/variadic/basic.phpt @@ -0,0 +1,57 @@ +--TEST-- +Basic variadic function +--FILE-- +<?php + +function test1(... $args) { + var_dump($args); +} + +test1(); +test1(1); +test1(1, 2, 3); + +function test2($arg1, $arg2, ...$args) { + var_dump($arg1, $arg2, $args); +} + +test2(1, 2); +test2(1, 2, 3); +test2(1, 2, 3, 4, 5); + +?> +--EXPECT-- +array(0) { +} +array(1) { + [0]=> + int(1) +} +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/by_ref.phpt b/Zend/tests/variadic/by_ref.phpt new file mode 100644 index 0000000000..e1635f4ecf --- /dev/null +++ b/Zend/tests/variadic/by_ref.phpt @@ -0,0 +1,24 @@ +--TEST-- +Variadic arguments with by-reference passing +--FILE-- +<?php + +function test(&... $args) { + $i = 0; + foreach ($args as &$arg) { + $arg = $i++; + } +} + +test(); +test($a); +var_dump($a); +test($b, $c, $d); +var_dump($b, $c, $d); + +?> +--EXPECT-- +int(0) +int(0) +int(1) +int(2) diff --git a/Zend/tests/variadic/by_ref_error.phpt b/Zend/tests/variadic/by_ref_error.phpt new file mode 100644 index 0000000000..7f21014146 --- /dev/null +++ b/Zend/tests/variadic/by_ref_error.phpt @@ -0,0 +1,12 @@ +--TEST-- +By-ref variadics enforce the reference +--FILE-- +<?php + +function test(&... $args) { } + +test(1); + +?> +--EXPECTF-- +Fatal error: Only variables can be passed by reference in %s on line %d diff --git a/Zend/tests/variadic/no_default_error.phpt b/Zend/tests/variadic/no_default_error.phpt new file mode 100644 index 0000000000..427ebed028 --- /dev/null +++ b/Zend/tests/variadic/no_default_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Variadic argument cannot have a default value +--FILE-- +<?php + +function test(...$args = 123) {} + +?> +--EXPECTF-- +Fatal error: Variadic parameter cannot have a default value in %s on line %d diff --git a/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt new file mode 100644 index 0000000000..f447837ca4 --- /dev/null +++ b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +It's not possible to turn a variadic function into a non-variadic one +--FILE-- +<?php + +interface DB { + public function query($query, ...$params); +} + +class MySQL implements DB { + public function query($query, $params) { } +} + +?> +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/only_last_error.phpt b/Zend/tests/variadic/only_last_error.phpt new file mode 100644 index 0000000000..ee6ff3f777 --- /dev/null +++ b/Zend/tests/variadic/only_last_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Only the last argument can be variadic +--FILE-- +<?php + +function test($foo, ...$bar, $baz) {} + +?> +--EXPECTF-- +Fatal error: Only the last parameter can be variadic in %s on line %d diff --git a/Zend/tests/variadic/optional_params.phpt b/Zend/tests/variadic/optional_params.phpt new file mode 100644 index 0000000000..ba965e538c --- /dev/null +++ b/Zend/tests/variadic/optional_params.phpt @@ -0,0 +1,49 @@ +--TEST-- +Optional parameter before variadic parameter +--FILE-- +<?php + +function fn($reqParam, $optParam = null, ...$params) { + var_dump($reqParam, $optParam, $params); +} + +fn(1); +fn(1, 2); +fn(1, 2, 3); +fn(1, 2, 3, 4); +fn(1, 2, 3, 4, 5); + +?> +--EXPECT-- +int(1) +NULL +array(0) { +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(2) { + [0]=> + int(3) + [1]=> + int(4) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/removing_parameter_error.phpt b/Zend/tests/variadic/removing_parameter_error.phpt new file mode 100644 index 0000000000..a189e5cf09 --- /dev/null +++ b/Zend/tests/variadic/removing_parameter_error.phpt @@ -0,0 +1,20 @@ +--TEST-- +It's not possible to remove required parameter before a variadic parameter +--FILE-- +<?php + +/* Theoretically this should be valid because it weakens the constraint, but + * PHP does not allow this (for non-variadics), so I'm not allowing it here, too, + * to stay consistent. */ + +interface DB { + public function query($query, ...$params); +} + +class MySQL implements DB { + public function query(...$params) { } +} + +?> +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/typehint_error.phpt b/Zend/tests/variadic/typehint_error.phpt new file mode 100644 index 0000000000..3006b99957 --- /dev/null +++ b/Zend/tests/variadic/typehint_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +Variadic arguments enforce typehints +--FILE-- +<?php + +function test(array... $args) { + var_dump($args); +} + +test(); +test([0], [1], [2]); +test([0], [1], 2); + +?> +--EXPECTF-- +array(0) { +} +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + array(1) { + [0]=> + int(2) + } +} + +Catchable fatal error: Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d diff --git a/Zend/tests/variadic/typehint_suppressed_error.phpt b/Zend/tests/variadic/typehint_suppressed_error.phpt new file mode 100644 index 0000000000..5048e1c1bb --- /dev/null +++ b/Zend/tests/variadic/typehint_suppressed_error.phpt @@ -0,0 +1,33 @@ +--TEST-- +Error suppression for typehints on variadic arguments works +--FILE-- +<?php + +function test(array... $args) { + var_dump($args); +} + +set_error_handler(function($errno, $errstr) { + var_dump($errstr); + return true; +}); + +test([0], [1], 2); + +?> +--EXPECTF-- +string(%d) "Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d and defined" +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + int(2) +} diff --git a/Zend/tests/variadic/variadic_changed_byref_error.phpt b/Zend/tests/variadic/variadic_changed_byref_error.phpt new file mode 100644 index 0000000000..14fb6ae5eb --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_byref_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Variadic arguments must have compatible passing modes +--FILE-- +<?php + +interface DB { + public function query($query, &...$params); +} + +class MySQL implements DB { + public function query($query, ...$params) { } +} + +?> +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, &...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_changed_typehint_error.phpt b/Zend/tests/variadic/variadic_changed_typehint_error.phpt new file mode 100644 index 0000000000..00df33a042 --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_typehint_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Typehints for variadic arguments have to be compatible +--FILE-- +<?php + +interface DB { + public function query($query, string ...$params); +} + +class MySQL implements DB { + public function query($query, int ...$params) { } +} + +?> +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_implements_non_variadic.phpt b/Zend/tests/variadic/variadic_implements_non_variadic.phpt new file mode 100644 index 0000000000..a66ec280b8 --- /dev/null +++ b/Zend/tests/variadic/variadic_implements_non_variadic.phpt @@ -0,0 +1,17 @@ +--TEST-- +A non-variadic function can be turned into a variadic one +--FILE-- +<?php + +interface DB { + public function query($query); +} + +class MySQL implements DB { + public function query($query, ...$params) { } +} + +?> +===DONE=== +--EXPECT-- +===DONE=== |
