/vendor/symfony/symfony/src/Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php

https://gitlab.com/Isaki/le331.fr · PHP · 281 lines · 205 code · 46 blank · 30 comment · 4 complexity · 444b9560116f17dade9a67c2ab48d38f MD5 · raw file

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