Skip to content

Commit 2e8c1e1

Browse files
committed
extract PHPUnitVersionDetector
1 parent 2b7e7a0 commit 2e8c1e1

File tree

8 files changed

+144
-47
lines changed

8 files changed

+144
-47
lines changed

extension.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,14 @@ services:
5050
-
5151
class: PHPStan\Rules\PHPUnit\AnnotationHelper
5252

53+
-
54+
class: PHPStan\Rules\PHPUnit\PHPUnitVersionDetector
55+
5356
-
5457
class: PHPStan\Rules\PHPUnit\TestMethodsHelper
58+
factory: @PHPStan\Rules\PHPUnit\TestMethodsHelperFactory::create()
59+
-
60+
class: PHPStan\Rules\PHPUnit\TestMethodsHelperFactory
5561
arguments:
5662
parser: @defaultAnalysisParser
5763

src/Rules/PHPUnit/DataProviderHelper.php

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,18 @@
2828

2929
class DataProviderHelper
3030
{
31-
32-
/**
33-
* Reflection provider.
34-
*
35-
*/
3631
private ReflectionProvider $reflectionProvider;
3732

38-
/**
39-
* The file type mapper.
40-
*
41-
*/
4233
private FileTypeMapper $fileTypeMapper;
4334

4435
private Parser $parser;
4536

4637
private bool $phpunit10OrNewer;
4738

4839
public function __construct(
49-
ReflectionProvider $reflectionProvider,
50-
FileTypeMapper $fileTypeMapper,
51-
Parser $parser,
40+
ReflectionProvider $reflectionProvider,
41+
FileTypeMapper $fileTypeMapper,
42+
Parser $parser,
5243
bool $phpunit10OrNewer
5344
)
5445
{

src/Rules/PHPUnit/DataProviderHelperFactory.php

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,43 +21,24 @@ class DataProviderHelperFactory
2121

2222
private Parser $parser;
2323

24+
private PHPUnitVersionDetector $PHPUnitVersionDetector;
25+
2426
public function __construct(
2527
ReflectionProvider $reflectionProvider,
2628
FileTypeMapper $fileTypeMapper,
27-
Parser $parser
29+
Parser $parser,
30+
PHPUnitVersionDetector $PHPUnitVersionDetector,
2831
)
2932
{
3033
$this->reflectionProvider = $reflectionProvider;
3134
$this->fileTypeMapper = $fileTypeMapper;
3235
$this->parser = $parser;
36+
$this->PHPUnitVersionDetector = $PHPUnitVersionDetector;
3337
}
3438

3539
public function create(): DataProviderHelper
3640
{
37-
$phpUnit10OrNewer = false;
38-
if ($this->reflectionProvider->hasClass(TestCase::class)) {
39-
$testCase = $this->reflectionProvider->getClass(TestCase::class);
40-
$file = $testCase->getFileName();
41-
if ($file !== null) {
42-
$phpUnitRoot = dirname($file, 3);
43-
$phpUnitComposer = $phpUnitRoot . '/composer.json';
44-
if (is_file($phpUnitComposer)) {
45-
$composerJson = @file_get_contents($phpUnitComposer);
46-
if ($composerJson !== false) {
47-
$json = json_decode($composerJson, true);
48-
$version = $json['extra']['branch-alias']['dev-main'] ?? null;
49-
if ($version !== null) {
50-
$majorVersion = (int) explode('.', $version)[0];
51-
if ($majorVersion >= 10) {
52-
$phpUnit10OrNewer = true;
53-
}
54-
}
55-
}
56-
}
57-
}
58-
}
59-
60-
return new DataProviderHelper($this->reflectionProvider, $this->fileTypeMapper, $this->parser, $phpUnit10OrNewer);
41+
return new DataProviderHelper($this->reflectionProvider, $this->fileTypeMapper, $this->parser, $this->PHPUnitVersionDetector->isPHPUnit10OrNewer());
6142
}
6243

6344
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\PHPUnit;
4+
5+
use PHPStan\Reflection\ReflectionProvider;
6+
use PHPUnit\Framework\TestCase;
7+
use function dirname;
8+
use function explode;
9+
use function file_get_contents;
10+
use function is_file;
11+
use function json_decode;
12+
13+
class PHPUnitVersionDetector
14+
{
15+
16+
private ?bool $is10OrNewer = null;
17+
18+
private ReflectionProvider $reflectionProvider;
19+
20+
public function __construct(ReflectionProvider $reflectionProvider)
21+
{
22+
$this->reflectionProvider = $reflectionProvider;
23+
}
24+
25+
public function isPHPUnit10OrNewer(): bool
26+
{
27+
if ($this->is10OrNewer !== null) {
28+
return $this->is10OrNewer;
29+
}
30+
31+
$this->is10OrNewer = false;
32+
if ($this->reflectionProvider->hasClass(TestCase::class)) {
33+
$testCase = $this->reflectionProvider->getClass(TestCase::class);
34+
$file = $testCase->getFileName();
35+
if ($file !== null) {
36+
$phpUnitRoot = dirname($file, 3);
37+
$phpUnitComposer = $phpUnitRoot . '/composer.json';
38+
if (is_file($phpUnitComposer)) {
39+
$composerJson = @file_get_contents($phpUnitComposer);
40+
if ($composerJson !== false) {
41+
$json = json_decode($composerJson, true);
42+
$version = $json['extra']['branch-alias']['dev-main'] ?? null;
43+
if ($version !== null) {
44+
$majorVersion = (int) explode('.', $version)[0];
45+
if ($majorVersion >= 10) {
46+
$this->is10OrNewer = true;
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
53+
54+
return $this->is10OrNewer;
55+
}
56+
57+
}

src/Rules/PHPUnit/TestMethodsHelper.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,19 @@ final class TestMethodsHelper
2121

2222
private Parser $parser;
2323

24+
private bool $phpunit10OrNewer;
25+
2426
public function __construct(
2527
ReflectionProvider $reflectionProvider,
2628
FileTypeMapper $fileTypeMapper,
27-
Parser $parser
29+
Parser $parser,
30+
bool $phpunit10OrNewer,
2831
)
2932
{
3033
$this->reflectionProvider = $reflectionProvider;
3134
$this->fileTypeMapper = $fileTypeMapper;
3235
$this->parser = $parser;
36+
$this->phpunit10OrNewer = $phpunit10OrNewer;
3337
}
3438

3539
/**
@@ -64,12 +68,9 @@ public function getTestMethods(ClassReflection $classReflection, Scope $scope):
6468
}
6569
}
6670

67-
// todo: detect tests with @test annotation
68-
69-
// XXX
70-
//if (!$this->phpunit10OrNewer) {
71-
// return;
72-
//}
71+
if (!$this->phpunit10OrNewer) {
72+
continue;
73+
}
7374

7475
$testAttributes = $reflectionMethod->getAttributes('PHPUnit\Framework\Attributes\Test');
7576
if ($testAttributes === []) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\PHPUnit;
4+
5+
use PHPStan\Parser\Parser;
6+
use PHPStan\Reflection\ReflectionProvider;
7+
use PHPStan\Type\FileTypeMapper;
8+
use PHPUnit\Framework\TestCase;
9+
use function dirname;
10+
use function explode;
11+
use function file_get_contents;
12+
use function is_file;
13+
use function json_decode;
14+
15+
class TestMethodsHelperFactory
16+
{
17+
18+
private ReflectionProvider $reflectionProvider;
19+
20+
private FileTypeMapper $fileTypeMapper;
21+
22+
private Parser $parser;
23+
24+
private PHPUnitVersionDetector $PHPUnitVersionDetector;
25+
26+
public function __construct(
27+
ReflectionProvider $reflectionProvider,
28+
FileTypeMapper $fileTypeMapper,
29+
Parser $parser,
30+
PHPUnitVersionDetector $PHPUnitVersionDetector,
31+
)
32+
{
33+
$this->reflectionProvider = $reflectionProvider;
34+
$this->fileTypeMapper = $fileTypeMapper;
35+
$this->parser = $parser;
36+
$this->PHPUnitVersionDetector = $PHPUnitVersionDetector;
37+
}
38+
39+
public function create(): TestMethodsHelper
40+
{
41+
return new TestMethodsHelper($this->reflectionProvider, $this->fileTypeMapper, $this->parser, $this->PHPUnitVersionDetector->isPHPUnit10OrNewer());
42+
}
43+
44+
}

tests/Rules/PHPUnit/DataProviderDataRuleTest.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\Rules\PhpDoc\UnresolvableTypeHelper;
1212
use PHPStan\Rules\PHPUnit\DataProviderDataRule;
1313
use PHPStan\Rules\PHPUnit\DataProviderHelper;
14+
use PHPStan\Rules\PHPUnit\PHPUnitVersionDetector;
1415
use PHPStan\Rules\PHPUnit\TestMethodsHelper;
1516
use PHPStan\Rules\Properties\PropertyReflectionFinder;
1617
use PHPStan\Rules\Rule;
@@ -30,8 +31,19 @@ protected function getRule(): Rule
3031

3132
return new CompositeRule(new DirectRegistry([
3233
new DataProviderDataRule(
33-
new TestMethodsHelper($reflectionProvider, self::getContainer()->getByType(FileTypeMapper::class), self::getContainer()->getService('defaultAnalysisParser')),
34-
new DataProviderHelper($reflectionProvider, self::getContainer()->getByType(FileTypeMapper::class), self::getContainer()->getService('defaultAnalysisParser'), true),
34+
new TestMethodsHelper(
35+
$reflectionProvider,
36+
self::getContainer()->getByType(FileTypeMapper::class),
37+
self::getContainer()->getService('defaultAnalysisParser'),
38+
true
39+
),
40+
new DataProviderHelper(
41+
$reflectionProvider,
42+
self::getContainer()->getByType(FileTypeMapper::class),
43+
self::getContainer()->getService('defaultAnalysisParser'),
44+
true
45+
),
46+
3547
),
3648
self::getContainer()->getByType(CallMethodsRule::class)
3749
]));

tests/Rules/PHPUnit/DataProviderDeclarationRuleTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ protected function getRule(): Rule
1717
$reflection = $this->createReflectionProvider();
1818

1919
return new DataProviderDeclarationRule(
20-
new DataProviderHelper($reflection, self::getContainer()->getByType(FileTypeMapper::class), self::getContainer()->getService('defaultAnalysisParser'), true),
20+
new DataProviderHelper(
21+
$reflection,
22+
self::getContainer()->getByType(FileTypeMapper::class),
23+
self::getContainer()->getService('defaultAnalysisParser'),
24+
true
25+
),
2126
true,
2227
true
2328
);

0 commit comments

Comments
 (0)