SwitchContinueToBreakFixerTest.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  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 provideFixCases
  23. */
  24. public function testFix(string $expected, ?string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. public static function provideFixCases(): iterable
  29. {
  30. yield 'alternative syntax |' => [
  31. '<?php
  32. switch($foo):
  33. case 3:
  34. continue;
  35. endswitch?>
  36. ',
  37. ];
  38. yield 'alternative syntax ||' => [
  39. '<?php
  40. foreach ([] as $v) {
  41. continue;
  42. }
  43. if ($foo != 0) {
  44. }
  45. switch ($foo):
  46. endswitch;',
  47. ];
  48. yield 'nested switches' => [
  49. '<?php
  50. switch($z) {
  51. case 1:
  52. switch($x) {
  53. case 2:
  54. switch($y) {
  55. case 3:
  56. switch($z) {
  57. case 4:
  58. break; // z.1
  59. }
  60. break; // z
  61. }
  62. break; // y
  63. }
  64. break; // x
  65. }
  66. ',
  67. '<?php
  68. switch($z) {
  69. case 1:
  70. switch($x) {
  71. case 2:
  72. switch($y) {
  73. case 3:
  74. switch($z) {
  75. case 4:
  76. continue; // z.1
  77. }
  78. continue; // z
  79. }
  80. continue; // y
  81. }
  82. continue; // x
  83. }
  84. ',
  85. ];
  86. yield 'nested 2' => [
  87. '<?php
  88. while ($foo) {
  89. switch ($bar) {
  90. case "baz":
  91. while ($xyz) {
  92. switch($zA) {
  93. case 1:
  94. break 3; // fix
  95. }
  96. if ($z) continue;
  97. if ($zz){ continue; }
  98. if ($zzz) continue 3;
  99. if ($zzz){ continue 3; }
  100. if ($b) break 2; // fix
  101. }
  102. switch($zG) {
  103. case 1:
  104. switch($zF) {
  105. case 1:
  106. break 1; // fix
  107. case 2:
  108. break 2; // fix
  109. case 3:
  110. break 3; // fix
  111. case 4:
  112. while($a){
  113. while($a){
  114. while($a){
  115. if ($a) {
  116. break 4; // fix
  117. } elseif($z) {
  118. break 5; // fix
  119. } else {
  120. break 6; // fix
  121. }
  122. continue 7;
  123. }
  124. }
  125. }
  126. continue 4;
  127. }
  128. break 2; // fix
  129. }
  130. }
  131. }
  132. ',
  133. '<?php
  134. while ($foo) {
  135. switch ($bar) {
  136. case "baz":
  137. while ($xyz) {
  138. switch($zA) {
  139. case 1:
  140. continue 3; // fix
  141. }
  142. if ($z) continue;
  143. if ($zz){ continue; }
  144. if ($zzz) continue 3;
  145. if ($zzz){ continue 3; }
  146. if ($b) continue 2; // fix
  147. }
  148. switch($zG) {
  149. case 1:
  150. switch($zF) {
  151. case 1:
  152. continue 1; // fix
  153. case 2:
  154. continue 2; // fix
  155. case 3:
  156. continue 3; // fix
  157. case 4:
  158. while($a){
  159. while($a){
  160. while($a){
  161. if ($a) {
  162. continue 4; // fix
  163. } elseif($z) {
  164. continue 5; // fix
  165. } else {
  166. continue 6; // fix
  167. }
  168. continue 7;
  169. }
  170. }
  171. }
  172. continue 4;
  173. }
  174. continue 2; // fix
  175. }
  176. }
  177. }
  178. ',
  179. ];
  180. yield 'nested do while' => [
  181. '<?php
  182. switch ($a) {
  183. case 1:
  184. do {
  185. switch ($a) {
  186. case 1:
  187. do {
  188. switch ($a) {
  189. case 1:
  190. do {
  191. continue;
  192. } while (false);
  193. break;
  194. }
  195. continue;
  196. } while (false);
  197. break;
  198. }
  199. continue;
  200. } while (false);
  201. break;
  202. }
  203. ',
  204. '<?php
  205. switch ($a) {
  206. case 1:
  207. do {
  208. switch ($a) {
  209. case 1:
  210. do {
  211. switch ($a) {
  212. case 1:
  213. do {
  214. continue;
  215. } while (false);
  216. continue;
  217. }
  218. continue;
  219. } while (false);
  220. continue;
  221. }
  222. continue;
  223. } while (false);
  224. continue;
  225. }
  226. ',
  227. ];
  228. yield [
  229. '<?php
  230. switch(foo()) {
  231. case 1: while(bar($i))continue;break;
  232. default: echo 7;
  233. }
  234. ',
  235. '<?php
  236. switch(foo()) {
  237. case 1: while(bar($i))continue;continue;
  238. default: echo 7;
  239. }
  240. ',
  241. ];
  242. yield 'do not fix cases' => [
  243. '<?php
  244. switch($a) {
  245. case 1:
  246. while (false) {
  247. continue;
  248. }
  249. while (false) break 1;
  250. do {
  251. continue;
  252. } while (false);
  253. for ($a = 0; $a < 1; ++$a) {
  254. continue;
  255. }
  256. foreach ($a as $b) continue;
  257. for (; $i < 1; ++$i) break 1; echo $i;
  258. for (;;) continue;
  259. while(false) continue;
  260. while(false) continue?><?php
  261. // so bad and such a mess, not worth adding a ton of logic to fix this
  262. switch($z) {
  263. case 1:
  264. continue ?> <?php 23;
  265. case 2:
  266. continue 1?> <?php + $a;
  267. }
  268. }
  269. ',
  270. ];
  271. yield 'nested while, do not fix' => [
  272. '<?php
  273. switch(foo()) {
  274. case 1: while(bar($i)){ --$i; echo 1; continue;}break;
  275. default: echo 8;
  276. }',
  277. ];
  278. yield 'not int cases' => [
  279. '<?php
  280. while($b) {
  281. switch($a) {
  282. case 1:
  283. break 01;
  284. case 2:
  285. break 0x1;
  286. case 22:
  287. break 0x01;
  288. case 3:
  289. break 0b1;
  290. case 32:
  291. break 0b0001;
  292. case 4:
  293. break 0b000001;
  294. // do not fix
  295. case 1:
  296. continue 02;
  297. case 2:
  298. continue 0x2;
  299. case 3:
  300. continue 0b10;
  301. }
  302. }',
  303. '<?php
  304. while($b) {
  305. switch($a) {
  306. case 1:
  307. continue 01;
  308. case 2:
  309. continue 0x1;
  310. case 22:
  311. continue 0x01;
  312. case 3:
  313. continue 0b1;
  314. case 32:
  315. continue 0b0001;
  316. case 4:
  317. continue 0b000001;
  318. // do not fix
  319. case 1:
  320. continue 02;
  321. case 2:
  322. continue 0x2;
  323. case 3:
  324. continue 0b10;
  325. }
  326. }',
  327. ];
  328. yield 'deep nested case' => [
  329. '<?php
  330. switch ($a) {
  331. case $b:
  332. while (false) {
  333. while (false) {
  334. while (false) {
  335. while (false) {
  336. while (false) {
  337. while (false) {
  338. while (false) {
  339. while (false) {
  340. switch ($a) {
  341. case 1:
  342. echo 1;
  343. break 10;
  344. }}}}}}}}}}',
  345. '<?php
  346. switch ($a) {
  347. case $b:
  348. while (false) {
  349. while (false) {
  350. while (false) {
  351. while (false) {
  352. while (false) {
  353. while (false) {
  354. while (false) {
  355. while (false) {
  356. switch ($a) {
  357. case 1:
  358. echo 1;
  359. continue 10;
  360. }}}}}}}}}}',
  361. ];
  362. yield [
  363. '<?php
  364. switch($a) {
  365. case "a":
  366. echo __FILE__;
  367. break;
  368. }
  369. ',
  370. '<?php
  371. switch($a) {
  372. case "a":
  373. echo __FILE__;
  374. continue;
  375. }
  376. ',
  377. 'numeric literal separator' => [
  378. '<?php
  379. switch ($a) {
  380. case $b:
  381. while (false) {
  382. while (false) {
  383. while (false) {
  384. while (false) {
  385. while (false) {
  386. while (false) {
  387. while (false) {
  388. while (false) {
  389. switch ($a) {
  390. case 1:
  391. echo 1;
  392. break 1_0;
  393. }}}}}}}}}}',
  394. '<?php
  395. switch ($a) {
  396. case $b:
  397. while (false) {
  398. while (false) {
  399. while (false) {
  400. while (false) {
  401. while (false) {
  402. while (false) {
  403. while (false) {
  404. while (false) {
  405. switch ($a) {
  406. case 1:
  407. echo 1;
  408. continue 1_0;
  409. }}}}}}}}}}',
  410. ],
  411. ];
  412. }
  413. }