OrderedTraitsFixerTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of PHP CS Fixer.
  5. *
  6. * (c) Fabien Potencier <fabien@symfony.com>
  7. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  8. *
  9. * This source file is subject to the MIT license that is bundled
  10. * with this source code in the file LICENSE.
  11. */
  12. namespace PhpCsFixer\Tests\Fixer\ClassNotation;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @covers \PhpCsFixer\Fixer\ClassNotation\OrderedTraitsFixer
  16. *
  17. * @internal
  18. */
  19. final class OrderedTraitsFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideFixCases
  23. *
  24. * @param array<string, mixed> $configuration
  25. */
  26. public function testFix(string $expected, ?string $input = null, array $configuration = []): void
  27. {
  28. $this->fixer->configure($configuration);
  29. $this->doTest($expected, $input);
  30. }
  31. /**
  32. * @return iterable<string, array{string, 1?: ?string}>
  33. */
  34. public static function provideFixCases(): iterable
  35. {
  36. yield 'simple' => [
  37. '<?php
  38. class Foo {
  39. use A;
  40. use B;
  41. }',
  42. '<?php
  43. class Foo {
  44. use B;
  45. use A;
  46. }',
  47. ];
  48. yield 'in multiple classes' => [
  49. '<?php
  50. class Foo {
  51. use A;
  52. use C;
  53. }
  54. class Bar {
  55. use B;
  56. use D;
  57. }',
  58. '<?php
  59. class Foo {
  60. use C;
  61. use A;
  62. }
  63. class Bar {
  64. use D;
  65. use B;
  66. }',
  67. ];
  68. yield 'separated by a property' => [
  69. '<?php
  70. class Foo {
  71. use A;
  72. use C;
  73. private $foo;
  74. use B;
  75. use D;
  76. }',
  77. '<?php
  78. class Foo {
  79. use C;
  80. use A;
  81. private $foo;
  82. use D;
  83. use B;
  84. }',
  85. ];
  86. yield 'separated by a method' => [
  87. '<?php
  88. class Foo {
  89. use A;
  90. use C;
  91. public function foo() { }
  92. use B;
  93. use D;
  94. }',
  95. '<?php
  96. class Foo {
  97. use C;
  98. use A;
  99. public function foo() { }
  100. use D;
  101. use B;
  102. }',
  103. ];
  104. yield 'grouped statements' => [
  105. '<?php
  106. class Foo {
  107. use A, C;
  108. use B;
  109. }',
  110. '<?php
  111. class Foo {
  112. use B;
  113. use A, C;
  114. }',
  115. ];
  116. yield 'with aliases and conflicts' => [
  117. '<?php
  118. class Foo {
  119. use A {
  120. A::foo insteadof B;
  121. A::bar as bazA;
  122. A::baz as protected;
  123. }
  124. use B {
  125. B::bar as bazB;
  126. }
  127. }',
  128. '<?php
  129. class Foo {
  130. use B {
  131. B::bar as bazB;
  132. }
  133. use A {
  134. A::foo insteadof B;
  135. A::bar as bazA;
  136. A::baz as protected;
  137. }
  138. }',
  139. ];
  140. yield 'symbol imports' => [
  141. '<?php
  142. use C;
  143. use B;
  144. use A;',
  145. ];
  146. yield 'anonymous function with inherited variables' => [
  147. '<?php
  148. $foo = function () use ($b, $a) { };
  149. $bar = function () use ($a, $b) { };',
  150. ];
  151. yield 'multiple traits in a single statement' => [
  152. '<?php
  153. class Foo {
  154. use A, B, C, D;
  155. }',
  156. '<?php
  157. class Foo {
  158. use C, B, D, A;
  159. }',
  160. ];
  161. yield 'multiple traits per statement' => [
  162. '<?php
  163. class Foo {
  164. use A, D;
  165. use B, C;
  166. }',
  167. '<?php
  168. class Foo {
  169. use C, B;
  170. use D, A;
  171. }',
  172. ];
  173. $uses = [];
  174. for ($i = 0; $i < 25; ++$i) {
  175. $uses[] = sprintf(' use A%02d;', $i);
  176. }
  177. yield 'simple, multiple I' => [
  178. sprintf("<?php\nclass Foo {\n%s\n}", implode("\n", $uses)),
  179. sprintf("<?php\nclass Foo {\n%s\n}", implode("\n", array_reverse($uses))),
  180. ];
  181. yield 'simple, length diff. I' => [
  182. '<?php
  183. class Foo {
  184. use A;
  185. use B\B;
  186. use C\C\C;
  187. use D\D\D\D;
  188. }',
  189. '<?php
  190. class Foo {
  191. use D\D\D\D;
  192. use C\C\C;
  193. use B\B;
  194. use A;
  195. }',
  196. ];
  197. yield 'comments handling' => [
  198. '<?php
  199. class Foo {
  200. /* A */use A\A\A\A/* A */;
  201. /* B */use B\B\B/* B */;
  202. /* C */use C\C/* C */;
  203. /* D */use D/* D */;
  204. }',
  205. '<?php
  206. class Foo {
  207. /* D */use D/* D */;
  208. /* C */use C\C/* C */;
  209. /* B */use B\B\B/* B */;
  210. /* A */use A\A\A\A/* A */;
  211. }',
  212. ];
  213. yield 'grouped statements II' => [
  214. '<?php
  215. class Foo {
  216. use A\Z, C\Y;
  217. use B\E;
  218. }',
  219. '<?php
  220. class Foo {
  221. use B\E;
  222. use A\Z, C\Y;
  223. }',
  224. ];
  225. yield 'simple, leading \\' => [
  226. '<?php
  227. class Foo {
  228. use \A;
  229. use \B;
  230. }',
  231. '<?php
  232. class Foo {
  233. use \B;
  234. use \A;
  235. }',
  236. ];
  237. yield 'simple, leading \\ before character order' => [
  238. '<?php
  239. class Foo {
  240. use A;
  241. use \B;
  242. use C;
  243. }',
  244. '<?php
  245. class Foo {
  246. use C;
  247. use \B;
  248. use A;
  249. }',
  250. ];
  251. yield 'with phpdoc' => [
  252. '<?php
  253. class Foo {
  254. // foo 1
  255. /** @phpstan-use A<Foo> */
  256. use A;
  257. /** @phpstan-use B<Foo> */
  258. use B;
  259. /** @phpstan-use C<Foo> */
  260. use C;
  261. }',
  262. '<?php
  263. class Foo {
  264. /** @phpstan-use C<Foo> */
  265. use C;
  266. /** @phpstan-use B<Foo> */
  267. use B;
  268. // foo 1
  269. /** @phpstan-use A<Foo> */
  270. use A;
  271. }',
  272. ];
  273. yield 'simple and with namespace' => [
  274. '<?php
  275. class User
  276. {
  277. use Test\B, TestA;
  278. }',
  279. '<?php
  280. class User
  281. {
  282. use TestA, Test\B;
  283. }',
  284. ];
  285. yield 'with case sensitive order' => [
  286. '<?php
  287. class Foo {
  288. use AA;
  289. use Aaa;
  290. }',
  291. '<?php
  292. class Foo {
  293. use Aaa;
  294. use AA;
  295. }',
  296. [
  297. 'case_sensitive' => true,
  298. ],
  299. ];
  300. }
  301. }