comparison vendor/nikic/php-parser/test/PhpParser/CodeParsingTest.php @ 0:4c8ae668cc8c

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