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;
20 class ClassLoaderTest extends TestCase
22 public function testGetPrefixes()
24 $loader = new ClassLoader();
25 $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
26 $loader->addPrefix('Bar', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
27 $loader->addPrefix('Bas', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
28 $prefixes = $loader->getPrefixes();
29 $this->assertArrayHasKey('Foo', $prefixes);
30 $this->assertArrayNotHasKey('Foo1', $prefixes);
31 $this->assertArrayHasKey('Bar', $prefixes);
32 $this->assertArrayHasKey('Bas', $prefixes);
35 public function testGetFallbackDirs()
37 $loader = new ClassLoader();
38 $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
39 $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
40 $fallback_dirs = $loader->getFallbackDirs();
41 $this->assertCount(2, $fallback_dirs);
45 * @dataProvider getLoadClassTests
47 public function testLoadClass($className, $testClassName, $message)
49 $loader = new ClassLoader();
50 $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
51 $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
52 $loader->loadClass($testClassName);
53 $this->assertTrue(class_exists($className), $message);
56 public function getLoadClassTests()
59 array('\\Namespaced2\\Foo', 'Namespaced2\\Foo', '->loadClass() loads Namespaced2\Foo class'),
60 array('\\Pearlike2_Foo', 'Pearlike2_Foo', '->loadClass() loads Pearlike2_Foo class'),
65 * @dataProvider getLoadNonexistentClassTests
67 public function testLoadNonexistentClass($className, $testClassName, $message)
69 $loader = new ClassLoader();
70 $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
71 $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
72 $loader->loadClass($testClassName);
73 $this->assertFalse(class_exists($className), $message);
76 public function getLoadNonexistentClassTests()
79 array('\\Pearlike3_Bar', '\\Pearlike3_Bar', '->loadClass() loads non existing Pearlike3_Bar class with a leading slash'),
83 public function testAddPrefixSingle()
85 $loader = new ClassLoader();
86 $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
87 $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
88 $prefixes = $loader->getPrefixes();
89 $this->assertArrayHasKey('Foo', $prefixes);
90 $this->assertCount(1, $prefixes['Foo']);
93 public function testAddPrefixesSingle()
95 $loader = new ClassLoader();
96 $loader->addPrefixes(array('Foo' => array('foo', 'foo')));
97 $loader->addPrefixes(array('Foo' => array('foo')));
98 $prefixes = $loader->getPrefixes();
99 $this->assertArrayHasKey('Foo', $prefixes);
100 $this->assertCount(1, $prefixes['Foo'], print_r($prefixes, true));
103 public function testAddPrefixMulti()
105 $loader = new ClassLoader();
106 $loader->addPrefix('Foo', 'foo');
107 $loader->addPrefix('Foo', 'bar');
108 $prefixes = $loader->getPrefixes();
109 $this->assertArrayHasKey('Foo', $prefixes);
110 $this->assertCount(2, $prefixes['Foo']);
111 $this->assertContains('foo', $prefixes['Foo']);
112 $this->assertContains('bar', $prefixes['Foo']);
115 public function testUseIncludePath()
117 $loader = new ClassLoader();
118 $this->assertFalse($loader->getUseIncludePath());
120 $this->assertNull($loader->findFile('Foo'));
122 $includePath = get_include_path();
124 $loader->setUseIncludePath(true);
125 $this->assertTrue($loader->getUseIncludePath());
127 set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);
129 $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'includepath'.DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));
131 set_include_path($includePath);
135 * @dataProvider getLoadClassFromFallbackTests
137 public function testLoadClassFromFallback($className, $testClassName, $message)
139 $loader = new ClassLoader();
140 $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
141 $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
142 $loader->addPrefix('', array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'));
143 $loader->loadClass($testClassName);
144 $this->assertTrue(class_exists($className), $message);
147 public function getLoadClassFromFallbackTests()
150 array('\\Namespaced2\\Baz', 'Namespaced2\\Baz', '->loadClass() loads Namespaced2\Baz class'),
151 array('\\Pearlike2_Baz', 'Pearlike2_Baz', '->loadClass() loads Pearlike2_Baz class'),
152 array('\\Namespaced2\\FooBar', 'Namespaced2\\FooBar', '->loadClass() loads Namespaced2\Baz class from fallback dir'),
153 array('\\Pearlike2_FooBar', 'Pearlike2_FooBar', '->loadClass() loads Pearlike2_Baz class from fallback dir'),
158 * @dataProvider getLoadClassNamespaceCollisionTests
160 public function testLoadClassNamespaceCollision($namespaces, $className, $message)
162 $loader = new ClassLoader();
163 $loader->addPrefixes($namespaces);
165 $loader->loadClass($className);
166 $this->assertTrue(class_exists($className), $message);
169 public function getLoadClassNamespaceCollisionTests()
174 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
175 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
177 'NamespaceCollision\C\Foo',
178 '->loadClass() loads NamespaceCollision\C\Foo from alpha.',
182 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
183 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
185 'NamespaceCollision\C\Bar',
186 '->loadClass() loads NamespaceCollision\C\Bar from alpha.',
190 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
191 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
193 'NamespaceCollision\C\B\Foo',
194 '->loadClass() loads NamespaceCollision\C\B\Foo from beta.',
198 'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
199 'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
201 'NamespaceCollision\C\B\Bar',
202 '->loadClass() loads NamespaceCollision\C\B\Bar from beta.',
206 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
207 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
209 'PrefixCollision_C_Foo',
210 '->loadClass() loads PrefixCollision_C_Foo from alpha.',
214 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
215 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
217 'PrefixCollision_C_Bar',
218 '->loadClass() loads PrefixCollision_C_Bar from alpha.',
222 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
223 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
225 'PrefixCollision_C_B_Foo',
226 '->loadClass() loads PrefixCollision_C_B_Foo from beta.',
230 'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
231 'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
233 'PrefixCollision_C_B_Bar',
234 '->loadClass() loads PrefixCollision_C_B_Bar from beta.',