* 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\Basic; use PhpCsFixer\Test\AbstractFixerTestCase; use PhpCsFixer\WhitespacesFixerConfig; /** * @author Dariusz Rumiński * * @internal * * @covers \PhpCsFixer\Fixer\Basic\BracesFixer */ final class BracesFixerTest extends AbstractFixerTestCase { private static $configurationOopPositionSameLine = array('position_after_functions_and_oop_constructs' => 'same'); public function testInvalidConfigurationClassyConstructs() { $this->setExpectedExceptionRegExp( 'PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException', '#^\[braces\] Invalid configuration: The option "position_after_functions_and_oop_constructs" with value "neither" is invalid\. Accepted values are: "next", "same"\.$#' ); $this->fixer->configure(array('position_after_functions_and_oop_constructs' => 'neither')); } /** * @param string $expected * @param null|string $input * @param null|array $configuration * * @dataProvider provideFixControlContinuationBracesCases */ public function testFixControlContinuationBraces($expected, $input = null, array $configuration = null) { if (null !== $configuration) { $this->fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixControlContinuationBracesCases() { return array( array( ' TestTest foo; echo $collection->items{1}->property; } ', ), array( ' TestTest TestTest foo; echo $collection->items{1}->property; } ', null, self::$configurationOopPositionSameLine, ), array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixMissingBracesAndIndentCases() { return array( array( 'next());', ), array( 'getTest());', 'getTest());', ), array( 'getTest());', 'getTest());', ), array( 'c()}d"; }', ), array( '{$c->d}($e); $f->{$g} = $h; $i->{$j}[$k] = $l; $m = $n->{$o}; $p = array($q->{$r}, $s->{$t}); $u->{$v}->w = 1; }', ), array( '{"a{$c}d"}(); }', ), array( '{"a{$c->{\'foo-bar\'}()}d"}(); }', ), array( '{"a{$c->{\'foo-bar\'}()}d"}(); }', ), array( 'x', 'x', ), array( 'phoneNumbers->filter(function ($phone) { $a = 1; $b = 1; $c = 1; return ($phone->getType() === 1) ? true : false; }); } } }', 'phoneNumbers->filter(function ($phone) { $a = 1; $b = 1; $c = 1; return ($phone->getType() === 1) ? true : false; }); } }', ), array( 'next());', null, self::$configurationOopPositionSameLine, ), array( 'getTest());', 'getTest());', self::$configurationOopPositionSameLine, ), array( 'getTest());', 'getTest());', self::$configurationOopPositionSameLine, ), array( 'c()}d"; }', 'c()}d"; }', self::$configurationOopPositionSameLine, ), array( '{$c->d}($e); $f->{$g} = $h; $i->{$j}[$k] = $l; $m = $n->{$o}; $p = array($q->{$r}, $s->{$t}); $u->{$v}->w = 1; }', '{$c->d}($e); $f->{$g} = $h; $i->{$j}[$k] = $l; $m = $n->{$o}; $p = array($q->{$r}, $s->{$t}); $u->{$v}->w = 1; }', self::$configurationOopPositionSameLine, ), array( '{"a{$c}d"}(); }', '{"a{$c}d"}(); }', self::$configurationOopPositionSameLine, ), array( '{"a{$c->{\'foo-bar\'}()}d"}(); }', '{"a{$c->{\'foo-bar\'}()}d"}(); }', self::$configurationOopPositionSameLine, ), array( '{"a{$c->{\'foo-bar\'}()}d"}(); }', '{"a{$c->{\'foo-bar\'}()}d"}(); }', self::$configurationOopPositionSameLine, ), array( 'x', 'x', self::$configurationOopPositionSameLine, ), array( 'phoneNumbers->filter(function ($phone) { $a = 1; $b = 1; $c = 1; return ($phone->getType() === 1) ? true : false; }); } } }', 'phoneNumbers->filter(function ($phone) { $a = 1; $b = 1; $c = 1; return ($phone->getType() === 1) ? true : false; }); } }', self::$configurationOopPositionSameLine, ), array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixClassyBracesCases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixClassyBraces54Cases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixAnonFunctionInShortArraySyntax54Cases() { return array( array( ' function ($data) { return true; } ], [ "callback" => function ($data) { return true; }, ], ]; }', ' function ($data) { return true; } ], [ "callback" => function ($data) { return true; }, ], ]; }', ), array( ' function ($data) { return true; } ], [ "callback" => function ($data) { return true; }, ], ]; }', ' function ($data) { return true; } ], [ "callback" => function ($data) { return true; }, ], ]; }', self::$configurationOopPositionSameLine, ), ); } /** * @param string $expected * @param null|string $input * @param null|array $configuration * * @dataProvider provideFixCommentBeforeBraceCases */ public function testFixCommentBeforeBrace($expected, $input = null, array $configuration = null) { if (null !== $configuration) { $this->fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixCommentBeforeBraceCases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixCommentBeforeBrace70Cases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixWhitespaceBeforeBraceCases() { return array( array( 'getFile()) { }', 'getFile()) { }', ), array( 'getFile()) { }', 'getFile()) { }', self::$configurationOopPositionSameLine, ), array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixFunctionsCases() { return array( array( 'bar(), function ($o) { return $o->isBaz(); }); }, $collection));', 'bar(), function ($o) { return $o->isBaz(); }); }, $collection));', ), array( 'fixers, function &($a, $b) use ($selfName) { return 1; });', ), array( 'fixers, function &($a, $b) use ($selfName) { return 1; } );', ), array( 'bar(), function ($o) { return $o->isBaz(); }); }, $collection));', 'bar(), function ($o) { return $o->isBaz(); }); }, $collection));', self::$configurationOopPositionSameLine, ), array( 'fixers, function &($a, $b) use ($selfName) { return 1; });', null, self::$configurationOopPositionSameLine, ), array( 'fixers, function &($a, $b) use ($selfName) { return 1; } );', null, self::$configurationOopPositionSameLine, ), array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provideFixSpaceAroundTokenCases() { return array( array( 'tesT ($test)) { }', 'tesT ($test)) { }', ), array( 'tesT ($test)) { }', 'tesT ($test)) { }', self::$configurationOopPositionSameLine, ), array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provide55Cases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provide56Cases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function provide70Cases() { return array( array( 'fixer->configure($configuration); } $this->doTest($expected, $input); } public function providePreserveLineAfterControlBrace() { return array( array( 'fixer->configure($configuration); } $this->fixer->configure(array( 'allow_single_line_closure' => true, )); $this->doTest($expected, $input); } public function provideFixWithAllowOnelineLambdaCases() { return array( array( 'fixer->configure($configuration); } $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t", "\r\n")); $this->doTest($expected, $input); } public function provideMessyWhitespacesCases() { return array( array( 'doTest($expected, $input); } }