SingleImportPerStatementFixerTest.php 6.6 KB

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