1
0
Fork 0

Fix ValidationTest to read serialized results

pull/357/head
Rob Lourens 2017-05-01 16:52:30 -07:00
parent f201ecd177
commit 4d476714ff
1 changed files with 58 additions and 90 deletions

View File

@ -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);
} }
} }
} }