SwitchContinueToBreakFixerTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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\ControlStructure;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\ControlStructure\SwitchContinueToBreakFixer
  18. */
  19. final class SwitchContinueToBreakFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideTestFixCases
  23. */
  24. public function testFix(string $expected, ?string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. public function provideTestFixCases(): \Generator
  29. {
  30. yield from [
  31. 'alternative syntax |' => [
  32. '<?php
  33. switch($foo):
  34. case 3:
  35. continue;
  36. endswitch?>
  37. ',
  38. ],
  39. 'alternative syntax ||' => [
  40. '<?php
  41. foreach ([] as $v) {
  42. continue;
  43. }
  44. if ($foo != 0) {
  45. }
  46. switch ($foo):
  47. endswitch;',
  48. ],
  49. 'nested switches' => [
  50. '<?php
  51. switch($z) {
  52. case 1:
  53. switch($x) {
  54. case 2:
  55. switch($y) {
  56. case 3:
  57. switch($z) {
  58. case 4:
  59. break; // z.1
  60. }
  61. break; // z
  62. }
  63. break; // y
  64. }
  65. break; // x
  66. }
  67. ',
  68. '<?php
  69. switch($z) {
  70. case 1:
  71. switch($x) {
  72. case 2:
  73. switch($y) {
  74. case 3:
  75. switch($z) {
  76. case 4:
  77. continue; // z.1
  78. }
  79. continue; // z
  80. }
  81. continue; // y
  82. }
  83. continue; // x
  84. }
  85. ',
  86. ],
  87. 'nested 2' => [
  88. '<?php
  89. while ($foo) {
  90. switch ($bar) {
  91. case "baz":
  92. while ($xyz) {
  93. switch($zA) {
  94. case 1:
  95. break 3; // fix
  96. }
  97. if ($z) continue;
  98. if ($zz){ continue; }
  99. if ($zzz) continue 3;
  100. if ($zzz){ continue 3; }
  101. if ($b) break 2; // fix
  102. }
  103. switch($zG) {
  104. case 1:
  105. switch($zF) {
  106. case 1:
  107. break 1; // fix
  108. case 2:
  109. break 2; // fix
  110. case 3:
  111. break 3; // fix
  112. case 4:
  113. while($a){
  114. while($a){
  115. while($a){
  116. if ($a) {
  117. break 4; // fix
  118. } elseif($z) {
  119. break 5; // fix
  120. } else {
  121. break 6; // fix
  122. }
  123. continue 7;
  124. }
  125. }
  126. }
  127. continue 4;
  128. }
  129. break 2; // fix
  130. }
  131. }
  132. }
  133. ',
  134. '<?php
  135. while ($foo) {
  136. switch ($bar) {
  137. case "baz":
  138. while ($xyz) {
  139. switch($zA) {
  140. case 1:
  141. continue 3; // fix
  142. }
  143. if ($z) continue;
  144. if ($zz){ continue; }
  145. if ($zzz) continue 3;
  146. if ($zzz){ continue 3; }
  147. if ($b) continue 2; // fix
  148. }
  149. switch($zG) {
  150. case 1:
  151. switch($zF) {
  152. case 1:
  153. continue 1; // fix
  154. case 2:
  155. continue 2; // fix
  156. case 3:
  157. continue 3; // fix
  158. case 4:
  159. while($a){
  160. while($a){
  161. while($a){
  162. if ($a) {
  163. continue 4; // fix
  164. } elseif($z) {
  165. continue 5; // fix
  166. } else {
  167. continue 6; // fix
  168. }
  169. continue 7;
  170. }
  171. }
  172. }
  173. continue 4;
  174. }
  175. continue 2; // fix
  176. }
  177. }
  178. }
  179. ',
  180. ],
  181. 'nested do while' => [
  182. '<?php
  183. switch ($a) {
  184. case 1:
  185. do {
  186. switch ($a) {
  187. case 1:
  188. do {
  189. switch ($a) {
  190. case 1:
  191. do {
  192. continue;
  193. } while (false);
  194. break;
  195. }
  196. continue;
  197. } while (false);
  198. break;
  199. }
  200. continue;
  201. } while (false);
  202. break;
  203. }
  204. ',
  205. '<?php
  206. switch ($a) {
  207. case 1:
  208. do {
  209. switch ($a) {
  210. case 1:
  211. do {
  212. switch ($a) {
  213. case 1:
  214. do {
  215. continue;
  216. } while (false);
  217. continue;
  218. }
  219. continue;
  220. } while (false);
  221. continue;
  222. }
  223. continue;
  224. } while (false);
  225. continue;
  226. }
  227. ',
  228. ],
  229. [
  230. '<?php
  231. switch(foo()) {
  232. case 1: while(bar($i))continue;break;
  233. default: echo 7;
  234. }
  235. ',
  236. '<?php
  237. switch(foo()) {
  238. case 1: while(bar($i))continue;continue;
  239. default: echo 7;
  240. }
  241. ',
  242. ],
  243. 'do not fix cases' => [
  244. '<?php
  245. switch($a) {
  246. case 1:
  247. while (false) {
  248. continue;
  249. }
  250. while (false) break 1;
  251. do {
  252. continue;
  253. } while (false);
  254. for ($a = 0; $a < 1; ++$a) {
  255. continue;
  256. }
  257. foreach ($a as $b) continue;
  258. for (; $i < 1; ++$i) break 1; echo $i;
  259. for (;;) continue;
  260. while(false) continue;
  261. while(false) continue?><?php
  262. // so bad and such a mess, not worth adding a ton of logic to fix this
  263. switch($z) {
  264. case 1:
  265. continue ?> <?php 23;
  266. case 2:
  267. continue 1?> <?php + $a;
  268. }
  269. }
  270. ',
  271. ],
  272. 'nested while, do not fix' => [
  273. '<?php
  274. switch(foo()) {
  275. case 1: while(bar($i)){ --$i; echo 1; continue;}break;
  276. default: echo 8;
  277. }',
  278. ],
  279. 'not int cases' => [
  280. '<?php
  281. while($b) {
  282. switch($a) {
  283. case 1:
  284. break 01;
  285. case 2:
  286. break 0x1;
  287. case 22:
  288. break 0x01;
  289. case 3:
  290. break 0b1;
  291. case 32:
  292. break 0b0001;
  293. case 4:
  294. break 0b000001;
  295. // do not fix
  296. case 1:
  297. continue 02;
  298. case 2:
  299. continue 0x2;
  300. case 3:
  301. continue 0b10;
  302. }
  303. }',
  304. '<?php
  305. while($b) {
  306. switch($a) {
  307. case 1:
  308. continue 01;
  309. case 2:
  310. continue 0x1;
  311. case 22:
  312. continue 0x01;
  313. case 3:
  314. continue 0b1;
  315. case 32:
  316. continue 0b0001;
  317. case 4:
  318. continue 0b000001;
  319. // do not fix
  320. case 1:
  321. continue 02;
  322. case 2:
  323. continue 0x2;
  324. case 3:
  325. continue 0b10;
  326. }
  327. }',
  328. ],
  329. 'deep nested case' => [
  330. '<?php
  331. switch ($a) {
  332. case $b:
  333. while (false) {
  334. while (false) {
  335. while (false) {
  336. while (false) {
  337. while (false) {
  338. while (false) {
  339. while (false) {
  340. while (false) {
  341. switch ($a) {
  342. case 1:
  343. echo 1;
  344. break 10;
  345. }}}}}}}}}}',
  346. '<?php
  347. switch ($a) {
  348. case $b:
  349. while (false) {
  350. while (false) {
  351. while (false) {
  352. while (false) {
  353. while (false) {
  354. while (false) {
  355. while (false) {
  356. while (false) {
  357. switch ($a) {
  358. case 1:
  359. echo 1;
  360. continue 10;
  361. }}}}}}}}}}',
  362. ],
  363. ];
  364. if (\PHP_VERSION_ID < 70000) {
  365. yield 'simple case' => [
  366. '<?php
  367. switch($a) {
  368. case 1:
  369. echo 1;
  370. break;
  371. case 2:
  372. echo 2;
  373. if ($z) break 1;
  374. break 1;
  375. case 3:
  376. echo 2;
  377. continue 2;
  378. case 4:
  379. continue 12;
  380. }
  381. ',
  382. '<?php
  383. switch($a) {
  384. case 1:
  385. echo 1;
  386. continue;
  387. case 2:
  388. echo 2;
  389. if ($z) continue 1;
  390. continue 1;
  391. case 3:
  392. echo 2;
  393. continue 2;
  394. case 4:
  395. continue 12;
  396. }
  397. ',
  398. ];
  399. yield 'nested 1' => [
  400. '<?php
  401. while($a) {
  402. switch($b) {
  403. case 1:
  404. break 1;
  405. case 2:
  406. break 1;
  407. case 3:
  408. continue 2;
  409. case 4:
  410. continue 3;
  411. }
  412. }
  413. switch($b) {
  414. case 1:
  415. switch($c) {
  416. case 1:
  417. break 2;
  418. }
  419. }
  420. ',
  421. '<?php
  422. while($a) {
  423. switch($b) {
  424. case 1:
  425. continue 1;
  426. case 2:
  427. continue 1;
  428. case 3:
  429. continue 2;
  430. case 4:
  431. continue 3;
  432. }
  433. }
  434. switch($b) {
  435. case 1:
  436. switch($c) {
  437. case 1:
  438. continue 2;
  439. }
  440. }
  441. ',
  442. ];
  443. }
  444. yield [
  445. '<?php
  446. switch($a) {
  447. case "a":
  448. echo __FILE__;
  449. break;
  450. }
  451. ',
  452. '<?php
  453. switch($a) {
  454. case "a":
  455. echo __FILE__;
  456. continue;
  457. }
  458. ',
  459. ];
  460. }
  461. /**
  462. * @requires PHP 7.4
  463. *
  464. * @dataProvider provideFix74Cases
  465. */
  466. public function testFix74(string $expected, ?string $input = null): void
  467. {
  468. $this->doTest($expected, $input);
  469. }
  470. public function provideFix74Cases(): array
  471. {
  472. return [
  473. 'numeric literal separator' => [
  474. '<?php
  475. switch ($a) {
  476. case $b:
  477. while (false) {
  478. while (false) {
  479. while (false) {
  480. while (false) {
  481. while (false) {
  482. while (false) {
  483. while (false) {
  484. while (false) {
  485. switch ($a) {
  486. case 1:
  487. echo 1;
  488. break 1_0;
  489. }}}}}}}}}}',
  490. '<?php
  491. switch ($a) {
  492. case $b:
  493. while (false) {
  494. while (false) {
  495. while (false) {
  496. while (false) {
  497. while (false) {
  498. while (false) {
  499. while (false) {
  500. while (false) {
  501. switch ($a) {
  502. case 1:
  503. echo 1;
  504. continue 1_0;
  505. }}}}}}}}}}',
  506. ],
  507. ];
  508. }
  509. }