1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036 |
- <?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\Phpdoc;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- /**
- * @author Jonathan Gruber <gruberjonathan@gmail.com>
- *
- * @internal
- *
- * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocParamOrderFixer
- */
- final class PhpdocParamOrderFixerTest extends AbstractFixerTestCase
- {
- public function testNoChanges(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- */
- public function m($a) {}
- }
- EOT;
- $this->doTest($expected);
- }
- public function testNoChangesMultiple(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param string $a
- * @param bool $b
- */
- public function m($a, $b) {}
- }
- EOT;
- $this->doTest($expected);
- }
- public function testOnlyParamsUntyped(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $b
- * @param $c
- * @param $d
- * @param $e
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $b
- * @param $e
- * @param $a
- * @param $c
- * @param $d
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testOnlyParamsUntypedMixed(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param int $a
- * @param $b
- * @param $c
- * @param bool $d
- * @param $e
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $c
- * @param $e
- * @param int $a
- * @param $b
- * @param bool $d
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testOnlyParamsTyped(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param string $a
- * @param bool $b
- * @param string $c
- * @param string $d
- * @param int $e
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param bool $b
- * @param string $a
- * @param string $c
- * @param int $e
- * @param string $d
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testOnlyParamsUndocumented(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $b
- * @param $c
- * @param $d
- */
- public function m($a, $b, $c, $d, $e, $f) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $c
- * @param $d
- * @param $b
- */
- public function m($a, $b, $c, $d, $e, $f) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testOnlyParamsSuperfluousAnnotation(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $b
- * @param $c
- * @param $superfluous
- */
- public function m($a, $b, $c) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $superfluous
- * @param $b
- * @param $c
- */
- public function m($a, $b, $c) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testOnlyParamsSuperfluousAnnotations(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $b
- * @param $c
- * @param $superfluous2
- * @param $superfluous1
- * @param $superfluous3
- */
- public function m($a, $b, $c) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $superfluous2
- * @param $b
- * @param $superfluous1
- * @param $c
- * @param $superfluous3
- */
- public function m($a, $b, $c) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsUntyped(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param $a
- * @param $b
- * @param $c
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param $b
- * @param $c
- * @param $a
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsTyped(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param Foo $a
- * @param int $b
- * @param bool $c
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param int $b
- * @param bool $c
- * @param Foo $a
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsDescription(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param Foo $a A parameter
- * @param int $b B parameter
- * @param bool $c C parameter
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param int $b B parameter
- * @param bool $c C parameter
- * @param Foo $a A parameter
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsMultilineDescription(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param Foo $a A parameter
- * @param int $b B parameter
- * @param bool $c Another multiline, longer
- * description of C parameter
- * @param bool $d Multiline description
- * of D parameter
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param int $b B parameter
- * @param bool $d Multiline description
- * of D parameter
- * @param bool $c Another multiline, longer
- * description of C parameter
- * @param Foo $a A parameter
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testComplexTypes(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param Foo[]|\Bar\Baz $a
- * @param Foo|Bar $b
- * @param array<int, FooInterface>|string $c
- * @param array<array{int, int}> $d
- * @param ?Foo $e
- * @param \Closure(( $b is Bar ? bool : int)): $this $f
- */
- public function m($a, $b, $c, $d, $e, $f) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param array<int, FooInterface>|string $c
- * @param Foo|Bar $b
- * @param array<array{int, int}> $d
- * @param ?Foo $e
- * @param \Closure(( $b is Bar ? bool : int)): $this $f
- * @param Foo[]|\Bar\Baz $a
- */
- public function m($a, $b, $c, $d, $e, $f) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testVariousMethodDeclarations(): void
- {
- $expected = <<<'EOT'
- <?php
- abstract class C {
- /**
- * @param Foo $a
- * @param array $b
- * @param $c
- * @param mixed $d
- */
- final public static function m1(Foo $a, array $b, $c, $d) {}
- /**
- * @param array $a
- * @param $b
- * @throws Exception
- *
- * @return bool
- */
- abstract public function m2(array $a, $b);
- /**
- * Description of
- * method
- *
- * @param int $a
- * @param Foo $b
- * @param $c
- * @param Bar $d
- * @param string $e
- */
- protected static function m3($a, Foo $b, $c, Bar $d, $e) {}
- /**
- * @see Something
- *
- * @param callable $a
- * @param $b
- * @param array $c
- * @param array $d
- *
- * @return int
- *
- * Text
- */
- final protected function m4(Callable $a, $b, array $c, array $d) {}
- /**
- * @param Bar $a
- * @param Bar $b
- * @param $c
- * @param int $d
- * @param array $e
- * @param $f
- *
- * @return Foo|null
- */
- abstract protected function m5(Bar $a, Bar $b, $c, $d, array $e, $f);
- /**
- * @param array $a
- * @param $b
- */
- private function m6(array $a, $b) {}
- /**
- * @param Foo $a
- * @param array $b
- * @param mixed $c
- */
- private static function m7(Foo $a, array $b, $c) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- abstract class C {
- /**
- * @param array $b
- * @param Foo $a
- * @param mixed $d
- * @param $c
- */
- final public static function m1(Foo $a, array $b, $c, $d) {}
- /**
- * @param $b
- * @param array $a
- * @throws Exception
- *
- * @return bool
- */
- abstract public function m2(array $a, $b);
- /**
- * Description of
- * method
- *
- * @param string $e
- * @param int $a
- * @param Foo $b
- * @param Bar $d
- * @param $c
- */
- protected static function m3($a, Foo $b, $c, Bar $d, $e) {}
- /**
- * @see Something
- *
- * @param $b
- * @param array $d
- * @param array $c
- * @param callable $a
- *
- * @return int
- *
- * Text
- */
- final protected function m4(Callable $a, $b, array $c, array $d) {}
- /**
- * @param Bar $b
- * @param $f
- * @param int $d
- * @param array $e
- * @param $c
- * @param Bar $a
- *
- * @return Foo|null
- */
- abstract protected function m5(Bar $a, Bar $b, $c, $d, array $e, $f);
- /**
- * @param $b
- * @param array $a
- */
- private function m6(array $a, $b) {}
- /**
- * @param array $b
- * @param mixed $c
- * @param Foo $a
- */
- private static function m7(Foo $a, array $b, $c) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsWithOtherAnnotationsInBetween(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * [c1] Method description
- * [c2] over multiple lines
- *
- * @see Baz
- *
- * @param int $a Long param
- * description
- * @param mixed $b
- * @param mixed $superflous1 With text
- * @param int $superflous2
- * @return array Long return
- * description
- * @throws Exception
- * @throws FooException
- */
- function foo($a, $b) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * [c1] Method description
- * [c2] over multiple lines
- *
- * @see Baz
- *
- * @param mixed $b
- * @param mixed $superflous1 With text
- * @return array Long return
- * description
- * @param int $superflous2
- * @throws Exception
- * @param int $a Long param
- * description
- * @throws FooException
- */
- function foo($a, $b) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testParamsBlankLines(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param $a
- * @param $b
- *
- * @param $c
- *
- *
- * @param $d
- *
- * @param $e
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * Some function
- *
- * @param $b
- * @param $e
- *
- * @param $c
- *
- *
- * @param $a
- *
- * @param $d
- *
- * @throws \Exception
- *
- * @return bool
- */
- public function m($a, $b, $c, $d, $e) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testNestedPhpdoc(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param string[] $array
- * @param callable $callback {
- * @param string $value
- * @param int $key
- * @param mixed $userdata
- * }
- * @param mixed $userdata
- *
- * @return bool
- */
- function string_array_walk(array &$array, callable $callback, $userdata = null) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param callable $callback {
- * @param string $value
- * @param int $key
- * @param mixed $userdata
- * }
- * @param mixed $userdata
- * @param string[] $array
- *
- * @return bool
- */
- function string_array_walk(array &$array, callable $callback, $userdata = null) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testMultiNestedPhpdoc(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param string[] $a
- * @param callable $b {
- * @param string $a
- * @param callable {
- * @param string $d
- * @param int $a
- * @param callable $c {
- * $param string $e
- * }
- * }
- * @param mixed $b2
- * }
- * @param mixed $c
- * @param int $d
- *
- * @return bool
- */
- function m(array &$a, callable $b, $c = null, $d) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param mixed $c
- * @param callable $b {
- * @param string $a
- * @param callable {
- * @param string $d
- * @param int $a
- * @param callable $c {
- * $param string $e
- * }
- * }
- * @param mixed $b2
- * }
- * @param int $d
- * @param string[] $a
- *
- * @return bool
- */
- function m(array &$a, callable $b, $c = null, $d) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testMultipleNestedPhpdoc(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param string[] $array
- * @param callable $callback {
- * @param string $value
- * @param int $key
- * @param mixed $userdata {
- * $param array $array
- * }
- * }
- * @param mixed $userdata
- * @param callable $foo {
- * @param callable {
- * @param string $inner1
- * @param int $inner2
- * }
- * @param mixed $userdata
- * }
- * @param $superflous1 Superflous
- * @param $superflous2 Superflous
- *
- * @return bool
- */
- function string_array_walk(array &$array, callable $callback, $userdata = null, $foo) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param $superflous1 Superflous
- * @param callable $callback {
- * @param string $value
- * @param int $key
- * @param mixed $userdata {
- * $param array $array
- * }
- * }
- * @param $superflous2 Superflous
- * @param callable $foo {
- * @param callable {
- * @param string $inner1
- * @param int $inner2
- * }
- * @param mixed $userdata
- * }
- * @param mixed $userdata
- * @param string[] $array
- *
- * @return bool
- */
- function string_array_walk(array &$array, callable $callback, $userdata = null, $foo) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testNonMatchingParamName(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param Foo $fooBar
- * @param $fooSomethingNotMatchingTheName
- * @param OtherClassLorem $x
- */
- function f(Foo $fooBar, Payment $foo, OtherClassLoremIpsum $y) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param $fooSomethingNotMatchingTheName
- * @param Foo $fooBar
- * @param OtherClassLorem $x
- */
- function f(Foo $fooBar, Payment $foo, OtherClassLoremIpsum $y) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testPlainFunction(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * A plain function
- *
- * @param $a
- * @param $b
- * @param $c
- * @param $d
- */
- function m($a, $b, $c, $d) {}
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * A plain function
- *
- * @param $c
- * @param $b
- * @param $d
- * @param $a
- */
- function m($a, $b, $c, $d) {}
- EOT;
- $this->doTest($expected, $input);
- }
- public function testCommentsInSignature(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param $a
- * @param $b
- * @param $c
- * @param $d
- */
- public/*1*/function/*2*/m/*3*/(/*4*/$a, $b,/*5*/$c, $d){}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $d
- * @param $a
- * @param $b
- * @param $c
- */
- public/*1*/function/*2*/m/*3*/(/*4*/$a, $b,/*5*/$c, $d){}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testClosure(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param array $a
- * @param $b
- * @param Foo $c
- * @param int $d
- */
- $closure = function (array $a, $b, Foo $c, $d) {};
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param $b
- * @param int $d
- * @param Foo $c
- * @param array $a
- */
- $closure = function (array $a, $b, Foo $c, $d) {};
- EOT;
- $this->doTest($expected, $input);
- }
- public function testArrowFunction(): void
- {
- $expected = <<<'EOT'
- <?php
- /**
- * @param array $a
- * @param $b
- * @param Foo $c
- * @param int $d
- */
- $closure = fn (array $a, $b, Foo $c, $d) => null;
- EOT;
- $input = <<<'EOT'
- <?php
- /**
- * @param $b
- * @param int $d
- * @param Foo $c
- * @param array $a
- */
- $closure = fn (array $a, $b, Foo $c, $d) => null;
- EOT;
- $this->doTest($expected, $input);
- }
- public function testInterface(): void
- {
- $expected = <<<'EOT'
- <?php
- Interface I
- {
- /**
- * @param string $a
- * @param array $b
- * @param Foo $c
- *
- * @return int|null
- */
- public function foo($a, array $b, Foo $c);
- /**
- * @param array $a
- * @param $b
- *
- * @return bool
- */
- public static function bar(array $a, $b);
- }
- EOT;
- $input = <<<'EOT'
- <?php
- Interface I
- {
- /**
- * @param Foo $c
- * @param string $a
- * @param array $b
- *
- * @return int|null
- */
- public function foo($a, array $b, Foo $c);
- /**
- * @param $b
- * @param array $a
- *
- * @return bool
- */
- public static function bar(array $a, $b);
- }
- EOT;
- $this->doTest($expected, $input);
- }
- public function testPhp7ParamTypes(): void
- {
- $expected = <<<'EOT'
- <?php
- class C {
- /**
- * @param array $a
- * @param $b
- * @param bool $c
- */
- public function m(array $a, $b, bool $c) {}
- }
- EOT;
- $input = <<<'EOT'
- <?php
- class C {
- /**
- * @param $b
- * @param bool $c
- * @param array $a
- */
- public function m(array $a, $b, bool $c) {}
- }
- EOT;
- $this->doTest($expected, $input);
- }
- }
|