Chris@13: markTestSkipped('HHVM does not throw warnings from token_get_all()'); Chris@0: } Chris@0: Chris@0: $errorHandler = new ErrorHandler\Collecting(); Chris@0: $lexer = $this->getLexer(['usedAttributes' => [ Chris@0: 'comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos' Chris@0: ]]); Chris@0: $lexer->startLexing($code, $errorHandler); Chris@0: $errors = $errorHandler->getErrors(); Chris@0: Chris@13: $this->assertCount(count($messages), $errors); Chris@0: for ($i = 0; $i < count($messages); $i++) { Chris@0: $this->assertSame($messages[$i], $errors[$i]->getMessageWithColumnInfo($code)); Chris@0: } Chris@0: } Chris@0: Chris@0: public function provideTestError() { Chris@13: return [ Chris@13: ["getLexer($options); Chris@0: $lexer->startLexing($code); Chris@0: while ($id = $lexer->getNextToken($value, $startAttributes, $endAttributes)) { Chris@0: $token = array_shift($tokens); Chris@0: Chris@0: $this->assertSame($token[0], $id); Chris@0: $this->assertSame($token[1], $value); Chris@0: $this->assertEquals($token[2], $startAttributes); Chris@0: $this->assertEquals($token[3], $endAttributes); Chris@0: } Chris@0: } Chris@0: Chris@0: public function provideTestLex() { Chris@13: return [ Chris@0: // tests conversion of closing PHP tag and drop of whitespace and opening tags Chris@13: [ Chris@0: 'plaintext', Chris@13: [], Chris@13: [ Chris@13: [ Chris@0: Tokens::T_STRING, 'tokens', Chris@13: ['startLine' => 1], ['endLine' => 1] Chris@13: ], Chris@13: [ Chris@0: ord(';'), '?>', Chris@13: ['startLine' => 1], ['endLine' => 1] Chris@13: ], Chris@13: [ Chris@0: Tokens::T_INLINE_HTML, 'plaintext', Chris@13: ['startLine' => 1, 'hasLeadingNewline' => false], Chris@13: ['endLine' => 1] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests line numbers Chris@13: [ Chris@0: ' 2], ['endLine' => 2] Chris@13: ], Chris@13: [ Chris@0: Tokens::T_STRING, 'token', Chris@13: ['startLine' => 2], ['endLine' => 2] Chris@13: ], Chris@13: [ Chris@0: ord('$'), '$', Chris@13: [ Chris@0: 'startLine' => 3, Chris@13: 'comments' => [ Chris@13: new Comment\Doc('/** doc' . "\n" . 'comment */', 2, 14, 5), Chris@13: ] Chris@13: ], Chris@13: ['endLine' => 3] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests comment extraction Chris@13: [ Chris@0: ' 2, Chris@13: 'comments' => [ Chris@13: new Comment('/* comment */', 1, 6, 1), Chris@13: new Comment('// comment' . "\n", 1, 20, 3), Chris@13: new Comment\Doc('/** docComment 1 */', 2, 31, 4), Chris@13: new Comment\Doc('/** docComment 2 */', 2, 50, 5), Chris@13: ], Chris@13: ], Chris@13: ['endLine' => 2] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests differing start and end line Chris@13: [ Chris@0: ' 1], ['endLine' => 2] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests exact file offsets Chris@13: [ Chris@0: ' ['startFilePos', 'endFilePos']], Chris@13: [ Chris@13: [ Chris@0: Tokens::T_CONSTANT_ENCAPSED_STRING, '"a"', Chris@13: ['startFilePos' => 6], ['endFilePos' => 8] Chris@13: ], Chris@13: [ Chris@0: ord(';'), ';', Chris@13: ['startFilePos' => 9], ['endFilePos' => 9] Chris@13: ], Chris@13: [ Chris@0: Tokens::T_CONSTANT_ENCAPSED_STRING, '"b"', Chris@13: ['startFilePos' => 18], ['endFilePos' => 20] Chris@13: ], Chris@13: [ Chris@0: ord(';'), ';', Chris@13: ['startFilePos' => 21], ['endFilePos' => 21] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests token offsets Chris@13: [ Chris@0: ' ['startTokenPos', 'endTokenPos']], Chris@13: [ Chris@13: [ Chris@0: Tokens::T_CONSTANT_ENCAPSED_STRING, '"a"', Chris@13: ['startTokenPos' => 1], ['endTokenPos' => 1] Chris@13: ], Chris@13: [ Chris@0: ord(';'), ';', Chris@13: ['startTokenPos' => 2], ['endTokenPos' => 2] Chris@13: ], Chris@13: [ Chris@0: Tokens::T_CONSTANT_ENCAPSED_STRING, '"b"', Chris@13: ['startTokenPos' => 5], ['endTokenPos' => 5] Chris@13: ], Chris@13: [ Chris@0: ord(';'), ';', Chris@13: ['startTokenPos' => 6], ['endTokenPos' => 6] Chris@13: ], Chris@13: ] Chris@13: ], Chris@0: // tests all attributes being disabled Chris@13: [ Chris@0: ' []], Chris@13: [ Chris@13: [ Chris@0: Tokens::T_VARIABLE, '$bar', Chris@13: [], [] Chris@13: ], Chris@13: [ Chris@0: ord(';'), ';', Chris@13: [], [] Chris@13: ] Chris@13: ] Chris@13: ], Chris@0: // tests no tokens Chris@13: [ Chris@0: '', Chris@13: [], Chris@13: [] Chris@13: ], Chris@13: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider provideTestHaltCompiler Chris@0: */ Chris@0: public function testHandleHaltCompiler($code, $remaining) { Chris@0: $lexer = $this->getLexer(); Chris@0: $lexer->startLexing($code); Chris@0: Chris@0: while (Tokens::T_HALT_COMPILER !== $lexer->getNextToken()); Chris@0: Chris@0: $this->assertSame($remaining, $lexer->handleHaltCompiler()); Chris@0: $this->assertSame(0, $lexer->getNextToken()); Chris@0: } Chris@0: Chris@0: public function provideTestHaltCompiler() { Chris@13: return [ Chris@13: ['Remaining Text', 'Remaining Text'], Chris@0: //array('expectException(Error::class); Chris@17: $this->expectExceptionMessage('__HALT_COMPILER must be followed by "();"'); Chris@0: $lexer = $this->getLexer(); Chris@0: $lexer->startLexing('getNextToken()); Chris@0: $lexer->handleHaltCompiler(); Chris@0: } Chris@0: Chris@0: public function testGetTokens() { Chris@0: $code = 'getLexer(); Chris@0: $lexer->startLexing($code); Chris@0: $this->assertSame($expectedTokens, $lexer->getTokens()); Chris@0: } Chris@0: }