NoBreakCommentFixerTest.php 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394
  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\ConfigurationException\InvalidFixerConfigurationException;
  14. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  15. use PhpCsFixer\WhitespacesFixerConfig;
  16. /**
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\ControlStructure\NoBreakCommentFixer
  20. */
  21. final class NoBreakCommentFixerTest 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. /**
  31. * @dataProvider provideFixCases
  32. */
  33. public function testFixWithExplicitDefaultConfiguration(string $expected, ?string $input = null): void
  34. {
  35. $this->fixer->configure([
  36. 'comment_text' => 'no break',
  37. ]);
  38. $this->doTest($expected, $input);
  39. }
  40. public static function provideFixCases(): iterable
  41. {
  42. yield [
  43. '<?php
  44. switch ($foo) {
  45. case 1:
  46. foo();
  47. // no break
  48. case 2:
  49. bar();
  50. // no break
  51. default:
  52. baz();
  53. }',
  54. '<?php
  55. switch ($foo) {
  56. case 1:
  57. foo();
  58. case 2:
  59. bar();
  60. default:
  61. baz();
  62. }',
  63. ];
  64. yield [
  65. '<?php
  66. switch ($foo) {
  67. case 1:
  68. foo();
  69. // no break
  70. case 2:
  71. bar();
  72. // no break
  73. default:
  74. baz();
  75. }',
  76. '<?php
  77. switch ($foo) {
  78. case 1:
  79. foo();
  80. case 2:
  81. bar();
  82. default:
  83. baz();
  84. }',
  85. ];
  86. yield [
  87. '<?php
  88. switch ($foo) {
  89. case 1:
  90. foo();
  91. // no break
  92. case 2:
  93. bar();
  94. // no break
  95. default:
  96. baz();
  97. }',
  98. '<?php
  99. switch ($foo) {
  100. case 1:
  101. foo(); // no break
  102. case 2:
  103. bar(); // no break
  104. default:
  105. baz();
  106. }',
  107. ];
  108. yield [
  109. '<?php
  110. switch ($foo) {
  111. case 1;
  112. foo();
  113. // no break
  114. case 2;
  115. bar();
  116. // no break
  117. default;
  118. baz();
  119. }',
  120. '<?php
  121. switch ($foo) {
  122. case 1;
  123. foo();
  124. case 2;
  125. bar();
  126. default;
  127. baz();
  128. }',
  129. ];
  130. yield [
  131. '<?php
  132. switch ($foo) {
  133. case 1:
  134. foo();
  135. // foo
  136. // no break
  137. case 2:
  138. bar();
  139. }',
  140. '<?php
  141. switch ($foo) {
  142. case 1:
  143. foo();
  144. // foo
  145. case 2:
  146. bar();
  147. }',
  148. ];
  149. yield [
  150. '<?php
  151. switch ($foo) { case 1: foo();
  152. // no break
  153. case 2: bar(); }',
  154. '<?php
  155. switch ($foo) { case 1: foo(); case 2: bar(); }',
  156. ];
  157. yield [
  158. '<?php
  159. switch ($foo) { case 1: foo();
  160. // no break
  161. case 2: bar(); }',
  162. '<?php
  163. switch ($foo) { case 1: foo();case 2: bar(); }',
  164. ];
  165. yield [
  166. '<?php
  167. switch ($foo) {
  168. case 1;
  169. foreach ($bar as $baz) {
  170. break;
  171. }
  172. // no break
  173. case 2;
  174. bar();
  175. }',
  176. '<?php
  177. switch ($foo) {
  178. case 1;
  179. foreach ($bar as $baz) {
  180. break;
  181. }
  182. case 2;
  183. bar();
  184. }',
  185. ];
  186. yield [
  187. '<?php
  188. switch ($foo) {
  189. case 1;
  190. for ($i = 0; $i < 1; ++$i) {
  191. break;
  192. }
  193. // no break
  194. case 2;
  195. bar();
  196. }',
  197. '<?php
  198. switch ($foo) {
  199. case 1;
  200. for ($i = 0; $i < 1; ++$i) {
  201. break;
  202. }
  203. case 2;
  204. bar();
  205. }',
  206. ];
  207. yield [
  208. '<?php
  209. switch ($foo) {
  210. case 1;
  211. foreach ($bar as $baz) {
  212. break;
  213. }
  214. // no break
  215. case 2;
  216. bar();
  217. }',
  218. '<?php
  219. switch ($foo) {
  220. case 1;
  221. foreach ($bar as $baz) {
  222. break;
  223. }
  224. case 2;
  225. bar();
  226. }',
  227. ];
  228. yield [
  229. '<?php
  230. switch ($foo) {
  231. case 1;
  232. if ($foo) {
  233. break;
  234. }
  235. // no break
  236. case 2;
  237. bar();
  238. }',
  239. '<?php
  240. switch ($foo) {
  241. case 1;
  242. if ($foo) {
  243. break;
  244. }
  245. case 2;
  246. bar();
  247. }',
  248. ];
  249. yield [
  250. '<?php
  251. switch ($foo) {
  252. case 1;
  253. do {
  254. break;
  255. } while ($bar);
  256. // no break
  257. case 2;
  258. bar();
  259. }',
  260. '<?php
  261. switch ($foo) {
  262. case 1;
  263. do {
  264. break;
  265. } while ($bar);
  266. case 2;
  267. bar();
  268. }',
  269. ];
  270. yield [
  271. '<?php
  272. switch ($foo) {
  273. case 1;
  274. $foo = function ($bar) {
  275. foreach ($bar as $baz) {
  276. break;
  277. }
  278. };
  279. // no break
  280. case 2;
  281. bar();
  282. }',
  283. '<?php
  284. switch ($foo) {
  285. case 1;
  286. $foo = function ($bar) {
  287. foreach ($bar as $baz) {
  288. break;
  289. }
  290. };
  291. case 2;
  292. bar();
  293. }',
  294. ];
  295. yield [
  296. '<?php
  297. switch ($foo) {
  298. case 1:
  299. switch ($bar) {
  300. case 1:
  301. foo();
  302. // no break
  303. case 2:
  304. bar();
  305. }
  306. break;
  307. case 2:
  308. switch ($bar) {
  309. case 1:
  310. bar();
  311. // no break
  312. case 2:
  313. foo();
  314. }
  315. }',
  316. '<?php
  317. switch ($foo) {
  318. case 1:
  319. switch ($bar) {
  320. case 1:
  321. foo();
  322. case 2:
  323. bar();
  324. }
  325. break;
  326. case 2:
  327. switch ($bar) {
  328. case 1:
  329. bar();
  330. case 2:
  331. foo();
  332. }
  333. }',
  334. ];
  335. yield [
  336. '<?php
  337. switch ($foo) {
  338. case 1:
  339. switch ($bar):
  340. case 1:
  341. foo();
  342. // no break
  343. case 2:
  344. bar();
  345. endswitch;
  346. break;
  347. case 2:
  348. switch ($bar):
  349. case 1:
  350. bar();
  351. // no break
  352. case 2:
  353. foo();
  354. endswitch;
  355. }',
  356. '<?php
  357. switch ($foo) {
  358. case 1:
  359. switch ($bar):
  360. case 1:
  361. foo();
  362. case 2:
  363. bar();
  364. endswitch;
  365. break;
  366. case 2:
  367. switch ($bar):
  368. case 1:
  369. bar();
  370. case 2:
  371. foo();
  372. endswitch;
  373. }',
  374. ];
  375. yield [
  376. '<?php
  377. switch ($foo) {
  378. case 1:
  379. foo();
  380. continue;
  381. case 2:
  382. bar();
  383. continue;
  384. default:
  385. baz();
  386. }',
  387. '<?php
  388. switch ($foo) {
  389. case 1:
  390. foo();
  391. // no break
  392. continue;
  393. case 2:
  394. bar();
  395. // no break
  396. continue;
  397. default:
  398. baz();
  399. }',
  400. ];
  401. yield [
  402. '<?php
  403. switch ($foo) {
  404. case 1:
  405. return foo();
  406. case 2:
  407. return bar();
  408. default:
  409. return baz();
  410. }',
  411. '<?php
  412. switch ($foo) {
  413. case 1:
  414. return foo();
  415. // no break
  416. case 2:
  417. return bar();
  418. // no break
  419. default:
  420. return baz();
  421. }',
  422. ];
  423. yield [
  424. '<?php
  425. switch ($foo) {
  426. case 1:
  427. return foo();
  428. case 2:
  429. return bar();
  430. default:
  431. return baz();
  432. }',
  433. '<?php
  434. switch ($foo) {
  435. case 1:
  436. // no break
  437. return foo();
  438. case 2:
  439. // no break
  440. return bar();
  441. default:
  442. return baz();
  443. }',
  444. ];
  445. yield [
  446. '<?php
  447. switch ($foo) {
  448. case 1:
  449. foo();
  450. break;
  451. case 2:
  452. bar();
  453. break;
  454. default:
  455. baz();
  456. }',
  457. '<?php
  458. switch ($foo) {
  459. case 1:
  460. foo();
  461. // no break
  462. break;
  463. case 2:
  464. bar();
  465. // no break
  466. break;
  467. default:
  468. baz();
  469. }',
  470. ];
  471. yield [
  472. '<?php
  473. switch ($foo) {
  474. case 1:
  475. foo();
  476. break;
  477. case 2:
  478. bar();
  479. break;
  480. case 21:
  481. bar();
  482. break;
  483. case 22:
  484. bar();
  485. break;
  486. case 23:
  487. bar();
  488. break;
  489. case 24:
  490. bar();
  491. break;
  492. case 3:
  493. baz();
  494. break;
  495. default:
  496. qux();
  497. }',
  498. '<?php
  499. switch ($foo) {
  500. case 1:
  501. foo();
  502. # no break
  503. break;
  504. case 2:
  505. bar();
  506. /* no break */
  507. break;
  508. case 21:
  509. bar();
  510. /*no break*/
  511. break;
  512. case 22:
  513. bar();
  514. /* no break */
  515. break;
  516. case 23:
  517. bar();
  518. /*no break */
  519. break;
  520. case 24:
  521. bar();
  522. /* no break*/
  523. break;
  524. case 3:
  525. baz();
  526. /** no break */
  527. break;
  528. default:
  529. qux();
  530. }',
  531. ];
  532. yield [
  533. '<?php
  534. switch ($foo) {
  535. case 1:
  536. case 2:
  537. bar();
  538. break;
  539. default:
  540. baz();
  541. }',
  542. '<?php
  543. switch ($foo) {
  544. case 1:
  545. // no break
  546. case 2:
  547. bar();
  548. // no break
  549. break;
  550. default:
  551. baz();
  552. }',
  553. ];
  554. yield [
  555. '<?php
  556. switch ($foo) {
  557. case 1:
  558. foo();
  559. }',
  560. '<?php
  561. switch ($foo) {
  562. case 1:
  563. foo();
  564. // no break
  565. }',
  566. ];
  567. yield [
  568. '<?php
  569. switch ($foo) {
  570. default:
  571. foo();
  572. }',
  573. '<?php
  574. switch ($foo) {
  575. default:
  576. foo();
  577. // no break
  578. }',
  579. ];
  580. yield [
  581. '<?php switch ($foo) { case 1: switch ($bar) { case 1: switch ($baz) { case 1: $foo = 1;
  582. // no break
  583. case 2: $foo = 2; }
  584. // no break
  585. case 2: switch ($baz) { case 1: $foo = 3;
  586. // no break
  587. case 2: $foo = 4; } }
  588. // no break
  589. case 2: switch ($bar) { case 1: switch ($baz) { case 1: $foo = 5;
  590. // no break
  591. case 2: $foo = 6; }
  592. // no break
  593. case 2: switch ($baz) { case 1: $foo = 7;
  594. // no break
  595. case 2: $foo = 8; } } }',
  596. '<?php switch ($foo) { case 1: switch ($bar) { case 1: switch ($baz) { case 1: $foo = 1; case 2: $foo = 2; } case 2: switch ($baz) { case 1: $foo = 3; case 2: $foo = 4; } } case 2: switch ($bar) { case 1: switch ($baz) { case 1: $foo = 5; case 2: $foo = 6; } case 2: switch ($baz) { case 1: $foo = 7; case 2: $foo = 8; } } }',
  597. ];
  598. yield [
  599. '<?php
  600. switch ($foo):
  601. case 1:
  602. foo();
  603. // no break
  604. case 2:
  605. bar();
  606. endswitch;',
  607. '<?php
  608. switch ($foo):
  609. case 1:
  610. foo();
  611. case 2:
  612. bar();
  613. // no break
  614. endswitch;',
  615. ];
  616. yield [
  617. '<?php
  618. switch ($foo) {
  619. case 1:
  620. ?>foo<?php
  621. // no break
  622. case 2:
  623. ?>bar<?php
  624. break;
  625. }',
  626. '<?php
  627. switch ($foo) {
  628. case 1:
  629. ?>foo<?php
  630. case 2:
  631. ?>bar<?php
  632. // no break
  633. break;
  634. }',
  635. ];
  636. yield [
  637. '<?php
  638. switch ($foo) {
  639. case 1:
  640. ?>foo<?php
  641. // no break
  642. case 2:
  643. ?>bar<?php
  644. break;
  645. }',
  646. '<?php
  647. switch ($foo) {
  648. case 1:
  649. ?>foo<?php
  650. case 2:
  651. ?>bar<?php
  652. // no break
  653. break;
  654. }',
  655. ];
  656. yield [
  657. '<?php
  658. switch ($foo) {
  659. case 1:
  660. ?>foo<?php // foo
  661. // no break
  662. case 2:
  663. ?>bar<?php // bar
  664. break;
  665. }',
  666. '<?php
  667. switch ($foo) {
  668. case 1:
  669. ?>foo<?php // foo
  670. case 2:
  671. ?>bar<?php // bar
  672. // no break
  673. break;
  674. }',
  675. ];
  676. yield [
  677. '<?php
  678. switch ($foo) {
  679. case 1:
  680. foo();
  681. // no break
  682. case 2:
  683. bar();
  684. // no break
  685. default:
  686. baz();
  687. }',
  688. '<?php
  689. switch ($foo) {
  690. case 1:
  691. // no break
  692. foo();
  693. case 2:
  694. // no break
  695. bar();
  696. default:
  697. baz();
  698. }',
  699. ];
  700. yield [
  701. '<?php
  702. switch ($foo) {
  703. case 1:
  704. die;
  705. case 2:
  706. exit;
  707. default:
  708. die;
  709. }',
  710. '<?php
  711. switch ($foo) {
  712. case 1:
  713. // no break
  714. die;
  715. case 2:
  716. // no break
  717. exit;
  718. default:
  719. die;
  720. }',
  721. ];
  722. yield [
  723. '<?php
  724. switch ($foo) {
  725. case 1: {
  726. throw new \Exception();
  727. }
  728. case 2:
  729. ?>
  730. <?php
  731. throw new \Exception();
  732. default:
  733. throw new \Exception();
  734. }',
  735. '<?php
  736. switch ($foo) {
  737. case 1: {
  738. // no break
  739. throw new \Exception();
  740. }
  741. case 2:
  742. ?>
  743. <?php
  744. // no break
  745. throw new \Exception();
  746. default:
  747. throw new \Exception();
  748. }',
  749. ];
  750. yield [
  751. '<?php
  752. switch ($foo) {
  753. case 1:
  754. goto a;
  755. case 2:
  756. goto a;
  757. default:
  758. goto a;
  759. }
  760. a:
  761. echo \'foo\';',
  762. '<?php
  763. switch ($foo) {
  764. case 1:
  765. // no break
  766. goto a;
  767. case 2:
  768. // no break
  769. goto a;
  770. default:
  771. goto a;
  772. }
  773. a:
  774. echo \'foo\';',
  775. ];
  776. yield [
  777. '<?php
  778. switch ($foo) {
  779. case "bar":
  780. if (1) {
  781. } else {
  782. }
  783. $aaa = new Bar();
  784. break;
  785. default:
  786. $aaa = new Baz();
  787. }',
  788. ];
  789. yield [
  790. '<?php
  791. switch ($foo) {
  792. case 1:
  793. ?>
  794. <?php
  795. // no break
  796. default:
  797. ?>
  798. <?php
  799. }',
  800. '<?php
  801. switch ($foo) {
  802. case 1:
  803. ?>
  804. <?php
  805. default:
  806. ?>
  807. <?php
  808. }',
  809. ];
  810. yield [
  811. '<?php
  812. switch ($foo) {
  813. case 1:
  814. ?>
  815. <?php
  816. // no break
  817. default:
  818. ?>
  819. <?php }',
  820. '<?php
  821. switch ($foo) {
  822. case 1:
  823. ?>
  824. <?php default:
  825. ?>
  826. <?php }',
  827. ];
  828. yield [
  829. '<?php
  830. switch ($foo) {
  831. case 1:
  832. foo();
  833. // no break
  834. case 2:
  835. bar();
  836. }',
  837. '<?php
  838. switch ($foo) {
  839. case 1:
  840. foo();
  841. // No break
  842. case 2:
  843. bar();
  844. }',
  845. ];
  846. yield [
  847. '<?php
  848. switch ($a) {
  849. case 1:
  850. throw new \Exception("");
  851. case 2;
  852. throw new \Exception("");
  853. case 3:
  854. throw new \Exception("");
  855. case 4;
  856. throw new \Exception("");
  857. case 5:
  858. throw new \Exception("");
  859. case 6;
  860. throw new \Exception("");
  861. }
  862. ',
  863. ];
  864. yield [
  865. '<?php
  866. switch ($f) {
  867. case 1:
  868. if ($a) {
  869. return "";
  870. }
  871. throw new $f();
  872. case Z:
  873. break;
  874. }',
  875. ];
  876. yield [
  877. '<?php
  878. switch ($foo) {
  879. case 1;
  880. $foo = new class {
  881. public function foo($bar)
  882. {
  883. foreach ($bar as $baz) {
  884. break;
  885. }
  886. }
  887. };
  888. // no break
  889. case 2;
  890. bar();
  891. }',
  892. '<?php
  893. switch ($foo) {
  894. case 1;
  895. $foo = new class {
  896. public function foo($bar)
  897. {
  898. foreach ($bar as $baz) {
  899. break;
  900. }
  901. }
  902. };
  903. case 2;
  904. bar();
  905. }',
  906. ];
  907. yield [
  908. '<?php
  909. switch ($foo) {
  910. case 1;
  911. $foo = new class(1) {
  912. public function foo($bar)
  913. {
  914. foreach ($bar as $baz) {
  915. break;
  916. }
  917. }
  918. };
  919. // no break
  920. case 2;
  921. bar();
  922. }',
  923. '<?php
  924. switch ($foo) {
  925. case 1;
  926. $foo = new class(1) {
  927. public function foo($bar)
  928. {
  929. foreach ($bar as $baz) {
  930. break;
  931. }
  932. }
  933. };
  934. case 2;
  935. bar();
  936. }',
  937. ];
  938. yield [
  939. '<?php
  940. switch($a) {
  941. case 1:
  942. $a = function () { throw new \Exception(""); };
  943. // no break
  944. case 2:
  945. $a = new class(){
  946. public function foo () { throw new \Exception(""); }
  947. };
  948. // no break
  949. case 3:
  950. echo 5;
  951. // no break
  952. default:
  953. echo 1;
  954. }
  955. ',
  956. '<?php
  957. switch($a) {
  958. case 1:
  959. $a = function () { throw new \Exception(""); };
  960. case 2:
  961. $a = new class(){
  962. public function foo () { throw new \Exception(""); }
  963. };
  964. case 3:
  965. echo 5;
  966. default:
  967. echo 1;
  968. }
  969. ',
  970. ];
  971. yield [
  972. '<?php
  973. switch ($foo) {
  974. case 10:
  975. echo 1;
  976. /* no break because of some more details stated here */
  977. case 22:
  978. break;
  979. }',
  980. ];
  981. yield [
  982. '<?php
  983. switch ($foo) {
  984. case 10:
  985. echo 1;
  986. # no break because of some more details stated here */
  987. case 22:
  988. break;
  989. }',
  990. ];
  991. yield [
  992. '<?php
  993. switch ($foo) {
  994. case 100:
  995. echo 10;
  996. /* no breaking windows please */
  997. // no break
  998. case 220:
  999. break;
  1000. }',
  1001. '<?php
  1002. switch ($foo) {
  1003. case 100:
  1004. echo 10;
  1005. /* no breaking windows please */
  1006. case 220:
  1007. break;
  1008. }',
  1009. ];
  1010. }
  1011. /**
  1012. * @dataProvider provideFixWithDifferentCommentTextCases
  1013. */
  1014. public function testFixWithDifferentCommentText(string $expected, ?string $input = null): void
  1015. {
  1016. $this->fixer->configure([
  1017. 'comment_text' => 'fall-through case!',
  1018. ]);
  1019. $this->doTest($expected, $input);
  1020. }
  1021. public static function provideFixWithDifferentCommentTextCases(): iterable
  1022. {
  1023. $cases = self::provideFixCases();
  1024. $replaceCommentText = static fn (string $php): string => strtr($php, [
  1025. 'No break' => 'Fall-through case!',
  1026. 'no break' => 'fall-through case!',
  1027. ]);
  1028. foreach ($cases as $case) {
  1029. $case[0] = $replaceCommentText($case[0]);
  1030. if (isset($case[1])) {
  1031. $case[1] = $replaceCommentText($case[1]);
  1032. }
  1033. yield $case;
  1034. }
  1035. yield [
  1036. '<?php
  1037. switch ($foo) {
  1038. case 1:
  1039. foo();
  1040. // no break
  1041. // fall-through case!
  1042. case 2:
  1043. bar();
  1044. // no break
  1045. // fall-through case!
  1046. default:
  1047. baz();
  1048. }',
  1049. '<?php
  1050. switch ($foo) {
  1051. case 1:
  1052. foo();
  1053. // no break
  1054. case 2:
  1055. bar();
  1056. // no break
  1057. default:
  1058. baz();
  1059. }',
  1060. ];
  1061. }
  1062. /**
  1063. * @dataProvider provideFixWithDifferentLineEndingCases
  1064. */
  1065. public function testFixWithDifferentLineEnding(string $expected, ?string $input = null): void
  1066. {
  1067. $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig(' ', "\r\n"));
  1068. $this->doTest($expected, $input);
  1069. }
  1070. public static function provideFixWithDifferentLineEndingCases(): iterable
  1071. {
  1072. foreach (self::provideFixCases() as $case) {
  1073. $case[0] = str_replace("\n", "\r\n", $case[0]);
  1074. if (isset($case[1])) {
  1075. $case[1] = str_replace("\n", "\r\n", $case[1]);
  1076. }
  1077. yield $case;
  1078. }
  1079. }
  1080. public function testFixWithCommentTextWithSpecialRegexpCharacters(): void
  1081. {
  1082. $this->fixer->configure([
  1083. 'comment_text' => '~***(//[No break here.]\\\\)***~',
  1084. ]);
  1085. $this->doTest(
  1086. '<?php
  1087. switch ($foo) {
  1088. case 1:
  1089. foo();
  1090. // ~***(//[No break here.]\\\\)***~
  1091. case 2:
  1092. bar();
  1093. // ~***(//[No break here.]\\\\)***~
  1094. default:
  1095. baz();
  1096. }',
  1097. '<?php
  1098. switch ($foo) {
  1099. case 1:
  1100. foo();
  1101. // ~***(//[No break here.]\\\\)***~
  1102. case 2:
  1103. bar();
  1104. default:
  1105. baz();
  1106. }'
  1107. );
  1108. }
  1109. public function testFixWithCommentTextWithTrailingSpaces(): void
  1110. {
  1111. $this->fixer->configure([
  1112. 'comment_text' => 'no break ',
  1113. ]);
  1114. $this->doTest(
  1115. '<?php
  1116. switch ($foo) {
  1117. case 1:
  1118. foo();
  1119. // no break
  1120. default:
  1121. baz();
  1122. }',
  1123. '<?php
  1124. switch ($foo) {
  1125. case 1:
  1126. foo();
  1127. default:
  1128. baz();
  1129. }'
  1130. );
  1131. }
  1132. /**
  1133. * @dataProvider provideFixWithCommentTextContainingNewLinesCases
  1134. */
  1135. public function testFixWithCommentTextContainingNewLines(string $text): void
  1136. {
  1137. $this->expectException(InvalidFixerConfigurationException::class);
  1138. $this->expectExceptionMessageMatches('/^\[no_break_comment\] Invalid configuration: The comment text must not contain new lines\.$/');
  1139. $this->fixer->configure([
  1140. 'comment_text' => $text,
  1141. ]);
  1142. }
  1143. public static function provideFixWithCommentTextContainingNewLinesCases(): iterable
  1144. {
  1145. yield ["No\nbreak"];
  1146. yield ["No\r\nbreak"];
  1147. yield ["No\rbreak"];
  1148. }
  1149. public function testConfigureWithInvalidOptions(): void
  1150. {
  1151. $this->expectException(InvalidFixerConfigurationException::class);
  1152. $this->expectExceptionMessageMatches('/^\[no_break_comment\] Invalid configuration: The option "foo" does not exist\. Defined options are: "comment_text"\.$/');
  1153. $this->fixer->configure(['foo' => true]);
  1154. }
  1155. /**
  1156. * @dataProvider provideFix80Cases
  1157. *
  1158. * @requires PHP 8.0
  1159. */
  1160. public function testFix80(string $expected, ?string $input = null): void
  1161. {
  1162. $this->doTest($expected, $input);
  1163. }
  1164. public static function provideFix80Cases(): iterable
  1165. {
  1166. yield [
  1167. '<?php
  1168. switch ($foo) {
  1169. case 1:
  1170. foo() ?? throw new \Exception();
  1171. // no break
  1172. case 2:
  1173. $a = $condition and throw new Exception();
  1174. // no break
  1175. case 3:
  1176. $callable = fn() => throw new Exception();
  1177. // no break
  1178. case 4:
  1179. $value = $falsableValue ?: throw new InvalidArgumentException();
  1180. // no break
  1181. default:
  1182. echo "PHP8";
  1183. }
  1184. ',
  1185. '<?php
  1186. switch ($foo) {
  1187. case 1:
  1188. foo() ?? throw new \Exception();
  1189. case 2:
  1190. $a = $condition and throw new Exception();
  1191. case 3:
  1192. $callable = fn() => throw new Exception();
  1193. case 4:
  1194. $value = $falsableValue ?: throw new InvalidArgumentException();
  1195. default:
  1196. echo "PHP8";
  1197. }
  1198. ',
  1199. ];
  1200. yield [
  1201. '<?php
  1202. match ($foo) {
  1203. 1 => "a",
  1204. default => "b"
  1205. };
  1206. match ($bar) {
  1207. 2 => "c",
  1208. default => "d"
  1209. };
  1210. match ($baz) {
  1211. 3 => "e",
  1212. default => "f"
  1213. };
  1214. ',
  1215. ];
  1216. yield 'switch with break and nested match' => [
  1217. '<?php switch ($value) {
  1218. case 1:
  1219. $x = match (true) {
  1220. default => 2
  1221. };
  1222. break;
  1223. default:
  1224. $x = 3;
  1225. }',
  1226. ];
  1227. yield 'switch without break and nested match' => [
  1228. '<?php switch ($value) {
  1229. case 1:
  1230. $x = match (true) {
  1231. default => 2
  1232. };
  1233. // no break
  1234. default:
  1235. $x = 3;
  1236. }',
  1237. '<?php switch ($value) {
  1238. case 1:
  1239. $x = match (true) {
  1240. default => 2
  1241. };
  1242. default:
  1243. $x = 3;
  1244. }',
  1245. ];
  1246. }
  1247. /**
  1248. * @dataProvider provideFix81Cases
  1249. *
  1250. * @requires PHP 8.1
  1251. */
  1252. public function testFix81(string $expected, ?string $input = null): void
  1253. {
  1254. $this->doTest($expected, $input);
  1255. }
  1256. public static function provideFix81Cases(): iterable
  1257. {
  1258. yield 'enums' => [
  1259. '<?php
  1260. enum Suit {
  1261. case Hearts;
  1262. case Diamonds;
  1263. case Clubs;
  1264. case Spades;
  1265. }
  1266. enum UserStatus: string {
  1267. case Pending = \'P\';
  1268. case Active = \'A\';
  1269. case Suspended = \'S\';
  1270. case CanceledByUser = \'C\';
  1271. }
  1272. switch($a) { // pass the `is candidate` check
  1273. case 1:
  1274. echo 1;
  1275. break;
  1276. }
  1277. ',
  1278. ];
  1279. }
  1280. }