Skip to content

Commit 113e46d

Browse files
committed
Refactor PHPUnit version detection to ease re-use
1 parent 7eff102 commit 113e46d

File tree

3 files changed

+66
-31
lines changed

3 files changed

+66
-31
lines changed

extension.neon

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ services:
4949
class: PHPStan\Rules\PHPUnit\CoversHelper
5050
-
5151
class: PHPStan\Rules\PHPUnit\AnnotationHelper
52+
-
53+
class: PHPStan\Rules\PHPUnit\PHPUnitVersionDetector
54+
5255
-
5356
class: PHPStan\Rules\PHPUnit\DataProviderHelper
5457
factory: @PHPStan\Rules\PHPUnit\DataProviderHelperFactory::create()

src/Rules/PHPUnit/DataProviderHelperFactory.php

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@
55
use PHPStan\Parser\Parser;
66
use PHPStan\Reflection\ReflectionProvider;
77
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;
148

159
class DataProviderHelperFactory
1610
{
@@ -21,43 +15,24 @@ class DataProviderHelperFactory
2115

2216
private Parser $parser;
2317

18+
private PHPUnitVersionDetector $PHPUnitVersionDetector;
19+
2420
public function __construct(
2521
ReflectionProvider $reflectionProvider,
2622
FileTypeMapper $fileTypeMapper,
27-
Parser $parser
23+
Parser $parser,
24+
PHPUnitVersionDetector $PHPUnitVersionDetector
2825
)
2926
{
3027
$this->reflectionProvider = $reflectionProvider;
3128
$this->fileTypeMapper = $fileTypeMapper;
3229
$this->parser = $parser;
30+
$this->PHPUnitVersionDetector = $PHPUnitVersionDetector;
3331
}
3432

3533
public function create(): DataProviderHelper
3634
{
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);
35+
return new DataProviderHelper($this->reflectionProvider, $this->fileTypeMapper, $this->parser, $this->PHPUnitVersionDetector->isPHPUnit10OrNewer());
6136
}
6237

6338
}
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+
}

0 commit comments

Comments
 (0)