Skip to content

Commit 57264d1

Browse files
authored
Merge pull request #16 from phpactor/test-dx
Tests: Improve test DX
2 parents 3274f21 + 0c546e4 commit 57264d1

File tree

7 files changed

+46
-105
lines changed

7 files changed

+46
-105
lines changed

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios",
44
"type": "library",
55
"require": {
6-
"php": ">=7.2"
6+
"php": ">=8.1"
77
},
88
"require-dev": {
9-
"phpunit/phpunit": "^8.5.15",
9+
"phpunit/phpunit": "^10.0",
1010
"phpstan/phpstan": "^1.8"
1111
},
1212
"license": "MIT",

phpunit.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333

3434
<testsuite name="api">
3535
<file>tests/api/NodeApiTest.php</file>
36-
<file>tests/api/getNodeAtPosition.php</file>
37-
<file>tests/api/getResolvedName.php</file>
36+
<file>tests/api/GetNodeAtPositionTest.php</file>
37+
<file>tests/api/GetResolvedNameTest.php</file>
3838
<file>tests/api/PositionUtilitiesTest.php</file>
3939
<file>tests/api/TextEditTest.php</file>
4040
</testsuite>

tests/CallbackTestListener.php

Lines changed: 0 additions & 21 deletions
This file was deleted.

tests/LexicalGrammarTest.php

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,30 @@
1111
use PHPUnit\Framework\BaseTestListener;
1212
use PHPUnit\Framework\AssertionFailedError;
1313

