diff --git a/lib/PhpParser/Parser/Multiple.php b/lib/PhpParser/Parser/Multiple.php index 7073dc2..95446e2 100644 --- a/lib/PhpParser/Parser/Multiple.php +++ b/lib/PhpParser/Parser/Multiple.php @@ -14,9 +14,9 @@ class Multiple implements Parser { /** * Create a parser which will try multiple parsers in an order of preference. * - * Parsers will be invoked in the order they're provided to the constructor. If one of the parsers runs without - * errors, it's output is returned. Otherwise the errors (and PhpParser\Error exception) of the first parser are - * used. + * Parsers will be invoked in the order they're provided to the constructor. If one of the + * parsers runs without errors, it's output is returned. Otherwise the errors (and + * PhpParser\Error exception) of the first parser are used. * * @param Parser[] $parsers */ diff --git a/test/PhpParser/Parser/MultipleTest.php b/test/PhpParser/Parser/MultipleTest.php new file mode 100644 index 0000000..c6e4dd4 --- /dev/null +++ b/test/PhpParser/Parser/MultipleTest.php @@ -0,0 +1,113 @@ + []]); + return new Multiple([new Php7($lexer), new Php5($lexer)]); + } + + private function getPrefer5() { + $lexer = new Lexer(['usedAttributes' => []]); + return new Multiple([new Php5($lexer), new Php7($lexer)]); + } + + /** @dataProvider provideTestParse */ + public function testParse($code, Multiple $parser, $expected) { + $this->assertEquals($expected, $parser->parse($code)); + $this->assertSame([], $parser->getErrors()); + } + + public function provideTestParse() { + return [ + [ + // PHP 7 only code + 'getPrefer5(), + [ + new Stmt\Class_('Test', ['stmts' => [ + new Stmt\ClassMethod('function') + ]]), + ] + ], + [ + // PHP 5 only code + 'b;', + $this->getPrefer7(), + [ + new Stmt\Global_([ + new Expr\Variable(new Expr\PropertyFetch(new Expr\Variable('a'), 'b')) + ]) + ] + ], + [ + // Different meaning (PHP 5) + 'getPrefer5(), + [ + new Expr\Variable( + new Expr\ArrayDimFetch(new Expr\Variable('a'), new LNumber(0)) + ) + ] + ], + [ + // Different meaning (PHP 7) + 'getPrefer7(), + [ + new Expr\ArrayDimFetch( + new Expr\Variable(new Expr\Variable('a')), new LNumber(0) + ) + ] + ], + ]; + } + + public function testThrownError() { + $this->setExpectedException('PhpParser\Error', 'FAIL A'); + + $parserA = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserA->expects($this->at(0)) + ->method('parse')->will($this->throwException(new Error('FAIL A'))); + + $parserB = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserB->expects($this->at(0)) + ->method('parse')->will($this->throwException(new Error('FAIL B'))); + + $parser = new Multiple([$parserA, $parserB]); + $parser->parse('dummy'); + } + + public function testGetErrors() { + $errorsA = [new Error('A1'), new Error('A2')]; + $parserA = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserA->expects($this->at(0))->method('parse'); + $parserA->expects($this->at(1)) + ->method('getErrors')->will($this->returnValue($errorsA)); + + $errorsB = [new Error('B1'), new Error('B2')]; + $parserB = $this->getMockBuilder('PhpParser\Parser')->getMock(); + $parserB->expects($this->at(0))->method('parse'); + $parserB->expects($this->at(1)) + ->method('getErrors')->will($this->returnValue($errorsB)); + + $parser = new Multiple([$parserA, $parserB]); + $parser->parse('dummy'); + $this->assertSame($errorsA, $parser->getErrors()); + } +} \ No newline at end of file