GroupImportFixerTest.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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. /**
  15. * @author Volodymyr Kupriienko <vldmr.kuprienko@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\Import\GroupImportFixer
  20. */
  21. final class GroupImportFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @dataProvider provideFixCases
  25. */
  26. public function testFix(string $expected, ?string $input = null): void
  27. {
  28. $this->doTest($expected, $input);
  29. }
  30. public static function provideFixCases(): iterable
  31. {
  32. yield [
  33. '<?php
  34. namespace X1\Y1;
  35. use A\{B as X, C as Y};
  36. use B\C;
  37. ',
  38. '<?php
  39. namespace X1\Y1;
  40. use A\B as X;
  41. use A\C as Y;
  42. use B\C;
  43. ',
  44. ];
  45. yield [
  46. '<?php
  47. namespace Foo\Bar;
  48. use A\{B as X, C as Y};
  49. ',
  50. '<?php
  51. namespace Foo\Bar;
  52. use A\B as X;
  53. use A\C as Y;
  54. ',
  55. ];
  56. yield [
  57. '<?php
  58. namespace Test;
  59. use Foo\{Bar, Baz, Test};
  60. ',
  61. '<?php
  62. namespace Test;
  63. use Foo\Bar;
  64. use Foo\Baz;
  65. use Foo\Test;
  66. ',
  67. ];
  68. yield [
  69. '<?php
  70. use App\First;
  71. use Test\Second;
  72. use Foo\{Bar, Baz};
  73. ',
  74. '<?php
  75. use App\First;
  76. use Foo\Bar;
  77. use Test\Second;
  78. use Foo\Baz;
  79. ',
  80. ];
  81. yield [
  82. '<?php
  83. use App\{First, Second};
  84. use Foo\{Bar, Baz};
  85. ',
  86. '<?php
  87. use Foo\Bar;
  88. use Foo\Baz;
  89. use App\First;
  90. use App\Second;
  91. ',
  92. ];
  93. yield [
  94. '<?php
  95. use App\{First, Second};
  96. use Foo\{Bar, Baz};
  97. ',
  98. '<?php
  99. use Foo\Bar;
  100. use App\First;
  101. use Foo\Baz;
  102. use App\Second;
  103. ',
  104. ];
  105. yield [
  106. '<?php
  107. use Foo\{Bar as Test, Baz};
  108. use App;
  109. ',
  110. '<?php
  111. use Foo\Bar as Test;
  112. use Foo\Baz;
  113. use App;
  114. ',
  115. ];
  116. yield [
  117. '<?php
  118. use App\Repository\{Customer as Client, Profile, User};
  119. ',
  120. '<?php
  121. use App\Repository\User;
  122. use App\Repository\Profile;
  123. use App\Repository\Customer as Client;
  124. ',
  125. ];
  126. yield [
  127. '<?php
  128. use function Foo\{Bar, Baz, Test as Alias};
  129. ',
  130. '<?php
  131. use function Foo\Bar;
  132. use function Foo\Baz;
  133. use function Foo\Test as Alias;
  134. ',
  135. ];
  136. yield [
  137. '<?php
  138. use const Some\Place\{A, B, C as D};
  139. ',
  140. '<?php
  141. use const Some\Place\A;
  142. use const Some\Place\B;
  143. use const Some\Place\C as D;
  144. ',
  145. ];
  146. yield [
  147. '<?php
  148. use Foo\Bar;
  149. use Foo\Baz\Lorem\Ipsum\Lets\Write\Some\More\Strings\{One, Two};
  150. ',
  151. '<?php
  152. use Foo\Bar;
  153. use Foo\Baz\Lorem\Ipsum\Lets\Write\Some\More\Strings\One;
  154. use Foo\Baz\Lorem\Ipsum\Lets\Write\Some\More\Strings\Two;
  155. ',
  156. ];
  157. yield [
  158. '<?php
  159. use Foo\Baz\John\Smith\Junior;
  160. use Foo\{Bar, Baz};
  161. use Foo\Baz\John\{Doe, Smith};
  162. use Foo\Baz\Johnny\{DoeSecond, SmithSecond};
  163. ',
  164. '<?php
  165. use Foo\Bar;
  166. use Foo\Baz;
  167. use Foo\Baz\John\Doe;
  168. use Foo\Baz\John\Smith;
  169. use Foo\Baz\John\Smith\Junior;
  170. use Foo\Baz\Johnny\DoeSecond;
  171. use Foo\Baz\Johnny\SmithSecond;
  172. ',
  173. ];
  174. yield [
  175. '<?php
  176. use PhpCsFixer\Tokenizer\{AbstractTransformer, CT, Token, Tokens};
  177. ',
  178. '<?php
  179. use PhpCsFixer\Tokenizer\AbstractTransformer;
  180. use PhpCsFixer\Tokenizer\CT;
  181. use PhpCsFixer\Tokenizer\Token;
  182. use PhpCsFixer\Tokenizer\Tokens;
  183. ',
  184. ];
  185. yield [
  186. '<?php
  187. use Foo\{Bar, Baz};
  188. ',
  189. '<?php
  190. use Foo\Bar;use Foo\Baz;
  191. ',
  192. ];
  193. yield [
  194. '<?php
  195. use Foo\{Bar, Baz};
  196. \DontTouch::me();
  197. ',
  198. '<?php
  199. use Foo\Bar;use Foo\Baz;\DontTouch::me();
  200. ',
  201. ];
  202. yield [
  203. '<?php
  204. use Foo\{Bar, Baz};
  205. use ReflectionClass;
  206. use ReflectionMethod;
  207. ',
  208. '<?php
  209. use Foo\Bar;
  210. use Foo\Baz;
  211. use ReflectionClass;
  212. use ReflectionMethod;
  213. ',
  214. ];
  215. yield [
  216. '<?php
  217. use Foo\{Bar, Baz};
  218. use \ReflectionClass;
  219. use \ReflectionMethod;
  220. ',
  221. '<?php
  222. use Foo\Bar;
  223. use Foo\Baz;
  224. use \ReflectionClass;
  225. use \ReflectionMethod;
  226. ',
  227. ];
  228. yield [
  229. '<?php
  230. use Framework\Support\{Arr, Collection};
  231. use Framework\Database\ORM\{Model, SoftDeletes};
  232. use Framework\Notifications\{Notifiable, Notification};
  233. use Framework\Support\Facades\{DB, Log};
  234. use Framework\Database\ORM\Relations\{BelongsTo, HasOne};
  235. use Framework\Database\Query\JoinClause;
  236. ',
  237. '<?php
  238. use Framework\Database\ORM\Model;
  239. use Framework\Database\ORM\Relations\BelongsTo;
  240. use Framework\Database\ORM\Relations\HasOne;
  241. use Framework\Database\ORM\SoftDeletes;
  242. use Framework\Database\Query\JoinClause;
  243. use Framework\Notifications\Notifiable;
  244. use Framework\Notifications\Notification;
  245. use Framework\Support\Arr;
  246. use Framework\Support\Collection;
  247. use Framework\Support\Facades\DB;
  248. use Framework\Support\Facades\Log;
  249. ',
  250. ];
  251. yield [
  252. '<?php
  253. use Framework\Baz\Class6;
  254. use Framework\Bar\{Class3, Class4, Class5};
  255. use Framework\Foo\{Class1, Class2, Class7};
  256. ',
  257. '<?php
  258. use Framework\Foo\Class1;
  259. use Framework\Foo\Class2;
  260. use Framework\Bar\Class3;
  261. use Framework\Bar\Class4;
  262. use Framework\Bar\Class5;
  263. use Framework\Baz\Class6;
  264. use Framework\Foo\Class7;
  265. ',
  266. ];
  267. yield [
  268. '<?php
  269. use function Foo\baz;
  270. use Foo\{Bar, Baz};
  271. ',
  272. '<?php
  273. use Foo\Bar;
  274. use function Foo\baz;
  275. use Foo\Baz;
  276. ',
  277. ];
  278. yield [
  279. '<?php
  280. use Foo\{D, E};
  281. use function Foo\{a, b};
  282. use Foo\Bar\Baz\{A, B};
  283. use Foo\Bar\C;
  284. ',
  285. '<?php
  286. use Foo\Bar\Baz\A;
  287. use Foo\Bar\Baz\B;
  288. use Foo\Bar\C;
  289. use Foo\D;
  290. use Foo\E;
  291. use function Foo\a;
  292. use function Foo\b;
  293. ',
  294. ];
  295. }
  296. /**
  297. * @dataProvider provideFixPre80Cases
  298. *
  299. * @requires PHP <8.0
  300. */
  301. public function testFixPre80(string $expected, string $input = null): void
  302. {
  303. $this->doTest($expected, $input);
  304. }
  305. public static function provideFixPre80Cases(): iterable
  306. {
  307. yield [
  308. '<?php
  309. /*1*//*2*//*3*//*4*//*5*//*6*/
  310. /*7*//*8*//*9*//*10*//*11*//*12*/
  311. /*13*//*14*//*15*//*16*//*17*/use A\{B, C, D};
  312. /*18*/
  313. ',
  314. '<?php
  315. /*1*/use/*2*/A/*3*/\/*4*/B/*5*/;/*6*/
  316. /*7*/use/*8*/A/*9*/\/*10*/C/*11*/;/*12*/
  317. /*13*/use/*14*/A/*15*/\/*16*/D/*17*/;/*18*/
  318. ',
  319. ];
  320. }
  321. }