14-
require_once __DIR__ . '/CallbackTestListener.php';
15-
1614
class LexicalGrammarTest extends TestCase {
17-
private $expectedTokensFile;
18-
private $tokens;
19-
const FILE_PATTERN = __DIR__ . "/cases/lexical/*";
20-
public function run(?TestResult $result = null) : TestResult {
21-
if (!isset($GLOBALS["GIT_CHECKOUT_LEXER"])) {
22-
$GLOBALS["GIT_CHECKOUT_LEXER"] = true;
23-
exec("git -C " . dirname(self::FILE_PATTERN) . " checkout *.php.tokens");
24-
}
25-
26-
$result->addListener(new CallbackTestListener(function (Test $test) {
27-
if (isset($test->expectedTokensFile) && isset($test->tokens)) {
28-
file_put_contents($test->expectedTokensFile, str_replace("\r\n", "\n", $test->tokens));
29-
}
30-
}));
31-
32-
$result = parent::run($result);
33-
return $result;
34-
}
35-
36-
3715
/**
3816
* @dataProvider lexicalProvider
3917
*/
4018
public function testOutputTokenClassificationAndLength($testCaseFile, $expectedTokensFile) {
4119
$fileContents = file_get_contents($testCaseFile);
42-
if (!file_exists($expectedTokensFile)) {
43-
file_put_contents($expectedTokensFile, $fileContents);
44-
exec("git add " . $expectedTokensFile);
45-
}
4620

47-
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
4821
$lexer = \Microsoft\PhpParser\TokenStreamProviderFactory::GetTokenStreamProvider($fileContents);
4922
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = true;
5023
$tokens = str_replace("\r\n", "\n", json_encode($lexer->getTokensArray(), JSON_PRETTY_PRINT));
5124
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = false;
52-
$this->expectedTokensFile = $expectedTokensFile;
53-
$this->tokens = $tokens;
54-
$this->assertEquals($expectedTokens, $tokens, "input: $testCaseFile\r\nexpected: $expectedTokensFile");
25+
26+
if (!file_exists($expectedTokensFile)) {
27+
file_put_contents($expectedTokensFile, $tokens);
28+
self::markTestSkipped('Snapshot generated');
29+
}
30+
31+
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
32+
33+
$this->assertEquals(
34+
$expectedTokens,
35+
$tokens,
36+
"input: $testCaseFile\r\nexpected: $expectedTokensFile (delete expected to regenerate)"
37+
);
5538
}
5639

5740
public function lexicalProvider() {

tests/ParserGrammarTest.php

Lines changed: 29 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,66 +12,43 @@
1212
use PHPUnit\Framework\TestListenerDefaultImplementation;
1313
use PHPUnit\Framework\AssertionFailedError;
1414

15-
require_once __DIR__ . '/CallbackTestListener.php';
16-
1715
class ParserGrammarTest extends TestCase {
18-
private $expectedTokensFile;
19-
private $expectedDiagnosticsFile;
20-
private $tokens;
21-
private $diagnostics;
22-
public function run(?TestResult $result = null) : TestResult {
23-
if (!isset($GLOBALS["GIT_CHECKOUT_PARSER"])) {
24-
$GLOBALS["GIT_CHECKOUT_PARSER"] = true;
25-
exec("git -C " . dirname(self::FILE_PATTERN) . " checkout *.php.tree *.php.diag");
26-
}
27-
28-
$result->addListener(new CallbackTestListener(function (Test $test) {
29-
if (isset($test->expectedTokensFile) && isset($test->tokens)) {
30-
file_put_contents($test->expectedTokensFile, str_replace("\r\n", "\n", $test->tokens));
31-
}
32-
if (isset($test->expectedDiagnosticsFile) && isset($test->diagnostics)) {
33-
file_put_contents($test->expectedDiagnosticsFile, str_replace("\r\n", "\n", $test->diagnostics));
34-
}
35-
}));
36-
37-
$result = parent::run($result);
38-
return $result;
39-
}
40-
4116
/**
4217
* @dataProvider treeProvider
4318
*/
4419
public function testOutputTreeClassificationAndLength($testCaseFile, $expectedTokensFile, $expectedDiagnosticsFile) {
45-
$this->expectedTokensFile = $expectedTokensFile;
46-
$this->expectedDiagnosticsFile = $expectedDiagnosticsFile;
47-
4820
$fileContents = file_get_contents($testCaseFile);
49-
if (!file_exists($expectedTokensFile)) {
50-
file_put_contents($expectedTokensFile, $fileContents);
51-
exec("git add " . $expectedTokensFile);
52-
}
53-
54-
if (!file_exists($expectedDiagnosticsFile)) {
55-
file_put_contents($expectedDiagnosticsFile, $fileContents);
56-
exec("git add " . $expectedDiagnosticsFile);
57-
}
5821

5922
$parser = new \Microsoft\PhpParser\Parser();
6023
$sourceFileNode = $parser->parseSourceFile($fileContents);
6124

62-
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
63-
$expectedDiagnostics = str_replace("\r\n", "\n", file_get_contents($expectedDiagnosticsFile));
64-
6525
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = true;
6626
$tokens = str_replace("\r\n", "\n", json_encode($sourceFileNode, JSON_PRETTY_PRINT));
6727
$diagnostics = str_replace("\r\n", "\n", json_encode(\Microsoft\PhpParser\DiagnosticsProvider::getDiagnostics($sourceFileNode), JSON_PRETTY_PRINT));
6828
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = false;
6929

70-
$this->tokens = $tokens;
71-
$this->diagnostics = $diagnostics;
30+
$skip = false;
31+
if (!file_exists($expectedTokensFile)) {
32+
file_put_contents($expectedTokensFile, $tokens);
33+
$skip = true;
34+
} else {
35+
$expectedTokens = trim(str_replace("\r\n", "\n", file_get_contents($expectedTokensFile)));
36+
}
7237

73-
$tokensOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedTokensFile";
74-
$diagnosticsOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedDiagnosticsFile";
38+
39+
if (!file_exists($expectedDiagnosticsFile)) {
40+
file_put_contents($expectedDiagnosticsFile, $diagnostics);
41+
$skip = true;
42+
} else {
43+
$expectedDiagnostics = trim(str_replace("\r\n", "\n", file_get_contents($expectedDiagnosticsFile)));
44+
}
45+
46+
if ($skip) {
47+
self::markTestSkipped('Snapshot generated');
48+
}
49+
50+
$tokensOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedTokensFile (deleted expected file to regenerate)";
51+
$diagnosticsOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedDiagnosticsFile (delete expected file to regenerate)";
7552

7653
$this->assertEquals($expectedTokens, $tokens, $tokensOutputStr);
7754
$this->assertEquals($expectedDiagnostics, $diagnostics, $diagnosticsOutputStr);
@@ -104,12 +81,14 @@ public function treeProvider() {
10481
$testProviderArray[basename($testCase)] = [$testCase, $testCase . ".tree", $testCase . ".diag"];
10582
}
10683

107-
foreach (self::PATTERNS_FOR_MINIMUM_PHP_VERSION as list($minVersionId, $filePattern)) {
108-
if (PHP_VERSION_ID >= $minVersionId) {
109-
$testCases = glob($filePattern . ".php");
110-
foreach ($testCases as $testCase) {
111-
$testProviderArray[basename($testCase)] = [$testCase, $testCase . ".tree", $testCase . ".diag"];
112-
}
84+
foreach (self::PATTERNS_FOR_MINIMUM_PHP_VERSION as [$minVersionId, $filePattern]) {
85+
if (PHP_VERSION_ID < $minVersionId) {
86+
continue;
87+
}
88+
89+
$testCases = glob($filePattern . ".php");
90+
foreach ($testCases as $testCase) {
91+
$testProviderArray[basename($testCase)] = [$testCase, $testCase . ".tree", $testCase . ".diag"];
11392
}
11493
}
11594

0 commit comments

Comments
 (0)