11
11
12
12
namespace Symfony \Component \Debug \Tests ;
13
13
14
+ use Symfony \Component \ClassLoader \MapClassLoader ;
14
15
use Symfony \Component \Debug \DebugClassLoader ;
15
16
use Symfony \Component \Debug \ErrorHandler ;
17
+ use Symfony \Component \Debug \Tests \Fixtures ;
16
18
17
19
class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
18
20
{
@@ -267,39 +269,62 @@ class_exists('Test\\'.__NAMESPACE__.'\\Float', true);
267
269
268
270
$ this ->assertSame ($ xError , $ lastError );
269
271
}
272
+
273
+ public function testExtendedFinalClass ()
274
+ {
275
+ set_error_handler (function () { return false ; });
276
+ $ e = error_reporting (0 );
277
+ trigger_error ('' , E_USER_NOTICE );
278
+
279
+ class_exists ('Test \\' .__NAMESPACE__ .'\\ExtendsFinalClass ' , true );
280
+
281
+ error_reporting ($ e );
282
+ restore_error_handler ();
283
+
284
+ $ lastError = error_get_last ();
285
+ unset($ lastError ['file ' ], $ lastError ['line ' ]);
286
+
287
+ $ xError = array (
288
+ 'type ' => E_USER_DEPRECATED ,
289
+ 'message ' => sprintf ('Extending the class %s in Test\Symfony\Component\Debug\Tests\ExtendsFinalClass is deprecated and may break in the next major release. ' , Fixtures \FinalClass::class),
290
+ );
291
+
292
+ $ this ->assertSame ($ xError , $ lastError );
293
+ }
270
294
}
271
295
272
296
class ClassLoader
273
297
{
274
- public function loadClass ($ class )
298
+ private $ mapLoader ;
299
+
300
+ public function __construct ()
275
301
{
302
+ $ map = array (
303
+ Fixtures \CaseMismatch::class => 'CaseMismatch.php ' ,
304
+ Fixtures \Psr4CaseMismatch::class => 'psr4 ' .DIRECTORY_SEPARATOR .'Psr4CaseMismatch.php ' ,
305
+ Fixtures \NotPSR0::class => 'reallyNotPsr0.php ' ,
306
+ Fixtures \NotPSR0bis::class => 'notPsr0Bis.php ' ,
307
+ Fixtures \DeprecatedInterface::class => 'DeprecatedInterface.php ' ,
308
+ Fixtures \FinalClass::class => 'FinalClass.php ' ,
309
+ );
310
+ array_walk ($ map , function (&$ file ) {
311
+ $ file = __DIR__ .DIRECTORY_SEPARATOR .'Fixtures ' .DIRECTORY_SEPARATOR .$ file ;
312
+ });
313
+ $ this ->mapLoader = new MapClassLoader ($ map );
276
314
}
277
315
278
- public function getClassMap ( )
316
+ public function loadClass ( $ class )
279
317
{
280
- return array (__NAMESPACE__ .'\Fixtures\NotPSR0bis ' => __DIR__ .'/Fixtures/notPsr0Bis.php ' );
281
318
}
282
319
283
320
public function findFile ($ class )
284
321
{
285
- $ fixtureDir = __DIR__ .DIRECTORY_SEPARATOR .'Fixtures ' .DIRECTORY_SEPARATOR ;
286
-
287
322
if (__NAMESPACE__ .'\TestingUnsilencing ' === $ class ) {
288
323
eval ('-- parse error -- ' );
289
324
} elseif (__NAMESPACE__ .'\TestingStacking ' === $ class ) {
290
325
eval ('namespace ' .__NAMESPACE__ .'; class TestingStacking { function foo() {} } ' );
291
326
} elseif (__NAMESPACE__ .'\TestingCaseMismatch ' === $ class ) {
292
327
eval ('namespace ' .__NAMESPACE__ .'; class TestingCaseMisMatch {} ' );
293
- } elseif (__NAMESPACE__ .'\Fixtures\CaseMismatch ' === $ class ) {
294
- return $ fixtureDir .'CaseMismatch.php ' ;
295
- } elseif (__NAMESPACE__ .'\Fixtures\Psr4CaseMismatch ' === $ class ) {
296
- return $ fixtureDir .'psr4 ' .DIRECTORY_SEPARATOR .'Psr4CaseMismatch.php ' ;
297
- } elseif (__NAMESPACE__ .'\Fixtures\NotPSR0 ' === $ class ) {
298
- return $ fixtureDir .'reallyNotPsr0.php ' ;
299
- } elseif (__NAMESPACE__ .'\Fixtures\NotPSR0bis ' === $ class ) {
300
- return $ fixtureDir .'notPsr0Bis.php ' ;
301
- } elseif (__NAMESPACE__ .'\Fixtures\DeprecatedInterface ' === $ class ) {
302
- return $ fixtureDir .'DeprecatedInterface.php ' ;
303
328
} elseif ('Symfony\Bridge\Debug\Tests\Fixtures\ExtendsDeprecatedParent ' === $ class ) {
304
329
eval ('namespace Symfony\Bridge\Debug\Tests\Fixtures; class ExtendsDeprecatedParent extends \\' .__NAMESPACE__ .'\Fixtures\DeprecatedClass {} ' );
305
330
} elseif ('Test \\' .__NAMESPACE__ .'\DeprecatedParentClass ' === $ class ) {
@@ -310,6 +335,10 @@ public function findFile($class)
310
335
eval ('namespace Test \\' .__NAMESPACE__ .'; class NonDeprecatedInterfaceClass implements \\' .__NAMESPACE__ .'\Fixtures\NonDeprecatedInterface {} ' );
311
336
} elseif ('Test \\' .__NAMESPACE__ .'\Float ' === $ class ) {
312
337
eval ('namespace Test \\' .__NAMESPACE__ .'; class Float {} ' );
338
+ } elseif ('Test \\' .__NAMESPACE__ .'\ExtendsFinalClass ' === $ class ) {
339
+ eval ('namespace Test \\' .__NAMESPACE__ .'; class ExtendsFinalClass extends \\' .__NAMESPACE__ .'\Fixtures\FinalClass {} ' );
340
+ } else {
341
+ return $ this ->mapLoader ->findFile ($ class );
313
342
}
314
343
}
315
344
}
0 commit comments