rectorphp / rector

Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
https://getrector.com
MIT License
8.61k stars 680 forks source link

Create a rule to annotate a data provider (PHPUnit) with correct array based the test method signature that uses the data provider #8800

Open DaveLiddament opened 3 weeks ago

DaveLiddament commented 3 weeks ago

Feature Request

I would like a Rector to add the correct return type docblock to a PHPUnit data provider method, based on the signature of the test method that references the data provider.

Rector would look for methods with the #[DataProvicder] attribute, it could then annotate the referenced data provider method, if it isn't already annotated, with relevant docblock,

E.g Before

final class NumericDataSetsTest extends TestCase
{
    public static function additionProvider(): array
    {
        return [
            [0, 0, 0],
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3],
        ];
    }

    #[DataProvider('additionProvider')]
    public function testAdd(int $a, int $b, int $expected): void
    {
        $this->assertSame($expected, $a + $b);
    }
}

Rector can work out from the testAdd parameters that the data provider should be: /** @return array<array-key,array<int,int,int>> */

Diff

 final class NumericDataSetsTest extends TestCase
 {
+     /** @return array<array-key,array<int,int,int>> */
     public static function additionProvider(): array
     {
         return [
            [0, 0, 0],
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3],
        ];
     }

     #[DataProvider('additionProvider')]
     public function testAdd(int $a, int $b, int $expected): void
     {
         $this->assertSame($expected, $a + $b);
     }
 }
carlos-granados commented 3 weeks ago

@DaveLiddament I guess it shoud be @return ?

DaveLiddament commented 3 weeks ago

@DaveLiddament I guess it shoud be @return ?

Good spot. Updated. Thanks

TomasVotruba commented 3 weeks ago

We had such a rule before but it was opinionated how complex array shapes should be included or skipped.

Proof of concept would be great 👍