12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079 |
- <?php
- declare(strict_types=1);
- namespace PhpCsFixer\Tests\Fixer\ControlStructure;
- use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- final class YodaStyleFixerTest extends AbstractFixerTestCase
- {
-
- public function testFix(string $expected, ?string $input = null, array $extraConfig = []): void
- {
- $this->fixer->configure(['equal' => true, 'identical' => true] + $extraConfig);
- $this->doTest($expected, $input);
- }
-
- public function testFixInverse(string $expected, ?string $input = null, array $extraConfig = []): void
- {
- $this->fixer->configure(['equal' => false, 'identical' => false] + $extraConfig);
- if (null === $input) {
- $this->doTest($expected);
- } else {
- $this->doTest($input, $expected);
- }
- }
- public function provideFixCases(): \Generator
- {
- yield from [
- [
- '<?php $a = 1 + ($b + $c) === true ? 1 : 2;',
- null,
- ['always_move_variable' => true],
- ],
- [
- '<?php $a = true === ($b + $c) ? 1 : 2;',
- '<?php $a = ($b + $c) === true ? 1 : 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php
- if ((1 === $a) === 1) {
- return;
- }',
- '<?php
- if (($a === 1) === 1) {
- return;
- }',
- ['always_move_variable' => false],
- ],
- [
- '<?php
- if (true === (1 !== $foo[0])) {
- return;
- }',
- '<?php
- if (($foo[0] !== 1) === true) {
- return;
- }',
- ['always_move_variable' => true],
- ],
- [
- '<?php return 1 !== $a [$b];',
- '<?php return $a [$b] !== 1;',
- ],
- [
- '<?= 1 === $a ? 5 : 7;',
- '<?= $a === 1 ? 5 : 7;',
- ],
- [
- '<?php print 1 === 1343;',
- ],
- [
- '<?php
- echo 3 === $a ? 2 : 4;
- ',
- '<?php
- echo $a === 3 ? 2 : 4;
- ',
- ],
- [
- '<?php 1 === foo($a) ? 1 : 2;',
- '<?php foo($a) === 1 ? 1 : 2;',
- ],
- [
- '<?php 1 === $a::$a ? 1 : 2;',
- '<?php $a::$a === 1 ? 1 : 2;',
- ],
- [
- '<?php 1 === (bool) $a ? 8 : 7;',
- '<?php (bool) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php 1 === new $a ? 1 : 2;',
- '<?php new $a === 1 ? 1 : 2;',
- ],
- [
- '<?php 1 === "a".$a ? 5 : 6;',
- '<?php "a".$a === 1 ? 5 : 6;',
- ],
- [
- '<?php 1 === __DIR__.$a ? 5 : 6;',
- '<?php __DIR__.$a === 1 ? 5 : 6;',
- ],
- [
- '<?php 1 === $a.$b ? 5 : 6;',
- '<?php $a.$b === 1 ? 5 : 6;',
- ],
- [
- '<?php echo 1 === (object) $a ? 8 : 7;',
- '<?php echo (object) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php echo 1 === (int) $a ? 8 : 7;',
- '<?php echo (int) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php echo 1 === (float) $a ? 8 : 7;',
- '<?php echo (float) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php echo 1 === (string) $a ? 8 : 7;',
- '<?php echo (string) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php echo 1 === (array) $a ? 8 : 7;',
- '<?php echo (array) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php echo 1 === (bool) $a ? 8 : 7;',
- '<?php echo (bool) $a === 1 ? 8 : 7;',
- ],
- [
- '<?php
- if ($a = true === $obj instanceof A) {
- echo \'A\';
- }',
- '<?php
- if ($a = $obj instanceof A === true) {
- echo \'A\';
- }',
- ],
- [
- '<?php echo 1 === !!$a ? 8 : 7;',
- '<?php echo !!$a === 1 ? 8 : 7;',
- ],
- [
- '<?php 1 === new $a ? 1 : 2;',
- '<?php new $a === 1 ? 1 : 2;',
- ],
- [
- '<?php $a = 1 === new b ? 1 : 2;',
- '<?php $a = new b === 1 ? 1 : 2;',
- ],
- [
- '<?php $a = 1 === empty($a) ? 1 : 2;',
- '<?php $a = empty($a) === 1 ? 1 : 2;',
- ],
- [
- '<?php $b = 1 === clone $a ? 5 : 9;',
- '<?php $b = clone $a === 1 ? 5 : 9;',
- ],
- [
- '<?php while(1 === $a ? 1 : 2){};',
- '<?php while($a === 1 ? 1 : 2){};',
- ],
- [
- '<?php $a = 1 === include_once $a ? 1 : 2;',
- '<?php $a = include_once $a === 1 ? 1 : 2;',
- ],
- [
- '<?php echo 1 === include $a ? 1 : 2;',
- '<?php echo include $a === 1 ? 1 : 2;',
- ],
- [
- '<?php echo 1 === require_once $a ? 1 : 2;',
- '<?php echo require_once $a === 1 ? 1 : 2;',
- ],
- [
- '<?php echo 1 === require $a ? 1 : 2;',
- '<?php echo require $a === 1 ? 1 : 2;',
- ],
- [
- '<?php switch(1 === $a){
- case true: echo 1;
- };',
- '<?php switch($a === 1){
- case true: echo 1;
- };',
- ],
- [
- '<?php echo 1 === $a ? 1 : 2;',
- '<?php echo $a === 1 ? 1 : 2;',
- ],
-
- ['<?php $a = 1 === 1;'],
- ['<?php $b = $b === $c;'],
- ['<?php $c = $$b === $$c;'],
- ['<?php $d = count($this->array[$var]) === $a;'],
- ['<?php $e = $a === count($this->array[$var]);'],
- ['<?php $f = ($a123 & self::MY_BITMASK) === $a;'],
- ['<?php $g = $a === ($a456 & self::MY_BITMASK);'],
- ['<?php $h = $this->getStuff() === $myVariable;'],
- ['<?php $i = $myVariable === $this->getStuff();'],
- ['<?php $j = 2 * $myVar % 3 === $a;'],
- ['<?php return $k === 2 * $myVar % 3;'],
- ['<?php $l = $c > 2;'],
- ['<?php return $this->myObject1->{$index}+$b === "";'],
- ['<?php return $m[2]+1 == 2;'],
- ['<?php return $foo === $bar[$baz][1];'],
- ['<?php $a = $b[$key]["1"] === $c["2"];'],
- ['<?php return $foo->$a === $foo->$b->$c;'],
- ['<?php return $x === 2 - 1;'],
- ['<?php return $x === 2-1;'],
-
- ['<?php return array(2) == $o;'],
- ['<?php return $p == array(2);'],
- ['<?php return $p == array("2");'],
- ['<?php return $p == array(TWO);'],
- ['<?php return $p == array(array());'],
- ['<?php return $p == [[]];'],
- ['<?php return array($q) == $a;'],
- ['<?php return $r == array($a);'],
- ['<?php $s = ((array(2))) == $a;'],
- ['<?php $t = $a == ((array(2)));'],
- ['<?php list($a) = $c === array(1) ? $b : $d;'],
- ['<?php $b = 7 === list($a) = [7];'],
- ['<?php $a = function(){} === array(0);'],
- ['<?php $z = $n == list($a) = $b;'],
- ['<?php return $n == list($a) = $b;'],
-
- 'Array destruct by ternary.' => [
- '<?php list($a) = 11 === $c ? $b : $d;',
- '<?php list($a) = $c === 11 ? $b : $d;',
- ],
- 'Less spacing.' => [
- '<?php $z=2==$a;$b=$c>1&&$c<=10;',
- '<?php $z=$a==2;$b=$c>1&&$c<=10;',
- ],
- 'Comments.' => [
- '<?php $z = /**/ /**/2/**/ /**/
- # aa
- /**/==/**/$a/***/;',
- '<?php $z = /**/ /**/$a/**/ /**/
- # aa
- /**/==/**/2/***/;',
- ],
- [
- '<?php return 2 == ($a)?>',
- ],
- [
- '<?php return ($a) == 2?>',
- ],
- [
- '<?php return 2 == ($a)?>',
- '<?php return ($a) == 2?>',
- ['always_move_variable' => true],
- ],
- [
- '<?php $a = ($c === ((null === $b)));',
- '<?php $a = ($c === (($b === null)));',
- ],
- [
- '<?php return null == $a[2];',
- '<?php return $a[2] == null;',
- ],
- [
- '<?php return "" === $this->myArray[$index];',
- '<?php return $this->myArray[$index] === "";',
- ],
- [
- '<?php return "" === $this->myArray[$index]->/*1*//*2*//*3*/a;',
- '<?php return $this->myArray[$index]->/*1*//*2*//*3*/a === "";',
- ],
- [
- '<?php return "" === $this->myArray[$index]->a;',
- '<?php return $this->myArray[$index]->a === "";',
- ],
- [
- '<?php return "" === $this->myObject2-> {$index};',
- '<?php return $this->myObject2-> {$index} === "";',
- ],
- [
- '<?php return "" === $this->myObject3->{$index}->a;',
- '<?php return $this->myObject3->{$index}->a === "";',
- ],
- [
- '<?php return "" === $this->myObject4->{$index}->{$index}->a;',
- '<?php return $this->myObject4->{$index}->{$index}->a === "";',
- ],
- [
- '<?php return "" === $this->myObject4->$index->a;',
- '<?php return $this->myObject4->$index->a === "";',
- ],
- [
- '<?php return self::MY_CONST === self::$myVariable;',
- '<?php return self::$myVariable === self::MY_CONST;',
- ],
- [
- '<?php return \A\B\C::MY_CONST === \A\B\C::$myVariable;',
- '<?php return \A\B\C::$myVariable === \A\B\C::MY_CONST;',
- ],
- [
- '<?php $a = 1 == $$a?>',
- '<?php $a = $$a == 1?>',
- ],
- 'Nested case' => [
- '<?php return null === $a[0 === $b ? $c : $d];',
- '<?php return $a[$b === 0 ? $c : $d] === null;',
- ],
- [
- '<?php return null === $this->{null === $a ? "a" : "b"};',
- '<?php return $this->{$a === null ? "a" : "b"} === null;',
- ],
- 'Complex code sample.' => [
- '<?php
- if ($a == $b) {
- return null === $b ? (null === $a ? 0 : 0 === $a->b) : 0 === $b->a;
- } else {
- if ($c === (null === $b)) {
- return false === $d;
- }
- }',
- '<?php
- if ($a == $b) {
- return $b === null ? ($a === null ? 0 : $a->b === 0) : $b->a === 0;
- } else {
- if ($c === ($b === null)) {
- return $d === false;
- }
- }',
- ],
- [
- '<?php $b = list($a) = 7 === [7];',
- '<?php $b = list($a) = [7] === 7;',
- ],
- [
- '<?php $a = 1 === function(){};',
- '<?php $a = function(){} === 1;',
- ],
- [
- '<?php
- $z#1
- #2
- =
- #3
- 1#4
- #5
- ===#6
- #7
- $a#8
- #9
- ;#10',
- '<?php
- $z#1
- #2
- =
- #3
- $a#4
- #5
- ===#6
- #7
- 1#8
- #9
- ;#10',
- ],
- [
- '<?php $i = 2 === $this/*a*//*b*//*c*//*d*//*e*//*f*/->getStuff();',
- '<?php $i = $this/*a*//*b*//*c*//*d*//*e*//*f*/->getStuff() === 2;',
- ],
- [
- '<?php return "" === $this->myObject5->{$index}->/*1*//*2*/b;',
- '<?php return $this->myObject5->{$index}->/*1*//*2*/b === "";',
- ],
- [
- '<?php
- function hello() {}
- 1 === $a ? b() : c();
- ',
- '<?php
- function hello() {}
- $a === 1 ? b() : c();
- ',
- ],
- [
- '<?php
- class A{}
- 1 === $a ? b() : c();
- ',
- '<?php
- class A{}
- $a === 1 ? b() : c();
- ',
- ],
- [
- '<?php
- function foo() {
- foreach ($arr as $key => $value) {
- false !== uniqid() ? 1 : 2;
- }
- false !== uniqid() ? 1 : 2;
- }',
- '<?php
- function foo() {
- foreach ($arr as $key => $value) {
- uniqid() !== false ? 1 : 2;
- }
- uniqid() !== false ? 1 : 2;
- }',
- ],
- [
- '<?php false === $a = array();',
- ],
- [
- '<?php $e = count($this->array[$var]) === $a;',
- '<?php $e = $a === count($this->array[$var]);',
- ['always_move_variable' => true],
- ],
- [
- '<?php $i = $this->getStuff() === $myVariable;',
- '<?php $i = $myVariable === $this->getStuff();',
- ['always_move_variable' => true],
- ],
- [
- '<?php $e = count($this->array[$var]) === $a;',
- '<?php $e = $a === count($this->array[$var]);',
- ['always_move_variable' => true],
- ],
- [
- '<?php $g = ($a789 & self::MY_BITMASK) === $a;',
- null,
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar + 2 === $k;',
- '<?php return $k === $myVar + 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar . $b === $k;',
- '<?php return $k === $myVar . $b;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar - 2 === $k;',
- '<?php return $k === $myVar - 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar * 2 === $k;',
- '<?php return $k === $myVar * 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar / 2 === $k;',
- '<?php return $k === $myVar / 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar % 2 === $k;',
- '<?php return $k === $myVar % 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar ** 2 === $k;',
- '<?php return $k === $myVar ** 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar < 2 === $k;',
- '<?php return $k === $myVar < 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar > 2 === $k;',
- '<?php return $k === $myVar > 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar <= 2 === $k;',
- '<?php return $k === $myVar <= 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar >= 2 === $k;',
- '<?php return $k === $myVar >= 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar . 2 === $k;',
- '<?php return $k === $myVar . 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar << 2 === $k;',
- '<?php return $k === $myVar << 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar >> 2 === $k;',
- '<?php return $k === $myVar >> 2;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return !$myVar === $k;',
- '<?php return $k === !$myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return $myVar instanceof Foo === $k;',
- '<?php return $k === $myVar instanceof Foo;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (bool) $myVar === $k;',
- '<?php return $k === (bool) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (int) $myVar === $k;',
- '<?php return $k === (int) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (float) $myVar === $k;',
- '<?php return $k === (float) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (string) $myVar === $k;',
- '<?php return $k === (string) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (array) $myVar === $k;',
- '<?php return $k === (array) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php return (object) $myVar === $k;',
- '<?php return $k === (object) $myVar;',
- ['always_move_variable' => true],
- ],
- [
- '<?php $a = null === foo();',
- '<?php $a = foo() === null;',
- ],
- [
- '<?php $a = \'foo\' === foo();',
- '<?php $a = foo() === \'foo\';',
- ],
- [
- '<?php $a = "foo" === foo();',
- '<?php $a = foo() === "foo";',
- ],
- [
- '<?php $a = 1 === foo();',
- '<?php $a = foo() === 1;',
- ],
- [
- '<?php $a = 1.2 === foo();',
- '<?php $a = foo() === 1.2;',
- ],
- [
- '<?php $a = true === foo();',
- '<?php $a = foo() === true;',
- ],
- [
- '<?php $a = false === foo();',
- '<?php $a = foo() === false;',
- ],
- [
- '<?php $a = -1 === reset($foo);',
- '<?php $a = reset($foo) === -1;',
- ],
- [
- '<?php $a = - 1 === reset($foo);',
- '<?php $a = reset($foo) === - 1;',
- ],
- [
- '<?php $a = -/* bar */1 === reset($foo);',
- '<?php $a = reset($foo) === -/* bar */1;',
- ],
- [
- '<?php $a %= 4 === $b ? 2 : 3;',
- '<?php $a %= $b === 4 ? 2 : 3;',
- ],
- [
- '<?php return array() === $array;',
- '<?php return $array === array();',
- ],
- [
- '<?php return [] === $array;',
- '<?php return $array === [];',
- ],
- [
- '<?php return array(/* foo */) === $array;',
- '<?php return $array === array(/* foo */);',
- ],
- [
- '<?php return [
- // 1
- ] === $array;',
- '<?php return $array === [
- // 1
- ];',
- ],
- [
- '<?php $a = $b = null === $c;',
- '<?php $a = $b = $c === null;',
- ],
- ];
- $template = '<?php $a = ($b + $c) %s 1 === true ? 1 : 2;';
- $operators = ['||', '&&'];
- foreach ($operators as $operator) {
- yield [
- sprintf($template, $operator),
- null,
- ['always_move_variable' => true],
- ];
- }
- $assignmentOperators = ['=', '**=', '*=', '|=', '+=', '-=', '^=', '<<=', '>>=', '&=', '.=', '/=', '%='];
- if (\PHP_VERSION_ID >= 70400) {
- $assignmentOperators[] = '??=';
- }
- $logicalOperators = ['xor', 'or', 'and', '||', '&&'];
- if (\PHP_VERSION_ID >= 70400) {
- $logicalOperators[] = '??';
- }
- foreach (array_merge($assignmentOperators, $logicalOperators) as $operator) {
- yield [
- sprintf('<?php $a %s 4 === $b ? 2 : 3;', $operator),
- sprintf('<?php $a %s $b === 4 ? 2 : 3;', $operator),
- ];
- }
- foreach ($assignmentOperators as $operator) {
- yield [
- sprintf('<?php 1 === $x %s 2;', $operator),
- ];
- }
- yield from [
- ['<?php $a = $b + 1 <=> $d;'],
- [
- '<?php $a = new class(10) extends SomeClass implements SomeInterface {} === $a;/**/',
- ],
- [
- '<?php $a = $b ?? 1 ?? 2 == $d;',
- '<?php $a = $b ?? 1 ?? $d == 2;',
- ],
- [
- '<?php $a = 1 === new class(10) extends SomeClass implements SomeInterface {};/**/',
- '<?php $a = new class(10) extends SomeClass implements SomeInterface {} === 1;/**/',
- ],
- [
- '<?php
- function a() {
- for ($i = 1; $i <= 3; $i++) {
- echo yield 1 === $i ? 1 : 2;
- }
- }
- ',
- '<?php
- function a() {
- for ($i = 1; $i <= 3; $i++) {
- echo yield $i === 1 ? 1 : 2;
- }
- }
- ',
- ],
- [
- '<?php function test() {return yield 1 !== $a [$b];};',
- '<?php function test() {return yield $a [$b] !== 1;};',
- ],
- [
- '<?php function test() {return yield 1 === $a;};',
- '<?php function test() {return yield $a === 1;};',
- ],
- ];
- yield [
- '<?php
- $a = 1;
- switch ($a) {
- case 1 === $a:
- echo 123;
- break;
- }
- ',
- '<?php
- $a = 1;
- switch ($a) {
- case $a === 1:
- echo 123;
- break;
- }
- ',
- ];
- }
-
- public function testFixLessGreater(string $expected, string $input): void
- {
- $this->fixer->configure(['less_and_greater' => true]);
- $this->doTest($expected, $input);
- }
-
- public function testFixLessGreaterInverse(string $expected, string $input): void
- {
- $this->fixer->configure(['less_and_greater' => false]);
- $this->doTest($input, $expected);
- }
- public function provideLessGreaterCases(): array
- {
- return [
- [
- '<?php $a = 3 <= $b;',
- '<?php $a = $b >= 3;',
- ],
- [
- '<?php $a = 3 > $b;',
- '<?php $a = $b < 3;',
- ],
- [
- '<?php $a = (3 > $b) || $d;',
- '<?php $a = ($b < 3) || $d;',
- ],
- ];
- }
- public function testComplexConfiguration(): void
- {
- $this->fixer->configure([
- 'equal' => null,
- 'identical' => true,
- 'less_and_greater' => false,
- ]);
- $this->doTest(
- '<?php
- $a = 1 === $b;
- $b = $c != 1;
- $c = $c > 3;
- ',
- '<?php
- $a = $b === 1;
- $b = $c != 1;
- $c = $c > 3;
- '
- );
- }
-
- public function testInvalidConfig(array $config, string $expectedMessage): void
- {
- $this->expectException(InvalidFixerConfigurationException::class);
- $this->expectExceptionMessageMatches("#^\\[{$this->fixer->getName()}\\] {$expectedMessage}$#");
- $this->fixer->configure($config);
- }
- public function provideInvalidConfigurationCases(): array
- {
- return [
- [['equal' => 2], 'Invalid configuration: The option "equal" with value 2 is expected to be of type "bool" or "null", but is of type "(int|integer)"\.'],
- [['_invalid_' => true], 'Invalid configuration: The option "_invalid_" does not exist\. Defined options are: "always_move_variable", "equal", "identical", "less_and_greater"\.'],
- ];
- }
- public function testDefinition(): void
- {
- static::assertInstanceOf(\PhpCsFixer\FixerDefinition\FixerDefinitionInterface::class, $this->fixer->getDefinition());
- }
-
- public function testPHP71Cases(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(['equal' => true, 'identical' => true]);
- $this->doTest($expected, $input);
- }
-
- public function testPHP71CasesInverse(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(['equal' => false, 'identical' => false]);
- if (null === $input) {
- $this->doTest($expected);
- } else {
- $this->doTest($input, $expected);
- }
- }
- public function providePHP71Cases(): array
- {
- return [
-
- ['<?php list("a" => $a, "b" => $b, "c" => $c) = $c === array(1) ? $b : $d;'],
- ['<?php list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points;'],
- ['<?php list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;'],
- ['<?php [$a, $b, $c] = [1, 2, 3];'],
- ['<?php ["a" => $a, "b" => $b, "c" => $c] = $a[0];'],
- ['<?php list("a" => $a, "b" => $b, "c" => $c) = $c === array(1) ? $b : $d;'],
- ['<?php $b = 7 === [$a] = [7];'],
- ['<?php $b = 7 === [$a] = [7];'],
- ['<?php [$a] = $c === array(1) ? $b : $d;'],
- ['<?php $b = 7 === [$a] = [7];'],
- ['<?php $z = $n == [$a] = $b;'],
- ['<?php return $n == [$a] = $b;'],
-
- [
- '<?php list("a" => $a, "b" => $b, "c" => $c) = 1 === $c ? $b : $d;',
- '<?php list("a" => $a, "b" => $b, "c" => $c) = $c === 1 ? $b : $d;',
- ],
- [
- '<?php list("a" => $a, "b" => $b, "c" => $c) = A::B === $c ? $b : $d;',
- '<?php list("a" => $a, "b" => $b, "c" => $c) = $c === A::B ? $b : $d;',
- ],
- [
- '<?php list( (2 === $c ? "a" : "b") => $b) = ["a" => 7 === $c ? 5 : 1, "b" => 7];',
- '<?php list( ($c === 2 ? "a" : "b") => $b) = ["a" => $c === 7 ? 5 : 1, "b" => 7];',
- ],
- [
- '<?php [ (ABC::A === $c ? "a" : "b") => $b] = ["a" => 7 === $c ? 5 : 1, "b" => 7];',
- '<?php [ ($c === ABC::A ? "a" : "b") => $b] = ["a" => $c === 7 ? 5 : 1, "b" => 7];',
- ],
- 'Array destruct by ternary.' => [
- '<?php [$a] = 11 === $c ? $b : $d;',
- '<?php [$a] = $c === 11 ? $b : $d;',
- ],
- [
- '<?php $b = [$a] = 7 === [7];',
- '<?php $b = [$a] = [7] === 7;',
- ],
- ];
- }
-
- public function testWithConfig(array $config, string $expected): void
- {
- $this->fixer->configure($config);
- $this->doTest($expected);
- }
- public function provideFixWithConfigCases(): \Generator
- {
- yield [
- [
- 'identical' => false,
- ],
- '<?php
- $a = [1, 2, 3];
- while (2 !== $b = array_pop($c));
- ',
- ];
- yield [
- [
- 'equal' => false,
- 'identical' => false,
- ],
- '<?php
- if ($revision->event == \'created\') {
- foreach ($revision->getModified() as $col => $data) {
- $model->$col = $data[\'new\'];
- }
- } else {
- foreach ($revision->getModified() as $col => $data) {
- $model->$col = $data[\'old\'];
- }
- }',
- ];
- }
-
- public function testFixPhp74(string $expected, ?string $input): void
- {
- $this->doTest($expected, $input);
- }
- public function provideFixPhp74Cases(): \Generator
- {
- yield [
- '<?php if (1_000 === $b);',
- '<?php if ($b === 1_000);',
- ];
- }
-
- public function testPHP74CasesInverse(string $expected, ?string $input = null, ?array $configuration = null): void
- {
- if (null !== $configuration) {
- $this->fixer->configure($configuration);
- }
- $this->doTest($expected, $input);
- }
- public function providePHP74Cases(): \Generator
- {
- yield [
- '<?php fn() => $c === array(1) ? $b : $d;',
- null,
- [
- 'less_and_greater' => false,
- ],
- ];
- yield [
- '<?php $a ??= 4 === $b ? 2 : 3;',
- '<?php $a ??= $b === 4 ? 2 : 3;',
- ];
- }
-
- public function testFixPrePHP80(string $expected, ?string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- public function provideFixPrePHP80Cases(): \Generator
- {
- yield [
- '<?php return \A/*5*/\/*6*/B\/*7*/C::MY_CONST === \A/*1*//*1*//*1*//*1*//*1*/\/*2*/B/*3*/\C/*4*/::$myVariable;',
- '<?php return \A/*1*//*1*//*1*//*1*//*1*/\/*2*/B/*3*/\C/*4*/::$myVariable === \A/*5*/\/*6*/B\/*7*/C::MY_CONST;',
- ];
- yield [
- '<?php return A\/**//**//**/B/*a*//*a*//*a*//*a*/::MY_CONST === B\C::$myVariable;',
- '<?php return B\C::$myVariable === A\/**//**//**/B/*a*//*a*//*a*//*a*/::MY_CONST;',
- ];
- yield ['<?php return $foo === $bar[$baz]{1};'];
- yield ['<?php return $foo->$a[1] === $bar[$baz]{1}->$a[1][2][3]->$d[$z]{1};'];
- yield ['<?php return $m->a{2}+1 == 2;'];
- yield ['<?php return $m{2}+1 == 2;'];
- yield [
- '<?php echo 1 === (unset) $a ? 8 : 7;',
- '<?php echo (unset) $a === 1 ? 8 : 7;',
- ];
- }
-
- public function testFix80(string $expected, ?string $input = null, array $config = []): void
- {
- $this->fixer->configure($config);
- $this->doTest($expected, $input);
- }
- public function provideFix80Cases(): \Generator
- {
- yield [
- '<?php
- if ($a = true === $obj instanceof (foo())) {
- echo 1;
- }',
- '<?php
- if ($a = $obj instanceof (foo()) === true) {
- echo 1;
- }',
- ];
- yield [
- '<?php $i = $this?->getStuff() === $myVariable;',
- '<?php $i = $myVariable === $this?->getStuff();',
- ['equal' => true, 'identical' => true, 'always_move_variable' => true],
- ];
- yield [
- '<?php 42 === $a->b[5]?->c;',
- '<?php $a->b[5]?->c === 42;',
- ];
- yield [
- '<?php return $this->myObject1?->{$index}+$b === "";',
- null,
- ['equal' => true, 'identical' => true],
- ];
- yield [
- '<?php new Foo(bar: 1 === $var);',
- '<?php new Foo(bar: $var === 1);',
- ];
- }
-
- public function testFix81(string $expected, string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- public function provideFix81Cases(): \Generator
- {
- yield 'does not make a lot of sense but is valid syntax, do not break 1' => [
- '<?php $b = strlen( ... ) === $a;',
- ];
- yield 'does not make a lot of sense but is valid syntax, do not break 2' => [
- '<?php $b = $a === strlen( ... );',
- ];
- }
- }
|