Skip to content

Commit d37bfea

Browse files
committed
ADD basic e2e tests
1 parent 1aa26fa commit d37bfea

13 files changed

Lines changed: 248 additions & 0 deletions
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e;
4+
5+
final class PHPStanResultsChecker
6+
{
7+
private const IDENTIFIER_PREFIX = 'phpExtensionLibrary.';
8+
private const FILE_PATH_TO_REMOVE = 'build/e2e/data/';
9+
10+
/**
11+
* @param array<int,string> $expectedResults
12+
*/
13+
public function checkResults(string $phpstanResultsAsJsonString, array $expectedResults): void
14+
{
15+
$asJson = json_decode($phpstanResultsAsJsonString, true);
16+
$this->assertArray($asJson, 'Failed to decode PHPStan results');
17+
18+
$totals = $asJson['totals'] ?? null;
19+
$this->assertArray($totals, 'Failed to find totals in PHPStan results');
20+
21+
$errorCount = $totals['errors'] ?? null;
22+
$this->assertNotNull($errorCount, 'Failed to find error count in PHPStan results');
23+
if ((int) $errorCount > 0) {
24+
$errors = $asJson['errors'] ?? null;
25+
throw new \RuntimeException('PHPStan reported errors: '.var_export($errors, true));
26+
}
27+
28+
$files = $asJson['files'] ?? null;
29+
$this->assertArray($files, 'Failed to find files in PHPStan results');
30+
31+
$additionalReportedErrors = [];
32+
33+
foreach ($files as $fullFileName => $fileIssues) {
34+
$filePath = $this->getCleanFilename($fullFileName);
35+
36+
$this->assertArray($fileIssues, 'Failed to find issues in PHPStan results');
37+
$messages = $fileIssues['messages'] ?? null;
38+
$this->assertArray($messages, 'Failed to find messages in PHPStan results');
39+
40+
foreach ($messages as $issue) {
41+
$line = $issue['line'] ?? null;
42+
$identifier = $issue['identifier'] ?? '';
43+
$cleanIdentifier = str_replace(self::IDENTIFIER_PREFIX, '', $identifier);
44+
45+
$key = sprintf('%s:%d:%s', $filePath, $line, $cleanIdentifier);
46+
47+
$expectedResultsKey = array_search($key, $expectedResults, true);
48+
if (false === $expectedResultsKey) {
49+
$additionalReportedErrors[] = $key;
50+
} else {
51+
unset($expectedResults[$expectedResultsKey]);
52+
}
53+
}
54+
}
55+
56+
if (([] === $additionalReportedErrors) && ([] === $expectedResults)) {
57+
// ALL OK
58+
return;
59+
}
60+
61+
$errorMessage = implode("\n", [
62+
'Additional reported errors:',
63+
var_export(array_values($additionalReportedErrors), true),
64+
'Expected errors not reported:',
65+
var_export(array_values($expectedResults), true),
66+
]);
67+
68+
throw new \RuntimeException($errorMessage);
69+
}
70+
71+
/** @phpstan-assert !null $value */
72+
private function assertNotNull(mixed $value, string $error): void
73+
{
74+
if (null === $value) {
75+
throw new \RuntimeException($error);
76+
}
77+
}
78+
79+
/** @phpstan-assert array $value */
80+
private function assertArray(mixed $value, string $error): void
81+
{
82+
if (!is_array($value)) {
83+
throw new \RuntimeException($error);
84+
}
85+
}
86+
87+
private function getCleanFilename(string $fullFileName): string
88+
{
89+
$position = strpos($fullFileName, self::FILE_PATH_TO_REMOVE);
90+
if (false === $position) {
91+
throw new \RuntimeException('Failed to find '.self::FILE_PATH_TO_REMOVE.' in '.$fullFileName);
92+
}
93+
$filePath = substr($fullFileName, $position + strlen(self::FILE_PATH_TO_REMOVE));
94+
95+
return str_replace('.php', '', $filePath);
96+
}
97+
}

build/e2e/data/BaseTraitClass.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class BaseTraitClass
6+
{
7+
8+
}

build/e2e/data/FriendProblems.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class FriendProblems
6+
{
7+
public function badCode(Person $person): void
8+
{
9+
new Person();
10+
Person::aStaticMethod();
11+
$person->aMethod();
12+
}
13+
}

build/e2e/data/MyTrait.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
use DaveLiddament\PhpLanguageExtensions\RestrictTraitTo;
6+
7+
#[RestrictTraitTo(BaseTraitClass::class)]
8+
trait MyTrait
9+
{
10+
11+
}

build/e2e/data/Person.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
use DaveLiddament\PhpLanguageExtensions\Friend;
6+
7+
#[Friend(PersonBuilder::class)]
8+
class Person
9+
{
10+
public function __construct()
11+
{
12+
}
13+
14+
public function aMethod(): void
15+
{
16+
}
17+
18+
public static function aStaticMethod(): void
19+
{
20+
}
21+
}

build/e2e/data/PersonBuilder.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class PersonBuilder
6+
{
7+
public function create(): Person
8+
{
9+
return new Person();
10+
}
11+
}

build/e2e/data/Shape.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class Shape
6+
{
7+
public function __construct()
8+
{
9+
}
10+
}

build/e2e/data/Square.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class Square extends Shape
6+
{
7+
public function __construct()
8+
{
9+
parent::__construct();
10+
}
11+
}

build/e2e/data/TraitClass.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class TraitClass extends BaseTraitClass
6+
{
7+
use MyTrait;
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace DaveLiddament\PhpstanPhpLanguageExtensions\Build\e2e\data;
4+
5+
class TraitClassProblems
6+
{
7+
use MyTrait;
8+
}

0 commit comments

Comments
 (0)