mirror of
https://github.com/danog/PHP-Parser.git
synced 2024-12-02 17:28:27 +01:00
bc21514ecf
As these are shared between Php5 and Php7 parsers they should be in some common place, otherwise we'd have to always reference either one or the other.
134 lines
4.5 KiB
PHP
134 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace PhpParser\Lexer;
|
|
|
|
use PhpParser\LexerTest;
|
|
use PhpParser\Parser\Tokens;
|
|
|
|
require_once __DIR__ . '/../LexerTest.php';
|
|
|
|
class EmulativeTest extends LexerTest
|
|
{
|
|
protected function getLexer(array $options = array()) {
|
|
return new Emulative($options);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideTestReplaceKeywords
|
|
*/
|
|
public function testReplaceKeywords($keyword, $expectedToken) {
|
|
$lexer = $this->getLexer();
|
|
$lexer->startLexing('<?php ' . $keyword);
|
|
|
|
$this->assertSame($expectedToken, $lexer->getNextToken());
|
|
$this->assertSame(0, $lexer->getNextToken());
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideTestReplaceKeywords
|
|
*/
|
|
public function testNoReplaceKeywordsAfterObjectOperator($keyword) {
|
|
$lexer = $this->getLexer();
|
|
$lexer->startLexing('<?php ->' . $keyword);
|
|
|
|
$this->assertSame(Tokens::T_OBJECT_OPERATOR, $lexer->getNextToken());
|
|
$this->assertSame(Tokens::T_STRING, $lexer->getNextToken());
|
|
$this->assertSame(0, $lexer->getNextToken());
|
|
}
|
|
|
|
public function provideTestReplaceKeywords() {
|
|
return array(
|
|
// PHP 5.5
|
|
array('finally', Tokens::T_FINALLY),
|
|
array('yield', Tokens::T_YIELD),
|
|
|
|
// PHP 5.4
|
|
array('callable', Tokens::T_CALLABLE),
|
|
array('insteadof', Tokens::T_INSTEADOF),
|
|
array('trait', Tokens::T_TRAIT),
|
|
array('__TRAIT__', Tokens::T_TRAIT_C),
|
|
|
|
// PHP 5.3
|
|
array('__DIR__', Tokens::T_DIR),
|
|
array('goto', Tokens::T_GOTO),
|
|
array('namespace', Tokens::T_NAMESPACE),
|
|
array('__NAMESPACE__', Tokens::T_NS_C),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideTestLexNewFeatures
|
|
*/
|
|
public function testLexNewFeatures($code, array $expectedTokens) {
|
|
$lexer = $this->getLexer();
|
|
$lexer->startLexing('<?php ' . $code);
|
|
|
|
foreach ($expectedTokens as $expectedToken) {
|
|
list($expectedTokenType, $expectedTokenText) = $expectedToken;
|
|
$this->assertSame($expectedTokenType, $lexer->getNextToken($text));
|
|
$this->assertSame($expectedTokenText, $text);
|
|
}
|
|
$this->assertSame(0, $lexer->getNextToken());
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideTestLexNewFeatures
|
|
*/
|
|
public function testLeaveStuffAloneInStrings($code) {
|
|
$stringifiedToken = '"' . addcslashes($code, '"\\') . '"';
|
|
|
|
$lexer = $this->getLexer();
|
|
$lexer->startLexing('<?php ' . $stringifiedToken);
|
|
|
|
$this->assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text));
|
|
$this->assertSame($stringifiedToken, $text);
|
|
$this->assertSame(0, $lexer->getNextToken());
|
|
}
|
|
|
|
public function provideTestLexNewFeatures() {
|
|
return array(
|
|
array('yield from', array(
|
|
array(Tokens::T_YIELD_FROM, 'yield from'),
|
|
)),
|
|
array("yield\r\nfrom", array(
|
|
array(Tokens::T_YIELD_FROM, "yield\r\nfrom"),
|
|
)),
|
|
array('...', array(
|
|
array(Tokens::T_ELLIPSIS, '...'),
|
|
)),
|
|
array('**', array(
|
|
array(Tokens::T_POW, '**'),
|
|
)),
|
|
array('**=', array(
|
|
array(Tokens::T_POW_EQUAL, '**='),
|
|
)),
|
|
array('??', array(
|
|
array(Tokens::T_COALESCE, '??'),
|
|
)),
|
|
array('<=>', array(
|
|
array(Tokens::T_SPACESHIP, '<=>'),
|
|
)),
|
|
array('0b1010110', array(
|
|
array(Tokens::T_LNUMBER, '0b1010110'),
|
|
)),
|
|
array('0b1011010101001010110101010010101011010101010101101011001110111100', array(
|
|
array(Tokens::T_DNUMBER, '0b1011010101001010110101010010101011010101010101101011001110111100'),
|
|
)),
|
|
array('\\', array(
|
|
array(Tokens::T_NS_SEPARATOR, '\\'),
|
|
)),
|
|
array("<<<'NOWDOC'\nNOWDOC;\n", array(
|
|
array(Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"),
|
|
array(Tokens::T_END_HEREDOC, 'NOWDOC'),
|
|
array(ord(';'), ';'),
|
|
)),
|
|
array("<<<'NOWDOC'\nFoobar\nNOWDOC;\n", array(
|
|
array(Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"),
|
|
array(Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"),
|
|
array(Tokens::T_END_HEREDOC, 'NOWDOC'),
|
|
array(ord(';'), ';'),
|
|
)),
|
|
);
|
|
}
|
|
}
|