* Dariusz RumiƄski * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace PhpCsFixer\Tests\Fixer\ControlStructure; use PhpCsFixer\Tests\Test\AbstractFixerTestCase; use PhpCsFixer\Tokenizer\Tokens; /** * @author SpacePossum * * @internal * * @covers \PhpCsFixer\Fixer\ControlStructure\NoUselessElseFixer */ final class NoUselessElseFixerTest extends AbstractFixerTestCase { /** * @param string $expected * @param null|string $input * * @dataProvider providePHPCloseTagCases */ public function testCloseTagCases($expected, $input = null) { $this->doTest($expected, $input); } public function providePHPCloseTagCases() { return [ [ ' 2 ? "" : die ?> 2 ? "" : die ?> doTest($expected, $input); } public function provideFixIfElseIfElseCases() { $expected = 'generateCases($expected, $input); $expected = 'generateCases($expected)); $expected = 'generateCases($expected)); $cases[] = [ 'doTest($expected, $input); } public function provideFixIfElseCases() { $expected = 'generateCases($expected, $input); $cases[] = [ 'doTest($expected, $input); } public function provideFixNestedIfCases() { return [ [ 'doTest($expected, $input); } public function provideFixEmptyElseCases() { return [ [ 'doTest($expected); } public function provideNegativeCases() { return [ [ ' 2) { return 1; } else { $a--; } }); ', ], [ ' 2) { } else { echo 1; } };', ], [ ' 2) { } else { echo 1; } };', ], ]; } /** * @param string $source * @param int $index * * @dataProvider provideBlockDetectionCases */ public function testBlockDetection(array $expected, $source, $index) { Tokens::clearCache(); $tokens = Tokens::fromCode($source); $method = new \ReflectionMethod($this->fixer, 'getPreviousBlock'); $method->setAccessible(true); $result = $method->invoke($this->fixer, $tokens, $index); $this->assertSame($expected, $result); } public function provideBlockDetectionCases() { $cases = []; $source = 'doTest($expected, $input); } public function provideConditionsWithoutBracesCases() { $cases = []; $statements = [ 'die;', 'throw new Exception($i);', 'while($i < 1) throw/*{}*/new Exception($i);', 'while($i < 1){throw new Exception($i);}', 'do{throw new Exception($i);}while($i < 1);', 'foreach($a as $b)throw new Exception($i);', 'foreach($a as $b){throw new Exception($i);}', ]; $ifTemplate = ' $indexes * * @dataProvider provideIsInConditionWithoutBracesCases */ public function testIsInConditionWithoutBraces($indexes, $input) { $reflection = new \ReflectionObject($this->fixer); $method = $reflection->getMethod('isInConditionWithoutBraces'); $method->setAccessible(true); $tokens = Tokens::fromCode($input); foreach ($indexes as $index => $expected) { $this->assertSame( $expected, $method->invoke($this->fixer, $tokens, $index, 0), sprintf('Failed in condition without braces check for index %d', $index) ); } } public function provideIsInConditionWithoutBracesCases() { return [ [ [ 18 => false, // return 25 => false, // return 36 => false, // return ], ' false, 29 => false, // throw ], ' false, 38 => true, // throw ], ' false, 26 => true, // throw 28 => true, // new 30 => true, // Exception ], ' false, 30 => true, // throw 32 => true, // new 34 => true, // Exception ], ' false, 25 => true, // throw 27 => true, // new 29 => true, // Exception ], ' true, // throw ], ' false, // 1 13 => true, // if (2nd) 21 => true, // true 33 => true, // while 43 => false, // echo 45 => false, // 2 46 => false, // ; 51 => false, // echo (123) ], ' false, // echo 13 => true, // echo 15 => true, // 2 20 => true, // die 23 => false, // echo ], ' true, // die 9 => true, // /**/ 15 => true, // die ], ' true, // die 9 => true, // /**/ 15 => true, // die ], ' ', ], ]; } /** * @param string $expected * @param null|string $input * * @return array */ private function generateCases($expected, $input = null) { $cases = []; foreach ([ 'exit;', 'exit();', 'exit(1);', 'die;', 'die();', 'die(1);', 'break;', 'break 2;', 'break (2);', 'continue;', 'continue 2;', 'continue (2);', 'return;', 'return 1;', 'return (1);', 'return "a";', 'return 8+2;', 'return null;', 'return sum(1+8*6, 2);', 'throw $e;', 'throw ($e);', 'throw new \Exception;', 'throw new \Exception();', 'throw new \Exception((string)12+1);', ] as $case) { if (null === $input) { $cases[] = [sprintf($expected, $case)]; $cases[] = [sprintf($expected, strtoupper($case))]; $cases[] = [sprintf($expected, strtolower($case))]; } else { $cases[] = [sprintf($expected, $case), sprintf($input, $case)]; $cases[] = [sprintf($expected, strtoupper($case)), sprintf($input, strtoupper($case))]; $cases[] = [sprintf($expected, strtolower($case)), sprintf($input, strtolower($case))]; } } return $cases; } }