SingleImportPerStatementFixerTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  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\Import;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. use PhpCsFixer\WhitespacesFixerConfig;
  15. /**
  16. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  17. *
  18. * @internal
  19. *
  20. * @covers \PhpCsFixer\Fixer\Import\SingleImportPerStatementFixer
  21. */
  22. final class SingleImportPerStatementFixerTest extends AbstractFixerTestCase
  23. {
  24. /**
  25. * @dataProvider provideFixCases
  26. */
  27. public function testFix(string $expected, ?string $input = null): void
  28. {
  29. $this->doTest($expected, $input);
  30. }
  31. public static function provideFixCases(): iterable
  32. {
  33. yield [
  34. '<?php
  35. /**/use Foo;
  36. use FooB;
  37. ',
  38. '<?php
  39. /**/use Foo,FooB;
  40. ',
  41. ];
  42. yield [
  43. <<<'EOF'
  44. use Some, Not, PHP, Like, Use, Statement;
  45. <?php
  46. use Foo;
  47. use FooA;
  48. use FooB;
  49. use FooC;
  50. use FooD as D;
  51. use FooE;
  52. use FooF;
  53. use FooG as G;
  54. use FooH;
  55. use FooI;
  56. use FooJ;
  57. use FooZ;
  58. EOF
  59. ,
  60. <<<'EOF'
  61. use Some, Not, PHP, Like, Use, Statement;
  62. <?php
  63. use Foo;
  64. use FooA, FooB;
  65. use FooC, FooD as D, FooE;
  66. use FooF,
  67. FooG as G,
  68. FooH, FooI,
  69. FooJ;
  70. use FooZ;
  71. EOF
  72. ];
  73. yield [
  74. <<<'EOF'
  75. <?php
  76. namespace {
  77. use Foo;
  78. use FooA;
  79. use FooB;
  80. use FooC;
  81. use FooD as D;
  82. use FooE;
  83. use FooF;
  84. use FooG as G;
  85. use FooH;
  86. use FooI;
  87. use FooJ;
  88. use FooZ;
  89. }
  90. namespace Boo {
  91. use Bar;
  92. use BarA;
  93. use BarB;
  94. use BarC;
  95. use BarD as D;
  96. use BarE;
  97. use BarF;
  98. use BarG as G;
  99. use BarH;
  100. use BarI;
  101. use BarJ;
  102. use BarZ;
  103. }
  104. EOF
  105. ,
  106. <<<'EOF'
  107. <?php
  108. namespace {
  109. use Foo;
  110. use FooA, FooB;
  111. use FooC, FooD as D, FooE;
  112. use FooF,
  113. FooG as G,
  114. FooH, FooI,
  115. FooJ;
  116. use FooZ;
  117. }
  118. namespace Boo {
  119. use Bar;
  120. use BarA, BarB;
  121. use BarC, BarD as D, BarE;
  122. use BarF,
  123. BarG as G,
  124. BarH, BarI,
  125. BarJ;
  126. use BarZ;
  127. }
  128. EOF
  129. ];
  130. yield [
  131. '<?php
  132. use FooA;
  133. use FooB;
  134. ',
  135. '<?php
  136. use FooA, FooB;
  137. ',
  138. ];
  139. yield [
  140. '<?php use FooA;
  141. use FooB?>',
  142. '<?php use FooA, FooB?>',
  143. ];
  144. yield [
  145. '<?php
  146. use B;
  147. use C;
  148. use E;
  149. use F;
  150. use G;
  151. use H;
  152. ',
  153. '<?php
  154. use B,C;
  155. use E,F;
  156. use G,H;
  157. ',
  158. ];
  159. yield [
  160. '<?php
  161. use B;
  162. /*
  163. */use C;
  164. ',
  165. '<?php
  166. use B,
  167. /*
  168. */C;
  169. ',
  170. ];
  171. yield [
  172. '<?php
  173. use A;
  174. use B;
  175. //,{} use ; :
  176. #,{} use ; :
  177. /*,{} use ; :*/
  178. use C ; ',
  179. '<?php
  180. use A,B,
  181. //,{} use ; :
  182. #,{} use ; :
  183. /*,{} use ; :*/
  184. C ; ',
  185. ];
  186. yield [
  187. '<?php use Z ;
  188. use X ?><?php new X(); // run before white space around semicolon',
  189. '<?php use Z , X ?><?php new X(); // run before white space around semicolon',
  190. ];
  191. yield [
  192. '<?php use FooA#
  193. ;#
  194. #
  195. use FooB;',
  196. '<?php use FooA#
  197. ,#
  198. #
  199. FooB;',
  200. ];
  201. yield [
  202. '<?php use some\b\ClassB;
  203. use function some\b\CC as C;
  204. use function some\b\D;
  205. use const some\b\E;
  206. use function some\b\A\B;',
  207. '<?php use some\b\{ClassB, function CC as C, function D, const E, function A\B};',
  208. ];
  209. yield [
  210. '<?php
  211. use Foo\Bar;
  212. use Foo\Baz;',
  213. '<?php
  214. use Foo\ {
  215. Bar, Baz
  216. };',
  217. ];
  218. yield [
  219. '<?php
  220. use Foo\Bar;
  221. use Foo\Baz;',
  222. '<?php
  223. use Foo\
  224. {
  225. Bar, Baz
  226. };',
  227. ];
  228. yield [
  229. '<?php
  230. use function md5;
  231. use function str_repeat;
  232. use const true;
  233. use const false;
  234. use A;
  235. use B;
  236. ',
  237. '<?php
  238. use function md5, str_repeat;
  239. use const true, false;
  240. use A,B;
  241. ',
  242. ];
  243. yield [
  244. '<?php
  245. use D\E;
  246. use D\F;
  247. use G\H;
  248. use G\I/*1*//*2*/;
  249. ',
  250. '<?php
  251. use D\{E,F,};
  252. use G\{H,I/*1*/,/*2*/};
  253. ',
  254. ];
  255. }
  256. public function testWithConfig(): void
  257. {
  258. $expected = '<?php
  259. use Space\Models\TestModelA;
  260. use Space\Models\TestModelB;
  261. use Space\Models\TestModel;';
  262. $input = '<?php
  263. use Space\Models\ {
  264. TestModelA,
  265. TestModelB,
  266. TestModel,
  267. };';
  268. $this->doTest($expected, $input);
  269. $this->fixer->configure(['group_to_single_imports' => false]);
  270. $this->doTest($input);
  271. }
  272. /**
  273. * @dataProvider provideMessyWhitespacesCases
  274. */
  275. public function testMessyWhitespaces(string $expected, ?string $input = null): void
  276. {
  277. $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t", "\r\n"));
  278. $this->doTest($expected, $input);
  279. }
  280. public static function provideMessyWhitespacesCases(): iterable
  281. {
  282. yield [
  283. "<?php\r\n use FooA;\r\n use FooB;",
  284. "<?php\r\n use FooA, FooB;",
  285. ];
  286. }
  287. /**
  288. * @dataProvider provideFixPrePHP80Cases
  289. *
  290. * @requires PHP <8.0
  291. */
  292. public function testFixPrePHP80(string $expected, string $input): void
  293. {
  294. $this->doTest($expected, $input);
  295. }
  296. public static function provideFixPrePHP80Cases(): iterable
  297. {
  298. yield [
  299. '<?php
  300. use some\a\ClassA;
  301. use some\a\ClassB;
  302. use some\a\ClassC as C;
  303. use function some\b\fn_a;
  304. use function some\b\fn_b;
  305. use function some\b\fn_c;
  306. use const some\c\ConstA/**/as/**/E; /* group comment */
  307. use const some\c\ConstB as D;
  308. use const some\c\// use.,{}
  309. ConstC;
  310. use A\{B};
  311. use D\E;
  312. use D\F;
  313. ',
  314. '<?php
  315. use some\a\{ClassA, ClassB, ClassC as C};
  316. use function some\b\{fn_a, fn_b, fn_c};
  317. use const/* group comment */some\c\{ConstA/**/as/**/ E , ConstB AS D, '.'
  318. // use.,{}
  319. ConstC};
  320. use A\{B};
  321. use D\{E,F};
  322. ',
  323. ];
  324. yield 'messy comments' => [
  325. '<?php
  326. use D\/*1*//*2*//*3*/E;
  327. use D\/*4*//*5*//*6*//*7*//*8*//*9*/F/*10*//*11*//*12*/;
  328. ',
  329. '<?php
  330. use D\{
  331. /*1*//*2*//*3*/E,/*4*//*5*//*6*/
  332. /*7*//*8*//*9*/F/*10*//*11*//*12*/
  333. };
  334. ',
  335. ];
  336. }
  337. }