xref: /PHP-7.2/Zend/tests/bug72101.phpt (revision e433c23b)
1--TEST--
2Bug #72101 (crash on complex code)
3--FILE--
4<?php
5class PHPUnit_Framework_MockObject_Stub_ReturnCallback {
6    protected $callback;
7    public function __construct($callback) {
8        $this->callback = $callback;
9    }
10    public function invoke($invocation) {
11        return call_user_func_array($this->callback, $invocation->parameters);
12    }
13}
14
15class PHPUnit_Framework_MockObject_InvocationMocker {
16    protected $matchers = [];
17    public function addMatcher( $matcher) {
18        $this->matchers[] = $matcher;
19    }
20    public function invoke( $invocation) {
21        foreach ($this->matchers as $match) {
22            $match->invoked($invocation);
23        }
24    }
25}
26
27class PHPUnit_Framework_MockObject_Matcher {
28    public $stub = null;
29    public function invoked($invocation) {
30        return $this->stub->invoke($invocation);
31    }
32}
33
34class MethodCallbackByReference {
35    public function bar(&$a, &$b, $c) {
36        Legacy::bar($a, $b, $c);
37    }
38    public function callback(&$a, &$b, $c) {
39        $b = 1;
40    }
41}
42class PHPUnit_Framework_MockObject_Invocation_Static {
43    public $parameters;
44    public function __construct(array $parameters) {
45        $this->parameters = $parameters;
46    }
47}
48
49class Mock_MethodCallbackByReference_7b180d26 extends MethodCallbackByReference {
50    public $inv_mocker;
51    public function bar(&$a, &$b, $c) {
52        $arguments = array($a, $b, $c);
53        $result = $this->inv_mocker->invoke(
54            new PHPUnit_Framework_MockObject_Invocation_Static(
55                $arguments
56            )
57        );
58        return $result;
59    }
60}
61
62set_error_handler(function() {
63//    var_dump(func_get_args());
64    DoesNotExists::$nope = true;
65}, E_ALL | E_STRICT);
66
67$foo = new Mock_MethodCallbackByReference_7b180d26();
68$InvMocker = new PHPUnit_Framework_MockObject_InvocationMocker();
69$foo->inv_mocker = $InvMocker;
70$OuterMatcher = new PHPUnit_Framework_MockObject_Matcher();
71$InvMocker->addMatcher($OuterMatcher);
72$OuterMatcher->methodNameMatcher = null;
73$OuterMatcher->stub = new PHPUnit_Framework_MockObject_Stub_ReturnCallback([$foo, 'callback']);
74$a = $b = $c = 0;
75$foo->bar($a, $b, $c);
76--EXPECTF--
77Fatal error: Uncaught Error: Class 'DoesNotExists' not found in %sbug72101.php:61
78Stack trace:
79#0 %sbug72101.php(8): {closure}(2, 'Parameter 1 to ...', '%s', 8, Array)
80#1 %sbug72101.php(27): PHPUnit_Framework_MockObject_Stub_ReturnCallback->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static))
81#2 %sbug72101.php(19): PHPUnit_Framework_MockObject_Matcher->invoked(Object(PHPUnit_Framework_MockObject_Invocation_Static))
82#3 %sbug72101.php(52): PHPUnit_Framework_MockObject_InvocationMocker->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static))
83#4 %sbug72101.php(72): Mock_MethodCallbackByReference_7b180d26->bar(0, 0, 0)
84#5 {main}
85  thrown in %sbug72101.php on line 61
86