* 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\Semicolon; use PhpCsFixer\Fixer\Semicolon\MultilineWhitespaceBeforeSemicolonsFixer; use PhpCsFixer\Tests\Test\AbstractFixerTestCase; use PhpCsFixer\WhitespacesFixerConfig; /** * @author John Kelly * @author Graham Campbell * @author Dariusz Rumiński * @author Egidijus Girčys * * @internal * * @covers \PhpCsFixer\Fixer\Semicolon\MultilineWhitespaceBeforeSemicolonsFixer */ final class MultilineWhitespaceBeforeSemicolonsFixerTest extends AbstractFixerTestCase { /** * @param string $expected * @param null|string $input * * @dataProvider provideMultiLineWhitespaceFixCases */ public function testFixMultiLineWhitespace($expected, $input = null) { $this->fixer->configure(['strategy' => MultilineWhitespaceBeforeSemicolonsFixer::STRATEGY_NO_MULTI_LINE]); $this->doTest($expected, $input); } public function provideMultiLineWhitespaceFixCases() { return [ [ 'bar() // test ;', 'bar() // test ;', ], [ "bar() # test ;', 'bar() # test ;', ], [ "setName(\'readme1\') ->setDescription(\'Generates the README\'); ', 'setName(\'readme1\') ->setDescription(\'Generates the README\') ; ', ], [ 'setName(\'readme2\') ->setDescription(\'Generates the README\'); ', 'setName(\'readme2\') ->setDescription(\'Generates the README\') ; ', ], [ 'foo(\'with param containing ;\') ;" ;', ], [ 'foo();', ], [ 'foo() ;', ], [ 'foo(\'with param containing ;\') ;', ], [ 'foo(\'with param containing ) ; \') ;', ], [ 'foo("with param containing ) ; ") ; ?>', ], [ 'foo("with semicolon in string) ; "); ?>', ], [ 'example();', 'example() ;', ], ]; } /** * @param string $expected * @param null|string $input * * @dataProvider provideMessyWhitespacesMultiLineWhitespaceFixCases */ public function testMessyWhitespacesMultiLineWhitespace($expected, $input = null) { $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t", "\r\n")); $this->fixer->configure(['strategy' => MultilineWhitespaceBeforeSemicolonsFixer::STRATEGY_NO_MULTI_LINE]); $this->doTest($expected, $input); } public function provideMessyWhitespacesMultiLineWhitespaceFixCases() { return [ [ "fixer->configure(['strategy' => MultilineWhitespaceBeforeSemicolonsFixer::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS]); $this->doTest($expected, $input); } public function provideSemicolonForChainedCallsFixCases() { return [ [ 'method1() ->method2() ; ?>', 'method1() ->method2(); ?>', ], [ 'method1() ->method2() // comment ; ', 'method1() ->method2(); // comment ', ], [ 'method1() ->method2() ; $service->method3(); $this ->method1() ->method2() ;', 'method1() ->method2() ; $service->method3(); $this ->method1() ->method2();', ], [ 'method2() ; ?>', 'method2(); ?>', ], [ 'method1() ->method2() ->method3() ->method4() ; ?>', 'method1() ->method2() ->method3() ->method4(); ?>', ], [ 'service->method1() ->method2([1, 2]) ->method3( "2", 2, [1, 2] ) ->method4() ; ?>', 'service->method1() ->method2([1, 2]) ->method3( "2", 2, [1, 2] ) ->method4(); ?>', ], [ 'method1() ->method2() ->method3() ->method4() ; ?>', 'method1() ->method2() ->method3() ->method4(); ?>', ], [ 'method1("a", true) ->method2(true, false) ->method3([1, 2, 3], ["a" => "b", "c" => 1, "d" => true]) ->method4(1, "a", $f) ; ?>', 'method1("a", true) ->method2(true, false) ->method3([1, 2, 3], ["a" => "b", "c" => 1, "d" => true]) ->method4(1, "a", $f); ?>', ], [ 'method1("a", true) // this is a comment /* ->method2(true, false) */ ->method3([1, 2, 3], ["a" => "b", "c" => 1, "d" => true]) ->method4(1, "a", $f) /* this is a comment */ ; ?>', 'method1("a", true) // this is a comment /* ->method2(true, false) */ ->method3([1, 2, 3], ["a" => "b", "c" => 1, "d" => true]) ->method4(1, "a", $f); /* this is a comment */ ?>', ], [ 'method1(); $service->method2()->method3(); ?>', ], [ 'method1() ; $service->method2()->method3() ; ?>', ], [ 'method2(function ($a) { $a->otherCall() ->a() ->b() ; }) ; ?>', 'method2(function ($a) { $a->otherCall() ->a() ->b() ; }); ?>', ], [ 'method2(function ($a) { $a->otherCall() ->a() ->b(array_merge([ 1 => 1, 2 => 2, ], $this->getOtherArray() )) ; }) ; ?>', 'method2(function ($a) { $a->otherCall() ->a() ->b(array_merge([ 1 => 1, 2 => 2, ], $this->getOtherArray() )); }); ?>', ], [ 'method1(null, null, [ null => null, 1 => $data->getId() > 0, ]) ->method2(4, Type::class) ; ', 'method1(null, null, [ null => null, 1 => $data->getId() > 0, ]) ->method2(4, Type::class); ', ], [ 'method1() ->method2() ; ?>', 'method1() ->method2(); ?>', ], ]; } /** * @param string $expected * @param null|string $input * * @dataProvider provideMessyWhitespacesSemicolonForChainedCallsFixCases */ public function testMessyWhitespacesSemicolonForChainedCalls($expected, $input = null) { $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t", "\r\n")); $this->fixer->configure(['strategy' => MultilineWhitespaceBeforeSemicolonsFixer::STRATEGY_NEW_LINE_FOR_CHAINED_CALLS]); $this->doTest($expected, $input); } public function provideMessyWhitespacesSemicolonForChainedCallsFixCases() { return [ [ "method1()\r\n\t\t->method2()\r\n ;", "method1()\r\n\t\t->method2();", ], [ "method1()\r\n\t\t->method2()\r\n\t\t->method(3)\r\n\t;", "method1()\r\n\t\t->method2()\r\n\t\t->method(3);", ], [ "method2(function (\$a) {\r\n\t\t\t\$a->otherCall()\r\n\t\t\t\t->a()\r\n\t\t\t\t->b(array_merge([\r\n\t\t\t\t\t\t1 => 1,\r\n\t\t\t\t\t\t2 => 2,\r\n\t\t\t\t\t], \$this->getOtherArray()\r\n\t\t\t\t))\r\n\t\t\t;\r\n\t\t})\r\n\t;\r\n?>", "method2(function (\$a) {\r\n\t\t\t\$a->otherCall()\r\n\t\t\t\t->a()\r\n\t\t\t\t->b(array_merge([\r\n\t\t\t\t\t\t1 => 1,\r\n\t\t\t\t\t\t2 => 2,\r\n\t\t\t\t\t], \$this->getOtherArray()\r\n\t\t\t\t));\r\n\t\t});\r\n?>", ], ]; } }