Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace PhpParser;
|
Chris@0
|
4
|
Chris@0
|
5 require_once __DIR__ . '/CodeTestAbstract.php';
|
Chris@0
|
6
|
Chris@0
|
7 class CodeParsingTest extends CodeTestAbstract
|
Chris@0
|
8 {
|
Chris@0
|
9 /**
|
Chris@0
|
10 * @dataProvider provideTestParse
|
Chris@0
|
11 */
|
Chris@0
|
12 public function testParse($name, $code, $expected, $modeLine) {
|
Chris@0
|
13 if (null !== $modeLine) {
|
Chris@0
|
14 $modes = array_fill_keys(explode(',', $modeLine), true);
|
Chris@0
|
15 } else {
|
Chris@0
|
16 $modes = [];
|
Chris@0
|
17 }
|
Chris@0
|
18
|
Chris@0
|
19
|
Chris@0
|
20 $lexer = new Lexer\Emulative(array('usedAttributes' => array(
|
Chris@0
|
21 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
|
Chris@0
|
22 )));
|
Chris@0
|
23 $parser5 = new Parser\Php5($lexer);
|
Chris@0
|
24 $parser7 = new Parser\Php7($lexer);
|
Chris@0
|
25
|
Chris@0
|
26 $dumpPositions = isset($modes['positions']);
|
Chris@0
|
27 $output5 = $this->getParseOutput($parser5, $code, $dumpPositions);
|
Chris@0
|
28 $output7 = $this->getParseOutput($parser7, $code, $dumpPositions);
|
Chris@0
|
29
|
Chris@0
|
30 if (isset($modes['php5'])) {
|
Chris@0
|
31 $this->assertSame($expected, $output5, $name);
|
Chris@0
|
32 $this->assertNotSame($expected, $output7, $name);
|
Chris@0
|
33 } else if (isset($modes['php7'])) {
|
Chris@0
|
34 $this->assertNotSame($expected, $output5, $name);
|
Chris@0
|
35 $this->assertSame($expected, $output7, $name);
|
Chris@0
|
36 } else {
|
Chris@0
|
37 $this->assertSame($expected, $output5, $name);
|
Chris@0
|
38 $this->assertSame($expected, $output7, $name);
|
Chris@0
|
39 }
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 private function getParseOutput(Parser $parser, $code, $dumpPositions) {
|
Chris@0
|
43 $errors = new ErrorHandler\Collecting;
|
Chris@0
|
44 $stmts = $parser->parse($code, $errors);
|
Chris@0
|
45
|
Chris@0
|
46 $output = '';
|
Chris@0
|
47 foreach ($errors->getErrors() as $error) {
|
Chris@0
|
48 $output .= $this->formatErrorMessage($error, $code) . "\n";
|
Chris@0
|
49 }
|
Chris@0
|
50
|
Chris@0
|
51 if (null !== $stmts) {
|
Chris@0
|
52 $dumper = new NodeDumper(['dumpComments' => true, 'dumpPositions' => $dumpPositions]);
|
Chris@0
|
53 $output .= $dumper->dump($stmts, $code);
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 return canonicalize($output);
|
Chris@0
|
57 }
|
Chris@0
|
58
|
Chris@0
|
59 public function provideTestParse() {
|
Chris@0
|
60 return $this->getTests(__DIR__ . '/../code/parser', 'test');
|
Chris@0
|
61 }
|
Chris@0
|
62
|
Chris@0
|
63 private function formatErrorMessage(Error $e, $code) {
|
Chris@0
|
64 if ($e->hasColumnInfo()) {
|
Chris@0
|
65 return $e->getMessageWithColumnInfo($code);
|
Chris@0
|
66 } else {
|
Chris@0
|
67 return $e->getMessage();
|
Chris@0
|
68 }
|
Chris@0
|
69 }
|
Chris@0
|
70 }
|