Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions rules.neon
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ conditionalTags:
PHPStan\Rules\PHPUnit\DataProviderDataRule:
phpstan.rules.rule: %featureToggles.bleedingEdge%

PHPStan\Rules\PHPUnit\ClassAttributeRequiresPhpVersionRule:
phpstan.rules.rule: %featureToggles.bleedingEdge%
Comment on lines +19 to +20

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

technically its a new rule, but in the end we just add wiring for a pre-existing service (and its bleeding edge only).

therefore I feel confident merging, without a review from ondrej


services:
-
class: PHPStan\Rules\PHPUnit\DataProviderDeclarationRule
Expand All @@ -30,6 +33,9 @@ services:
tags:
- phpstan.rules.rule

-
class: PHPStan\Rules\PHPUnit\ClassAttributeRequiresPhpVersionRule

-
class: PHPStan\Rules\PHPUnit\AssertEqualsIsDiscouragedRule

Expand Down
44 changes: 44 additions & 0 deletions src/Rules/PHPUnit/ClassAttributeRequiresPhpVersionRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php declare(strict_types = 1);

namespace PHPStan\Rules\PHPUnit;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\InClassNode;
use PHPStan\Rules\Rule;
use PHPUnit\Framework\TestCase;

/**
* @implements Rule<InClassNode>
*/
class ClassAttributeRequiresPhpVersionRule implements Rule
{

private AttributeVersionRequirementHelper $attributeVersionRequirementHelper;

public function __construct(
AttributeVersionRequirementHelper $attributeVersionRequirementHelper
)
{
$this->attributeVersionRequirementHelper = $attributeVersionRequirementHelper;
}

public function getNodeType(): string
{
return InClassNode::class;
}

public function processNode(Node $node, Scope $scope): array
{
$classReflection = $scope->getClassReflection();
if ($classReflection === null || $classReflection->is(TestCase::class) === false) {
return [];
}

return $this->attributeVersionRequirementHelper->checkRequiresPhpVersion(
$classReflection->getNativeReflection()->getBetterReflection()->getAttributesByName('PHPUnit\Framework\Attributes\RequiresPhp'),
$scope,
);
}

}
2 changes: 2 additions & 0 deletions tests/Rules/PHPUnit/ClassAttributeRequiresPhpVersionRule.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
parameters:
phpVersion: 80500
63 changes: 63 additions & 0 deletions tests/Rules/PHPUnit/ClassAttributeRequiresPhpVersionRuleTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php declare(strict_types = 1);

namespace PHPStan\Rules\PHPUnit;

use PHPStan\Php\PhpVersion;
use PHPStan\Rules\Rule;
use PHPStan\Testing\RuleTestCase;

/**
* @extends RuleTestCase<ClassAttributeRequiresPhpVersionRule>
*/
final class ClassAttributeRequiresPhpVersionRuleTest extends RuleTestCase
{

private int $phpVersion = 80500;

private int $phpunitMajorVersion;

private int $phpunitMinorVersion;

private bool $warnAboutIncompleteVersion = false;

public function testWarnAboutIncompleteVersion(): void
{
$this->phpunitMajorVersion = 12;
$this->phpunitMinorVersion = 5;
$this->warnAboutIncompleteVersion = true;

$this->analyse([__DIR__ . '/data/requires-php-version-on-class.php'], [
[
'Version requirement will always evaluate to false.',
10,
],
[
'Version requirement is incomplete.',
10,
],
]);
}

protected function getRule(): Rule
{
$phpunitVersion = new PHPUnitVersion($this->phpunitMajorVersion, $this->phpunitMinorVersion);

return new ClassAttributeRequiresPhpVersionRule(
new AttributeVersionRequirementHelper(
$phpunitVersion,
false,
new PhpVersion($this->phpVersion),
true,
$this->warnAboutIncompleteVersion,
),
);
}

public static function getAdditionalConfigFiles(): array
{
return [
__DIR__ . '/ClassAttributeRequiresPhpVersionRule.neon',
];
}

}
24 changes: 24 additions & 0 deletions tests/Rules/PHPUnit/data/requires-php-version-on-class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace RequiresPhpVersionOnClass;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\RequiresPhp;

#[RequiresPhp('< 7.0')]
class RequiresPhpOnClass extends TestCase
{
public function testBar(): void {

}
}

#[RequiresPhp('>=8.0.0')]
class CorrectRequirementOnClass extends TestCase
{
public function testBar(): void {

}
}
Loading