CodeParsingTest.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace PhpParser;
  3. use PhpParser\Comment;
  4. require_once __DIR__ . '/CodeTestAbstract.php';
  5. class CodeParsingTest extends CodeTestAbstract
  6. {
  7. /**
  8. * @dataProvider provideTestParse
  9. */
  10. public function testParse($name, $code, $expected, $mode) {
  11. $lexer = new Lexer\Emulative(array('usedAttributes' => array(
  12. 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
  13. )));
  14. $parser5 = new Parser\Php5($lexer, array(
  15. 'throwOnError' => false,
  16. ));
  17. $parser7 = new Parser\Php7($lexer, array(
  18. 'throwOnError' => false,
  19. ));
  20. $output5 = $this->getParseOutput($parser5, $code);
  21. $output7 = $this->getParseOutput($parser7, $code);
  22. if ($mode === 'php5') {
  23. $this->assertSame($expected, $output5, $name);
  24. $this->assertNotSame($expected, $output7, $name);
  25. } else if ($mode === 'php7') {
  26. $this->assertNotSame($expected, $output5, $name);
  27. $this->assertSame($expected, $output7, $name);
  28. } else {
  29. $this->assertSame($expected, $output5, $name);
  30. $this->assertSame($expected, $output7, $name);
  31. }
  32. }
  33. private function getParseOutput(Parser $parser, $code) {
  34. $stmts = $parser->parse($code);
  35. $errors = $parser->getErrors();
  36. $output = '';
  37. foreach ($errors as $error) {
  38. $output .= $this->formatErrorMessage($error, $code) . "\n";
  39. }
  40. if (null !== $stmts) {
  41. $dumper = new NodeDumper(['dumpComments' => true]);
  42. $output .= $dumper->dump($stmts);
  43. }
  44. return canonicalize($output);
  45. }
  46. public function provideTestParse() {
  47. return $this->getTests(__DIR__ . '/../code/parser', 'test');
  48. }
  49. private function formatErrorMessage(Error $e, $code) {
  50. if ($e->hasColumnInfo()) {
  51. return $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code)
  52. . ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code);
  53. } else {
  54. return $e->getMessage();
  55. }
  56. }
  57. }