Skip to content

Commit 5308dff

Browse files
committed
Tests: Improve test DX
- Generate snapshot if file does not exist rather than whatever it was doing before. - Upgrade phpunit - Removed CallbackTestListener - Add hint about regeneration in assertions
1 parent 3274f21 commit 5308dff

File tree

7 files changed

+46
-97
lines changed

7 files changed

+46
-97
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 & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,33 @@
1111
use PHPUnit\Framework\BaseTestListener;
1212
use PHPUnit\Framework\AssertionFailedError;
1313

14-
require_once __DIR__ . '/CallbackTestListener.php';
15-
1614
class LexicalGrammarTest extends TestCase {
1715
private $expectedTokensFile;
1816
private $tokens;
1917
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-
3718
/**
3819
* @dataProvider lexicalProvider
3920
*/
4021
public function testOutputTokenClassificationAndLength($testCaseFile, $expectedTokensFile) {
4122
$fileContents = file_get_contents($testCaseFile);
42-
if (!file_exists($expectedTokensFile)) {
43-
file_put_contents($expectedTokensFile, $fileContents);
44-
exec("git add " . $expectedTokensFile);
45-
}
4623

47-
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
4824
$lexer = \Microsoft\PhpParser\TokenStreamProviderFactory::GetTokenStreamProvider($fileContents);
4925
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = true;
5026
$tokens = str_replace("\r\n", "\n", json_encode($lexer->getTokensArray(), JSON_PRETTY_PRINT));
5127
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = false;
52-
$this->expectedTokensFile = $expectedTokensFile;
53-
$this->tokens = $tokens;
54-
$this->assertEquals($expectedTokens, $tokens, "input: $testCaseFile\r\nexpected: $expectedTokensFile");
28+
29+
if (!file_exists($expectedTokensFile)) {
30+
file_put_contents($expectedTokensFile, $tokens);
31+
self::markTestSkipped('Snapshot generated');
32+
}
33+
34+
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
35+
36+
$this->assertEquals(
37+
$expectedTokens,
38+
$tokens,
39+
"input: $testCaseFile\r\nexpected: $expectedTokensFile (delete expected to regenerate)"
40+
);
5541
}
5642

5743
public function lexicalProvider() {

tests/ParserGrammarTest.php

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

15-
require_once __DIR__ . '/CallbackTestListener.php';
16-
1715
class ParserGrammarTest extends TestCase {
1816
private $expectedTokensFile;
1917
private $expectedDiagnosticsFile;
2018
private $tokens;
2119
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-
}
4020

4121
/**
4222
* @dataProvider treeProvider
4323
*/
4424
public function testOutputTreeClassificationAndLength($testCaseFile, $expectedTokensFile, $expectedDiagnosticsFile) {
45-
$this->expectedTokensFile = $expectedTokensFile;
46-
$this->expectedDiagnosticsFile = $expectedDiagnosticsFile;
47-
4825
$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-
}
5826

5927
$parser = new \Microsoft\PhpParser\Parser();
6028
$sourceFileNode = $parser->parseSourceFile($fileContents);
6129

62-
$expectedTokens = str_replace("\r\n", "\n", file_get_contents($expectedTokensFile));
63-
$expectedDiagnostics = str_replace("\r\n", "\n", file_get_contents($expectedDiagnosticsFile));
64-
6530
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = true;
6631
$tokens = str_replace("\r\n", "\n", json_encode($sourceFileNode, JSON_PRETTY_PRINT));
6732
$diagnostics = str_replace("\r\n", "\n", json_encode(\Microsoft\PhpParser\DiagnosticsProvider::getDiagnostics($sourceFileNode), JSON_PRETTY_PRINT));
6833
$GLOBALS["SHORT_TOKEN_SERIALIZE"] = false;
6934

70-
$this->tokens = $tokens;
71-
$this->diagnostics = $diagnostics;
35+
$skip = false;
36+
if (!file_exists($expectedTokensFile)) {
37+
file_put_contents($expectedTokensFile, $tokens);
38+
$skip = true;
39+
} else {
40+
$expectedTokens = trim(str_replace("\r\n", "\n", file_get_contents($expectedTokensFile)));
41+
}
42+
43+
44+
if (!file_exists($expectedDiagnosticsFile)) {
45+
file_put_contents($expectedDiagnosticsFile, $diagnostics);
46+
$skip = true;
47+
} else {
48+
$expectedDiagnostics = trim(str_replace("\r\n", "\n", file_get_contents($expectedDiagnosticsFile)));
49+
}
50+
51+
if ($skip) {
52+
self::markTestSkipped('Snapshot generated');
53+
}
7254

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";
55+
$tokensOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedTokensFile (deleted expected file to regenerate)";
56+
$diagnosticsOutputStr = "input doc:\r\n$fileContents\r\n\r\ninput: $testCaseFile\r\nexpected: $expectedDiagnosticsFile (delete expected file to regenerate)";
7557

7658
$this->assertEquals($expectedTokens, $tokens, $tokensOutputStr);
7759
$this->assertEquals($expectedDiagnostics, $diagnostics, $diagnosticsOutputStr);
@@ -104,12 +86,14 @@ public function treeProvider() {
10486
$testProviderArray[basename($testCase)] = [$testCase, $testCase . ".tree", $testCase . ".diag"];
10587
}
10688

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-
}
89+
foreach (self::PATTERNS_FOR_MINIMUM_PHP_VERSION as [$minVersionId, $filePattern]) {
90+
if (PHP_VERSION_ID < $minVersionId) {
91+
continue;
92+
}
93+
94+
$testCases = glob($filePattern . ".php");
95+
foreach ($testCases as $testCase) {
96+
$testProviderArray[basename($testCase)] = [$testCase, $testCase . ".tree", $testCase . ".diag"];
11397
}
11498
}
11599

0 commit comments

Comments
 (0)