BlankLineBetweenImportGroupsFixerTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  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\Whitespace;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\Whitespace\BlankLineBetweenImportGroupsFixer
  18. */
  19. final class BlankLineBetweenImportGroupsFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideFixTypesOrderAndNewlinesCases
  23. */
  24. public function testFixTypesOrderAndNewlines(string $expected, ?string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. public static function provideFixTypesOrderAndNewlinesCases(): iterable
  29. {
  30. yield [
  31. '<?php
  32. use Aaa\Ccc;
  33. use Foo\Zar\Baz;
  34. use some\a\{ClassA};
  35. use some\b\{ClassD, ClassB, ClassC as C};
  36. use Bar\Biz\Boooz\Bum;
  37. use some\b\{
  38. ClassF,
  39. ClassG
  40. };
  41. use Some\Cloz;
  42. use Aaa\Bbb;
  43. use const some\a\{ConstD};
  44. use const some\a\{ConstA};
  45. use const some\a\{ConstB, ConstC as CC};
  46. use const some\b\{ConstE};
  47. use function some\f\{fn_g, fn_h, fn_i};
  48. use function some\c\{fn_f};
  49. use function some\a\{fn_x};
  50. use function some\b\{fn_c, fn_d, fn_e};
  51. use function some\a\{fn_a, fn_b};
  52. ',
  53. '<?php
  54. use Aaa\Ccc;
  55. use Foo\Zar\Baz;
  56. use some\a\{ClassA};
  57. use some\b\{ClassD, ClassB, ClassC as C};
  58. use Bar\Biz\Boooz\Bum;
  59. use some\b\{
  60. ClassF,
  61. ClassG
  62. };
  63. use Some\Cloz;
  64. use Aaa\Bbb;
  65. use const some\a\{ConstD};
  66. use const some\a\{ConstA};
  67. use const some\a\{ConstB, ConstC as CC};
  68. use const some\b\{ConstE};
  69. use function some\f\{fn_g, fn_h, fn_i};
  70. use function some\c\{fn_f};
  71. use function some\a\{fn_x};
  72. use function some\b\{fn_c, fn_d, fn_e};
  73. use function some\a\{fn_a, fn_b};
  74. ',
  75. ];
  76. yield [
  77. '<?php
  78. use Aaa\Ccc;
  79. use Foo\Zar\Baz;
  80. use function some\f\{fn_g, fn_h, fn_i};
  81. use some\a\{ClassA};
  82. use some\b\{ClassD, ClassB, ClassC as C};
  83. use Bar\Biz\Boooz\Bum;
  84. use function some\c\{fn_f};
  85. use some\b\{
  86. ClassF,
  87. ClassG
  88. };
  89. use const some\a\{ConstD};
  90. use Some\Cloz;
  91. use function some\a\{fn_x};
  92. use const some\a\{ConstA};
  93. use function some\b\{fn_c, fn_d, fn_e};
  94. use const some\a\{ConstB, ConstC as CC};
  95. use Aaa\Bbb;
  96. use const some\b\{ConstE};
  97. use function some\a\{fn_a, fn_b};
  98. ',
  99. '<?php
  100. use Aaa\Ccc;
  101. use Foo\Zar\Baz;
  102. use function some\f\{fn_g, fn_h, fn_i};
  103. use some\a\{ClassA};
  104. use some\b\{ClassD, ClassB, ClassC as C};
  105. use Bar\Biz\Boooz\Bum;
  106. use function some\c\{fn_f};
  107. use some\b\{
  108. ClassF,
  109. ClassG
  110. };
  111. use const some\a\{ConstD};
  112. use Some\Cloz;
  113. use function some\a\{fn_x};
  114. use const some\a\{ConstA};
  115. use function some\b\{fn_c, fn_d, fn_e};
  116. use const some\a\{ConstB, ConstC as CC};
  117. use Aaa\Bbb;
  118. use const some\b\{ConstE};
  119. use function some\a\{fn_a, fn_b};
  120. ',
  121. ];
  122. yield [
  123. '<?php
  124. use Aaa\Ccc;
  125. use Foo\Zar\Baz;
  126. #use function some\f\{fn_g, fn_h, fn_i};
  127. use some\a\{ClassA};
  128. use some\b\{ClassD, ClassB, ClassC as C};
  129. use Bar\Biz\Boooz\Bum;
  130. use function some\c\{fn_f};
  131. use some\b\{
  132. ClassF,
  133. ClassG
  134. };
  135. use const some\a\{ConstD};
  136. use Some\Cloz;
  137. use function some\a\{fn_x};
  138. /** Import ConstA to do some nice magic */
  139. use const some\a\{ConstA};
  140. use function some\b\{fn_c, fn_d, fn_e};
  141. use const some\a\{ConstB, ConstC as CC};
  142. use Aaa\Bbb;
  143. use const some\b\{ConstE};
  144. use function some\a\{fn_a, fn_b};
  145. ',
  146. '<?php
  147. use Aaa\Ccc;
  148. use Foo\Zar\Baz;
  149. #use function some\f\{fn_g, fn_h, fn_i};
  150. use some\a\{ClassA};
  151. use some\b\{ClassD, ClassB, ClassC as C};
  152. use Bar\Biz\Boooz\Bum;
  153. use function some\c\{fn_f};
  154. use some\b\{
  155. ClassF,
  156. ClassG
  157. };
  158. use const some\a\{ConstD};
  159. use Some\Cloz;
  160. use function some\a\{fn_x};
  161. /** Import ConstA to do some nice magic */
  162. use const some\a\{ConstA};
  163. use function some\b\{fn_c, fn_d, fn_e};
  164. use const some\a\{ConstB, ConstC as CC};
  165. use Aaa\Bbb;
  166. use const some\b\{ConstE};
  167. use function some\a\{fn_a, fn_b};
  168. ',
  169. ];
  170. yield [
  171. '<?php
  172. /**
  173. use Aaa\Ccc;
  174. use Foo\Zar\Baz;
  175. */
  176. use function some\f\{fn_g, fn_h, fn_i};
  177. use some\a\{ClassA};
  178. use some\b\{ClassD, ClassB, ClassC as C};
  179. use Bar\Biz\Boooz\Bum;
  180. use function some\c\{fn_f};
  181. use some\b\{
  182. ClassF,
  183. ClassG
  184. };
  185. use const some\a\{ConstD};
  186. use Some\Cloz;
  187. // Ignore the following content
  188. // use function some\a\{fn_x};
  189. // use const some\a\{ConstA};
  190. use function some\b\{fn_c, fn_d, fn_e};
  191. use const some\a\{ConstB, ConstC as CC};
  192. use Aaa\Bbb;
  193. use const some\b\{ConstE};
  194. use function some\a\{fn_a, fn_b};
  195. ',
  196. '<?php
  197. /**
  198. use Aaa\Ccc;
  199. use Foo\Zar\Baz;
  200. */
  201. use function some\f\{fn_g, fn_h, fn_i};
  202. use some\a\{ClassA};
  203. use some\b\{ClassD, ClassB, ClassC as C};
  204. use Bar\Biz\Boooz\Bum;
  205. use function some\c\{fn_f};
  206. use some\b\{
  207. ClassF,
  208. ClassG
  209. };
  210. use const some\a\{ConstD};
  211. use Some\Cloz;
  212. // Ignore the following content
  213. // use function some\a\{fn_x};
  214. // use const some\a\{ConstA};
  215. use function some\b\{fn_c, fn_d, fn_e};
  216. use const some\a\{ConstB, ConstC as CC};
  217. use Aaa\Bbb;
  218. use const some\b\{ConstE};
  219. use function some\a\{fn_a, fn_b};
  220. ',
  221. ];
  222. yield [
  223. '<?php
  224. use Aaa\Ccc;
  225. /*use Foo\Zar\Baz;
  226. use function some\f\{fn_g, fn_h, fn_i};
  227. use some\a\{ClassA};
  228. use some\b\{ClassD, ClassB, ClassC as C};
  229. use Bar\Biz\Boooz\Bum;
  230. use function some\c\{fn_f};
  231. use some\b\{
  232. ClassF,
  233. ClassG
  234. };
  235. use const some\a\{ConstD};
  236. use Some\Cloz;
  237. use function some\a\{fn_x};
  238. use const some\a\{ConstA};
  239. use function some\b\{fn_c, fn_d, fn_e};
  240. use const some\a\{ConstB, ConstC as CC};
  241. use Aaa\Bbb;
  242. use const some\b\{ConstE};
  243. */
  244. use function some\a\{fn_a, fn_b};
  245. ',
  246. '<?php
  247. use Aaa\Ccc;
  248. /*use Foo\Zar\Baz;
  249. use function some\f\{fn_g, fn_h, fn_i};
  250. use some\a\{ClassA};
  251. use some\b\{ClassD, ClassB, ClassC as C};
  252. use Bar\Biz\Boooz\Bum;
  253. use function some\c\{fn_f};
  254. use some\b\{
  255. ClassF,
  256. ClassG
  257. };
  258. use const some\a\{ConstD};
  259. use Some\Cloz;
  260. use function some\a\{fn_x};
  261. use const some\a\{ConstA};
  262. use function some\b\{fn_c, fn_d, fn_e};
  263. use const some\a\{ConstB, ConstC as CC};
  264. use Aaa\Bbb;
  265. use const some\b\{ConstE};
  266. */
  267. use function some\a\{fn_a, fn_b};
  268. ',
  269. ];
  270. yield [
  271. '<?php
  272. use Aaa\Ccc;
  273. use function some\a\{fn_a, fn_b};
  274. use function some\b\{
  275. fn_c,
  276. fn_d
  277. };
  278. ',
  279. '<?php
  280. use Aaa\Ccc;
  281. use function some\a\{fn_a, fn_b};
  282. use function some\b\{
  283. fn_c,
  284. fn_d
  285. };
  286. ',
  287. ];
  288. yield [
  289. '<?php
  290. use Aaa\Ccc;
  291. use function some\a\{fn_a, fn_b}; // Do this because of reasons
  292. use function some\b\{
  293. fn_c,
  294. fn_d
  295. };
  296. ',
  297. '<?php
  298. use Aaa\Ccc;
  299. use function some\a\{fn_a, fn_b}; // Do this because of reasons
  300. use function some\b\{
  301. fn_c,
  302. fn_d
  303. };
  304. ',
  305. ];
  306. yield [
  307. '<?php
  308. use Aaa\Ccc;
  309. /** Beginning of line comment as well */use function some\a\{fn_a, fn_b};
  310. use function some\b\{
  311. fn_c,
  312. fn_d
  313. };
  314. ',
  315. '<?php
  316. use Aaa\Ccc;
  317. /** Beginning of line comment as well */use function some\a\{fn_a, fn_b};
  318. use function some\b\{
  319. fn_c,
  320. fn_d
  321. };
  322. ',
  323. ];
  324. yield [
  325. '<?php
  326. use /* x */ function /* x */ Psl\Str\trim;
  327. use /* x */ Psl\Str /* x */;
  328. use /* x */ const /* x */ Psl\Str\OTHER_ALPHABET;
  329. use /* x */ const /* x */ Psl\Str\ALPHABET;
  330. use /* x */ function /* x */ Psl\Str\ /* x */ {
  331. /* x */ trim_left /* x */,
  332. /* x */ trim_right /* x */,
  333. };
  334. ',
  335. '<?php
  336. use /* x */ function /* x */ Psl\Str\trim;
  337. use /* x */ Psl\Str /* x */;
  338. use /* x */ const /* x */ Psl\Str\OTHER_ALPHABET;
  339. use /* x */ const /* x */ Psl\Str\ALPHABET;
  340. use /* x */ function /* x */ Psl\Str\ /* x */ {
  341. /* x */ trim_left /* x */,
  342. /* x */ trim_right /* x */,
  343. };
  344. ',
  345. ];
  346. yield 'lots of inserts in same namespace' => [
  347. '<?php
  348. namespace A\B6 {
  349. use C1\B1;
  350. use const C6\Z1;
  351. use C2\B2;
  352. use const C7\Z2;
  353. use C3\B3;
  354. use const C8\Z3;
  355. use C4\B4;
  356. use const C9\Z4;
  357. use C5\B5;
  358. use const C0\Z5;
  359. }
  360. ',
  361. '<?php
  362. namespace A\B6 {
  363. use C1\B1;use const C6\Z1;
  364. use C2\B2;use const C7\Z2;
  365. use C3\B3;use const C8\Z3;
  366. use C4\B4;use const C9\Z4;
  367. use C5\B5;use const C0\Z5;
  368. }
  369. ',
  370. ];
  371. yield 'lots of inserts in multiple namespaces' => [
  372. '<?php
  373. namespace A\B1 {
  374. use C\B;
  375. use const C\Z;
  376. }
  377. namespace A\B2 {
  378. use C\B;
  379. use const C\Z;
  380. }
  381. namespace A\B3 {
  382. use C\B;
  383. use const C\Z;
  384. }
  385. namespace A\B4 {
  386. use C\B;
  387. use const C\Z;
  388. }
  389. namespace A\B5 {
  390. use C\B;
  391. use const C\Z;
  392. }
  393. ',
  394. '<?php
  395. namespace A\B1 {
  396. use C\B;use const C\Z;
  397. }
  398. namespace A\B2 {
  399. use C\B;use const C\Z;
  400. }
  401. namespace A\B3 {
  402. use C\B;use const C\Z;
  403. }
  404. namespace A\B4 {
  405. use C\B;use const C\Z;
  406. }
  407. namespace A\B5 {
  408. use C\B;use const C\Z;
  409. }
  410. ',
  411. ];
  412. yield [
  413. '<?php use A\B; /*1*/
  414. use const C\D;',
  415. '<?php use A\B; /*1*/ use const C\D;',
  416. ];
  417. yield [
  418. '<?php
  419. namespace Foo;
  420. use A\B; /* foo */ /* A */ /* B */ # X
  421. use const C\D; // bar
  422. ',
  423. '<?php
  424. namespace Foo;
  425. use A\B; /* foo */ /* A */ /* B */ # X
  426. use const C\D; // bar
  427. ',
  428. ];
  429. }
  430. /**
  431. * @dataProvider provideFixPre80Cases
  432. *
  433. * @requires PHP <8.0
  434. */
  435. public function testFixPre80(string $expected, string $input = null): void
  436. {
  437. $this->doTest($expected, $input);
  438. }
  439. public static function provideFixPre80Cases(): iterable
  440. {
  441. yield [
  442. '<?php
  443. use Some\/**Namespace*/Weird\Be/**ha*/;
  444. use function Other\/**Namespace*/Weird\/**Comments*/have;
  445. ',
  446. '<?php
  447. use Some\/**Namespace*/Weird\Be/**ha*/;
  448. use function Other\/**Namespace*/Weird\/**Comments*/have;
  449. ',
  450. ];
  451. }
  452. }