summaryrefslogtreecommitdiff
path: root/Zend/tests
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/tests')
-rw-r--r--Zend/tests/bug30922.phpt2
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload1.phpt37
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload2.phpt38
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload3.phpt45
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload4.phpt44
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload5.phpt60
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt (renamed from Zend/tests/type_declarations/variance/class_order_autoload.phpt)10
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt27
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt38
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt39
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt52
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt39
-rw-r--r--Zend/tests/type_declarations/variance/class_order_error.phpt (renamed from Zend/tests/type_declarations/variance/class_order.phpt)0
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