1 <?php declare(strict_types=1);
3 namespace PhpParser\Lexer;
5 use PhpParser\LexerTest;
6 use PhpParser\Parser\Tokens;
8 require_once __DIR__ . '/../LexerTest.php';
10 class EmulativeTest extends LexerTest
12 protected function getLexer(array $options = []) {
13 return new Emulative($options);
17 * @dataProvider provideTestReplaceKeywords
19 public function testReplaceKeywords($keyword, $expectedToken) {
20 $lexer = $this->getLexer();
21 $lexer->startLexing('<?php ' . $keyword);
23 $this->assertSame($expectedToken, $lexer->getNextToken());
24 $this->assertSame(0, $lexer->getNextToken());
28 * @dataProvider provideTestReplaceKeywords
30 public function testNoReplaceKeywordsAfterObjectOperator($keyword) {
31 $lexer = $this->getLexer();
32 $lexer->startLexing('<?php ->' . $keyword);
34 $this->assertSame(Tokens::T_OBJECT_OPERATOR, $lexer->getNextToken());
35 $this->assertSame(Tokens::T_STRING, $lexer->getNextToken());
36 $this->assertSame(0, $lexer->getNextToken());
39 public function provideTestReplaceKeywords() {
42 ['finally', Tokens::T_FINALLY],
43 ['yield', Tokens::T_YIELD],
46 ['callable', Tokens::T_CALLABLE],
47 ['insteadof', Tokens::T_INSTEADOF],
48 ['trait', Tokens::T_TRAIT],
49 ['__TRAIT__', Tokens::T_TRAIT_C],
52 ['__DIR__', Tokens::T_DIR],
53 ['goto', Tokens::T_GOTO],
54 ['namespace', Tokens::T_NAMESPACE],
55 ['__NAMESPACE__', Tokens::T_NS_C],
60 * @dataProvider provideTestLexNewFeatures
62 public function testLexNewFeatures($code, array $expectedTokens) {
63 $lexer = $this->getLexer();
64 $lexer->startLexing('<?php ' . $code);
66 foreach ($expectedTokens as $expectedToken) {
67 list($expectedTokenType, $expectedTokenText) = $expectedToken;
68 $this->assertSame($expectedTokenType, $lexer->getNextToken($text));
69 $this->assertSame($expectedTokenText, $text);
71 $this->assertSame(0, $lexer->getNextToken());
75 * @dataProvider provideTestLexNewFeatures
77 public function testLeaveStuffAloneInStrings($code) {
78 $stringifiedToken = '"' . addcslashes($code, '"\\') . '"';
80 $lexer = $this->getLexer();
81 $lexer->startLexing('<?php ' . $stringifiedToken);
83 $this->assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text));
84 $this->assertSame($stringifiedToken, $text);
85 $this->assertSame(0, $lexer->getNextToken());
88 public function provideTestLexNewFeatures() {
91 [Tokens::T_YIELD_FROM, 'yield from'],
94 [Tokens::T_YIELD_FROM, "yield\r\nfrom"],
97 [Tokens::T_ELLIPSIS, '...'],
100 [Tokens::T_POW, '**'],
103 [Tokens::T_POW_EQUAL, '**='],
106 [Tokens::T_COALESCE, '??'],
109 [Tokens::T_SPACESHIP, '<=>'],
112 [Tokens::T_LNUMBER, '0b1010110'],
114 ['0b1011010101001010110101010010101011010101010101101011001110111100', [
115 [Tokens::T_DNUMBER, '0b1011010101001010110101010010101011010101010101101011001110111100'],
118 [Tokens::T_NS_SEPARATOR, '\\'],
120 ["<<<'NOWDOC'\nNOWDOC;\n", [
121 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"],
122 [Tokens::T_END_HEREDOC, 'NOWDOC'],
125 ["<<<'NOWDOC'\nFoobar\nNOWDOC;\n", [
126 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"],
127 [Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"],
128 [Tokens::T_END_HEREDOC, 'NOWDOC'],