diff options
Diffstat (limited to 'Zend/tests')
13 files changed, 425 insertions, 6 deletions
diff --git a/Zend/tests/bug30922.phpt b/Zend/tests/bug30922.phpt index 0d5d8ae838..001845a7cb 100644 --- a/Zend/tests/bug30922.phpt +++ b/Zend/tests/bug30922.phpt @@ -10,4 +10,4 @@ var_dump($a instanceOf A); echo "ok\n"; ?> --EXPECTF-- -Fatal error: Interface 'RecurisiveFooFar' not found in %sbug30922.php on line %d +Fatal error: Interface RecurisiveFooFar cannot implement itself in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order_autoload1.phpt b/Zend/tests/type_declarations/variance/class_order_autoload1.phpt new file mode 100644 index 0000000000..d68d2e8afa --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload1.phpt @@ -0,0 +1,37 @@ +--TEST-- +Class order allowed with autoloading (1) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class === 'A') { + class A { + public function method() : B {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method() : C {} + } + var_dump(new B); + } else { + class C extends B { + } + var_dump(new C); + } +}); + +var_dump(new C); + +?> +===DONE=== +--EXPECT-- +object(A)#2 (0) { +} +object(B)#2 (0) { +} +object(C)#2 (0) { +} +object(C)#2 (0) { +} +===DONE=== diff --git a/Zend/tests/type_declarations/variance/class_order_autoload2.phpt b/Zend/tests/type_declarations/variance/class_order_autoload2.phpt new file mode 100644 index 0000000000..f6229d3995 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload2.phpt @@ -0,0 +1,38 @@ +--TEST-- +Class order allowed with autoloading (2) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class === 'A') { + class A { + public function method() : B {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method() : C {} + } + var_dump(new B); + } else { + class C extends B { + } + var_dump(new C); + } +}); + +// Same as autoload1 test case, but with a different autoloading root +var_dump(new B); + +?> +===DONE=== +--EXPECT-- +object(A)#2 (0) { +} +object(C)#2 (0) { +} +object(B)#2 (0) { +} +object(B)#2 (0) { +} +===DONE=== diff --git a/Zend/tests/type_declarations/variance/class_order_autoload3.phpt b/Zend/tests/type_declarations/variance/class_order_autoload3.phpt new file mode 100644 index 0000000000..d09f2a9c45 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload3.phpt @@ -0,0 +1,45 @@ +--TEST-- +Class order allowed with autoloading (3) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + class X { + public function method(): A {} + } + var_dump(new X); + } else if ($class == 'Y') { + class Y extends X { + public function method(): B {} + } + var_dump(new Y); + } +}); + +var_dump(new B); + +?> +===DONE=== +--EXPECT-- +object(A)#2 (0) { +} +object(X)#2 (0) { +} +object(Y)#2 (0) { +} +object(B)#2 (0) { +} +object(B)#2 (0) { +} +===DONE=== diff --git a/Zend/tests/type_declarations/variance/class_order_autoload4.phpt b/Zend/tests/type_declarations/variance/class_order_autoload4.phpt new file mode 100644 index 0000000000..37070b444c --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload4.phpt @@ -0,0 +1,44 @@ +--TEST-- +Class order allowed with autoloading (4) +--FILE-- +<?php + +// Same as autoload3 test case, but with X, Y being interfaces. +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + interface X { + public function method(): A; + } + var_dump(interface_exists('X')); + } else if ($class == 'Y') { + interface Y extends X { + public function method(): B; + } + var_dump(interface_exists('Y')); + } +}); + +var_dump(new B); + +?> +===DONE=== +--EXPECT-- +object(A)#2 (0) { +} +bool(true) +bool(true) +object(B)#2 (0) { +} +object(B)#2 (0) { +} +===DONE=== diff --git a/Zend/tests/type_declarations/variance/class_order_autoload5.phpt b/Zend/tests/type_declarations/variance/class_order_autoload5.phpt new file mode 100644 index 0000000000..77e9a0a9ec --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload5.phpt @@ -0,0 +1,60 @@ +--TEST-- +Class order allowed with autoloading (5) +--FILE-- +<?php + +// Similar to variance3, but one more class hierarchy in the cycle +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + class X { + public function method(): Q {} + } + var_dump(new X); + } else if ($class == 'Y') { + class Y extends X { + public function method(): R {} + } + var_dump(new Y); + } else if ($class == 'Q') { + class Q { + public function method(): A {} + } + var_dump(new Q); + } else if ($class == 'R') { + class R extends Q { + public function method(): B {} + } + var_dump(new R); + } +}); + +var_dump(new B); + +?> +===DONE=== +--EXPECT-- +object(A)#2 (0) { +} +object(X)#2 (0) { +} +object(Q)#2 (0) { +} +object(R)#2 (0) { +} +object(Y)#2 (0) { +} +object(B)#2 (0) { +} +object(B)#2 (0) { +} +===DONE=== diff --git a/Zend/tests/type_declarations/variance/class_order_autoload.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt index a4ea534577..9af4041604 100644 --- a/Zend/tests/type_declarations/variance/class_order_autoload.phpt +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt @@ -1,16 +1,16 @@ --TEST-- -Returns are covariant, but we don't allow the code due to class ordering (autoload variation) +Variance error in the presence of autoloading (1) --FILE-- <?php spl_autoload_register(function($class) { if ($class === 'A') { class A { - public function method() : B {} + public function method() : C {} } } else if ($class == 'B') { class B extends A { - public function method() : C {} + public function method() : B {} } } else { class C extends B { @@ -18,8 +18,8 @@ spl_autoload_register(function($class) { } }); -$c = new C; +$b = new B; ?> --EXPECTF-- -Fatal error: Could not check compatibility between B::method(): C and A::method(): B, because class C is not available in %s on line %d +Fatal error: Declaration of B::method(): B must be compatible with A::method(): C in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt new file mode 100644 index 0000000000..48d2e0b956 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt @@ -0,0 +1,27 @@ +--TEST-- +Variance error in the presence of autoloading (2) +--FILE-- +<?php + +// Same as autoload_error1, but for argument types. +spl_autoload_register(function($class) { + if ($class === 'A') { + class A { + public function method(B $x) {} + } + } else if ($class == 'B') { + class B extends A { + public function method(C $x) {} + } + } else { + class C extends B { + } + } +}); + +$b = new B; +$c = new C; + +?> +--EXPECTF-- +Warning: Declaration of B::method(C $x) should be compatible with A::method(B $x) in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt new file mode 100644 index 0000000000..23b60b4584 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt @@ -0,0 +1,38 @@ +--TEST-- +Variance error in the presence of autoloading (3) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + } else if ($class == 'X') { + class X { + public function method(): Q {} + } + } else if ($class == 'Y') { + class Y extends X { + public function method(): R {} + } + } else if ($class == 'Q') { + class Q { + public function method(): B {} + } + } else if ($class == 'R') { + class R extends Q { + public function method(): A {} + } + } +}); + +$b = new B; + +?> +--EXPECTF-- +Fatal error: Declaration of R::method(): A must be compatible with Q::method(): B in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt new file mode 100644 index 0000000000..6acf9313f4 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt @@ -0,0 +1,39 @@ +--TEST-- +Variance error in the presence of autoloading (4) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + class X { + public function method(): B {} + } + var_dump(new X); + } else if ($class == 'Y') { + class Y extends X { + public function method(): A {} + } + var_dump(new Y); + } +}); + +var_dump(new B); + +?> +--EXPECTF-- +object(A)#2 (0) { +} +object(X)#2 (0) { +} + +Fatal error: Declaration of Y::method(): A must be compatible with X::method(): B in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt new file mode 100644 index 0000000000..a6a46f84a2 --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt @@ -0,0 +1,52 @@ +--TEST-- +Variance error in the presence of autoloading (5) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + class X { + public function method(Y $a) {} + } + var_dump(new X); + } else if ($class == 'Y') { + class Y extends X { + public function method(Z $a) {} + } + var_dump(new Y); + } else if ($class == 'Z') { + class Z extends Y { + public function method($a) {} + } + var_dump(new Z); + } +}); + +var_dump(new B); + +?> +--EXPECTF-- +object(A)#2 (0) { +} +object(X)#2 (0) { +} + +Warning: Declaration of Y::method(Z $a) should be compatible with X::method(Y $a) in %s on line %d +object(Z)#2 (0) { +} +object(Y)#2 (0) { +} +object(B)#2 (0) { +} +object(B)#2 (0) { +} diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt new file mode 100644 index 0000000000..4b54c9554d --- /dev/null +++ b/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt @@ -0,0 +1,39 @@ +--TEST-- +Variance error in the presence of autoloading (6) +--FILE-- +<?php + +spl_autoload_register(function($class) { + if ($class == 'A') { + class A { + public function method(): X {} + } + var_dump(new A); + } else if ($class == 'B') { + class B extends A { + public function method(): Y {} + } + var_dump(new B); + } else if ($class == 'X') { + class X { + public function method(): X {} + } + var_dump(new X); + } else if ($class == 'Y') { + class Y extends X { + public function method(): Unknown {} + } + var_dump(new Y); + } +}); + +var_dump(new B); + +?> +--EXPECTF-- +object(A)#2 (0) { +} +object(X)#2 (0) { +} + +Fatal error: Could not check compatibility between Y::method(): Unknown and X::method(): X, because class Unknown is not available in %s on line %d diff --git a/Zend/tests/type_declarations/variance/class_order.phpt b/Zend/tests/type_declarations/variance/class_order_error.phpt index df66e78b78..df66e78b78 100644 --- a/Zend/tests/type_declarations/variance/class_order.phpt +++ b/Zend/tests/type_declarations/variance/class_order_error.phpt |
