ArrayIndentationFixerTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  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\Whitespace;
  12. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  13. use PhpCsFixer\WhitespacesFixerConfig;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\Whitespace\ArrayIndentationFixer
  18. */
  19. final class ArrayIndentationFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @param string $expected
  23. * @param null|string $input
  24. *
  25. * @dataProvider provideFixCases
  26. */
  27. public function testFix($expected, $input = null)
  28. {
  29. $this->doTest($expected, $input);
  30. }
  31. public function provideFixCases()
  32. {
  33. return $this->withLongArraySyntaxCases([
  34. [
  35. <<<'EXPECTED'
  36. <?php
  37. $foo = [
  38. 'foo',
  39. 'bar' => 'baz',
  40. ];
  41. EXPECTED
  42. ,
  43. <<<'INPUT'
  44. <?php
  45. $foo = [
  46. 'foo',
  47. 'bar' => 'baz',
  48. ];
  49. INPUT
  50. ,
  51. ],
  52. [
  53. <<<'EXPECTED'
  54. <?php
  55. $foo = [
  56. 'foo',
  57. 'bar' => 'baz',
  58. ];
  59. EXPECTED
  60. ,
  61. <<<'INPUT'
  62. <?php
  63. $foo = [
  64. 'foo',
  65. 'bar' => 'baz',
  66. ];
  67. INPUT
  68. ,
  69. ],
  70. [
  71. <<<'EXPECTED'
  72. <?php
  73. $foo = [
  74. ['bar', 'baz'],
  75. [
  76. 'bar',
  77. 'baz'
  78. ],
  79. ];
  80. EXPECTED
  81. ,
  82. <<<'INPUT'
  83. <?php
  84. $foo = [
  85. ['bar', 'baz'],
  86. [
  87. 'bar',
  88. 'baz'
  89. ],
  90. ];
  91. INPUT
  92. ,
  93. ],
  94. [
  95. <<<'EXPECTED'
  96. <?php
  97. $foo = [
  98. ['foo',
  99. 'bar',
  100. ['foo',
  101. 'bar',
  102. ['foo',
  103. 'bar',
  104. 'baz']],
  105. 'baz'],
  106. ];
  107. EXPECTED
  108. ,
  109. <<<'INPUT'
  110. <?php
  111. $foo = [
  112. ['foo',
  113. 'bar',
  114. ['foo',
  115. 'bar',
  116. ['foo',
  117. 'bar',
  118. 'baz']],
  119. 'baz'],
  120. ];
  121. INPUT
  122. ,
  123. ],
  124. [
  125. <<<'EXPECTED'
  126. <?php
  127. class Foo
  128. {
  129. public $foo = [
  130. ['bar', 'baz'],
  131. [
  132. 'bar',
  133. 'baz'
  134. ],
  135. ];
  136. public function bar()
  137. {
  138. return [
  139. ['bar', 'baz'],
  140. [
  141. 'bar',
  142. 'baz'
  143. ],
  144. ];
  145. }
  146. }
  147. EXPECTED
  148. ,
  149. <<<'INPUT'
  150. <?php
  151. class Foo
  152. {
  153. public $foo = [
  154. ['bar', 'baz'],
  155. [
  156. 'bar',
  157. 'baz'
  158. ],
  159. ];
  160. public function bar()
  161. {
  162. return [
  163. ['bar', 'baz'],
  164. [
  165. 'bar',
  166. 'baz'
  167. ],
  168. ];
  169. }
  170. }
  171. INPUT
  172. ,
  173. ],
  174. [
  175. <<<'EXPECTED'
  176. <?php
  177. $foo = [
  178. 'foo' => foo(
  179. 1,
  180. 2
  181. ),
  182. 'bar' => bar(
  183. 1,
  184. 2
  185. ),
  186. 'baz' => baz(
  187. 1,
  188. 2
  189. ),
  190. ];
  191. EXPECTED
  192. ,
  193. <<<'INPUT'
  194. <?php
  195. $foo = [
  196. 'foo' => foo(
  197. 1,
  198. 2
  199. ),
  200. 'bar' => bar(
  201. 1,
  202. 2
  203. ),
  204. 'baz' => baz(
  205. 1,
  206. 2
  207. ),
  208. ];
  209. INPUT
  210. ,
  211. ],
  212. [
  213. <<<'EXPECTED'
  214. <?php
  215. $foo = [
  216. 'foo' => ['bar' => [
  217. 'baz',
  218. ]],
  219. 'qux',
  220. ];
  221. EXPECTED
  222. ,
  223. <<<'INPUT'
  224. <?php
  225. $foo = [
  226. 'foo' => ['bar' => [
  227. 'baz',
  228. ]],
  229. 'qux',
  230. ];
  231. INPUT
  232. ,
  233. ],
  234. [
  235. <<<'EXPECTED'
  236. <?php
  237. $foo = [
  238. 'foo' => [
  239. (new Foo())
  240. ->foo(),
  241. ],
  242. ];
  243. EXPECTED
  244. ,
  245. <<<'INPUT'
  246. <?php
  247. $foo = [
  248. 'foo' => [
  249. (new Foo())
  250. ->foo(),
  251. ],
  252. ];
  253. INPUT
  254. ,
  255. ],
  256. [
  257. <<<'EXPECTED'
  258. <?php
  259. $foo = [
  260. [new Foo(
  261. )],
  262. [new Foo(
  263. )],
  264. ];
  265. EXPECTED
  266. ,
  267. <<<'INPUT'
  268. <?php
  269. $foo = [
  270. [new Foo(
  271. )],
  272. [new Foo(
  273. )],
  274. ];
  275. INPUT
  276. ,
  277. ],
  278. [
  279. <<<'EXPECTED'
  280. <?php
  281. $foo = new Foo([
  282. (new Bar())
  283. ->foo([
  284. 'foo',
  285. 'foo',
  286. ])
  287. ->bar(['bar', 'bar'])
  288. ->baz([
  289. 'baz',
  290. 'baz',
  291. ])
  292. ,
  293. ]);
  294. EXPECTED
  295. ,
  296. <<<'INPUT'
  297. <?php
  298. $foo = new Foo([
  299. (new Bar())
  300. ->foo([
  301. 'foo',
  302. 'foo',
  303. ])
  304. ->bar(['bar', 'bar'])
  305. ->baz([
  306. 'baz',
  307. 'baz',
  308. ])
  309. ,
  310. ]);
  311. INPUT
  312. ,
  313. ],
  314. [
  315. <<<'EXPECTED'
  316. <?php
  317. class Foo
  318. {
  319. public function bar()
  320. {
  321. $foo = [
  322. 'foo',
  323. 'foo',
  324. ];
  325. $bar = [
  326. 'bar',
  327. 'bar',
  328. ];
  329. }
  330. }
  331. EXPECTED
  332. ,
  333. <<<'INPUT'
  334. <?php
  335. class Foo
  336. {
  337. public function bar()
  338. {
  339. $foo = [
  340. 'foo',
  341. 'foo',
  342. ];
  343. $bar = [
  344. 'bar',
  345. 'bar',
  346. ];
  347. }
  348. }
  349. INPUT
  350. ,
  351. ],
  352. [
  353. <<<'EXPECTED'
  354. <?php
  355. class Foo
  356. {
  357. public function bar()
  358. {
  359. return new Bar([
  360. (new Baz())
  361. ->qux([function ($a) {
  362. foreach ($a as $b) {
  363. if ($b) {
  364. throw new Exception(sprintf(
  365. 'Oops: %s',
  366. $b
  367. ));
  368. }
  369. }
  370. }]),
  371. ]);
  372. }
  373. }
  374. EXPECTED
  375. ,
  376. <<<'INPUT'
  377. <?php
  378. class Foo
  379. {
  380. public function bar()
  381. {
  382. return new Bar([
  383. (new Baz())
  384. ->qux([function ($a) {
  385. foreach ($a as $b) {
  386. if ($b) {
  387. throw new Exception(sprintf(
  388. 'Oops: %s',
  389. $b
  390. ));
  391. }
  392. }
  393. }]),
  394. ]);
  395. }
  396. }
  397. INPUT
  398. ,
  399. ],
  400. [
  401. <<<'EXPECTED'
  402. <?php
  403. $foo = [
  404. 'Foo'.
  405. foo()
  406. .bar()
  407. ,
  408. ];
  409. EXPECTED
  410. ,
  411. <<<'INPUT'
  412. <?php
  413. $foo = [
  414. 'Foo'.
  415. foo()
  416. .bar()
  417. ,
  418. ];
  419. INPUT
  420. ,
  421. ],
  422. [
  423. <<<'EXPECTED'
  424. <?php
  425. $foo = [
  426. [new \stdClass()],
  427. 'foo',
  428. ];
  429. EXPECTED
  430. ,
  431. <<<'INPUT'
  432. <?php
  433. $foo = [
  434. [new \stdClass()],
  435. 'foo',
  436. ];
  437. INPUT
  438. ,
  439. ],
  440. [
  441. <<<'EXPECTED'
  442. <?php
  443. $foo = [
  444. $bar
  445. ? 'bar'
  446. : 'foo'
  447. ,
  448. ];
  449. EXPECTED
  450. ,
  451. <<<'INPUT'
  452. <?php
  453. $foo = [
  454. $bar
  455. ? 'bar'
  456. : 'foo'
  457. ,
  458. ];
  459. INPUT
  460. ,
  461. ],
  462. [
  463. <<<'EXPECTED'
  464. <?php
  465. $foo = [
  466. $bar ?
  467. 'bar' :
  468. 'foo'
  469. ,
  470. ];
  471. EXPECTED
  472. ,
  473. <<<'INPUT'
  474. <?php
  475. $foo = [
  476. $bar ?
  477. 'bar' :
  478. 'foo'
  479. ,
  480. ];
  481. INPUT
  482. ,
  483. ],
  484. [
  485. <<<'EXPECTED'
  486. <?php
  487. $foo = [
  488. [
  489. 'foo',
  490. ], [
  491. 'bar',
  492. ],
  493. ];
  494. EXPECTED
  495. ,
  496. <<<'INPUT'
  497. <?php
  498. $foo = [
  499. [
  500. 'foo',
  501. ], [
  502. 'bar',
  503. ],
  504. ];
  505. INPUT
  506. ,
  507. ],
  508. [
  509. <<<'EXPECTED'
  510. <?php
  511. $foo = [
  512. 'foo', // comment
  513. 'bar',
  514. ];
  515. EXPECTED
  516. ,
  517. <<<'INPUT'
  518. <?php
  519. $foo = [
  520. 'foo', // comment
  521. 'bar',
  522. ];
  523. INPUT
  524. ,
  525. ],
  526. [
  527. <<<'EXPECTED'
  528. <?php
  529. $foo = [[[
  530. 'foo',
  531. 'bar',
  532. ],
  533. ],
  534. ];
  535. EXPECTED
  536. ,
  537. <<<'INPUT'
  538. <?php
  539. $foo = [[[
  540. 'foo',
  541. 'bar',
  542. ],
  543. ],
  544. ];
  545. INPUT
  546. ,
  547. ],
  548. [
  549. <<<'EXPECTED'
  550. <?php
  551. $foo = [
  552. [
  553. [
  554. 'foo',
  555. 'bar',
  556. ]]];
  557. EXPECTED
  558. ,
  559. <<<'INPUT'
  560. <?php
  561. $foo = [
  562. [
  563. [
  564. 'foo',
  565. 'bar',
  566. ]]];
  567. INPUT
  568. ,
  569. ],
  570. [
  571. <<<'EXPECTED'
  572. <?php
  573. $foo = [
  574. [
  575. [[
  576. [[[
  577. 'foo',
  578. 'bar',
  579. ]
  580. ]]
  581. ]
  582. ]
  583. ]];
  584. EXPECTED
  585. ,
  586. <<<'INPUT'
  587. <?php
  588. $foo = [
  589. [
  590. [[
  591. [[[
  592. 'foo',
  593. 'bar',
  594. ]
  595. ]]
  596. ]
  597. ]
  598. ]];
  599. INPUT
  600. ,
  601. ],
  602. [
  603. <<<'EXPECTED'
  604. <?php
  605. $foo = [[
  606. [
  607. [[[],[[
  608. [[[
  609. 'foo',
  610. 'bar',
  611. ],[[],[]]]
  612. ]],[
  613. 'baz',
  614. ]]
  615. ],[]],[]]
  616. ]
  617. ];
  618. EXPECTED
  619. ,
  620. <<<'INPUT'
  621. <?php
  622. $foo = [[
  623. [
  624. [[[],[[
  625. [[[
  626. 'foo',
  627. 'bar',
  628. ],[[],[]]]
  629. ]],[
  630. 'baz',
  631. ]]
  632. ],[]],[]]
  633. ]
  634. ];
  635. INPUT
  636. ,
  637. ],
  638. [
  639. <<<'EXPECTED'
  640. <?php if ($foo): ?>
  641. <?php foo([
  642. 'bar',
  643. 'baz',
  644. ]) ?>
  645. <?php endif ?>
  646. EXPECTED
  647. ,
  648. <<<'INPUT'
  649. <?php if ($foo): ?>
  650. <?php foo([
  651. 'bar',
  652. 'baz',
  653. ]) ?>
  654. <?php endif ?>
  655. INPUT
  656. ,
  657. ],
  658. [
  659. <<<'EXPECTED'
  660. <div>
  661. <a
  662. class="link"
  663. href="<?= Url::to([
  664. '/site/page',
  665. 'id' => 123,
  666. ]); ?>"
  667. >
  668. Link text
  669. </a>
  670. </div>
  671. EXPECTED
  672. ,
  673. <<<'INPUT'
  674. <div>
  675. <a
  676. class="link"
  677. href="<?= Url::to([
  678. '/site/page',
  679. 'id' => 123,
  680. ]); ?>"
  681. >
  682. Link text
  683. </a>
  684. </div>
  685. INPUT
  686. ,
  687. ],
  688. [
  689. <<<'EXPECTED'
  690. <?php
  691. $arr = [
  692. 'a' => 'b',
  693. // 'c' => 'd',
  694. ];
  695. EXPECTED
  696. ,
  697. <<<'INPUT'
  698. <?php
  699. $arr = [
  700. 'a' => 'b',
  701. // 'c' => 'd',
  702. ];
  703. INPUT
  704. ,
  705. ],
  706. [
  707. '<?php
  708. '.'
  709. $foo = [
  710. "foo",
  711. "bar",
  712. ];',
  713. ],
  714. [
  715. <<<'EXPECTED'
  716. <?php
  717. $foo = [
  718. 'foo' =>
  719. 'Some'
  720. .' long'
  721. .' string',
  722. 'bar' =>
  723. 'Another'
  724. .' long'
  725. .' string'
  726. ];
  727. EXPECTED
  728. ,
  729. <<<'INPUT'
  730. <?php
  731. $foo = [
  732. 'foo' =>
  733. 'Some'
  734. .' long'
  735. .' string',
  736. 'bar' =>
  737. 'Another'
  738. .' long'
  739. .' string'
  740. ];
  741. INPUT
  742. ,
  743. ],
  744. [
  745. <<<'EXPECTED'
  746. <?php
  747. $foo = [
  748. $test
  749. ? [
  750. 123,
  751. ]
  752. : [
  753. 321,
  754. ],
  755. ];
  756. EXPECTED
  757. ,
  758. <<<'INPUT'
  759. <?php
  760. $foo = [
  761. $test
  762. ? [
  763. 123,
  764. ]
  765. : [
  766. 321,
  767. ],
  768. ];
  769. INPUT
  770. ,
  771. ],
  772. [
  773. <<<'EXPECTED'
  774. <?php
  775. $foo = [[
  776. new Foo(
  777. 'foo'
  778. ),
  779. ]];
  780. EXPECTED
  781. ,
  782. <<<'INPUT'
  783. <?php
  784. $foo = [[
  785. new Foo(
  786. 'foo'
  787. ),
  788. ]];
  789. INPUT
  790. ,
  791. ],
  792. ]);
  793. }
  794. /**
  795. * @param string $expected
  796. * @param null|string $input
  797. *
  798. * @dataProvider provideFixWithTabsCases
  799. */
  800. public function testFixWithTabs($expected, $input = null)
  801. {
  802. $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t"));
  803. $this->doTest($expected, $input);
  804. }
  805. public function provideFixWithTabsCases()
  806. {
  807. return $this->withLongArraySyntaxCases([
  808. [
  809. <<<EXPECTED
  810. <?php
  811. \$foo = [
  812. \t'foo',
  813. \t'bar' => 'baz',
  814. ];
  815. EXPECTED
  816. ,
  817. <<<'INPUT'
  818. <?php
  819. $foo = [
  820. 'foo',
  821. 'bar' => 'baz',
  822. ];
  823. INPUT
  824. ,
  825. ],
  826. [
  827. <<<EXPECTED
  828. <?php
  829. \$foo = [
  830. \t'foo',
  831. \t'bar' => 'baz',
  832. ];
  833. EXPECTED
  834. ,
  835. <<<INPUT
  836. <?php
  837. \$foo = [
  838. \t\t\t'foo',
  839. \t\t'bar' => 'baz',
  840. ];
  841. INPUT
  842. ,
  843. ],
  844. ]);
  845. }
  846. /**
  847. * @param string $expected
  848. * @param null|string $input
  849. *
  850. * @dataProvider provideFixPhp74Cases
  851. * @requires PHP 7.4
  852. */
  853. public function testFixPhp74($expected, $input = null)
  854. {
  855. $this->doTest($expected, $input);
  856. }
  857. public function provideFixPhp74Cases()
  858. {
  859. return [
  860. [
  861. <<<'EXPECTED'
  862. <?php
  863. $foo = [
  864. ...$foo,
  865. ...$bar,
  866. ];
  867. EXPECTED
  868. ,
  869. <<<'INPUT'
  870. <?php
  871. $foo = [
  872. ...$foo,
  873. ...$bar,
  874. ];
  875. INPUT
  876. ,
  877. ],
  878. ];
  879. }
  880. private function withLongArraySyntaxCases(array $cases)
  881. {
  882. $longSyntaxCases = [];
  883. foreach ($cases as $case) {
  884. $case[0] = $this->toLongArraySyntax($case[0]);
  885. if (isset($case[1])) {
  886. $case[1] = $this->toLongArraySyntax($case[1]);
  887. }
  888. $longSyntaxCases[] = $case;
  889. }
  890. return array_merge($cases, $longSyntaxCases);
  891. }
  892. private function toLongArraySyntax($php)
  893. {
  894. return strtr($php, [
  895. '[' => 'array(',
  896. ']' => ')',
  897. ]);
  898. }
  899. }