From 7049cba6951342da7b27e116fe103166d50ebc9b Mon Sep 17 00:00:00 2001 From: Nicolas PHILIPPE Date: Mon, 19 Aug 2024 17:27:25 +0200 Subject: [PATCH] #[RequiresPhpunitExtension] attribute --- .../Attributes/RequiresPhpunitExtension.php | 43 ++++ src/Metadata/Api/Requirements.php | 20 ++ src/Metadata/Metadata.php | 25 +++ src/Metadata/MetadataCollection.php | 10 + src/Metadata/Parser/AttributeParser.php | 19 ++ src/Metadata/RequiresPhpunitExtension.php | 48 +++++ .../tests/RequiresPhpunitExtensionTest.php | 22 ++ tests/_files/RequirementsTest.php | 6 + tests/unit/Metadata/Api/RequirementsTest.php | 3 + .../unit/Metadata/MetadataCollectionTest.php | 11 + tests/unit/Metadata/MetadataTest.php | 190 ++++++++++++++++++ .../Metadata/Parser/AttributeParserTest.php | 2 + .../Parser/AttributeParserTestCase.php | 34 ++++ 13 files changed, 433 insertions(+) create mode 100644 src/Framework/Attributes/RequiresPhpunitExtension.php create mode 100644 src/Metadata/RequiresPhpunitExtension.php create mode 100644 tests/_files/Metadata/Attribute/tests/RequiresPhpunitExtensionTest.php diff --git a/src/Framework/Attributes/RequiresPhpunitExtension.php b/src/Framework/Attributes/RequiresPhpunitExtension.php new file mode 100644 index 00000000000..3b248f5800b --- /dev/null +++ b/src/Framework/Attributes/RequiresPhpunitExtension.php @@ -0,0 +1,43 @@ + + * + * 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; +use PHPUnit\Runner\Extension\Extension; + +/** + * @immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)] +final readonly class RequiresPhpunitExtension +{ + /** + * @var list> + */ + private array $extensionClasses; + + /** + * @param class-string $extensionClasses + */ + public function __construct(string ...$extensionClasses) + { + $this->extensionClasses = $extensionClasses; + } + + /** + * @return list> + */ + public function extensionClasses(): array + { + return $this->extensionClasses; + } +} diff --git a/src/Metadata/Api/Requirements.php b/src/Metadata/Api/Requirements.php index cd57ab0d943..14539434d0a 100644 --- a/src/Metadata/Api/Requirements.php +++ b/src/Metadata/Api/Requirements.php @@ -13,9 +13,12 @@ use const PHP_OS_FAMILY; use const PHP_VERSION; use function addcslashes; +use function array_column; +use function array_diff; use function assert; use function extension_loaded; use function function_exists; +use function implode; use function ini_get; use function method_exists; use function phpversion; @@ -29,8 +32,10 @@ use PHPUnit\Metadata\RequiresPhp; use PHPUnit\Metadata\RequiresPhpExtension; use PHPUnit\Metadata\RequiresPhpunit; +use PHPUnit\Metadata\RequiresPhpunitExtension; use PHPUnit\Metadata\RequiresSetting; use PHPUnit\Runner\Version; +use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit @@ -86,6 +91,21 @@ public function requirementsNotSatisfiedFor(string $className, string $methodNam } } + if ($metadata->isRequiresPhpunitExtension()) { + assert($metadata instanceof RequiresPhpunitExtension); + + $configuration = ConfigurationRegistry::get(); + + $extensionBootstrappers = array_column($configuration->extensionBootstrappers(), 'className'); + + if ($configuration->noExtensions() || $missingExtensions = array_diff($metadata->extensionClasses(), $extensionBootstrappers)) { + $notSatisfied[] = sprintf( + 'PHPUnit extension(s) "%s" required.', + implode('", "', $missingExtensions ?? $metadata->extensionClasses()), + ); + } + } + if ($metadata->isRequiresOperatingSystemFamily()) { assert($metadata instanceof RequiresOperatingSystemFamily); diff --git a/src/Metadata/Metadata.php b/src/Metadata/Metadata.php index 6f4e4be55fd..6fd5137da92 100644 --- a/src/Metadata/Metadata.php +++ b/src/Metadata/Metadata.php @@ -10,6 +10,7 @@ namespace PHPUnit\Metadata; use PHPUnit\Metadata\Version\Requirement; +use PHPUnit\Runner\Extension\Extension; /** * @immutable @@ -390,6 +391,22 @@ public static function requiresPhpunitOnMethod(Requirement $versionRequirement): return new RequiresPhpunit(self::METHOD_LEVEL, $versionRequirement); } + /** + * @param class-string $extensionClasses + */ + public static function requiresPhpunitExtensionOnClass(string ...$extensionClasses): RequiresPhpunitExtension + { + return new RequiresPhpunitExtension(self::CLASS_LEVEL, ...$extensionClasses); + } + + /** + * @param class-string $extensionClasses + */ + public static function requiresPhpunitExtensionOnMethod(string ...$extensionClasses): RequiresPhpunitExtension + { + return new RequiresPhpunitExtension(self::METHOD_LEVEL, ...$extensionClasses); + } + /** * @param non-empty-string $setting * @param non-empty-string $value @@ -831,6 +848,14 @@ public function isRequiresPhpunit(): bool return false; } + /** + * @phpstan-assert-if-true RequiresPhpunitExtension $this + */ + public function isRequiresPhpunitExtension(): bool + { + return false; + } + /** * @phpstan-assert-if-true RequiresSetting $this */ diff --git a/src/Metadata/MetadataCollection.php b/src/Metadata/MetadataCollection.php index e5212667c4e..44094b8a6ea 100644 --- a/src/Metadata/MetadataCollection.php +++ b/src/Metadata/MetadataCollection.php @@ -483,6 +483,16 @@ public function isRequiresPhpunit(): self ); } + public function isRequiresPhpunitExtension(): self + { + return new self( + ...array_filter( + $this->metadata, + static fn (Metadata $metadata): bool => $metadata->isRequiresPhpunitExtension(), + ), + ); + } + public function isRequiresSetting(): self { return new self( diff --git a/src/Metadata/Parser/AttributeParser.php b/src/Metadata/Parser/AttributeParser.php index 223321c9baf..3c63e3ee63d 100644 --- a/src/Metadata/Parser/AttributeParser.php +++ b/src/Metadata/Parser/AttributeParser.php @@ -58,6 +58,7 @@ use PHPUnit\Framework\Attributes\RequiresPhp; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use PHPUnit\Framework\Attributes\RequiresPhpunit; +use PHPUnit\Framework\Attributes\RequiresPhpunitExtension; use PHPUnit\Framework\Attributes\RequiresSetting; use PHPUnit\Framework\Attributes\RunClassInSeparateProcess; use PHPUnit\Framework\Attributes\RunInSeparateProcess; @@ -288,6 +289,15 @@ public function forClass(string $className): MetadataCollection break; + case RequiresPhpunitExtension::class: + assert($attributeInstance instanceof RequiresPhpunitExtension); + + $result[] = Metadata::requiresPhpunitExtensionOnClass( + ...$attributeInstance->extensionClasses(), + ); + + break; + case RequiresSetting::class: assert($attributeInstance instanceof RequiresSetting); @@ -641,6 +651,15 @@ public function forMethod(string $className, string $methodName): MetadataCollec break; + case RequiresPhpunitExtension::class: + assert($attributeInstance instanceof RequiresPhpunitExtension); + + $result[] = Metadata::requiresPhpunitExtensionOnMethod( + ...$attributeInstance->extensionClasses(), + ); + + break; + case RequiresSetting::class: assert($attributeInstance instanceof RequiresSetting); diff --git a/src/Metadata/RequiresPhpunitExtension.php b/src/Metadata/RequiresPhpunitExtension.php new file mode 100644 index 00000000000..b87061d518e --- /dev/null +++ b/src/Metadata/RequiresPhpunitExtension.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Metadata; + +use PHPUnit\Runner\Extension\Extension; + +/** + * @immutable + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +final readonly class RequiresPhpunitExtension extends Metadata +{ + /** + * @var list> + */ + private array $extensionClasses; + + /** + * @param class-string $extensionClasses + */ + public function __construct(int $level, string ...$extensionClasses) + { + parent::__construct($level); + + $this->extensionClasses = $extensionClasses; + } + + public function isRequiresPhpunitExtension(): true + { + return true; + } + + /** + * @return list> + */ + public function extensionClasses(): array + { + return $this->extensionClasses; + } +} diff --git a/tests/_files/Metadata/Attribute/tests/RequiresPhpunitExtensionTest.php b/tests/_files/Metadata/Attribute/tests/RequiresPhpunitExtensionTest.php new file mode 100644 index 00000000000..7ce228afd81 --- /dev/null +++ b/tests/_files/Metadata/Attribute/tests/RequiresPhpunitExtensionTest.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture\Metadata\Attribute; + +use PHPUnit\Framework\Attributes\RequiresPhpunitExtension; +use PHPUnit\Framework\TestCase; + +#[RequiresPhpunitExtension(SomeClass::class)] +final class RequiresPhpunitExtensionTest extends TestCase +{ + #[RequiresPhpunitExtension(SomeClass::class, SomeOtherClass::class)] + public function testOne(): void + { + } +} diff --git a/tests/_files/RequirementsTest.php b/tests/_files/RequirementsTest.php index 6a67c1bbb53..0dd60f636cf 100644 --- a/tests/_files/RequirementsTest.php +++ b/tests/_files/RequirementsTest.php @@ -16,6 +16,7 @@ use PHPUnit\Framework\Attributes\RequiresPhp; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use PHPUnit\Framework\Attributes\RequiresPhpunit; +use PHPUnit\Framework\Attributes\RequiresPhpunitExtension; use PHPUnit\Framework\Attributes\RequiresSetting; use PHPUnit\Framework\Attributes\TestDox; use PHPUnit\Framework\Attributes\Ticket; @@ -363,4 +364,9 @@ public function testVersionConstraintRegexpIgnoresWhitespace(): void public function testSettingDisplayErrorsOn(): void { } + + #[RequiresPhpunitExtension(SomeClass::class, SomeOtherClass::class)] + public function testPHPUnitExtensionRequired(): void + { + } } diff --git a/tests/unit/Metadata/Api/RequirementsTest.php b/tests/unit/Metadata/Api/RequirementsTest.php index 5a8825d6f70..b869de505af 100644 --- a/tests/unit/Metadata/Api/RequirementsTest.php +++ b/tests/unit/Metadata/Api/RequirementsTest.php @@ -123,6 +123,9 @@ public static function missingRequirementsProvider(): array 'PHP ^1.0 is required.', 'PHPUnit ^2.0 is required.', ]], + ['testPHPUnitExtensionRequired', [ + 'PHPUnit extension(s) "PHPUnit\TestFixture\SomeClass", "PHPUnit\TestFixture\SomeOtherClass" required.', + ]], ]; } diff --git a/tests/unit/Metadata/MetadataCollectionTest.php b/tests/unit/Metadata/MetadataCollectionTest.php index 7d6c6cc57d1..2f367ab73fb 100644 --- a/tests/unit/Metadata/MetadataCollectionTest.php +++ b/tests/unit/Metadata/MetadataCollectionTest.php @@ -16,6 +16,7 @@ use PHPUnit\Framework\TestCase; use PHPUnit\Metadata\Version\ComparisonRequirement; use PHPUnit\Util\VersionComparisonOperator; +use stdClass; #[CoversClass(MetadataCollection::class)] #[CoversClass(MetadataCollectionIterator::class)] @@ -48,6 +49,7 @@ #[UsesClass(RequiresPhp::class)] #[UsesClass(RequiresPhpExtension::class)] #[UsesClass(RequiresPhpunit::class)] +#[UsesClass(RequiresPhpunitExtension::class)] #[UsesClass(RequiresSetting::class)] #[UsesClass(RunClassInSeparateProcess::class)] #[UsesClass(RunInSeparateProcess::class)] @@ -404,6 +406,14 @@ public function test_Can_be_filtered_for_RequiresPhpunit(): void $this->assertTrue($collection->asArray()[0]->isRequiresPhpunit()); } + public function test_Can_be_filtered_for_RequiresPhpunitExtension(): void + { + $collection = $this->collectionWithOneOfEach()->isRequiresPhpunitExtension(); + + $this->assertCount(1, $collection); + $this->assertTrue($collection->asArray()[0]->isRequiresPhpunitExtension()); + } + public function test_Can_be_filtered_for_RequiresSetting(): void { $collection = $this->collectionWithOneOfEach()->isRequiresSetting(); @@ -563,6 +573,7 @@ private function collectionWithOneOfEach(): MetadataCollection new VersionComparisonOperator('>='), ), ), + Metadata::requiresPhpunitExtensionOnClass(stdClass::class), Metadata::requiresSettingOnClass('foo', 'bar'), Metadata::runClassInSeparateProcess(), Metadata::runInSeparateProcess(), diff --git a/tests/unit/Metadata/MetadataTest.php b/tests/unit/Metadata/MetadataTest.php index e8e3ea0ceaf..9e0a2159b30 100644 --- a/tests/unit/Metadata/MetadataTest.php +++ b/tests/unit/Metadata/MetadataTest.php @@ -52,6 +52,7 @@ #[CoversClass(RequiresPhp::class)] #[CoversClass(RequiresPhpExtension::class)] #[CoversClass(RequiresPhpunit::class)] +#[CoversClass(RequiresPhpunitExtension::class)] #[CoversClass(RequiresSetting::class)] #[CoversClass(RunClassInSeparateProcess::class)] #[CoversClass(RunInSeparateProcess::class)] @@ -110,6 +111,8 @@ public function testCanBeAfter(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -166,6 +169,7 @@ public function testCanBeAfterClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -222,6 +226,7 @@ public function testCanBeBackupGlobalsOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -279,6 +284,7 @@ public function testCanBeBackupGlobalsOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -336,6 +342,7 @@ public function testCanBeBackupStaticPropertiesOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -393,6 +400,7 @@ public function testCanBeBackupStaticPropertiesOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -450,6 +458,7 @@ public function testCanBeBeforeClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -506,6 +515,7 @@ public function testCanBeBefore(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -562,6 +572,7 @@ public function testCanBeCoversOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -619,6 +630,7 @@ public function testCanBeCoversOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -676,6 +688,7 @@ public function testCanBeCoversClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -735,6 +748,7 @@ public function testCanBeCoversDefaultClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -793,6 +807,7 @@ public function testCanBeCoversTrait(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -851,6 +866,7 @@ public function testCanBeCoversFunction(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -910,6 +926,7 @@ public function testCanBeCoversMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -970,6 +987,7 @@ public function testCanBeCoversNothingOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1026,6 +1044,7 @@ public function testCanBeCoversNothingOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1082,6 +1101,7 @@ public function testCanBeDataProvider(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1141,6 +1161,7 @@ public function testCanBeDependsOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1201,6 +1222,7 @@ public function testCanBeDependsOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1262,6 +1284,7 @@ public function testCanBeDisableReturnValueGenerationForTestDoubles(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1318,6 +1341,7 @@ public function testCanBeDoesNotPerformAssertionsOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1374,6 +1398,7 @@ public function testCanBeDoesNotPerformAssertionsOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1430,6 +1455,7 @@ public function testCanBeExcludeGlobalVariableFromBackupOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1487,6 +1513,7 @@ public function testCanBeExcludeGlobalVariableFromBackupOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1544,6 +1571,7 @@ public function testCanBeExcludeStaticPropertyFromBackupOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1603,6 +1631,7 @@ public function testCanBeExcludeStaticPropertyFromBackupOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1662,6 +1691,7 @@ public function testCanBeGroupOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1720,6 +1750,7 @@ public function testCanBeIgnoreDeprecationsOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1776,6 +1807,7 @@ public function testCanBeIgnoreDeprecationsOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1832,6 +1864,7 @@ public function testCanBeIgnorePhpunitDeprecationsOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1888,6 +1921,7 @@ public function testCanBeIgnorePhpunitDeprecationsOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -1944,6 +1978,7 @@ public function testCanBeGroupOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2002,6 +2037,7 @@ public function testCanBeRunTestsInSeparateProcesses(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2058,6 +2094,7 @@ public function testCanBeRunClassInSeparateProcess(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2114,6 +2151,7 @@ public function testCanBeRunInSeparateProcess(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2170,6 +2208,7 @@ public function testCanBeTest(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2226,6 +2265,7 @@ public function testCanBePreCondition(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2282,6 +2322,7 @@ public function testCanBePostCondition(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2337,6 +2378,7 @@ public function testCanBePreserveGlobalStateOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2394,6 +2436,7 @@ public function testCanBePreserveGlobalStateOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2452,6 +2495,7 @@ public function testCanBeRequiresMethodOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2511,6 +2555,7 @@ public function testCanBeRequiresMethodOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2570,6 +2615,7 @@ public function testCanBeRequiresFunctionOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2628,6 +2674,7 @@ public function testCanBeRequiresFunctionOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2686,6 +2733,7 @@ public function testCanBeRequiresOperatingSystemOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2744,6 +2792,7 @@ public function testCanBeRequiresOperatingSystemOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2802,6 +2851,7 @@ public function testCanBeRequiresOperatingSystemFamilyOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2860,6 +2910,7 @@ public function testCanBeRequiresOperatingSystemFamilyOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2923,6 +2974,7 @@ public function testCanBeRequiresPhpOnClass(): void $this->assertTrue($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -2986,6 +3038,7 @@ public function testCanBeRequiresPhpOnMethod(): void $this->assertTrue($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3044,6 +3097,7 @@ public function testCanBeRequiresPhpExtensionOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertTrue($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3112,6 +3166,7 @@ public function testCanBeRequiresPhpExtensionWithVersionOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertTrue($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3172,6 +3227,7 @@ public function testCanBeRequiresPhpExtensionOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertTrue($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3240,6 +3296,7 @@ public function testCanBeRequiresPhpExtensionWithVersionOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertTrue($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3305,6 +3362,7 @@ public function testCanBeRequiresPhpunitOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertTrue($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3322,6 +3380,65 @@ public function testCanBeRequiresPhpunitOnClass(): void $this->assertFalse($metadata->isMethodLevel()); } + public function testCanBeRequiresPhpunitExtensionOnClass(): void + { + $metadata = Metadata::requiresPhpunitExtensionOnClass(SomeClass::class, SomeOtherClass::class); + + $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->isCoversClass()); + $this->assertFalse($metadata->isCovers()); + $this->assertFalse($metadata->isCoversDefaultClass()); + $this->assertFalse($metadata->isCoversTrait()); + $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($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->isIgnorePhpunitDeprecations()); + $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->assertTrue($metadata->isRequiresPhpunitExtension()); + $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->isUsesTrait()); + $this->assertFalse($metadata->isUsesFunction()); + $this->assertFalse($metadata->isUsesMethod()); + $this->assertFalse($metadata->isWithoutErrorHandler()); + + $this->assertSame([SomeClass::class, SomeOtherClass::class], $metadata->extensionClasses()); + + $this->assertTrue($metadata->isClassLevel()); + $this->assertFalse($metadata->isMethodLevel()); + } + public function testCanBeRequiresPhpunitOnMethod(): void { $metadata = Metadata::requiresPhpunitOnMethod( @@ -3368,6 +3485,7 @@ public function testCanBeRequiresPhpunitOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertTrue($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3385,6 +3503,65 @@ public function testCanBeRequiresPhpunitOnMethod(): void $this->assertFalse($metadata->isClassLevel()); } + public function testCanBeRequiresPhpunitExtensionOnMethod(): void + { + $metadata = Metadata::requiresPhpunitExtensionOnMethod(SomeClass::class, SomeOtherClass::class); + + $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->isCoversClass()); + $this->assertFalse($metadata->isCovers()); + $this->assertFalse($metadata->isCoversDefaultClass()); + $this->assertFalse($metadata->isCoversTrait()); + $this->assertFalse($metadata->isCoversFunction()); + $this->assertFalse($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->isIgnorePhpunitDeprecations()); + $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->assertTrue($metadata->isRequiresPhpunitExtension()); + $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->isUsesTrait()); + $this->assertFalse($metadata->isUsesFunction()); + $this->assertFalse($metadata->isUsesMethod()); + $this->assertFalse($metadata->isWithoutErrorHandler()); + + $this->assertSame([SomeClass::class, SomeOtherClass::class], $metadata->extensionClasses()); + + $this->assertTrue($metadata->isMethodLevel()); + $this->assertFalse($metadata->isClassLevel()); + } + public function testCanBeRequiresSettingOnClass(): void { $metadata = Metadata::requiresSettingOnClass('foo', 'bar'); @@ -3426,6 +3603,7 @@ public function testCanBeRequiresSettingOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertTrue($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3485,6 +3663,7 @@ public function testCanBeRequiresSettingOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertTrue($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3544,6 +3723,7 @@ public function testCanBeTestDoxOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertTrue($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3602,6 +3782,7 @@ public function testCanBeTestDoxOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertTrue($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3660,6 +3841,7 @@ public function testCanBeTestWith(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertTrue($metadata->isTestWith()); @@ -3720,6 +3902,7 @@ public function testCanBeUsesOnClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3778,6 +3961,7 @@ public function testCanBeUsesOnMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3836,6 +4020,7 @@ public function testCanBeUsesClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3895,6 +4080,7 @@ public function testCanBeUsesDefaultClass(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -3953,6 +4139,7 @@ public function testCanBeUsesTrait(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -4012,6 +4199,7 @@ public function testCanBeUsesFunction(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -4070,6 +4258,7 @@ public function testCanBeUsesMethod(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); @@ -4130,6 +4319,7 @@ public function testCanBeWithoutErrorHandler(): void $this->assertFalse($metadata->isRequiresPhp()); $this->assertFalse($metadata->isRequiresPhpExtension()); $this->assertFalse($metadata->isRequiresPhpunit()); + $this->assertFalse($metadata->isRequiresPhpunitExtension()); $this->assertFalse($metadata->isRequiresSetting()); $this->assertFalse($metadata->isTestDox()); $this->assertFalse($metadata->isTestWith()); diff --git a/tests/unit/Metadata/Parser/AttributeParserTest.php b/tests/unit/Metadata/Parser/AttributeParserTest.php index 7f730b590c8..8a4034ba179 100644 --- a/tests/unit/Metadata/Parser/AttributeParserTest.php +++ b/tests/unit/Metadata/Parser/AttributeParserTest.php @@ -47,6 +47,7 @@ use PHPUnit\Framework\Attributes\RequiresPhp; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use PHPUnit\Framework\Attributes\RequiresPhpunit; +use PHPUnit\Framework\Attributes\RequiresPhpunitExtension; use PHPUnit\Framework\Attributes\RequiresSetting; use PHPUnit\Framework\Attributes\RunClassInSeparateProcess; use PHPUnit\Framework\Attributes\RunInSeparateProcess; @@ -104,6 +105,7 @@ #[CoversClass(RequiresPhpExtension::class)] #[CoversClass(RequiresPhp::class)] #[CoversClass(RequiresPhpunit::class)] +#[CoversClass(RequiresPhpunitExtension::class)] #[CoversClass(RequiresSetting::class)] #[CoversClass(RunClassInSeparateProcess::class)] #[CoversClass(RunInSeparateProcess::class)] diff --git a/tests/unit/Metadata/Parser/AttributeParserTestCase.php b/tests/unit/Metadata/Parser/AttributeParserTestCase.php index 20f99e19a99..ba63250e939 100644 --- a/tests/unit/Metadata/Parser/AttributeParserTestCase.php +++ b/tests/unit/Metadata/Parser/AttributeParserTestCase.php @@ -17,6 +17,7 @@ use PHPUnit\Metadata\RequiresPhp; use PHPUnit\Metadata\RequiresPhpExtension; use PHPUnit\Metadata\RequiresPhpunit; +use PHPUnit\Metadata\RequiresPhpunitExtension; use PHPUnit\Metadata\RequiresSetting; use PHPUnit\Metadata\Version\ComparisonRequirement; use PHPUnit\Metadata\Version\ConstraintRequirement; @@ -45,6 +46,7 @@ use PHPUnit\TestFixture\Metadata\Attribute\RequiresOperatingSystemTest; use PHPUnit\TestFixture\Metadata\Attribute\RequiresPhpExtensionTest; use PHPUnit\TestFixture\Metadata\Attribute\RequiresPhpTest; +use PHPUnit\TestFixture\Metadata\Attribute\RequiresPhpunitExtensionTest; use PHPUnit\TestFixture\Metadata\Attribute\RequiresPhpunitTest; use PHPUnit\TestFixture\Metadata\Attribute\RequiresSettingTest; use PHPUnit\TestFixture\Metadata\Attribute\SmallTest; @@ -315,6 +317,22 @@ public function test_parses_RequiresPhpunit_attribute_on_class(): void $this->assertSame('>= 10.0.0', $versionRequirement->asString()); } + #[TestDox('Parses #[RequiresPhpunitExtension] attribute on class')] + public function test_parses_RequiresPhpunitExtension_attribute_on_class(): void + { + $metadata = $this->parser()->forClass(RequiresPhpunitExtensionTest::class)->isRequiresPhpunitExtension(); + + $this->assertCount(1, $metadata); + + $requirement = $metadata->asArray()[0]; + + $this->assertTrue($requirement->isRequiresPhpunitExtension()); + + assert($requirement instanceof RequiresPhpunitExtension); + + $this->assertSame(['PHPUnit\TestFixture\Metadata\Attribute\SomeClass'], $requirement->extensionClasses()); + } + #[TestDox('Parses #[RequiresSetting] attribute on class')] public function test_parses_RequiresSetting_attribute_on_class(): void { @@ -867,6 +885,22 @@ public function test_parses_RequiresPhpunit_attribute_on_method(): void $this->assertSame('^10.0', $versionRequirement->asString()); } + #[TestDox('Parses #[RequiresPhpunitExtension] attribute on method')] + public function test_parses_RequiresPhpunitExtension_attribute_on_method(): void + { + $metadata = $this->parser()->forMethod(RequiresPhpunitExtensionTest::class, 'testOne')->isRequiresPhpunitExtension(); + + $this->assertCount(1, $metadata); + + $requirement = $metadata->asArray()[0]; + + $this->assertTrue($requirement->isRequiresPhpunitExtension()); + + assert($requirement instanceof RequiresPhpunitExtension); + + $this->assertSame(['PHPUnit\TestFixture\Metadata\Attribute\SomeClass', 'PHPUnit\TestFixture\Metadata\Attribute\SomeOtherClass'], $requirement->extensionClasses()); + } + #[TestDox('Parses #[RequiresSetting] attribute on method')] public function test_parses_RequiresSetting_attribute_on_method(): void {