1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of PHP CS Fixer.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- * Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace PhpCsFixer\Tests\Fixer\ClassNotation;
- use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- use PhpCsFixer\WhitespacesFixerConfig;
- /**
- * @author Javier Spagnoletti <phansys@gmail.com>
- *
- * @internal
- *
- * @covers \PhpCsFixer\Fixer\ClassNotation\SingleClassElementPerStatementFixer
- *
- * @extends AbstractFixerTestCase<\PhpCsFixer\Fixer\ClassNotation\SingleClassElementPerStatementFixer>
- *
- * @phpstan-import-type _AutogeneratedInputConfiguration from \PhpCsFixer\Fixer\ClassNotation\SingleClassElementPerStatementFixer
- */
- final class SingleClassElementPerStatementFixerTest extends AbstractFixerTestCase
- {
- /**
- * @param _AutogeneratedInputConfiguration $configuration
- *
- * @dataProvider provideFixCases
- */
- public function testFix(string $expected, ?string $input = null, array $configuration = []): void
- {
- $this->fixer->configure($configuration);
- $this->doTest($expected, $input);
- }
- public static function provideFixCases(): iterable
- {
- yield [
- '<?php
- class Foo
- {
- private static $bar1 = array(1,2,3);
- private static $bar2 = [1,2,3];
- private static $baz1 = array(array(1,2), array(3, 4));
- private static $baz2 = array(1,2,3);
- private static $aaa1 = 1;
- private static $aaa2 = array(2, 2);
- private static $aaa3 = 3;
- }',
- '<?php
- class Foo
- {
- private static $bar1 = array(1,2,3), $bar2 = [1,2,3];
- private static $baz1 = array(array(1,2), array(3, 4)), $baz2 = array(1,2,3);
- private static $aaa1 = 1, $aaa2 = array(2, 2), $aaa3 = 3;
- }',
- ];
- yield [
- '<?php
- class Foo
- {
- const A = 1;
- const B = 2;
- }
- echo Foo::A, Foo::B;
- ',
- '<?php
- class Foo
- {
- const A = 1, B = 2;
- }
- echo Foo::A, Foo::B;
- ',
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1; protected static $bar; protected static $baz=2 ; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1,$bar,$baz=2 ; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo {}
- class Bar
- {
- }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1; protected static $bar; protected static $baz=2 ; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1, $bar, $baz=2 ; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { const ONE = 1; const TWO = 2; protected static $foo = 1; protected static $bar; protected static $baz=2 ; const THREE = 3; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { const ONE = 1, TWO = 2; protected static $foo = 1, $bar, $baz=2 ; const THREE = 3; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo {
- protected static $foo = 1;
- protected static $bar;
- protected static $baz=2;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo {
- protected static $foo = 1,
- $bar,
- $baz=2;
- }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo {
- /**
- * Some great docblock
- */
- protected static $foo = 1;
- protected static $bar;
- protected static $baz=2;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo {
- /**
- * Some great docblock
- */
- protected static $foo = 1,
- $bar,
- $baz=2;
- }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo {
- /**
- * @int
- */
- protected static $foo = 1;
- protected static $bar;
- protected static $baz=2;
- // this is an inline comment, not a docblock
- private $var = false;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo {
- /**
- * @int
- */
- protected static $foo = 1,
- $bar,
- $baz=2;
- // this is an inline comment, not a docblock
- private $var = false;
- }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo {
- /**
- * @int
- */
- protected static $foo = 1;
- protected static $bar;
- protected static $baz=2;
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo {
- /**
- * @int
- */
- protected static $foo = 1,
- $bar,
- $baz=2;
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_1' => [
- <<<'EOT'
- <?php
- class Foo
- {
- public $bar = null;
- public $initialized = false;
- public $configured = false;
- public $called = false;
- public $arguments = array();
- public $baz = null;
- public $drop = false;
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- public $bar = null, $initialized = false, $configured = false, $called = false, $arguments = array();
- public $baz = null, $drop = false;
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_2' => [
- <<<'EOT'
- <?php
- class Foo
- {
- const TWO = '2';
- public $bar = null;
- public $initialized = false;
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- const TWO = '2';
- public $bar = null, $initialized = false;
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_3' => [
- <<<'EOT'
- <?php
- class Foo
- {
- const TWO = '2';
- public $bar = null;
- public $initialized = false;
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- const TWO = '2';
- public $bar = null, $initialized = false;
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_4' => [
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1;
- public $bar = null;
- public $initialized = false;
- public $configured = false;
- public $called = false;
- public $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1;
- public $bar = null, $initialized = false, $configured = false, $called = false, $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_5' => [
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1; public $bar = null; public $initialized = false; public $configured = false; public $called = false; public $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1; public $bar = null, $initialized = false, $configured = false, $called = false, $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'line_breaks_6' => [
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1;public $bar = null;public $initialized = false;public $configured = false;public $called = false;public $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- public $one = 1;public $bar = null, $initialized = false, $configured = false, $called = false, $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'whitespace_1' => [
- <<<'EOT'
- <?php
- class Foo { public $one = 1; public $bar = null; public $initialized = false; public $configured = false; public $called = false; public $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public $one = 1; public $bar = null,$initialized = false,$configured = false,$called = false,$arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield 'whitespace_2' => [
- <<<'EOT'
- <?php
- class Foo { public $one = 1; public $bar = null; public $initialized = false; public $configured = false; public $called=false; public $arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public $one = 1; public $bar = null,$initialized = false,$configured = false,$called=false,$arguments = array();
- function doSomething()
- {
- }
- }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1; protected static $bar; protected static $baz=1; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1, $bar, $baz=1; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1; protected static $bar; protected static $baz=1; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { protected static $foo = 1, $bar, $baz=1; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { protected $foo = 1; protected $bar; protected $baz=2; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { protected $foo = 1, $bar, $baz=2; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { var $foo = 1; var $bar; var $baz=2; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { var $foo = 1, $bar, $baz=2; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { var $foo = 1; var $bar; public function doSomething1() {} var $baz=2; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { var $foo = 1, $bar; public function doSomething1() {} var $baz=2; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { var $foo = 1; var $bar; public function doSomething2() { global $one, $two, $three; } var $baz=2; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { var $foo = 1, $bar; public function doSomething2() { global $one, $two, $three; } var $baz=2; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { public function doSomething3() {} protected $foo = 1; protected $bar; protected $baz=2; }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public function doSomething3() {} protected $foo = 1, $bar, $baz=2; }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { public function doSomethingElse() {} protected $foo = 1; protected $bar; protected $baz=2; private $acme =array(); }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public function doSomethingElse() {} protected $foo = 1, $bar, $baz=2; private $acme =array(); }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { public function doSomewhere() {} protected $foo = 1; protected $bar; protected $baz=2; private $acme1 =array(); }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public function doSomewhere() {} protected $foo = 1, $bar, $baz=2; private $acme1 =array(); }
- EOT,
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo { public function doThis() { global $one1, $two2, $three3; } protected $foo = 1; protected $bar; protected $baz=2; private $acme2 =array(); }
- EOT,
- <<<'EOT'
- <?php
- class Foo { public function doThis() { global $one1, $two2, $three3; } protected $foo = 1, $bar, $baz=2; private $acme2 =array(); }
- EOT,
- ];
- yield [
- '<?php
- class Foo
- {
- const A = 1;
- const #
- B#
- =#
- 2#
- ;#
- }
- echo Foo::A, Foo::B;
- ',
- '<?php
- class Foo
- {
- const A = 1,#
- B#
- =#
- 2#
- ;#
- }
- echo Foo::A, Foo::B;
- ',
- ];
- yield [
- '<?php
- class Token {
- const PUBLIC_CONST = 0;
- private const PRIVATE_CONST = 0;
- protected const PROTECTED_CONST = 0;
- public const PUBLIC_CONST_TWO = 0;
- public const TEST_71 = 0;
- }
- ',
- '<?php
- class Token {
- const PUBLIC_CONST = 0;
- private const PRIVATE_CONST = 0;
- protected const PROTECTED_CONST = 0;
- public const PUBLIC_CONST_TWO = 0, TEST_71 = 0;
- }
- ',
- ];
- yield [
- '<?php class Foo {
- private int $foo;
- private int $bar;
- }',
- '<?php class Foo {
- private int $foo, $bar;
- }',
- ];
- yield [
- '<?php class Foo {
- protected ?string $foo;
- protected ?string $bar;
- }',
- '<?php class Foo {
- protected ?string $foo, $bar;
- }',
- ];
- yield [
- '<?php class Foo {
- public ? string $foo;
- public ? string $bar;
- }',
- '<?php class Foo {
- public ? string $foo, $bar;
- }',
- ];
- yield [
- '<?php class Foo {
- var ? Foo\Bar $foo;
- var ? Foo\Bar $bar;
- }',
- '<?php class Foo {
- var ? Foo\Bar $foo, $bar;
- }',
- ];
- yield [
- '<?php class Foo {
- var array $foo;
- var array $bar;
- }',
- '<?php class Foo {
- var array $foo, $bar;
- }',
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a';
- const OTHER_CONST = 'b';
- protected static $foo = 1;
- protected static $bar = 2;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a', OTHER_CONST = 'b';
- protected static $foo = 1, $bar = 2;
- }
- EOT,
- ['elements' => ['const', 'property']],
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a';
- const OTHER_CONST = 'b';
- protected static $foo = 1, $bar = 2;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a', OTHER_CONST = 'b';
- protected static $foo = 1, $bar = 2;
- }
- EOT,
- ['elements' => ['const']],
- ];
- yield [
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a', OTHER_CONST = 'b';
- protected static $foo = 1;
- protected static $bar = 2;
- }
- EOT,
- <<<'EOT'
- <?php
- class Foo
- {
- const SOME_CONST = 'a', OTHER_CONST = 'b';
- protected static $foo = 1, $bar = 2;
- }
- EOT,
- ['elements' => ['property']],
- ];
- yield 'anonymous class' => [
- '<?php
- $a = new class() {
- const PUBLIC_CONST_TWO = 0;
- const TEST_70 = 0;
- public function a() {
- }
- };
- class C
- {
- public function A()
- {
- $a = new class() {
- const PUBLIC_CONST_TWO = 0;
- const TEST_70 = 0;
- public function a() {}
- };
- }
- }
- ',
- '<?php
- $a = new class() {
- const PUBLIC_CONST_TWO = 0, TEST_70 = 0;
- public function a() {
- }
- };
- class C
- {
- public function A()
- {
- $a = new class() {
- const PUBLIC_CONST_TWO = 0, TEST_70 = 0;
- public function a() {}
- };
- }
- }
- ',
- ];
- }
- public function testWithWhitespacesConfig(): void
- {
- $this->fixer->setWhitespacesConfig(new WhitespacesFixerConfig("\t", "\r\n"));
- $this->doTest(
- "<?php\r\n\tclass Foo {\r\n\t\tconst AAA=0;\r\n\t\tconst BBB=1;\r\n\t}",
- "<?php\r\n\tclass Foo {\r\n\t\tconst AAA=0, BBB=1;\r\n\t}",
- );
- }
- /**
- * @dataProvider provideFix80Cases
- *
- * @requires PHP 8.0
- */
- public function testFix80(string $expected, string $input): void
- {
- $this->doTest($expected, $input);
- }
- /**
- * @return iterable<array{string, string}>
- */
- public static function provideFix80Cases(): iterable
- {
- yield [
- '<?php
- class Foo
- {
- private string|int $prop1;
- private string|int $prop2;
- }
- ',
- '<?php
- class Foo
- {
- private string|int $prop1, $prop2;
- }
- ',
- ];
- }
- /**
- * @dataProvider provideFix81Cases
- *
- * @requires PHP 8.1
- */
- public function testFix81(string $expected, ?string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- /**
- * @return iterable<array{0: string, 1?: string}>
- */
- public static function provideFix81Cases(): iterable
- {
- yield [
- '<?php
- class Foo
- {
- readonly int $a;
- readonly int $b;
- public readonly int $c;
- public readonly int $d;
- readonly private string /*1*/$e;
- readonly private string /*2*/$f;
- readonly float $g;
- protected readonly float $h1;
- protected readonly float $h2;
- readonly float $z1;
- readonly float $z2;
- readonly float $z3;
- }',
- '<?php
- class Foo
- {
- readonly int $a, $b;
- public readonly int $c, $d;
- readonly private string /*1*/$e,/*2*/$f;
- readonly float $g;
- protected readonly float $h1, $h2;
- readonly float $z1, $z2, $z3;
- }',
- ];
- yield [
- '<?php
- class Foo
- {
- final public const B1 = "2";
- final public const B2 = "2";
- readonly float $z2;
- }
- ',
- ];
- yield [
- '<?php
- class Foo
- {
- private Foo&Bar $prop1;
- private Foo&Bar $prop2;
- }
- ',
- '<?php
- class Foo
- {
- private Foo&Bar $prop1, $prop2;
- }
- ',
- ];
- yield [
- "<?php
- enum Foo: string {
- public const A = 'A';
- public const B = 'B';
- case Hearts = 'H';
- case Spades = 'S';
- }
- var_dump(Foo::A.Foo::B);",
- "<?php
- enum Foo: string {
- public const A = 'A', B = 'B';
- case Hearts = 'H';
- case Spades = 'S';
- }
- var_dump(Foo::A.Foo::B);",
- ];
- }
- /**
- * @dataProvider provideFix82Cases
- *
- * @requires PHP 8.2
- */
- public function testFix82(string $expected, ?string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- /**
- * @return iterable<array{string, string}>
- */
- public static function provideFix82Cases(): iterable
- {
- yield [
- '<?php trait Foo { public const Bar = 1; public const Baz = 1; }',
- '<?php trait Foo { public const Bar = 1, Baz = 1; }',
- ];
- }
- public function testInvalidConfiguration(): void
- {
- $this->expectException(InvalidFixerConfigurationException::class);
- $this->expectExceptionMessageMatches('/^\[single_class_element_per_statement\] Invalid configuration: The option "elements" .*\.$/');
- $this->fixer->configure(['elements' => ['foo']]); // @phpstan-ignore-line
- }
- }
|