Fix ValidationTest to read serialized results
parent
f201ecd177
commit
4d476714ff
|
@ -30,7 +30,7 @@ class ValidationTest extends TestCase
|
||||||
foreach ($frameworks as $frameworkDir) {
|
foreach ($frameworks as $frameworkDir) {
|
||||||
$frameworkName = basename($frameworkDir);
|
$frameworkName = basename($frameworkDir);
|
||||||
if ($frameworkName !== "broken") {
|
if ($frameworkName !== "broken") {
|
||||||
// continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$iterator = new RecursiveDirectoryIterator(__DIR__ . "/../../validation/frameworks/" . $frameworkName);
|
$iterator = new RecursiveDirectoryIterator(__DIR__ . "/../../validation/frameworks/" . $frameworkName);
|
||||||
|
@ -49,43 +49,6 @@ class ValidationTest extends TestCase
|
||||||
return $testProviderArray;
|
return $testProviderArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @group validation
|
|
||||||
* @dataProvider frameworkErrorProvider
|
|
||||||
* @param $testCaseFile
|
|
||||||
* @param $frameworkName
|
|
||||||
*/
|
|
||||||
public function testFrameworkErrors($testCaseFile, $frameworkName) {
|
|
||||||
$fileContents = file_get_contents($testCaseFile);
|
|
||||||
|
|
||||||
$parser = ParserResourceFactory::getParser();
|
|
||||||
$docBlockFactory = DocBlockFactory::createInstance();
|
|
||||||
$index = new Index;
|
|
||||||
$definitionResolver = ParserResourceFactory::getDefinitionResolver($index);
|
|
||||||
|
|
||||||
$directory = __DIR__ . "/output/$frameworkName/";
|
|
||||||
$outFile = $directory . basename($testCaseFile);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$document = new PhpDocument($testCaseFile, $fileContents, $index, $parser, $docBlockFactory, $definitionResolver);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
if (!file_exists($dir = __DIR__ . "/output")) {
|
|
||||||
mkdir($dir);
|
|
||||||
}
|
|
||||||
if (!file_exists($directory)) {
|
|
||||||
mkdir($directory);
|
|
||||||
}
|
|
||||||
file_put_contents($outFile, $fileContents);
|
|
||||||
$this->fail((string)$e);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assertNotNull($document->getStmts());
|
|
||||||
|
|
||||||
if (file_exists($outFile)) {
|
|
||||||
unlink($outFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group validation
|
* @group validation
|
||||||
* @dataProvider frameworkErrorProvider
|
* @dataProvider frameworkErrorProvider
|
||||||
|
@ -93,48 +56,36 @@ class ValidationTest extends TestCase
|
||||||
* @param $frameworkName
|
* @param $frameworkName
|
||||||
*/
|
*/
|
||||||
public function testDefinitionErrors($testCaseFile, $frameworkName) {
|
public function testDefinitionErrors($testCaseFile, $frameworkName) {
|
||||||
echo PHP_EOL . realpath($testCaseFile) . PHP_EOL;
|
echo "Test file: " . realpath($testCaseFile) . PHP_EOL;
|
||||||
|
|
||||||
$fileContents = file_get_contents($testCaseFile);
|
$fileContents = file_get_contents($testCaseFile);
|
||||||
[$expectedDefinitions, $expectedReferences] = $this->getExpectedDefinitionsAndReferences($testCaseFile, $frameworkName, $fileContents);
|
$expectedValues = $this->getExpectedTestValues($testCaseFile, $frameworkName, $fileContents);
|
||||||
[$actualDefinitions, $actualReferences] = $this->getActualDefinitionsAndReferences($testCaseFile, $fileContents);
|
$actualValues = $this->getActualTestValues($testCaseFile, $fileContents);
|
||||||
|
|
||||||
$this->filterSkippedReferences($expectedReferences);
|
$this->assertEquals($expectedValues['definitions'], $actualValues['definitions']);
|
||||||
$this->filterSkippedReferences($actualReferences);
|
|
||||||
|
|
||||||
$expectedValues = $this->getValuesFromDefinitionsAndReferences($expectedDefinitions, $expectedReferences);
|
|
||||||
$actualValues = $this->getValuesFromDefinitionsAndReferences($actualDefinitions, $actualReferences);
|
|
||||||
|
|
||||||
foreach ($expectedValues as $name => $expectedValue) {
|
|
||||||
$actualValue = $actualValues[$name];
|
|
||||||
|
|
||||||
if ($name === 'references') {
|
|
||||||
try {
|
try {
|
||||||
$this->assertArraySubset($expectedValue, $actualValue, false, 'references don\'t match.');
|
$this->assertArraySubset((array)$expectedValues['references'], (array)$actualValues['references'], false, 'references don\'t match.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->assertEquals($expectedValue, $actualValue, 'references don\'t match.');
|
$this->assertEquals((array)$expectedValues['references'], (array)$actualValues['references'], 'references don\'t match.');
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assertEquals($expectedValue, $actualValue, "$name did not match.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $filename
|
* @param $filename
|
||||||
|
* @param $frameworkName
|
||||||
* @param $fileContents
|
* @param $fileContents
|
||||||
* @return array<Definition[], string[][]>
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function getExpectedDefinitionsAndReferences($filename, $frameworkName, $fileContents) {
|
private function getExpectedTestValues($filename, $frameworkName, $fileContents) {
|
||||||
// $outputFile = $filename . '.expected';
|
|
||||||
// if (file_exists($outputFile)) {
|
|
||||||
// return json_decode(file_get_contents($outputFile));
|
|
||||||
// }
|
|
||||||
|
|
||||||
global $parserKind;
|
global $parserKind;
|
||||||
$parserKind = ParserKind::PHP_PARSER;
|
$parserKind = ParserKind::PHP_PARSER;
|
||||||
|
|
||||||
|
$outputFile = $filename . '.expected.json';
|
||||||
|
if (file_exists($outputFile)) {
|
||||||
|
return (array)json_decode(file_get_contents($outputFile));
|
||||||
|
}
|
||||||
|
|
||||||
$index = new Index();
|
$index = new Index();
|
||||||
$parser = ParserResourceFactory::getParser();
|
$parser = ParserResourceFactory::getParser();
|
||||||
$docBlockFactory = DocBlockFactory::createInstance();
|
$docBlockFactory = DocBlockFactory::createInstance();
|
||||||
|
@ -150,16 +101,23 @@ class ValidationTest extends TestCase
|
||||||
$this->markTestSkipped('Baseline parser failed: null AST');
|
$this->markTestSkipped('Baseline parser failed: null AST');
|
||||||
}
|
}
|
||||||
|
|
||||||
$defsAndRefs = [$document->getDefinitions(), $index->references];
|
$expectedRefs = $index->references;
|
||||||
// if ($frameworkName === 'broken') {
|
$this->filterSkippedReferences($expectedRefs);
|
||||||
// file_put_contents($outputFile, json_encode($defsAndRefs, JSON_PRETTY_PRINT));
|
$expectedDefs = $this->getTestValuesFromDefs($document->getDefinitions());
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
return $defsAndRefs;
|
$refsAndDefs = array(
|
||||||
|
'references' => json_decode(json_encode($expectedRefs)),
|
||||||
|
'definitions' => json_decode(json_encode($expectedDefs))
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($frameworkName === 'broken') {
|
||||||
|
file_put_contents($outputFile, json_encode($refsAndDefs, JSON_PRETTY_PRINT));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getActualDefinitionsAndReferences($filename, $fileContents) {
|
return $refsAndDefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getActualTestValues($filename, $fileContents): array {
|
||||||
global $parserKind;
|
global $parserKind;
|
||||||
$parserKind = ParserKind::TOLERANT_PHP_PARSER;
|
$parserKind = ParserKind::TOLERANT_PHP_PARSER;
|
||||||
|
|
||||||
|
@ -170,40 +128,50 @@ class ValidationTest extends TestCase
|
||||||
|
|
||||||
$document = new PhpDocument($filename, $fileContents, $index, $parser, $docBlockFactory, $definitionResolver);
|
$document = new PhpDocument($filename, $fileContents, $index, $parser, $docBlockFactory, $definitionResolver);
|
||||||
|
|
||||||
return [$document->getDefinitions(), $index->references];
|
$actualRefs = $index->references;
|
||||||
|
$this->filterSkippedReferences($actualRefs);
|
||||||
|
$actualDefs = $this->getTestValuesFromDefs($document->getDefinitions());
|
||||||
|
|
||||||
|
// TODO - probably a more PHP-typical way to do this. Need to compare the objects parsed from json files
|
||||||
|
// to the real results. json_decode returns stdClass Objects, not arrays.
|
||||||
|
return array(
|
||||||
|
'references' => json_decode(json_encode($actualRefs)),
|
||||||
|
'definitions' => json_decode(json_encode($actualDefs))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $expectedDefinitions
|
* @param $definitions Definition[]
|
||||||
* @param $expectedReferences
|
|
||||||
* @return array|\array[]
|
* @return array|\array[]
|
||||||
* @internal param $propertyNames
|
|
||||||
*/
|
*/
|
||||||
private function getValuesFromDefinitionsAndReferences($expectedDefinitions, $expectedReferences): array
|
private function getTestValuesFromDefs($definitions): array
|
||||||
{
|
{
|
||||||
// TODO - use reflection to read these properties
|
// TODO - use reflection to read these properties
|
||||||
$propertyNames = ['extends', 'isGlobal', 'isStatic', 'canBeInstantiated', 'symbolInformation', 'type', 'documentation'];
|
$propertyNames = ['extends', 'isGlobal', 'isStatic', 'canBeInstantiated', 'symbolInformation', 'type', 'documentation'];
|
||||||
|
|
||||||
$expectedValues = [];
|
$defsForAssert = [];
|
||||||
foreach ($expectedDefinitions as $expectedDefinition) {
|
foreach ($definitions as $definition) {
|
||||||
$fqn = $expectedDefinition->fqn;
|
$fqn = $definition->fqn;
|
||||||
$expectedValues['$def->fqn'][] = $fqn;
|
|
||||||
|
|
||||||
foreach ($propertyNames as $propertyName) {
|
foreach ($propertyNames as $propertyName) {
|
||||||
if ($propertyName === 'symbolInformation') {
|
if ($propertyName === 'symbolInformation') {
|
||||||
unset($expectedDefinition->$propertyName->location->range);
|
// Range is very often different - don't check it, for now
|
||||||
|
unset($definition->$propertyName->location->range);
|
||||||
} elseif ($propertyName === 'extends') {
|
} elseif ($propertyName === 'extends') {
|
||||||
$expectedDefinition->$propertyName = $expectedDefinition->$propertyName ?? [];
|
$definition->$propertyName = $definition->$propertyName ?? [];
|
||||||
|
} elseif ($propertyName === 'type') {
|
||||||
|
// Class info is not captured by json_encode. It's important for 'type'.
|
||||||
|
$defsForAssert[$fqn][$propertyName . '__class'] = get_class($definition->$propertyName);
|
||||||
}
|
}
|
||||||
$expectedValues['$def->' . $propertyName][$fqn] = $expectedDefinition->$propertyName;
|
|
||||||
|
$defsForAssert[$fqn][$propertyName] = $definition->$propertyName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$expectedValues['references'] = $expectedReferences;
|
return $defsForAssert;
|
||||||
return $expectedValues;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function filterSkippedReferences(&$references)
|
private function filterSkippedReferences(&$references): void
|
||||||
{
|
{
|
||||||
$skipped = [
|
$skipped = [
|
||||||
'false', 'true', 'null', 'FALSE', 'TRUE', 'NULL',
|
'false', 'true', 'null', 'FALSE', 'TRUE', 'NULL',
|
||||||
|
@ -217,7 +185,7 @@ class ValidationTest extends TestCase
|
||||||
foreach ($references as $key=>$value) {
|
foreach ($references as $key=>$value) {
|
||||||
foreach ($skipped as $s) {
|
foreach ($skipped as $s) {
|
||||||
if (strpos($key, $s) !== false) {
|
if (strpos($key, $s) !== false) {
|
||||||
unset($references[$key]);
|
unset($references->$key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue