diff --git a/src/Framework/Attributes/CoversMethod.php b/src/Framework/Attributes/CoversMethod.php new file mode 100644 index 00000000000..dd2d6410225 --- /dev/null +++ b/src/Framework/Attributes/CoversMethod.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Attributes; + +use Attribute; + +/** + * @psalm-immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] +final readonly class CoversMethod +{ + /** + * @psalm-var class-string + */ + private string $className; + + /** + * @psalm-var non-empty-string + */ + private string $methodName; + + /** + * @psalm-param class-string $className + * @psalm-param non-empty-string $methodName + */ + public function __construct(string $className, $methodName) + { + $this->className = $className; + $this->methodName = $methodName; + } + + /** + * @psalm-return class-string + */ + public function className(): string + { + return $this->className; + } + + /** + * @psalm-return non-empty-string + */ + public function methodName(): string + { + return $this->methodName; + } +} diff --git a/src/Metadata/CoversMethod.php b/src/Metadata/CoversMethod.php new file mode 100644 index 00000000000..c78ed8c8e5a --- /dev/null +++ b/src/Metadata/CoversMethod.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Metadata; + +/** + * @psalm-immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +final readonly class CoversMethod extends Metadata +{ + /** + * @psalm-var class-string + */ + private string $className; + + /** + * @psalm-var non-empty-string + */ + private string $methodName; + + /** + * @psalm-param 0|1 $level + * @psalm-param class-string $className + * @psalm-param non-empty-string $methodName + */ + protected function __construct(int $level, string $className, string $methodName) + { + parent::__construct($level); + + $this->className = $className; + $this->methodName = $methodName; + } + + /** + * @psalm-assert-if-true CoversMethod $this + */ + public function isCoversMethod(): bool + { + return true; + } + + /** + * @psalm-return class-string + */ + public function className(): string + { + return $this->className; + } + + /** + * @psalm-return non-empty-string + */ + public function methodName(): string + { + return $this->methodName; + } + + /** + * @psalm-return non-empty-string + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function asStringForCodeUnitMapper(): string + { + return $this->className . '::' . $this->methodName; + } +} diff --git a/src/Metadata/Metadata.php b/src/Metadata/Metadata.php index 471378d5382..ca9151f64aa 100644 --- a/src/Metadata/Metadata.php +++ b/src/Metadata/Metadata.php @@ -74,6 +74,15 @@ public static function coversClass(string $className): CoversClass return new CoversClass(self::CLASS_LEVEL, $className); } + /** + * @psalm-param class-string $className + * @psalm-param non-empty-string $methodName + */ + public static function coversMethod(string $className, string $methodName): CoversMethod + { + return new CoversMethod(self::CLASS_LEVEL, $className, $methodName); + } + /** * @psalm-param non-empty-string $functionName */ @@ -560,6 +569,14 @@ public function isCoversFunction(): bool return false; } + /** + * @psalm-assert-if-true CoversMethod $this + */ + public function isCoversMethod(): bool + { + return false; + } + /** * @psalm-assert-if-true CoversNothing $this */ diff --git a/src/Metadata/MetadataCollection.php b/src/Metadata/MetadataCollection.php index feea38cef93..276b023f17e 100644 --- a/src/Metadata/MetadataCollection.php +++ b/src/Metadata/MetadataCollection.php @@ -200,6 +200,16 @@ public function isCoversFunction(): self ); } + public function isCoversMethod(): self + { + return new self( + ...array_filter( + $this->metadata, + static fn (Metadata $metadata): bool => $metadata->isCoversMethod(), + ), + ); + } + public function isExcludeGlobalVariableFromBackup(): self { return new self( diff --git a/src/Metadata/Parser/AttributeParser.php b/src/Metadata/Parser/AttributeParser.php index 3ead71f213c..3f90f72bbb1 100644 --- a/src/Metadata/Parser/AttributeParser.php +++ b/src/Metadata/Parser/AttributeParser.php @@ -25,6 +25,7 @@ use PHPUnit\Framework\Attributes\BeforeClass; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversFunction; +use PHPUnit\Framework\Attributes\CoversMethod; use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\DataProviderExternal; @@ -123,6 +124,16 @@ public function forClass(string $className): MetadataCollection break; + case CoversMethod::class: + assert($attributeInstance instanceof CoversMethod); + + $result[] = Metadata::coversMethod( + $attributeInstance->className(), + $attributeInstance->methodName(), + ); + + break; + case CoversNothing::class: $result[] = Metadata::coversNothingOnClass(); diff --git a/tests/_files/Metadata/Attribute/tests/CoversTest.php b/tests/_files/Metadata/Attribute/tests/CoversTest.php index 6213267ec96..963d58bf2cf 100644 --- a/tests/_files/Metadata/Attribute/tests/CoversTest.php +++ b/tests/_files/Metadata/Attribute/tests/CoversTest.php @@ -11,10 +11,12 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversFunction; +use PHPUnit\Framework\Attributes\CoversMethod; use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; #[CoversClass(Example::class)] +#[CoversMethod(Example::class, 'method')] #[CoversFunction('f')] #[CoversNothing] final class CoversTest extends TestCase diff --git a/tests/unit/Metadata/MetadataCollectionTest.php b/tests/unit/Metadata/MetadataCollectionTest.php index b0b715b55b3..fc3aef9cdbe 100644 --- a/tests/unit/Metadata/MetadataCollectionTest.php +++ b/tests/unit/Metadata/MetadataCollectionTest.php @@ -29,6 +29,7 @@ #[UsesClass(CoversClass::class)] #[UsesClass(CoversDefaultClass::class)] #[UsesClass(CoversFunction::class)] +#[UsesClass(CoversMethod::class)] #[UsesClass(CoversNothing::class)] #[UsesClass(DataProvider::class)] #[UsesClass(DependsOnClass::class)] @@ -210,6 +211,14 @@ public function test_Can_be_filtered_for_CoversFunction(): void $this->assertTrue($collection->asArray()[0]->isCoversFunction()); } + public function test_Can_be_filtered_for_CoversMethod(): void + { + $collection = $this->collectionWithOneOfEach()->isCoversMethod(); + + $this->assertCount(1, $collection); + $this->assertTrue($collection->asArray()[0]->isCoversMethod()); + } + public function test_Can_be_filtered_for_CoversNothing(): void { $collection = $this->collectionWithOneOfEach()->isCoversNothing(); @@ -489,6 +498,7 @@ private function collectionWithOneOfEach(): MetadataCollection Metadata::coversClass(''), Metadata::coversDefaultClass(''), Metadata::coversFunction(''), + Metadata::coversMethod('', ''), Metadata::coversNothingOnClass(), Metadata::dataProvider('', ''), Metadata::dependsOnClass('', false, false), diff --git a/tests/unit/Metadata/MetadataTest.php b/tests/unit/Metadata/MetadataTest.php index cfcf22906ac..5a58e0cd00b 100644 --- a/tests/unit/Metadata/MetadataTest.php +++ b/tests/unit/Metadata/MetadataTest.php @@ -26,6 +26,7 @@ #[CoversClass(\PHPUnit\Metadata\CoversClass::class)] #[CoversClass(CoversDefaultClass::class)] #[CoversClass(CoversFunction::class)] +#[CoversClass(CoversMethod::class)] #[CoversClass(CoversNothing::class)] #[CoversClass(DataProvider::class)] #[CoversClass(DependsOnClass::class)] @@ -77,6 +78,7 @@ public function testCanBeAfter(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -125,6 +127,7 @@ public function testCanBeAfterClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -173,6 +176,7 @@ public function testCanBeBackupGlobalsOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -225,6 +229,7 @@ public function testCanBeBackupGlobalsOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -277,6 +282,7 @@ public function testCanBeBackupStaticPropertiesOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -329,6 +335,7 @@ public function testCanBeBackupStaticPropertiesOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -381,6 +388,7 @@ public function testCanBeBeforeClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -429,6 +437,7 @@ public function testCanBeBefore(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -477,6 +486,7 @@ public function testCanBeCoversOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -529,6 +539,7 @@ public function testCanBeCoversOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -581,6 +592,7 @@ public function testCanBeCoversClass(): void $this->assertTrue($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -632,6 +644,7 @@ public function testCanBeCoversDefaultClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertTrue($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -719,6 +732,59 @@ public function testCanBeCoversFunction(): void $this->assertSame('::f', $metadata->asStringForCodeUnitMapper()); } + public function testCanBeCoversMethod(): void + { + $metadata = Metadata::coversMethod(self::class, 'testCanBeCoversMethod'); + + $this->assertFalse($metadata->isAfter()); + $this->assertFalse($metadata->isAfterClass()); + $this->assertFalse($metadata->isBackupGlobals()); + $this->assertFalse($metadata->isBackupStaticProperties()); + $this->assertFalse($metadata->isBeforeClass()); + $this->assertFalse($metadata->isBefore()); + $this->assertFalse($metadata->isCovers()); + $this->assertFalse($metadata->isCoversClass()); + $this->assertFalse($metadata->isCoversDefaultClass()); + $this->assertFalse($metadata->isCoversFunction()); + $this->assertTrue($metadata->isCoversMethod()); + $this->assertFalse($metadata->isCoversNothing()); + $this->assertFalse($metadata->isDataProvider()); + $this->assertFalse($metadata->isDependsOnClass()); + $this->assertFalse($metadata->isDependsOnMethod()); + $this->assertFalse($metadata->isDisableReturnValueGenerationForTestDoubles()); + $this->assertFalse($metadata->isDoesNotPerformAssertions()); + $this->assertFalse($metadata->isExcludeGlobalVariableFromBackup()); + $this->assertFalse($metadata->isExcludeStaticPropertyFromBackup()); + $this->assertFalse($metadata->isGroup()); + $this->assertFalse($metadata->isIgnoreDeprecations()); + $this->assertFalse($metadata->isRunClassInSeparateProcess()); + $this->assertFalse($metadata->isRunInSeparateProcess()); + $this->assertFalse($metadata->isRunTestsInSeparateProcesses()); + $this->assertFalse($metadata->isTest()); + $this->assertFalse($metadata->isPreCondition()); + $this->assertFalse($metadata->isPostCondition()); + $this->assertFalse($metadata->isPreserveGlobalState()); + $this->assertFalse($metadata->isRequiresMethod()); + $this->assertFalse($metadata->isRequiresFunction()); + $this->assertFalse($metadata->isRequiresOperatingSystem()); + $this->assertFalse($metadata->isRequiresOperatingSystemFamily()); + $this->assertFalse($metadata->isRequiresPhp()); + $this->assertFalse($metadata->isRequiresPhpExtension()); + $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresSetting()); + $this->assertFalse($metadata->isTestDox()); + $this->assertFalse($metadata->isTestWith()); + $this->assertFalse($metadata->isUses()); + $this->assertFalse($metadata->isUsesClass()); + $this->assertFalse($metadata->isUsesDefaultClass()); + $this->assertFalse($metadata->isUsesFunction()); + $this->assertFalse($metadata->isWithoutErrorHandler()); + + $this->assertSame(self::class, $metadata->className()); + $this->assertSame('testCanBeCoversMethod', $metadata->methodName()); + $this->assertSame(self::class . '::testCanBeCoversMethod', $metadata->asStringForCodeUnitMapper()); + } + public function testCanBeCoversNothingOnMethod(): void { $metadata = Metadata::coversNothingOnMethod(); @@ -733,6 +799,7 @@ public function testCanBeCoversNothingOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertTrue($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -784,6 +851,7 @@ public function testCanBeCoversNothingOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertTrue($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -835,6 +903,7 @@ public function testCanBeDataProvider(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertTrue($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -886,6 +955,7 @@ public function testCanBeDependsOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertTrue($metadata->isDependsOnClass()); @@ -938,6 +1008,7 @@ public function testCanBeDependsOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -991,6 +1062,7 @@ public function testCanBeDisableReturnValueGenerationForTestDoubles(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1039,6 +1111,7 @@ public function testCanBeDoesNotPerformAssertionsOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1090,6 +1163,7 @@ public function testCanBeDoesNotPerformAssertionsOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1141,6 +1215,7 @@ public function testCanBeExcludeGlobalVariableFromBackupOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1193,6 +1268,7 @@ public function testCanBeExcludeGlobalVariableFromBackupOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1245,6 +1321,7 @@ public function testCanBeExcludeStaticPropertyFromBackupOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1298,6 +1375,7 @@ public function testCanBeExcludeStaticPropertyFromBackupOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1351,6 +1429,7 @@ public function testCanBeGroupOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1403,6 +1482,7 @@ public function testCanBeIgnoreDeprecationsOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1451,6 +1531,7 @@ public function testCanBeIgnoreDeprecationsOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1499,6 +1580,7 @@ public function testCanBeGroupOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1551,6 +1633,7 @@ public function testCanBeRunTestsInSeparateProcesses(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1600,6 +1683,7 @@ public function testCanBeRunClassInSeparateProcess(): void $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); $this->assertFalse($metadata->isDependsOnMethod()); @@ -1648,6 +1732,7 @@ public function testCanBeRunInSeparateProcess(): void $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); $this->assertFalse($metadata->isDependsOnMethod()); @@ -1696,6 +1781,7 @@ public function testCanBeTest(): void $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); $this->assertFalse($metadata->isDependsOnMethod()); @@ -1743,6 +1829,7 @@ public function testCanBePreCondition(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1791,6 +1878,7 @@ public function testCanBePostCondition(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1838,6 +1926,7 @@ public function testCanBePreserveGlobalStateOnClass(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1889,6 +1978,7 @@ public function testCanBePreserveGlobalStateOnMethod(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1941,6 +2031,7 @@ public function testCanBeRequiresMethodOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -1994,6 +2085,7 @@ public function testCanBeRequiresMethodOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2047,6 +2139,7 @@ public function testCanBeRequiresFunctionOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2099,6 +2192,7 @@ public function testCanBeRequiresFunctionOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2151,6 +2245,7 @@ public function testCanBeRequiresOperatingSystemOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2203,6 +2298,7 @@ public function testCanBeRequiresOperatingSystemOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2255,6 +2351,7 @@ public function testCanBeRequiresOperatingSystemFamilyOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2307,6 +2404,7 @@ public function testCanBeRequiresOperatingSystemFamilyOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2364,6 +2462,7 @@ public function testCanBeRequiresPhpOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2422,6 +2521,7 @@ public function testCanBeRequiresPhpOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2475,6 +2575,7 @@ public function testCanBeRequiresPhpExtensionOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2538,6 +2639,7 @@ public function testCanBeRequiresPhpExtensionWithVersionOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2593,6 +2695,7 @@ public function testCanBeRequiresPhpExtensionOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2656,6 +2759,7 @@ public function testCanBeRequiresPhpExtensionWithVersionOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2716,6 +2820,7 @@ public function testCanBeRequiresPhpunitOnClass(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2774,6 +2879,7 @@ public function testCanBeRequiresPhpunitOnMethod(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2827,6 +2933,7 @@ public function testCanBeRequiresSettingOnClass(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2881,6 +2988,7 @@ public function testCanBeRequiresSettingOnMethod(): void $this->assertFalse($metadata->isCovers()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2935,6 +3043,7 @@ public function testCanBeTestDoxOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -2988,6 +3097,7 @@ public function testCanBeTestDoxOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3041,6 +3151,7 @@ public function testCanBeTestWith(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3091,6 +3202,7 @@ public function testCanBeUsesOnClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3144,6 +3256,7 @@ public function testCanBeUsesOnMethod(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3197,6 +3310,7 @@ public function testCanBeUsesClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3248,6 +3362,7 @@ public function testCanBeUsesDefaultClass(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3298,6 +3413,7 @@ public function testCanBeUsesFunction(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); @@ -3349,6 +3465,7 @@ public function testCanBeWithoutErrorHandler(): void $this->assertFalse($metadata->isCoversClass()); $this->assertFalse($metadata->isCoversDefaultClass()); $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($metadata->isCoversMethod()); $this->assertFalse($metadata->isCoversNothing()); $this->assertFalse($metadata->isDataProvider()); $this->assertFalse($metadata->isDependsOnClass()); diff --git a/tests/unit/Metadata/Parser/AttributeParserTestCase.php b/tests/unit/Metadata/Parser/AttributeParserTestCase.php index 7c8ba60a846..a63cdd4c142 100644 --- a/tests/unit/Metadata/Parser/AttributeParserTestCase.php +++ b/tests/unit/Metadata/Parser/AttributeParserTestCase.php @@ -90,6 +90,17 @@ public function test_parses_CoversFunction_attribute_on_class(): void $this->assertSame('f', $metadata->asArray()[0]->functionName()); } + #[TestDox('Parses #[CoversMethod] attribute on class')] + public function test_parses_CoversMethod_attribute_on_class(): void + { + $metadata = $this->parser()->forClass(CoversTest::class)->isCoversMethod(); + + $this->assertCount(1, $metadata); + $this->assertTrue($metadata->asArray()[0]->isCoversMethod()); + $this->assertSame(Example::class, $metadata->asArray()[0]->className()); + $this->assertSame('method', $metadata->asArray()[0]->methodName()); + } + #[TestDox('Parses #[CoversNothing] attribute on class')] public function test_parses_CoversNothing_attribute_on_class(): void {