YodaStyleFixerTest.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  15. * @author SpacePossum
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\ControlStructure\YodaStyleFixer
  20. */
  21. final class YodaStyleFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @param string $expected
  25. * @param null|string $input
  26. *
  27. * @dataProvider provideFixCases
  28. */
  29. public function testFix($expected, $input = null)
  30. {
  31. $this->fixer->configure(['equal' => true, 'identical' => true]);
  32. $this->doTest($expected, $input);
  33. }
  34. /**
  35. * Test with the inverse config.
  36. *
  37. * @param string $expected
  38. * @param null|string $input
  39. *
  40. * @dataProvider provideFixCases
  41. */
  42. public function testFixInverse($expected, $input = null)
  43. {
  44. $this->fixer->configure(['equal' => false, 'identical' => false]);
  45. if (null === $input) {
  46. $this->doTest($expected);
  47. } else {
  48. $this->doTest($input, $expected);
  49. }
  50. }
  51. /**
  52. * @return array
  53. */
  54. public function provideFixCases()
  55. {
  56. return [
  57. [
  58. '<?= 1 === $a ? 5 : 7;',
  59. '<?= $a === 1 ? 5 : 7;',
  60. ],
  61. [
  62. '<?php print 1 === 1343;',
  63. ],
  64. [
  65. '<?php
  66. echo 3 === $a ? 2 : 4;
  67. ',
  68. '<?php
  69. echo $a === 3 ? 2 : 4;
  70. ',
  71. ],
  72. [
  73. '<?php 1 === lala($a) ? 1 : 2;',
  74. '<?php lala($a) === 1 ? 1 : 2;',
  75. ],
  76. [
  77. '<?php 1 === $a::$a ? 1 : 2;',
  78. '<?php $a::$a === 1 ? 1 : 2;',
  79. ],
  80. [
  81. '<?php 1 === (bool) $a ? 8 : 7;',
  82. '<?php (bool) $a === 1 ? 8 : 7;',
  83. ],
  84. [
  85. '<?php 1 === new $a ? 1 : 2;',
  86. '<?php new $a === 1 ? 1 : 2;',
  87. ],
  88. [
  89. '<?php 1 === "a".$a ? 5 : 6;',
  90. '<?php "a".$a === 1 ? 5 : 6;',
  91. ],
  92. [
  93. '<?php 1 === __DIR__.$a ? 5 : 6;',
  94. '<?php __DIR__.$a === 1 ? 5 : 6;',
  95. ],
  96. [
  97. '<?php 1 === $a.$b ? 5 : 6;',
  98. '<?php $a.$b === 1 ? 5 : 6;',
  99. ],
  100. [
  101. '<?php echo 1 === (object) $a ? 8 : 7;',
  102. '<?php echo (object) $a === 1 ? 8 : 7;',
  103. ],
  104. [
  105. '<?php 1===(real)$a?1:2;',
  106. '<?php (real)$a===1?1:2;',
  107. ],
  108. [
  109. '<?php echo 1 === (unset) $a ? 8 : 7;',
  110. '<?php echo (unset) $a === 1 ? 8 : 7;',
  111. ],
  112. [
  113. '<?php echo 1 === (int) $a ? 8 : 7;',
  114. '<?php echo (int) $a === 1 ? 8 : 7;',
  115. ],
  116. [
  117. '<?php echo 1 === (float) $a ? 8 : 7;',
  118. '<?php echo (float) $a === 1 ? 8 : 7;',
  119. ],
  120. [
  121. '<?php echo 1 === (string) $a ? 8 : 7;',
  122. '<?php echo (string) $a === 1 ? 8 : 7;',
  123. ],
  124. [
  125. '<?php echo 1 === (array) $a ? 8 : 7;',
  126. '<?php echo (array) $a === 1 ? 8 : 7;',
  127. ],
  128. [
  129. '<?php echo 1 === (bool) $a ? 8 : 7;',
  130. '<?php echo (bool) $a === 1 ? 8 : 7;',
  131. ],
  132. [
  133. '<?php
  134. if ($a = true === $obj instanceof A) {
  135. echo \'A\';
  136. }',
  137. '<?php
  138. if ($a = $obj instanceof A === true) {
  139. echo \'A\';
  140. }',
  141. ],
  142. [
  143. '<?php echo 1 === !!$a ? 8 : 7;',
  144. '<?php echo !!$a === 1 ? 8 : 7;',
  145. ],
  146. [
  147. '<?php 1 === new $a ? 1 : 2;',
  148. '<?php new $a === 1 ? 1 : 2;',
  149. ],
  150. [
  151. '<?php $a = 1 === new b ? 1 : 2;',
  152. '<?php $a = new b === 1 ? 1 : 2;',
  153. ],
  154. [
  155. '<?php $a = 1 === empty($a) ? 1 : 2;',
  156. '<?php $a = empty($a) === 1 ? 1 : 2;',
  157. ],
  158. [
  159. '<?php $b = 1 === clone $a ? 5 : 9;',
  160. '<?php $b = clone $a === 1 ? 5 : 9;',
  161. ],
  162. [
  163. '<?php while(1 === $a ? 1 : 2){};',
  164. '<?php while($a === 1 ? 1 : 2){};',
  165. ],
  166. [
  167. '<?php $a = 1 === include_once $a ? 1 : 2;',
  168. '<?php $a = include_once $a === 1 ? 1 : 2;',
  169. ],
  170. [
  171. '<?php echo 1 === include $a ? 1 : 2;',
  172. '<?php echo include $a === 1 ? 1 : 2;',
  173. ],
  174. [
  175. '<?php echo 1 === require_once $a ? 1 : 2;',
  176. '<?php echo require_once $a === 1 ? 1 : 2;',
  177. ],
  178. [
  179. '<?php echo 1 === require $a ? 1 : 2;',
  180. '<?php echo require $a === 1 ? 1 : 2;',
  181. ],
  182. [
  183. '<?php switch(1 === $a){
  184. case true: echo 1;
  185. };',
  186. '<?php switch($a === 1){
  187. case true: echo 1;
  188. };',
  189. ],
  190. [
  191. '<?php echo 1 === $a ? 1 : 2;',
  192. '<?php echo $a === 1 ? 1 : 2;',
  193. ],
  194. // Don't fix cases.
  195. ['<?php $a = 1 === 1;'],
  196. ['<?php $b = $b === $c;'],
  197. ['<?php $c = $$b === $$c;'],
  198. ['<?php $d = count($this->array[$var]) === $a;'],
  199. ['<?php $e = $a === count($this->array[$var]);'],
  200. ['<?php $f = ($a & self::MY_BITMASK) === $a;'],
  201. ['<?php $g = $a === ($a & self::MY_BITMASK);'],
  202. ['<?php $h = $this->getStuff() === $myVariable;'],
  203. ['<?php $i = $myVariable === $this->getStuff();'],
  204. ['<?php $j = 2 * $myVar % 3 === $a;'],
  205. ['<?php return $k === 2 * $myVar % 3;'],
  206. ['<?php $l = $c > 2;'],
  207. ['<?php return $this->myObject1->{$index}+$b === "";'],
  208. ['<?php return $m[2]+1 == 2;'],
  209. // https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/693
  210. ['<?php return array(2) == $o;'],
  211. ['<?php return $p == array(2);'],
  212. ['<?php return array($q) == $a;'],
  213. ['<?php return $r == array($a);'],
  214. ['<?php $s = ((array(2))) == $a;'],
  215. ['<?php $t = $a == ((array(2)));'],
  216. ['<?php list($a) = $c === array(1) ? $b : $d;'],
  217. ['<?php $b = 7 === list($a) = [7];'],
  218. ['<?php $a = function(){} === array(0);'],
  219. ['<?php $z = $n == list($a) = $b;'],
  220. ['<?php return $n == list($a) = $b;'],
  221. // Fix cases.
  222. 'Array destruct by ternary.' => [
  223. '<?php list($a) = 11 === $c ? $b : $d;',
  224. '<?php list($a) = $c === 11 ? $b : $d;',
  225. ],
  226. 'Less spacing.' => [
  227. '<?php $z=2==$a;$b=$c>1&&$c<=10;',
  228. '<?php $z=$a==2;$b=$c>1&&$c<=10;',
  229. ],
  230. 'Comments.' => [
  231. '<?php $z = /**/ /**/2/**/ /**/
  232. # aa
  233. /**/==/**/$a/***/;',
  234. '<?php $z = /**/ /**/$a/**/ /**/
  235. # aa
  236. /**/==/**/2/***/;',
  237. ],
  238. [
  239. '<?php return 2 == ($a)?>',
  240. '<?php return ($a) == 2?>',
  241. ],
  242. [
  243. '<?php $a = ($c === ((null === $b)));',
  244. '<?php $a = ($c === (($b === null)));',
  245. ],
  246. [
  247. '<?php return null == $a[2];',
  248. '<?php return $a[2] == null;',
  249. ],
  250. [
  251. '<?php return "" === $this->myArray[$index];',
  252. '<?php return $this->myArray[$index] === "";',
  253. ],
  254. [
  255. '<?php return "" === $this->myArray[$index]->/*1*//*2*//*3*/a;',
  256. '<?php return $this->myArray[$index]->/*1*//*2*//*3*/a === "";',
  257. ],
  258. [
  259. '<?php return "" === $this->myArray[$index]->a;',
  260. '<?php return $this->myArray[$index]->a === "";',
  261. ],
  262. [
  263. '<?php return "" === $this->myObject2-> {$index};',
  264. '<?php return $this->myObject2-> {$index} === "";',
  265. ],
  266. [
  267. '<?php return "" === $this->myObject3->{$index}->a;',
  268. '<?php return $this->myObject3->{$index}->a === "";',
  269. ],
  270. [
  271. '<?php return "" === $this->myObject4->{$index}->{$index}->a;',
  272. '<?php return $this->myObject4->{$index}->{$index}->a === "";',
  273. ],
  274. [
  275. '<?php return "" === $this->myObject4->$index->a;',
  276. '<?php return $this->myObject4->$index->a === "";',
  277. ],
  278. [
  279. '<?php return self::MY_CONST === self::$myVariable;',
  280. '<?php return self::$myVariable === self::MY_CONST;',
  281. ],
  282. [
  283. '<?php return \A/*5*/\/*6*/B\/*7*/C::MY_CONST === \A/*1*//*1*//*1*//*1*//*1*/\/*2*/B/*3*/\C/*4*/::$myVariable;',
  284. '<?php return \A/*1*//*1*//*1*//*1*//*1*/\/*2*/B/*3*/\C/*4*/::$myVariable === \A/*5*/\/*6*/B\/*7*/C::MY_CONST;',
  285. ],
  286. [
  287. '<?php return \A\B\C::MY_CONST === \A\B\C::$myVariable;',
  288. '<?php return \A\B\C::$myVariable === \A\B\C::MY_CONST;',
  289. ],
  290. [
  291. '<?php return A\/**//**//**/B/*a*//*a*//*a*//*a*/::MY_CONST === B\C::$myVariable;',
  292. '<?php return B\C::$myVariable === A\/**//**//**/B/*a*//*a*//*a*//*a*/::MY_CONST;',
  293. ],
  294. [
  295. '<?php $a = 1 == $$a?>',
  296. '<?php $a = $$a == 1?>',
  297. ],
  298. 'Nested case' => [
  299. '<?php return null === $a[0 === $b ? $c : $d];',
  300. '<?php return $a[$b === 0 ? $c : $d] === null;',
  301. ],
  302. [
  303. '<?php return null === $this->{null === $a ? "a" : "b"};',
  304. '<?php return $this->{$a === null ? "a" : "b"} === null;',
  305. ],
  306. 'Complex code sample.' => [
  307. '<?php
  308. if ($a == $b) {
  309. return null === $b ? (null === $a ? 0 : 0 === $a->b) : 0 === $b->a;
  310. } else {
  311. if ($c === (null === $b)) {
  312. return false === $d;
  313. }
  314. }',
  315. '<?php
  316. if ($a == $b) {
  317. return $b === null ? ($a === null ? 0 : $a->b === 0) : $b->a === 0;
  318. } else {
  319. if ($c === ($b === null)) {
  320. return $d === false;
  321. }
  322. }',
  323. ],
  324. [
  325. '<?php $b = list($a) = 7 === [7];', // makes no sense, but valid PHP syntax
  326. '<?php $b = list($a) = [7] === 7;',
  327. ],
  328. [
  329. '<?php $a = 1 === function(){};',
  330. '<?php $a = function(){} === 1;',
  331. ],
  332. [
  333. '<?php
  334. $z#1
  335. #2
  336. =
  337. #3
  338. 1#4
  339. #5
  340. ===#6
  341. #7
  342. $a#8
  343. #9
  344. ;#10',
  345. '<?php
  346. $z#1
  347. #2
  348. =
  349. #3
  350. $a#4
  351. #5
  352. ===#6
  353. #7
  354. 1#8
  355. #9
  356. ;#10',
  357. ],
  358. [
  359. '<?php $i = 2 === $this/*a*//*b*//*c*//*d*//*e*//*f*/->getStuff();',
  360. '<?php $i = $this/*a*//*b*//*c*//*d*//*e*//*f*/->getStuff() === 2;',
  361. ],
  362. [
  363. '<?php return "" === $this->myObject5->{$index}->/*1*//*2*/b;',
  364. '<?php return $this->myObject5->{$index}->/*1*//*2*/b === "";',
  365. ],
  366. [
  367. '<?php
  368. function hello() {}
  369. 1 === $a ? b() : c();
  370. ',
  371. '<?php
  372. function hello() {}
  373. $a === 1 ? b() : c();
  374. ',
  375. ],
  376. [
  377. '<?php
  378. class A{}
  379. 1 === $a ? b() : c();
  380. ',
  381. '<?php
  382. class A{}
  383. $a === 1 ? b() : c();
  384. ',
  385. ],
  386. [
  387. '<?php
  388. function foo() {
  389. foreach ($arr as $key => $value) {
  390. false !== uniqid() ? 1 : 2;
  391. }
  392. false !== uniqid() ? 1 : 2;
  393. }',
  394. '<?php
  395. function foo() {
  396. foreach ($arr as $key => $value) {
  397. uniqid() !== false ? 1 : 2;
  398. }
  399. uniqid() !== false ? 1 : 2;
  400. }',
  401. ],
  402. [
  403. '<?php false === $a = array();',
  404. ],
  405. ];
  406. }
  407. /**
  408. * @param string $expected
  409. * @param string $input
  410. *
  411. * @dataProvider provideLessGreaterCases
  412. */
  413. public function testFixLessGreater($expected, $input)
  414. {
  415. $this->fixer->configure(['less_and_greater' => true]);
  416. $this->doTest($expected, $input);
  417. }
  418. /**
  419. * Test with the inverse config.
  420. *
  421. * @param string $expected
  422. * @param string $input
  423. *
  424. * @dataProvider provideLessGreaterCases
  425. */
  426. public function testFixLessGreaterInverse($expected, $input)
  427. {
  428. $this->fixer->configure(['less_and_greater' => false]);
  429. $this->doTest($input, $expected);
  430. }
  431. /**
  432. * @return array<string[]>
  433. */
  434. public function provideLessGreaterCases()
  435. {
  436. return [
  437. [
  438. '<?php $a = 3 <= $b;',
  439. '<?php $a = $b >= 3;',
  440. ],
  441. [
  442. '<?php $a = 3 > $b;',
  443. '<?php $a = $b < 3;',
  444. ],
  445. [
  446. '<?php $a = (3 > $b) || $d;',
  447. '<?php $a = ($b < 3) || $d;',
  448. ],
  449. ];
  450. }
  451. public function testComplexConfiguration()
  452. {
  453. $this->fixer->configure([
  454. 'equal' => null,
  455. 'identical' => true,
  456. 'less_and_greater' => false,
  457. ]);
  458. $this->doTest(
  459. '<?php
  460. $a = 1 === $b;
  461. $b = $c != 1;
  462. $c = $c > 3;
  463. ',
  464. '<?php
  465. $a = $b === 1;
  466. $b = $c != 1;
  467. $c = $c > 3;
  468. '
  469. );
  470. }
  471. /**
  472. * @param array $config
  473. * @param string $expectedMessage
  474. *
  475. * @dataProvider provideInvalidConfigurationCases
  476. */
  477. public function testInvalidConfig(array $config, $expectedMessage)
  478. {
  479. $this->expectException(\PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException::class);
  480. $this->expectExceptionMessageRegExp(sprintf(
  481. '#^\[%s\] %s$#',
  482. $this->fixer->getName(),
  483. preg_quote($expectedMessage, '#')
  484. ));
  485. $this->fixer->configure($config);
  486. }
  487. /**
  488. * @return array
  489. */
  490. public function provideInvalidConfigurationCases()
  491. {
  492. return [
  493. [['equal' => 2], 'Invalid configuration: The option "equal" with value 2 is expected to be of type "bool" or "null", but is of type "integer".'],
  494. [['_invalid_' => true], 'Invalid configuration: The option "_invalid_" does not exist. Defined options are: "equal", "identical", "less_and_greater".'],
  495. ];
  496. }
  497. public function testDefinition()
  498. {
  499. $this->assertInstanceOf(\PhpCsFixer\FixerDefinition\FixerDefinitionInterface::class, $this->fixer->getDefinition());
  500. }
  501. /**
  502. * @param string $expected
  503. * @param string $input
  504. *
  505. * @dataProvider providePHP56Cases
  506. * @requires PHP 5.6
  507. */
  508. public function testFixPHP56($expected, $input)
  509. {
  510. $this->fixer->configure(['equal' => true, 'identical' => true]);
  511. $this->doTest($expected, $input);
  512. }
  513. /**
  514. * Test with the inverse config.
  515. *
  516. * @param string $expected
  517. * @param string $input
  518. *
  519. * @dataProvider providePHP56Cases
  520. * @requires PHP 5.6
  521. */
  522. public function testFixPHP56Inverse($expected, $input)
  523. {
  524. $this->fixer->configure(['equal' => false, 'identical' => false]);
  525. $this->doTest($input, $expected);
  526. }
  527. /**
  528. * @return array<string, string[]>
  529. */
  530. public function providePHP56Cases()
  531. {
  532. return [
  533. '5.6 Simple non-Yoda conditions that need to be fixed' => [
  534. '<?php $a **= 4 === $b ? 2 : 3;',
  535. '<?php $a **= $b === 4 ? 2 : 3;',
  536. ],
  537. ];
  538. }
  539. /**
  540. * @param string $expected
  541. * @param null|string $input
  542. *
  543. * @dataProvider providePHP70Cases
  544. * @requires PHP 7.0
  545. */
  546. public function testPHP70Cases($expected, $input = null)
  547. {
  548. $this->fixer->configure(['equal' => true, 'identical' => true]);
  549. $this->doTest($expected, $input);
  550. }
  551. /**
  552. * Test with the inverse config.
  553. *
  554. * @param string $expected
  555. * @param null|string $input
  556. *
  557. * @dataProvider providePHP70Cases
  558. * @requires PHP 7.0
  559. */
  560. public function testPHP70CasesInverse($expected, $input = null)
  561. {
  562. $this->fixer->configure(['equal' => false, 'identical' => false]);
  563. if (null === $input) {
  564. $this->doTest($expected);
  565. } else {
  566. $this->doTest($input, $expected);
  567. }
  568. }
  569. /**
  570. * @return array<string[]>
  571. */
  572. public function providePHP70Cases()
  573. {
  574. return [
  575. ['<?php $a = $b + 1 <=> $d;'],
  576. [
  577. '<?php $a = new class(10) extends SomeClass implements SomeInterface {} === $a;/**/',
  578. ],
  579. [
  580. '<?php $a = $b ?? 1 ?? 2 == $d;',
  581. '<?php $a = $b ?? 1 ?? $d == 2;',
  582. ],
  583. [
  584. '<?php $a = 1 === new class(10) extends SomeClass implements SomeInterface {};/**/',
  585. '<?php $a = new class(10) extends SomeClass implements SomeInterface {} === 1;/**/',
  586. ],
  587. [
  588. '<?php
  589. function a() {
  590. for ($i = 1; $i <= 3; $i++) {
  591. echo yield 1 === $i ? 1 : 2;
  592. }
  593. }
  594. ',
  595. ],
  596. ];
  597. }
  598. /**
  599. * @param string $expected
  600. * @param null|string $input
  601. *
  602. * @dataProvider providePHP71Cases
  603. * @requires PHP 7.1
  604. */
  605. public function testPHP71Cases($expected, $input = null)
  606. {
  607. $this->fixer->configure(['equal' => true, 'identical' => true]);
  608. $this->doTest($expected, $input);
  609. }
  610. /**
  611. * Test with the inverse config.
  612. *
  613. * @param string $expected
  614. * @param null|string $input
  615. *
  616. * @dataProvider providePHP71Cases
  617. * @requires PHP 7.1
  618. */
  619. public function testPHP71CasesInverse($expected, $input = null)
  620. {
  621. $this->fixer->configure(['equal' => false, 'identical' => false]);
  622. if (null === $input) {
  623. $this->doTest($expected);
  624. } else {
  625. $this->doTest($input, $expected);
  626. }
  627. }
  628. /**
  629. * @return array<string[]>
  630. */
  631. public function providePHP71Cases()
  632. {
  633. return [
  634. // no fix cases
  635. ['<?php list("a" => $a, "b" => $b, "c" => $c) = $c === array(1) ? $b : $d;'],
  636. ['<?php list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points;'],
  637. ['<?php list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;'],
  638. ['<?php [$a, $b, $c] = [1, 2, 3];'],
  639. ['<?php ["a" => $a, "b" => $b, "c" => $c] = $a[0];'],
  640. ['<?php list("a" => $a, "b" => $b, "c" => $c) = $c === array(1) ? $b : $d;'],
  641. ['<?php $b = 7 === [$a] = [7];'], // makes no sense, but valid PHP syntax
  642. ['<?php $b = 7 === [$a] = [7];'],
  643. ['<?php [$a] = $c === array(1) ? $b : $d;'],
  644. ['<?php $b = 7 === [$a] = [7];'],
  645. ['<?php $z = $n == [$a] = $b;'],
  646. ['<?php return $n == [$a] = $b;'],
  647. // fix cases
  648. [
  649. '<?php list("a" => $a, "b" => $b, "c" => $c) = 1 === $c ? $b : $d;',
  650. '<?php list("a" => $a, "b" => $b, "c" => $c) = $c === 1 ? $b : $d;',
  651. ],
  652. [
  653. '<?php list("a" => $a, "b" => $b, "c" => $c) = A::B === $c ? $b : $d;',
  654. '<?php list("a" => $a, "b" => $b, "c" => $c) = $c === A::B ? $b : $d;',
  655. ],
  656. [
  657. '<?php list( (2 === $c ? "a" : "b") => $b) = ["a" => 7 === $c ? 5 : 1, "b" => 7];',
  658. '<?php list( ($c === 2 ? "a" : "b") => $b) = ["a" => $c === 7 ? 5 : 1, "b" => 7];',
  659. ],
  660. [
  661. '<?php [ (ABC::A === $c ? "a" : "b") => $b] = ["a" => 7 === $c ? 5 : 1, "b" => 7];',
  662. '<?php [ ($c === ABC::A ? "a" : "b") => $b] = ["a" => $c === 7 ? 5 : 1, "b" => 7];',
  663. ],
  664. 'Array destruct by ternary.' => [
  665. '<?php [$a] = 11 === $c ? $b : $d;',
  666. '<?php [$a] = $c === 11 ? $b : $d;',
  667. ],
  668. [
  669. '<?php $b = [$a] = 7 === [7];', // makes no sense, but valid PHP syntax
  670. '<?php $b = [$a] = [7] === 7;',
  671. ],
  672. ];
  673. }
  674. /**
  675. * @param array $config
  676. * @param string $expected
  677. *
  678. * @dataProvider provideFixWithConfigCases
  679. */
  680. public function testWithConfig(array $config, $expected)
  681. {
  682. $this->fixer->configure($config);
  683. $this->doTest($expected);
  684. }
  685. public function provideFixWithConfigCases()
  686. {
  687. return [
  688. [
  689. [
  690. 'identical' => false,
  691. ],
  692. '<?php
  693. $a = [1, 2, 3];
  694. while (2 !== $b = array_pop($c));
  695. ',
  696. ],
  697. [
  698. [
  699. 'equal' => false,
  700. 'identical' => false,
  701. ],
  702. '<?php
  703. if ($revision->event == \'created\') {
  704. foreach ($revision->getModified() as $col => $data) {
  705. $model->$col = $data[\'new\'];
  706. }
  707. } else {
  708. foreach ($revision->getModified() as $col => $data) {
  709. $model->$col = $data[\'old\'];
  710. }
  711. }',
  712. ],
  713. ];
  714. }
  715. }