ClassLoaderTest.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\ClassLoader\Tests;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\ClassLoader\ClassLoader;
  13. /**
  14. * @group legacy
  15. */
  16. class ClassLoaderTest extends TestCase
  17. {
  18. public function testGetPrefixes()
  19. {
  20. $loader = new ClassLoader();
  21. $loader->addPrefix('Foo', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  22. $loader->addPrefix('Bar', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  23. $loader->addPrefix('Bas', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  24. $prefixes = $loader->getPrefixes();
  25. $this->assertArrayHasKey('Foo', $prefixes);
  26. $this->assertArrayNotHasKey('Foo1', $prefixes);
  27. $this->assertArrayHasKey('Bar', $prefixes);
  28. $this->assertArrayHasKey('Bas', $prefixes);
  29. }
  30. public function testGetFallbackDirs()
  31. {
  32. $loader = new ClassLoader();
  33. $loader->addPrefix(null, __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  34. $loader->addPrefix(null, __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  35. $fallback_dirs = $loader->getFallbackDirs();
  36. $this->assertCount(2, $fallback_dirs);
  37. }
  38. /**
  39. * @dataProvider getLoadClassTests
  40. */
  41. public function testLoadClass($className, $testClassName, $message)
  42. {
  43. $loader = new ClassLoader();
  44. $loader->addPrefix('Namespaced2\\', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  45. $loader->addPrefix('Pearlike2_', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  46. $loader->loadClass($testClassName);
  47. $this->assertTrue(class_exists($className), $message);
  48. }
  49. public function getLoadClassTests()
  50. {
  51. return [
  52. ['\\Namespaced2\\Foo', 'Namespaced2\\Foo', '->loadClass() loads Namespaced2\Foo class'],
  53. ['\\Pearlike2_Foo', 'Pearlike2_Foo', '->loadClass() loads Pearlike2_Foo class'],
  54. ];
  55. }
  56. /**
  57. * @dataProvider getLoadNonexistentClassTests
  58. */
  59. public function testLoadNonexistentClass($className, $testClassName, $message)
  60. {
  61. $loader = new ClassLoader();
  62. $loader->addPrefix('Namespaced2\\', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  63. $loader->addPrefix('Pearlike2_', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  64. $loader->loadClass($testClassName);
  65. $this->assertFalse(class_exists($className), $message);
  66. }
  67. public function getLoadNonexistentClassTests()
  68. {
  69. return [
  70. ['\\Pearlike3_Bar', '\\Pearlike3_Bar', '->loadClass() loads non existing Pearlike3_Bar class with a leading slash'],
  71. ];
  72. }
  73. public function testAddPrefixSingle()
  74. {
  75. $loader = new ClassLoader();
  76. $loader->addPrefix('Foo', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  77. $loader->addPrefix('Foo', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  78. $prefixes = $loader->getPrefixes();
  79. $this->assertArrayHasKey('Foo', $prefixes);
  80. $this->assertCount(1, $prefixes['Foo']);
  81. }
  82. public function testAddPrefixesSingle()
  83. {
  84. $loader = new ClassLoader();
  85. $loader->addPrefixes(['Foo' => ['foo', 'foo']]);
  86. $loader->addPrefixes(['Foo' => ['foo']]);
  87. $prefixes = $loader->getPrefixes();
  88. $this->assertArrayHasKey('Foo', $prefixes);
  89. $this->assertCount(1, $prefixes['Foo'], print_r($prefixes, true));
  90. }
  91. public function testAddPrefixMulti()
  92. {
  93. $loader = new ClassLoader();
  94. $loader->addPrefix('Foo', 'foo');
  95. $loader->addPrefix('Foo', 'bar');
  96. $prefixes = $loader->getPrefixes();
  97. $this->assertArrayHasKey('Foo', $prefixes);
  98. $this->assertCount(2, $prefixes['Foo']);
  99. $this->assertContains('foo', $prefixes['Foo']);
  100. $this->assertContains('bar', $prefixes['Foo']);
  101. }
  102. public function testUseIncludePath()
  103. {
  104. $loader = new ClassLoader();
  105. $this->assertFalse($loader->getUseIncludePath());
  106. $this->assertNull($loader->findFile('Foo'));
  107. $includePath = get_include_path();
  108. $loader->setUseIncludePath(true);
  109. $this->assertTrue($loader->getUseIncludePath());
  110. set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);
  111. $this->assertEquals(__DIR__.\DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR.'includepath'.\DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));
  112. set_include_path($includePath);
  113. }
  114. /**
  115. * @dataProvider getLoadClassFromFallbackTests
  116. */
  117. public function testLoadClassFromFallback($className, $testClassName, $message)
  118. {
  119. $loader = new ClassLoader();
  120. $loader->addPrefix('Namespaced2\\', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  121. $loader->addPrefix('Pearlike2_', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  122. $loader->addPrefix('', [__DIR__.\DIRECTORY_SEPARATOR.'Fixtures/fallback']);
  123. $loader->loadClass($testClassName);
  124. $this->assertTrue(class_exists($className), $message);
  125. }
  126. public function getLoadClassFromFallbackTests()
  127. {
  128. return [
  129. ['\\Namespaced2\\Baz', 'Namespaced2\\Baz', '->loadClass() loads Namespaced2\Baz class'],
  130. ['\\Pearlike2_Baz', 'Pearlike2_Baz', '->loadClass() loads Pearlike2_Baz class'],
  131. ['\\Namespaced2\\FooBar', 'Namespaced2\\FooBar', '->loadClass() loads Namespaced2\Baz class from fallback dir'],
  132. ['\\Pearlike2_FooBar', 'Pearlike2_FooBar', '->loadClass() loads Pearlike2_Baz class from fallback dir'],
  133. ];
  134. }
  135. /**
  136. * @dataProvider getLoadClassNamespaceCollisionTests
  137. */
  138. public function testLoadClassNamespaceCollision($namespaces, $className, $message)
  139. {
  140. $loader = new ClassLoader();
  141. $loader->addPrefixes($namespaces);
  142. $loader->loadClass($className);
  143. $this->assertTrue(class_exists($className), $message);
  144. }
  145. public function getLoadClassNamespaceCollisionTests()
  146. {
  147. return [
  148. [
  149. [
  150. 'NamespaceCollision\\C' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  151. 'NamespaceCollision\\C\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  152. ],
  153. 'NamespaceCollision\C\Foo',
  154. '->loadClass() loads NamespaceCollision\C\Foo from alpha.',
  155. ],
  156. [
  157. [
  158. 'NamespaceCollision\\C\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  159. 'NamespaceCollision\\C' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  160. ],
  161. 'NamespaceCollision\C\Bar',
  162. '->loadClass() loads NamespaceCollision\C\Bar from alpha.',
  163. ],
  164. [
  165. [
  166. 'NamespaceCollision\\C' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  167. 'NamespaceCollision\\C\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  168. ],
  169. 'NamespaceCollision\C\B\Foo',
  170. '->loadClass() loads NamespaceCollision\C\B\Foo from beta.',
  171. ],
  172. [
  173. [
  174. 'NamespaceCollision\\C\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  175. 'NamespaceCollision\\C' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  176. ],
  177. 'NamespaceCollision\C\B\Bar',
  178. '->loadClass() loads NamespaceCollision\C\B\Bar from beta.',
  179. ],
  180. [
  181. [
  182. 'PrefixCollision_C_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  183. 'PrefixCollision_C_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  184. ],
  185. 'PrefixCollision_C_Foo',
  186. '->loadClass() loads PrefixCollision_C_Foo from alpha.',
  187. ],
  188. [
  189. [
  190. 'PrefixCollision_C_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  191. 'PrefixCollision_C_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  192. ],
  193. 'PrefixCollision_C_Bar',
  194. '->loadClass() loads PrefixCollision_C_Bar from alpha.',
  195. ],
  196. [
  197. [
  198. 'PrefixCollision_C_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  199. 'PrefixCollision_C_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  200. ],
  201. 'PrefixCollision_C_B_Foo',
  202. '->loadClass() loads PrefixCollision_C_B_Foo from beta.',
  203. ],
  204. [
  205. [
  206. 'PrefixCollision_C_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/beta',
  207. 'PrefixCollision_C_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/alpha',
  208. ],
  209. 'PrefixCollision_C_B_Bar',
  210. '->loadClass() loads PrefixCollision_C_B_Bar from beta.',
  211. ],
  212. ];
  213. }
  214. }