|
@@ -57,6 +57,11 @@ final class ProjectCodeTest extends TestCase
|
|
|
*/
|
|
|
private static ?array $srcClassCases = null;
|
|
|
|
|
|
+ /**
|
|
|
+ * @var null|array<string, array{class-string, string}>
|
|
|
+ */
|
|
|
+ private static ?array $dataProviderMethodCases = null;
|
|
|
+
|
|
|
/**
|
|
|
* @var array<class-string, Tokens>
|
|
|
*/
|
|
@@ -258,7 +263,7 @@ final class ProjectCodeTest extends TestCase
|
|
|
*
|
|
|
* @param class-string<TestCase> $testClassName
|
|
|
*/
|
|
|
- public function testThatTestDataProvidersAreUsed(string $testClassName, \ReflectionMethod $dataProvider): void
|
|
|
+ public function testThatTestDataProvidersAreUsed(string $testClassName, string $dataProviderName): void
|
|
|
{
|
|
|
$usedDataProviderMethodNames = [];
|
|
|
|
|
@@ -266,44 +271,45 @@ final class ProjectCodeTest extends TestCase
|
|
|
$usedDataProviderMethodNames[] = $providerName;
|
|
|
}
|
|
|
|
|
|
- $dataProviderName = $dataProvider->getName();
|
|
|
-
|
|
|
self::assertContains(
|
|
|
$dataProviderName,
|
|
|
$usedDataProviderMethodNames,
|
|
|
- \sprintf('Data provider in "%s" with name "%s" is not used.', $dataProvider->getDeclaringClass()->getName(), $dataProviderName)
|
|
|
+ \sprintf('Data provider "%s::%s" is not used.', $testClassName, $dataProviderName),
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @dataProvider provideDataProviderMethodCases
|
|
|
*/
|
|
|
- public function testThatTestDataProvidersAreCorrectlyNamed(string $testClassName, \ReflectionMethod $dataProvider): void
|
|
|
+ public function testThatTestDataProvidersAreCorrectlyNamed(string $testClassName, string $dataProviderName): void
|
|
|
{
|
|
|
- $dataProviderName = $dataProvider->getShortName();
|
|
|
-
|
|
|
self::assertMatchesRegularExpression('/^provide[A-Z]\S+Cases$/', $dataProviderName, \sprintf(
|
|
|
- 'Data provider in "%s" with name "%s" is not correctly named.',
|
|
|
+ 'Data provider "%s::%s" is not correctly named.',
|
|
|
$testClassName,
|
|
|
- $dataProviderName
|
|
|
+ $dataProviderName,
|
|
|
));
|
|
|
}
|
|
|
|
|
|
public static function provideDataProviderMethodCases(): iterable
|
|
|
{
|
|
|
- foreach (self::provideTestClassCases() as $testClassName) {
|
|
|
- $testClassName = reset($testClassName);
|
|
|
- $reflectionClass = new \ReflectionClass($testClassName);
|
|
|
-
|
|
|
- $methods = array_filter(
|
|
|
- $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC),
|
|
|
- static fn (\ReflectionMethod $reflectionMethod): bool => $reflectionMethod->getDeclaringClass()->getName() === $reflectionClass->getName() && str_starts_with($reflectionMethod->getName(), 'provide')
|
|
|
- );
|
|
|
-
|
|
|
- foreach ($methods as $method) {
|
|
|
- yield $testClassName.'::'.$method->getName() => [$testClassName, $method];
|
|
|
+ if (null === self::$dataProviderMethodCases) {
|
|
|
+ self::$dataProviderMethodCases = [];
|
|
|
+ foreach (self::provideTestClassCases() as $testClassName) {
|
|
|
+ $testClassName = reset($testClassName);
|
|
|
+ $reflectionClass = new \ReflectionClass($testClassName);
|
|
|
+
|
|
|
+ $dataProviderNames = array_filter(
|
|
|
+ $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC),
|
|
|
+ static fn (\ReflectionMethod $reflectionMethod): bool => $reflectionMethod->getDeclaringClass()->getName() === $reflectionClass->getName() && str_starts_with($reflectionMethod->getName(), 'provide')
|
|
|
+ );
|
|
|
+
|
|
|
+ foreach ($dataProviderNames as $dataProviderName) {
|
|
|
+ self::$dataProviderMethodCases[$testClassName.'::'.$dataProviderName->getName()] = [$testClassName, $dataProviderName->getName()];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ yield from self::$dataProviderMethodCases;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -467,11 +473,8 @@ final class ProjectCodeTest extends TestCase
|
|
|
*
|
|
|
* @param class-string<TestCase> $testClassName
|
|
|
*/
|
|
|
- public function testDataProvidersAreNonPhpVersionConditional(string $testClassName, \ReflectionMethod $dataProvider): void
|
|
|
+ public function testDataProvidersAreNonPhpVersionConditional(string $testClassName, string $dataProviderName): void
|
|
|
{
|
|
|
- $dataProviderName = $dataProvider->getName();
|
|
|
- $methodId = $testClassName.'::'.$dataProviderName;
|
|
|
-
|
|
|
$tokens = $this->createTokensForClass($testClassName);
|
|
|
$tokensAnalyzer = new TokensAnalyzer($tokens);
|
|
|
$dataProviderElements = array_filter($tokensAnalyzer->getClassyElements(), static function (array $v, int $k) use ($tokens, $dataProviderName) {
|
|
@@ -482,7 +485,7 @@ final class ProjectCodeTest extends TestCase
|
|
|
}, ARRAY_FILTER_USE_BOTH);
|
|
|
|
|
|
if (1 !== \count($dataProviderElements)) {
|
|
|
- throw new \UnexpectedValueException(\sprintf('DataProvider `%s` should be found exactly once, got %d times.', $methodId, \count($dataProviderElements)));
|
|
|
+ throw new \UnexpectedValueException(\sprintf('Data provider "%s::%s" should be found exactly once, got %d times.', $testClassName, $dataProviderName, \count($dataProviderElements)));
|
|
|
}
|
|
|
|
|
|
$methodIndex = array_key_first($dataProviderElements);
|
|
@@ -503,8 +506,9 @@ final class ProjectCodeTest extends TestCase
|
|
|
0,
|
|
|
$versionTokens,
|
|
|
\sprintf(
|
|
|
- "DataProvider '%s' should not check PHP version and provide different cases depends on it. It leads to situation when DataProvider provides 'sometimes 10, sometimes 11' test cases, depends on PHP version. That makes John Doe to see 'you run 10/10' and thinking all tests are executed, instead of actually seeing 'you run 10/11 and 1 skipped'.",
|
|
|
- $methodId,
|
|
|
+ 'Data provider "%s::%s" should not check PHP version and provide different cases depends on it. It leads to situation when DataProvider provides "sometimes 10, sometimes 11" test cases, depends on PHP version. That makes John Doe to see "you run 10/10" and thinking all tests are executed, instead of actually seeing "you run 10/11 and 1 skipped".',
|
|
|
+ $testClassName,
|
|
|
+ $dataProviderName,
|
|
|
),
|
|
|
);
|
|
|
}
|
|
@@ -512,18 +516,18 @@ final class ProjectCodeTest extends TestCase
|
|
|
/**
|
|
|
* @dataProvider provideDataProviderMethodCases
|
|
|
*/
|
|
|
- public function testDataProvidersDeclaredReturnType(string $testClassName, \ReflectionMethod $method): void
|
|
|
+ public function testDataProvidersDeclaredReturnType(string $testClassName, string $dataProviderName): void
|
|
|
{
|
|
|
- $methodId = $testClassName.'::'.$method->getName();
|
|
|
+ $dataProvider = new \ReflectionMethod($testClassName, $dataProviderName);
|
|
|
|
|
|
- self::assertSame('iterable', $method->hasReturnType() && $method->getReturnType() instanceof \ReflectionNamedType ? $method->getReturnType()->getName() : null, \sprintf('DataProvider `%s` must provide `iterable` as return in method prototype.', $methodId));
|
|
|
+ self::assertSame('iterable', $dataProvider->hasReturnType() && $dataProvider->getReturnType() instanceof \ReflectionNamedType ? $dataProvider->getReturnType()->getName() : null, \sprintf('Data provider "%s::%s" must provide `iterable` as return in method prototype.', $testClassName, $dataProviderName));
|
|
|
|
|
|
- $doc = new DocBlock(false !== $method->getDocComment() ? $method->getDocComment() : '/** */');
|
|
|
+ $doc = new DocBlock(false !== $dataProvider->getDocComment() ? $dataProvider->getDocComment() : '/** */');
|
|
|
|
|
|
$returnDocs = $doc->getAnnotationsOfType('return');
|
|
|
|
|
|
if (\count($returnDocs) > 1) {
|
|
|
- throw new \UnexpectedValueException(\sprintf('Multiple `%s@return` annotations.', $methodId));
|
|
|
+ throw new \UnexpectedValueException(\sprintf('Multiple "%s::%s@return" annotations.', $testClassName, $dataProviderName));
|
|
|
}
|
|
|
|
|
|
if (1 !== \count($returnDocs)) {
|
|
@@ -535,9 +539,9 @@ final class ProjectCodeTest extends TestCase
|
|
|
$returnDoc = $returnDocs[0];
|
|
|
$types = $returnDoc->getTypes();
|
|
|
|
|
|
- self::assertCount(1, $types, \sprintf('DataProvider `%s@return` must provide single type.', $methodId));
|
|
|
- self::assertMatchesRegularExpression('/^iterable\</', $types[0], \sprintf('DataProvider `%s@return` must return iterable.', $methodId));
|
|
|
- self::assertMatchesRegularExpression('/^iterable\<(?:(?:int\|)?string, )?array\{/', $types[0], \sprintf('DataProvider `%s@return` must return iterable of tuples (eg `iterable<string, array{string, string}>`).', $methodId));
|
|
|
+ self::assertCount(1, $types, \sprintf('Data provider "%s::%s@return" must provide single type.', $testClassName, $dataProviderName));
|
|
|
+ self::assertMatchesRegularExpression('/^iterable\</', $types[0], \sprintf('Data provider "%s::%s@return" must return iterable.', $testClassName, $dataProviderName));
|
|
|
+ self::assertMatchesRegularExpression('/^iterable\<(?:(?:int\|)?string, )?array\{/', $types[0], \sprintf('Data provider "%s::%s@return" must return iterable of tuples (eg `iterable<string, array{string, string}>`).', $testClassName, $dataProviderName));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -800,112 +804,107 @@ final class ProjectCodeTest extends TestCase
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @dataProvider provideTestClassCases
|
|
|
+ * @dataProvider provideDataProviderMethodCases
|
|
|
*
|
|
|
- * @param class-string $className
|
|
|
+ * @param class-string<TestCase> $testClassName
|
|
|
*/
|
|
|
- public function testThatDataFromDataProvidersIsNotDuplicated(string $className): void
|
|
|
+ public function testThatDataFromDataProvidersIsNotDuplicated(string $testClassName, string $dataProviderName): void
|
|
|
{
|
|
|
- $duplicates = [];
|
|
|
- foreach ((new \ReflectionClass($className))->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
|
|
|
- if ($method->getDeclaringClass()->getName() !== $className) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!str_starts_with($method->getName(), 'provide')) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ $exceptions = [ // should only shrink
|
|
|
+ // because of Serialization
|
|
|
+ 'PhpCsFixer\Tests\AutoReview\CommandTest::provideCommandHasNameConstCases',
|
|
|
+ 'PhpCsFixer\Tests\AutoReview\DocumentationTest::provideFixerDocumentationFileIsUpToDateCases',
|
|
|
+ 'PhpCsFixer\Tests\AutoReview\FixerFactoryTest::providePriorityIntegrationTestFilesAreListedInPriorityGraphCases',
|
|
|
+ 'PhpCsFixer\Tests\Console\Command\DescribeCommandTest::provideExecuteOutputCases',
|
|
|
+ 'PhpCsFixer\Tests\Console\Command\HelpCommandTest::provideGetDisplayableAllowedValuesCases',
|
|
|
+ 'PhpCsFixer\Tests\Documentation\FixerDocumentGeneratorTest::provideGenerateRuleSetsDocumentationCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\EncodingFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\UtilsTest::provideStableSortCases',
|
|
|
+ // because of more than one duplicate
|
|
|
+ 'PhpCsFixer\Tests\Console\Command\SelfUpdateCommandTest::provideExecuteCases',
|
|
|
+ 'PhpCsFixer\Tests\Console\Output\Progress\DotsOutputTest::provideDotsProgressOutputCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ArrayNotation\TrimArraySpacesFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFixClassyBracesCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\BracesPositionFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\CurlyBracesPositionFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ClassNotation\FinalClassFixerTest::provideFix80Cases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\PsrAutoloadingFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\CastNotation\LowercaseCastFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ClassNotation\FinalClassFixerTest::provideFix82Cases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUnneededControlParenthesesFixerTest::provideFixAllCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUselessElseFixerTest::provideFixIfElseIfElseCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUselessElseFixerTest::provideFixIfElseCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\YodaStyleFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\YodaStyleFixerTest::providePHP71Cases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixerTest::provideFixWithColonCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAroundParenthesesOnlyCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\LanguageConstruct\SingleSpaceAfterConstructFixerTest::provideFixWithUseCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\LanguageConstruct\SingleSpaceAroundConstructFixerTest::provideFixWithUseCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\PhpUnit\PhpUnitStrictFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Phpdoc\PhpdocInlineTagNormalizerFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\Analyzer\AlternativeSyntaxAnalyzerTest::provideItThrowsOnInvalidAlternativeSyntaxBlockStartIndexCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\Analyzer\FunctionsAnalyzerTest::provideIsGlobalFunctionCallCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\TokenTest::provideIsMagicConstantCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\TokensAnalyzerTest::provideIsBinaryOperatorCases',
|
|
|
+ // because of one duplicate
|
|
|
+ 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideGetTypesCases',
|
|
|
+ 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideGetConstTypesCases',
|
|
|
+ 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideParseInvalidExceptionCases',
|
|
|
+ 'PhpCsFixer\Tests\FixerNameValidatorTest::provideIsValidCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ArrayNotation\ArraySyntaxFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFixMultiLineStructuresCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFunctionImportCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Comment\NoEmptyCommentFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ConstantNotation\NativeConstantInvocationFixerTest::provideFixWithDefaultConfigurationCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixWithDifferentCommentTextCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixWithDifferentLineEndingCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAllCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAroundCommasOnlyCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\FunctionNotation\PhpdocToParamTypeFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Import\OrderedImportsFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Operator\StandardizeIncrementFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\PhpUnit\PhpUnitTargetVersionTest::provideFulfillsCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Phpdoc\PhpdocTypesOrderFixerTest::provideFixWithNullFirstCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\StringNotation\SingleQuoteFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Whitespace\MethodChainingIndentationFixerTest::provideFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Whitespace\SpacesInsideParenthesesFixerTest::provideDefaultFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Fixer\Whitespace\SpacesInsideParenthesesFixerTest::provideSpacesFixCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\Analyzer\AttributeAnalyzerTest::provideIsAttributeCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\Analyzer\ClassyAnalyzerTest::provideIsClassyInvocationCases',
|
|
|
+ 'PhpCsFixer\Tests\Tokenizer\Transformer\ReturnRefTransformerTest::provideProcessCases',
|
|
|
+ ];
|
|
|
+ if (\in_array($testClassName.'::'.$dataProviderName, $exceptions, true)) {
|
|
|
+ $this->addToAssertionCount(1);
|
|
|
|
|
|
- $exceptions = [ // should only shrink
|
|
|
- // because of Serialization
|
|
|
- 'PhpCsFixer\Tests\AutoReview\CommandTest::provideCommandHasNameConstCases',
|
|
|
- 'PhpCsFixer\Tests\AutoReview\DocumentationTest::provideFixerDocumentationFileIsUpToDateCases',
|
|
|
- 'PhpCsFixer\Tests\AutoReview\FixerFactoryTest::providePriorityIntegrationTestFilesAreListedInPriorityGraphCases',
|
|
|
- 'PhpCsFixer\Tests\AutoReview\ProjectCodeTest::provideDataProviderMethodCases',
|
|
|
- 'PhpCsFixer\Tests\Console\Command\DescribeCommandTest::provideExecuteOutputCases',
|
|
|
- 'PhpCsFixer\Tests\Console\Command\HelpCommandTest::provideGetDisplayableAllowedValuesCases',
|
|
|
- 'PhpCsFixer\Tests\Documentation\FixerDocumentGeneratorTest::provideGenerateRuleSetsDocumentationCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\EncodingFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\UtilsTest::provideStableSortCases',
|
|
|
- // because of more than one duplicate
|
|
|
- 'PhpCsFixer\Tests\Console\Command\SelfUpdateCommandTest::provideExecuteCases',
|
|
|
- 'PhpCsFixer\Tests\Console\Output\Progress\DotsOutputTest::provideDotsProgressOutputCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ArrayNotation\TrimArraySpacesFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFixClassyBracesCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\BracesPositionFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\CurlyBracesPositionFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ClassNotation\FinalClassFixerTest::provideFix80Cases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\PsrAutoloadingFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\CastNotation\LowercaseCastFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ClassNotation\FinalClassFixerTest::provideFix82Cases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUnneededControlParenthesesFixerTest::provideFixAllCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUselessElseFixerTest::provideFixIfElseIfElseCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoUselessElseFixerTest::provideFixIfElseCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\YodaStyleFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\YodaStyleFixerTest::providePHP71Cases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixerTest::provideFixWithColonCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAroundParenthesesOnlyCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\LanguageConstruct\SingleSpaceAfterConstructFixerTest::provideFixWithUseCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\LanguageConstruct\SingleSpaceAroundConstructFixerTest::provideFixWithUseCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\PhpUnit\PhpUnitStrictFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Phpdoc\PhpdocInlineTagNormalizerFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\Analyzer\AlternativeSyntaxAnalyzerTest::provideItThrowsOnInvalidAlternativeSyntaxBlockStartIndexCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\Analyzer\FunctionsAnalyzerTest::provideIsGlobalFunctionCallCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\TokenTest::provideIsMagicConstantCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\TokensAnalyzerTest::provideIsBinaryOperatorCases',
|
|
|
- // because of one duplicate
|
|
|
- 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideGetTypesCases',
|
|
|
- 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideGetConstTypesCases',
|
|
|
- 'PhpCsFixer\Tests\DocBlock\TypeExpressionTest::provideParseInvalidExceptionCases',
|
|
|
- 'PhpCsFixer\Tests\FixerNameValidatorTest::provideIsValidCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ArrayNotation\ArraySyntaxFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFixMultiLineStructuresCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Basic\BracesFixerTest::provideFunctionImportCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Comment\NoEmptyCommentFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ConstantNotation\NativeConstantInvocationFixerTest::provideFixWithDefaultConfigurationCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixWithDifferentCommentTextCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\ControlStructure\NoBreakCommentFixerTest::provideFixWithDifferentLineEndingCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAllCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\DoctrineAnnotation\DoctrineAnnotationSpacesFixerTest::provideFixAroundCommasOnlyCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\FunctionNotation\PhpdocToParamTypeFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Import\OrderedImportsFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Operator\StandardizeIncrementFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\PhpUnit\PhpUnitTargetVersionTest::provideFulfillsCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Phpdoc\PhpdocTypesOrderFixerTest::provideFixWithNullFirstCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\StringNotation\SingleQuoteFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Whitespace\MethodChainingIndentationFixerTest::provideFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Whitespace\SpacesInsideParenthesesFixerTest::provideDefaultFixCases',
|
|
|
- 'PhpCsFixer\Tests\Fixer\Whitespace\SpacesInsideParenthesesFixerTest::provideSpacesFixCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\Analyzer\AttributeAnalyzerTest::provideIsAttributeCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\Analyzer\ClassyAnalyzerTest::provideIsClassyInvocationCases',
|
|
|
- 'PhpCsFixer\Tests\Tokenizer\Transformer\ReturnRefTransformerTest::provideProcessCases',
|
|
|
- ];
|
|
|
- if (\in_array($className.'::'.$method->getName(), $exceptions, true)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- $alreadyFoundCases = [];
|
|
|
- foreach ($method->invoke($method->getDeclaringClass()->newInstanceWithoutConstructor()) as $candidateKey => $candidateData) {
|
|
|
- $candidateData = serialize($candidateData);
|
|
|
- $foundInDuplicates = false;
|
|
|
- foreach ($alreadyFoundCases as $caseKey => $caseData) {
|
|
|
- if ($candidateData === $caseData) {
|
|
|
- $duplicates[] = \sprintf(
|
|
|
- 'Duplicate in %s::%s: %s and %s.'.PHP_EOL,
|
|
|
- $className,
|
|
|
- $method->getName(),
|
|
|
- \is_int($caseKey) ? '#'.$caseKey : '"'.$caseKey.'"',
|
|
|
- \is_int($candidateKey) ? '#'.$candidateKey : '"'.$candidateKey.'"',
|
|
|
- );
|
|
|
- $foundInDuplicates = true;
|
|
|
- }
|
|
|
- }
|
|
|
- if (!$foundInDuplicates) {
|
|
|
- $alreadyFoundCases[$candidateKey] = $candidateData;
|
|
|
+ $dataProvider = new \ReflectionMethod($testClassName, $dataProviderName);
|
|
|
+
|
|
|
+ $duplicates = [];
|
|
|
+ $alreadyFoundCases = [];
|
|
|
+ foreach ($dataProvider->invoke($dataProvider->getDeclaringClass()->newInstanceWithoutConstructor()) as $candidateKey => $candidateData) {
|
|
|
+ $candidateData = serialize($candidateData);
|
|
|
+ $foundInDuplicates = false;
|
|
|
+ foreach ($alreadyFoundCases as $caseKey => $caseData) {
|
|
|
+ if ($candidateData === $caseData) {
|
|
|
+ $duplicates[] = \sprintf(
|
|
|
+ 'Duplicate in %s::%s: %s and %s.'.PHP_EOL,
|
|
|
+ $testClassName,
|
|
|
+ $dataProviderName,
|
|
|
+ \is_int($caseKey) ? '#'.$caseKey : '"'.$caseKey.'"',
|
|
|
+ \is_int($candidateKey) ? '#'.$candidateKey : '"'.$candidateKey.'"',
|
|
|
+ );
|
|
|
+ $foundInDuplicates = true;
|
|
|
}
|
|
|
}
|
|
|
+ if (!$foundInDuplicates) {
|
|
|
+ $alreadyFoundCases[$candidateKey] = $candidateData;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
self::assertSame([], $duplicates);
|
|
|
}
|
|
|
|