Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / class-loader / Tests / ClassCollectionLoaderTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\ClassLoader\Tests;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\ClassLoader\ClassCollectionLoader;
16 use Symfony\Component\ClassLoader\Tests\Fixtures\DeclaredClass;
17 use Symfony\Component\ClassLoader\Tests\Fixtures\WarmedClass;
18
19 require_once __DIR__.'/Fixtures/ClassesWithParents/GInterface.php';
20 require_once __DIR__.'/Fixtures/ClassesWithParents/CInterface.php';
21 require_once __DIR__.'/Fixtures/ClassesWithParents/B.php';
22 require_once __DIR__.'/Fixtures/ClassesWithParents/A.php';
23
24 class ClassCollectionLoaderTest extends TestCase
25 {
26     public function testTraitDependencies()
27     {
28         require_once __DIR__.'/Fixtures/deps/traits.php';
29
30         $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
31         $m = $r->getMethod('getOrderedClasses');
32         $m->setAccessible(true);
33
34         $ordered = $m->invoke(null, array('CTFoo'));
35
36         $this->assertEquals(
37             array('TD', 'TC', 'TB', 'TA', 'TZ', 'CTFoo'),
38             array_map(function ($class) { return $class->getName(); }, $ordered)
39         );
40
41         $ordered = $m->invoke(null, array('CTBar'));
42
43         $this->assertEquals(
44             array('TD', 'TZ', 'TC', 'TB', 'TA', 'CTBar'),
45             array_map(function ($class) { return $class->getName(); }, $ordered)
46         );
47     }
48
49     /**
50      * @dataProvider getDifferentOrders
51      */
52     public function testClassReordering(array $classes)
53     {
54         $expected = array(
55             'ClassesWithParents\\GInterface',
56             'ClassesWithParents\\CInterface',
57             'ClassesWithParents\\B',
58             'ClassesWithParents\\A',
59         );
60
61         $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
62         $m = $r->getMethod('getOrderedClasses');
63         $m->setAccessible(true);
64
65         $ordered = $m->invoke(null, $classes);
66
67         $this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
68     }
69
70     public function getDifferentOrders()
71     {
72         return array(
73             array(array(
74                 'ClassesWithParents\\A',
75                 'ClassesWithParents\\CInterface',
76                 'ClassesWithParents\\GInterface',
77                 'ClassesWithParents\\B',
78             )),
79             array(array(
80                 'ClassesWithParents\\B',
81                 'ClassesWithParents\\A',
82                 'ClassesWithParents\\CInterface',
83             )),
84             array(array(
85                 'ClassesWithParents\\CInterface',
86                 'ClassesWithParents\\B',
87                 'ClassesWithParents\\A',
88             )),
89             array(array(
90                 'ClassesWithParents\\A',
91             )),
92         );
93     }
94
95     /**
96      * @dataProvider getDifferentOrdersForTraits
97      */
98     public function testClassWithTraitsReordering(array $classes)
99     {
100         require_once __DIR__.'/Fixtures/ClassesWithParents/ATrait.php';
101         require_once __DIR__.'/Fixtures/ClassesWithParents/BTrait.php';
102         require_once __DIR__.'/Fixtures/ClassesWithParents/CTrait.php';
103         require_once __DIR__.'/Fixtures/ClassesWithParents/D.php';
104         require_once __DIR__.'/Fixtures/ClassesWithParents/E.php';
105
106         $expected = array(
107             'ClassesWithParents\\GInterface',
108             'ClassesWithParents\\CInterface',
109             'ClassesWithParents\\ATrait',
110             'ClassesWithParents\\BTrait',
111             'ClassesWithParents\\CTrait',
112             'ClassesWithParents\\B',
113             'ClassesWithParents\\A',
114             'ClassesWithParents\\D',
115             'ClassesWithParents\\E',
116         );
117
118         $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
119         $m = $r->getMethod('getOrderedClasses');
120         $m->setAccessible(true);
121
122         $ordered = $m->invoke(null, $classes);
123
124         $this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
125     }
126
127     public function getDifferentOrdersForTraits()
128     {
129         return array(
130             array(array(
131                 'ClassesWithParents\\E',
132                 'ClassesWithParents\\ATrait',
133             )),
134             array(array(
135                 'ClassesWithParents\\E',
136             )),
137         );
138     }
139
140     public function testFixClassWithTraitsOrdering()
141     {
142         require_once __DIR__.'/Fixtures/ClassesWithParents/CTrait.php';
143         require_once __DIR__.'/Fixtures/ClassesWithParents/F.php';
144         require_once __DIR__.'/Fixtures/ClassesWithParents/G.php';
145
146         $classes = array(
147             'ClassesWithParents\\F',
148             'ClassesWithParents\\G',
149         );
150
151         $expected = array(
152             'ClassesWithParents\\CTrait',
153             'ClassesWithParents\\F',
154             'ClassesWithParents\\G',
155         );
156
157         $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
158         $m = $r->getMethod('getOrderedClasses');
159         $m->setAccessible(true);
160
161         $ordered = $m->invoke(null, $classes);
162
163         $this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
164     }
165
166     /**
167      * @dataProvider getFixNamespaceDeclarationsData
168      */
169     public function testFixNamespaceDeclarations($source, $expected)
170     {
171         $this->assertEquals('<?php '.$expected, ClassCollectionLoader::fixNamespaceDeclarations('<?php '.$source));
172     }
173
174     public function getFixNamespaceDeclarationsData()
175     {
176         return array(
177             array("namespace;\nclass Foo {}\n", "namespace\n{\nclass Foo {}\n}"),
178             array("namespace Foo;\nclass Foo {}\n", "namespace Foo\n{\nclass Foo {}\n}"),
179             array("namespace   Bar ;\nclass Foo {}\n", "namespace Bar\n{\nclass Foo {}\n}"),
180             array("namespace Foo\Bar;\nclass Foo {}\n", "namespace Foo\Bar\n{\nclass Foo {}\n}"),
181             array("namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n", "namespace Foo\Bar\Bar\n{\nclass Foo {}\n}"),
182             array("namespace\n{\nclass Foo {}\n}\n", "namespace\n{\nclass Foo {}\n}"),
183         );
184     }
185
186     /**
187      * @dataProvider getFixNamespaceDeclarationsDataWithoutTokenizer
188      */
189     public function testFixNamespaceDeclarationsWithoutTokenizer($source, $expected)
190     {
191         ClassCollectionLoader::enableTokenizer(false);
192         $this->assertEquals('<?php '.$expected, ClassCollectionLoader::fixNamespaceDeclarations('<?php '.$source));
193         ClassCollectionLoader::enableTokenizer(true);
194     }
195
196     public function getFixNamespaceDeclarationsDataWithoutTokenizer()
197     {
198         return array(
199             array("namespace;\nclass Foo {}\n", "namespace\n{\nclass Foo {}\n}\n"),
200             array("namespace Foo;\nclass Foo {}\n", "namespace Foo\n{\nclass Foo {}\n}\n"),
201             array("namespace   Bar ;\nclass Foo {}\n", "namespace   Bar\n{\nclass Foo {}\n}\n"),
202             array("namespace Foo\Bar;\nclass Foo {}\n", "namespace Foo\Bar\n{\nclass Foo {}\n}\n"),
203             array("namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n", "namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n"),
204             array("\nnamespace\n{\nclass Foo {}\n\$namespace=123;}\n", "\nnamespace\n{\nclass Foo {}\n\$namespace=123;}\n"),
205         );
206     }
207
208     /**
209      * @expectedException \InvalidArgumentException
210      */
211     public function testUnableToLoadClassException()
212     {
213         if (is_file($file = sys_get_temp_dir().'/foo.php')) {
214             unlink($file);
215         }
216
217         ClassCollectionLoader::load(array('SomeNotExistingClass'), sys_get_temp_dir(), 'foo', false);
218     }
219
220     public function testCommentStripping()
221     {
222         if (is_file($file = __DIR__.'/bar.php')) {
223             unlink($file);
224         }
225         spl_autoload_register($r = function ($class) {
226             if (0 === strpos($class, 'Namespaced') || 0 === strpos($class, 'Pearlike_')) {
227                 @require_once __DIR__.'/Fixtures/'.str_replace(array('\\', '_'), '/', $class).'.php';
228             }
229         });
230
231         $strictTypes = defined('HHVM_VERSION') ? '' : "\nnamespace {require __DIR__.'/Fixtures/Namespaced/WithStrictTypes.php';}";
232
233         ClassCollectionLoader::load(
234             array('Namespaced\\WithComments', 'Pearlike_WithComments', 'Namespaced\\WithDirMagic', 'Namespaced\\WithFileMagic', 'Namespaced\\WithHaltCompiler', $strictTypes ? 'Namespaced\\WithStrictTypes' : 'Namespaced\\WithComments'),
235             __DIR__,
236             'bar',
237             false
238         );
239
240         spl_autoload_unregister($r);
241
242         $this->assertEquals(<<<'EOF'
243 namespace Namespaced
244 {
245 class WithComments
246 {
247 public static $loaded = true;
248 }
249 $string ='string should not be   modified {$string}';
250 $heredoc = (<<<HD
251
252
253 Heredoc should not be   modified {$string}
254
255
256 HD
257 );
258 $nowdoc =<<<'ND'
259
260
261 Nowdoc should not be   modified {$string}
262
263
264 ND
265 ;
266 }
267 namespace
268 {
269 class Pearlike_WithComments
270 {
271 public static $loaded = true;
272 }
273 }
274 namespace {require __DIR__.'/Fixtures/Namespaced/WithDirMagic.php';}
275 namespace {require __DIR__.'/Fixtures/Namespaced/WithFileMagic.php';}
276 namespace {require __DIR__.'/Fixtures/Namespaced/WithHaltCompiler.php';}
277 EOF
278             .$strictTypes,
279             str_replace(array("<?php \n", '\\\\'), array('', '/'), file_get_contents($file))
280         );
281
282         unlink($file);
283     }
284
285     public function testInline()
286     {
287         $this->assertTrue(class_exists(WarmedClass::class, true));
288
289         @unlink($cache = sys_get_temp_dir().'/inline.php');
290
291         $classes = array(WarmedClass::class);
292         $excluded = array(DeclaredClass::class);
293
294         ClassCollectionLoader::inline($classes, $cache, $excluded);
295
296         $this->assertSame(<<<'EOTXT'
297 <?php 
298 namespace Symfony\Component\ClassLoader\Tests\Fixtures
299 {
300 interface WarmedInterface
301 {
302 }
303 }
304 namespace Symfony\Component\ClassLoader\Tests\Fixtures
305 {
306 class WarmedClass extends DeclaredClass implements WarmedInterface
307 {
308 }
309 }
310 EOTXT
311             , file_get_contents($cache)
312         );
313
314         unlink($cache);
315     }
316 }