PageRenderTime 29ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

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

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