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