mirror of
https://github.com/phabelio/PHP-Parser.git
synced 2024-12-11 00:29:37 +01:00
a0c216bf4b
Adding this as an option to avoid breaking people's tests. Some of the test results show pretty clearly that we are incorrectly assigning the same comment multiple times for nested nodes (mentioned in #36).
70 lines
2.1 KiB
PHP
70 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace PhpParser;
|
|
|
|
use PhpParser\Comment;
|
|
|
|
require_once __DIR__ . '/CodeTestAbstract.php';
|
|
|
|
class CodeParsingTest extends CodeTestAbstract
|
|
{
|
|
/**
|
|
* @dataProvider provideTestParse
|
|
*/
|
|
public function testParse($name, $code, $expected, $mode) {
|
|
$lexer = new Lexer\Emulative(array('usedAttributes' => array(
|
|
'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
|
|
)));
|
|
$parser5 = new Parser\Php5($lexer, array(
|
|
'throwOnError' => false,
|
|
));
|
|
$parser7 = new Parser\Php7($lexer, array(
|
|
'throwOnError' => false,
|
|
));
|
|
|
|
$output5 = $this->getParseOutput($parser5, $code);
|
|
$output7 = $this->getParseOutput($parser7, $code);
|
|
|
|
if ($mode === 'php5') {
|
|
$this->assertSame($expected, $output5, $name);
|
|
$this->assertNotSame($expected, $output7, $name);
|
|
} else if ($mode === 'php7') {
|
|
$this->assertNotSame($expected, $output5, $name);
|
|
$this->assertSame($expected, $output7, $name);
|
|
} else {
|
|
$this->assertSame($expected, $output5, $name);
|
|
$this->assertSame($expected, $output7, $name);
|
|
}
|
|
}
|
|
|
|
private function getParseOutput(Parser $parser, $code) {
|
|
$stmts = $parser->parse($code);
|
|
$errors = $parser->getErrors();
|
|
|
|
$output = '';
|
|
foreach ($errors as $error) {
|
|
$output .= $this->formatErrorMessage($error, $code) . "\n";
|
|
}
|
|
|
|
if (null !== $stmts) {
|
|
$dumper = new NodeDumper(['dumpComments' => true]);
|
|
$output .= $dumper->dump($stmts);
|
|
}
|
|
|
|
return canonicalize($output);
|
|
}
|
|
|
|
public function provideTestParse() {
|
|
return $this->getTests(__DIR__ . '/../code/parser', 'test');
|
|
}
|
|
|
|
private function formatErrorMessage(Error $e, $code) {
|
|
if ($e->hasColumnInfo()) {
|
|
return $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code)
|
|
. ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code);
|
|
} else {
|
|
return $e->getMessage();
|
|
}
|
|
}
|
|
}
|