Yaffs site version 1.1
[yaffs-website] / vendor / symfony / class-loader / Tests / ClassLoaderTest.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\ClassLoader;
16
17 class ClassLoaderTest extends TestCase
18 {
19     public function testGetPrefixes()
20     {
21         $loader = new ClassLoader();
22         $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
23         $loader->addPrefix('Bar', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
24         $loader->addPrefix('Bas', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
25         $prefixes = $loader->getPrefixes();
26         $this->assertArrayHasKey('Foo', $prefixes);
27         $this->assertArrayNotHasKey('Foo1', $prefixes);
28         $this->assertArrayHasKey('Bar', $prefixes);
29         $this->assertArrayHasKey('Bas', $prefixes);
30     }
31
32     public function testGetFallbackDirs()
33     {
34         $loader = new ClassLoader();
35         $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
36         $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
37         $fallback_dirs = $loader->getFallbackDirs();
38         $this->assertCount(2, $fallback_dirs);
39     }
40
41     /**
42      * @dataProvider getLoadClassTests
43      */
44     public function testLoadClass($className, $testClassName, $message)
45     {
46         $loader = new ClassLoader();
47         $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
48         $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
49         $loader->loadClass($testClassName);
50         $this->assertTrue(class_exists($className), $message);
51     }
52
53     public function getLoadClassTests()
54     {
55         return array(
56             array('\\Namespaced2\\Foo', 'Namespaced2\\Foo',   '->loadClass() loads Namespaced2\Foo class'),
57             array('\\Pearlike2_Foo',    'Pearlike2_Foo',      '->loadClass() loads Pearlike2_Foo class'),
58         );
59     }
60
61     /**
62      * @dataProvider getLoadNonexistentClassTests
63      */
64     public function testLoadNonexistentClass($className, $testClassName, $message)
65     {
66         $loader = new ClassLoader();
67         $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
68         $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
69         $loader->loadClass($testClassName);
70         $this->assertFalse(class_exists($className), $message);
71     }
72
73     public function getLoadNonexistentClassTests()
74     {
75         return array(
76             array('\\Pearlike3_Bar', '\\Pearlike3_Bar', '->loadClass() loads non existing Pearlike3_Bar class with a leading slash'),
77         );
78     }
79
80     public function testAddPrefixSingle()
81     {
82         $loader = new ClassLoader();
83         $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
84         $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
85         $prefixes = $loader->getPrefixes();
86         $this->assertArrayHasKey('Foo', $prefixes);
87         $this->assertCount(1, $prefixes['Foo']);
88     }
89
90     public function testAddPrefixesSingle()
91     {
92         $loader = new ClassLoader();
93         $loader->addPrefixes(array('Foo' => array('foo', 'foo')));
94         $loader->addPrefixes(array('Foo' => array('foo')));
95         $prefixes = $loader->getPrefixes();
96         $this->assertArrayHasKey('Foo', $prefixes);
97         $this->assertCount(1, $prefixes['Foo'], print_r($prefixes, true));
98     }
99
100     public function testAddPrefixMulti()
101     {
102         $loader = new ClassLoader();
103         $loader->addPrefix('Foo', 'foo');
104         $loader->addPrefix('Foo', 'bar');
105         $prefixes = $loader->getPrefixes();
106         $this->assertArrayHasKey('Foo', $prefixes);
107         $this->assertCount(2, $prefixes['Foo']);
108         $this->assertContains('foo', $prefixes['Foo']);
109         $this->assertContains('bar', $prefixes['Foo']);
110     }
111
112     public function testUseIncludePath()
113     {
114         $loader = new ClassLoader();
115         $this->assertFalse($loader->getUseIncludePath());
116
117         $this->assertNull($loader->findFile('Foo'));
118
119         $includePath = get_include_path();
120
121         $loader->setUseIncludePath(true);
122         $this->assertTrue($loader->getUseIncludePath());
123
124         set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);
125
126         $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'includepath'.DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));
127
128         set_include_path($includePath);
129     }
130
131     /**
132      * @dataProvider getLoadClassFromFallbackTests
133      */
134     public function testLoadClassFromFallback($className, $testClassName, $message)
135     {
136         $loader = new ClassLoader();
137         $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
138         $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
139         $loader->addPrefix('', array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'));
140         $loader->loadClass($testClassName);
141         $this->assertTrue(class_exists($className), $message);
142     }
143
144     public function getLoadClassFromFallbackTests()
145     {
146         return array(
147             array('\\Namespaced2\\Baz',    'Namespaced2\\Baz',    '->loadClass() loads Namespaced2\Baz class'),
148             array('\\Pearlike2_Baz',       'Pearlike2_Baz',       '->loadClass() loads Pearlike2_Baz class'),
149             array('\\Namespaced2\\FooBar', 'Namespaced2\\FooBar', '->loadClass() loads Namespaced2\Baz class from fallback dir'),
150             array('\\Pearlike2_FooBar',    'Pearlike2_FooBar',    '->loadClass() loads Pearlike2_Baz class from fallback dir'),
151         );
152     }
153
154     /**
155      * @dataProvider getLoadClassNamespaceCollisionTests
156      */
157     public function testLoadClassNamespaceCollision($namespaces, $className, $message)
158     {
159         $loader = new ClassLoader();
160         $loader->addPrefixes($namespaces);
161
162         $loader->loadClass($className);
163         $this->assertTrue(class_exists($className), $message);
164     }
165
166     public function getLoadClassNamespaceCollisionTests()
167     {
168         return array(
169             array(
170                 array(
171                     'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
172                     'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
173                 ),
174                 'NamespaceCollision\C\Foo',
175                 '->loadClass() loads NamespaceCollision\C\Foo from alpha.',
176             ),
177             array(
178                 array(
179                     'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
180                     'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
181                 ),
182                 'NamespaceCollision\C\Bar',
183                 '->loadClass() loads NamespaceCollision\C\Bar from alpha.',
184             ),
185             array(
186                 array(
187                     'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
188                     'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
189                 ),
190                 'NamespaceCollision\C\B\Foo',
191                 '->loadClass() loads NamespaceCollision\C\B\Foo from beta.',
192             ),
193             array(
194                 array(
195                     'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
196                     'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
197                 ),
198                 'NamespaceCollision\C\B\Bar',
199                 '->loadClass() loads NamespaceCollision\C\B\Bar from beta.',
200             ),
201             array(
202                 array(
203                     'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
204                     'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
205                 ),
206                 'PrefixCollision_C_Foo',
207                 '->loadClass() loads PrefixCollision_C_Foo from alpha.',
208             ),
209             array(
210                 array(
211                     'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
212                     'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
213                 ),
214                 'PrefixCollision_C_Bar',
215                 '->loadClass() loads PrefixCollision_C_Bar from alpha.',
216             ),
217             array(
218                 array(
219                     'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
220                     'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
221                 ),
222                 'PrefixCollision_C_B_Foo',
223                 '->loadClass() loads PrefixCollision_C_B_Foo from beta.',
224             ),
225             array(
226                 array(
227                     'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
228                     'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
229                 ),
230                 'PrefixCollision_C_B_Bar',
231                 '->loadClass() loads PrefixCollision_C_B_Bar from beta.',
232             ),
233         );
234     }
235 }