11
11
12
12
namespace Symfony \Bridge \PhpUnit ;
13
13
14
+ use PHPUnit \Framework \TestResult ;
15
+ use PHPUnit \Util \ErrorHandler ;
16
+
14
17
/**
15
18
* Catch deprecation notices and print a summary report at the end of the test suite.
16
19
*
@@ -23,6 +26,7 @@ class DeprecationErrorHandler
23
26
const MODE_DISABLED = 'disabled ' ;
24
27
25
28
private static $ isRegistered = false ;
29
+ private static $ isAtLeastPhpUnit83 ;
26
30
27
31
/**
28
32
* Registers and configures the deprecation handler.
@@ -44,6 +48,7 @@ public static function register($mode = 0)
44
48
}
45
49
46
50
$ UtilPrefix = class_exists ('PHPUnit_Util_ErrorHandler ' ) ? 'PHPUnit_Util_ ' : 'PHPUnit\Util \\' ;
51
+ self ::$ isAtLeastPhpUnit83 = method_exists ('PHPUnit\Util\ErrorHandler ' , '__invoke ' );
47
52
48
53
$ getMode = function () use ($ mode ) {
49
54
static $ memoizedMode = false ;
@@ -106,9 +111,7 @@ public static function register($mode = 0)
106
111
);
107 112
$ deprecationHandler = function ($ type , $ msg , $ file , $ line , $ context = array ()) use (&$ deprecations , $ getMode , $ UtilPrefix , $ inVendors ) {
108
113
if ((E_USER_DEPRECATED !== $ type && E_DEPRECATED !== $ type ) || DeprecationErrorHandler::MODE_DISABLED === $ mode = $ getMode ()) {
109
- $ ErrorHandler = $ UtilPrefix .'ErrorHandler ' ;
110
-
111
- return $ ErrorHandler ::handleError ($ type , $ msg , $ file , $ line , $ context );
114
+ return \call_user_func (DeprecationErrorHandler::getPhpUnitErrorHandler (), $ type , $ msg , $ file , $ line , $ context );
112
115
}
113
116
114
117
$ trace = debug_backtrace ();
@@ -183,7 +186,7 @@ public static function register($mode = 0)
183
186
184
187
if (null !== $ oldErrorHandler ) {
185
188
restore_error_handler ();
186
- if (array ($ UtilPrefix .'ErrorHandler ' , 'handleError ' ) === $ oldErrorHandler ) {
189
+ if ($ oldErrorHandler instanceof ErrorHandler || array ($ UtilPrefix .'ErrorHandler ' , 'handleError ' ) === $ oldErrorHandler ) {
187
190
restore_error_handler ();
188
191
self ::register ($ mode );
189
192
}
@@ -285,12 +288,8 @@ public static function collectDeprecations($outputFile)
285
288
if ($ previousErrorHandler ) {
286
289
return $ previousErrorHandler ($ type , $ msg , $ file , $ line , $ context );
287
290
}
288
- static $ autoload = true ;
289
291
290
- $ ErrorHandler = class_exists ('PHPUnit_Util_ErrorHandler ' , $ autoload ) ? 'PHPUnit_Util_ErrorHandler ' : 'PHPUnit\Util\ErrorHandler ' ;
291
- $ autoload = false ;
292
-
293
- return $ ErrorHandler ::handleError ($ type , $ msg , $ file , $ line , $ context );
292
+ return \call_user_func (DeprecationErrorHandler::getPhpUnitErrorHandler (), $ type , $ msg , $ file , $ line , $ context );
294
293
}
295
294
$ deprecations [] = array (error_reporting (), $ msg , $ file );
296
295
});
@@ -300,6 +299,29 @@ public static function collectDeprecations($outputFile)
300
299
});
301
300
}
302
301
302
+ /**
303
+ * @internal
304
+ */
305
+ public static function getPhpUnitErrorHandler ()
306
+ {
307
+ if (!self ::$ isAtLeastPhpUnit83 ) {
308
+ return (class_exists ('PHPUnit_Util_ErrorHandler ' , false ) ? 'PHPUnit_Util_ ' : 'PHPUnit\Util \\' ).'ErrorHandler::handleError ' ;
309
+ }
310
+
311
+ foreach (debug_backtrace (DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS ) as $ frame ) {
312
+ if (isset ($ frame ['object ' ]) && $ frame ['object ' ] instanceof TestResult) {
313
+ return new ErrorHandler (
314
+ $ frame ['object ' ]->getConvertDeprecationsToExceptions (),
315
+ $ frame ['object ' ]->getConvertErrorsToExceptions (),
316
+ $ frame ['object ' ]->getConvertNoticesToExceptions (),
317
+ $ frame ['object ' ]->getConvertWarningsToExceptions ()
318
+ );
319
+ }
320
+ }
321
+
322
+ return function () { return false ; };
323
+ }
324
+
303
325
/**
304
326
* Returns true if STDOUT is defined and supports colorization.
305
327
*
0 commit comments