OrderedTraitsFixerTest.php 5.6 KB

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