diff --git a/src/Rules/PHPUnit/DataProviderDataRule.php b/src/Rules/PHPUnit/DataProviderDataRule.php index ac800f5..8df5d8b 100644 --- a/src/Rules/PHPUnit/DataProviderDataRule.php +++ b/src/Rules/PHPUnit/DataProviderDataRule.php @@ -4,6 +4,7 @@ use PhpParser\Node; use PHPStan\Analyser\Scope; +use PHPStan\BetterReflection\Reflection\ReflectionMethod; use PHPStan\Node\Expr\TypeExpr; use PHPStan\Rules\Rule; use PHPStan\Type\ObjectType; @@ -63,19 +64,19 @@ public function processNode(Node $node, Scope $scope): array return []; } - $testsWithProvider = []; + $testWithProviderMethods = []; $method = $scope->getFunction(); $testMethods = $this->testMethodsHelper->getTestMethods($classReflection, $scope); foreach ($testMethods as $testMethod) { foreach ($this->dataProviderHelper->getDataProviderMethods($scope, $testMethod, $classReflection) as [, $providerMethodName]) { if ($providerMethodName === $method->getName()) { - $testsWithProvider[] = $testMethod; + $testWithProviderMethods[] = $testMethod; continue 2; } } } - if (count($testsWithProvider) === 0) { + if (count($testWithProviderMethods) === 0) { return []; } @@ -84,25 +85,10 @@ public function processNode(Node $node, Scope $scope): array return []; } - $maxNumberOfParameters = null; - foreach ($testsWithProvider as $testMethod) { - $num = $testMethod->getNumberOfParameters(); - if ($testMethod->isVariadic()) { - $num = PHP_INT_MAX; - } - if ($maxNumberOfParameters === null) { - $maxNumberOfParameters = $num; - continue; - } + $maxNumberOfParameters = $this->getMaxNumberOfParameters($testWithProviderMethods); - $maxNumberOfParameters = max($maxNumberOfParameters, $num); - if ($num === PHP_INT_MAX) { - break; - } - } - - foreach ($testsWithProvider as $testMethod) { - $numberOfParameters = $testMethod->getNumberOfParameters(); + foreach ($testWithProviderMethods as $testWithProviderMethod) { + $numberOfParameters = $testWithProviderMethod->getNumberOfParameters(); foreach ($arraysTypes as [$startLine, $arraysType]) { $args = $this->arrayItemsToArgs($arraysType, $numberOfParameters); @@ -111,7 +97,7 @@ public function processNode(Node $node, Scope $scope): array } if ( - !$testMethod->isVariadic() + !$testWithProviderMethod->isVariadic() && $numberOfParameters !== $maxNumberOfParameters ) { $args = array_slice($args, 0, $numberOfParameters); @@ -119,7 +105,7 @@ public function processNode(Node $node, Scope $scope): array $scope->invokeNodeCallback(new Node\Expr\MethodCall( new TypeExpr(new ObjectType($classReflection->getName())), - $testMethod->getName(), + $testWithProviderMethod->getName(), $args, ['startLine' => $startLine], )); @@ -129,6 +115,28 @@ public function processNode(Node $node, Scope $scope): array return []; } + /** + * @param non-empty-array $testMethods + */ + private function getMaxNumberOfParameters(array $testMethods): int + { + $maxNumberOfParameters = null; + foreach ($testMethods as $testMethod) { + $num = $testMethod->getNumberOfParameters(); + if ($testMethod->isVariadic()) { + return PHP_INT_MAX; + } + if ($maxNumberOfParameters === null) { + $maxNumberOfParameters = $num; + continue; + } + + $maxNumberOfParameters = max($maxNumberOfParameters, $num); + } + + return $maxNumberOfParameters; + } + /** * @return array */