4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\ClassLoader\Tests;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\ClassLoader\ClassLoader;
17 class ClassLoaderTest extends TestCase
19 public function testGetPrefixes()
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);
32 public function testGetFallbackDirs()
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);
42 * @dataProvider getLoadClassTests
44 public function testLoadClass($className, $testClassName, $message)
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);
53 public function getLoadClassTests()
56 array('\\Namespaced2\\Foo', 'Namespaced2\\Foo', '->loadClass() loads Namespaced2\Foo class'),
57 array('\\Pearlike2_Foo', 'Pearlike2_Foo', '->loadClass() loads Pearlike2_Foo class'),
62 * @dataProvider getLoadNonexistentClassTests
64 public function testLoadNonexistentClass($className, $testClassName, $message)
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);
73 public function getLoadNonexistentClassTests()
76 array('\\Pearlike3_Bar', '\\Pearlike3_Bar', '->loadClass() loads non existing Pearlike3_Bar class with a leading slash'),
80 public function testAddPrefixSingle()
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']);
90 public function testAddPrefixesSingle()
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));
100 public function testAddPrefixMulti()
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']);
112 public function testUseIncludePath()
114 $loader = new ClassLoader();
115 $this->assertFalse($loader->getUseIncludePath());
117 $this->assertNull($loader->findFile('Foo'));
119 $includePath = get_include_path();
121 $loader->setUseIncludePath(true);
122 $this->assertTrue($loader->getUseIncludePath());
124 set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);
126 $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'includepath'.DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));
128 set_include_path($includePath);
132 * @dataProvider getLoadClassFromFallbackTests
134 public function testLoadClassFromFallback($className, $testClassName, $message)
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);
144 public function getLoadClassFromFallbackTests()
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'),
155 * @dataProvider getLoadClassNamespaceCollisionTests
157 public function testLoadClassNamespaceCollision($namespaces, $className, $message)
159 $loader = new ClassLoader();
160 $loader->addPrefixes($namespaces);
162 $loader->loadClass($className);
163 $this->assertTrue(class_exists($className), $message);
166 public function getLoadClassNamespaceCollisionTests()
171 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
172 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
174 'NamespaceCollision\C\Foo',
175 '->loadClass() loads NamespaceCollision\C\Foo from alpha.',
179 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
180 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
182 'NamespaceCollision\C\Bar',
183 '->loadClass() loads NamespaceCollision\C\Bar from alpha.',
187 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
188 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
190 'NamespaceCollision\C\B\Foo',
191 '->loadClass() loads NamespaceCollision\C\B\Foo from beta.',
195 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
196 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
198 'NamespaceCollision\C\B\Bar',
199 '->loadClass() loads NamespaceCollision\C\B\Bar from beta.',
203 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
204 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
206 'PrefixCollision_C_Foo',
207 '->loadClass() loads PrefixCollision_C_Foo from alpha.',
211 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
212 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
214 'PrefixCollision_C_Bar',
215 '->loadClass() loads PrefixCollision_C_Bar from alpha.',
219 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
220 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
222 'PrefixCollision_C_B_Foo',
223 '->loadClass() loads PrefixCollision_C_B_Foo from beta.',
227 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
228 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
230 'PrefixCollision_C_B_Bar',
231 '->loadClass() loads PrefixCollision_C_B_Bar from beta.',