SwitchContinueToBreakFixerTest.php 11 KB

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