Chris@13
|
1 <?php declare(strict_types=1);
|
Chris@0
|
2
|
Chris@0
|
3 namespace PhpParser\Lexer;
|
Chris@0
|
4
|
Chris@0
|
5 use PhpParser\LexerTest;
|
Chris@0
|
6 use PhpParser\Parser\Tokens;
|
Chris@0
|
7
|
Chris@0
|
8 require_once __DIR__ . '/../LexerTest.php';
|
Chris@0
|
9
|
Chris@0
|
10 class EmulativeTest extends LexerTest
|
Chris@0
|
11 {
|
Chris@13
|
12 protected function getLexer(array $options = []) {
|
Chris@0
|
13 return new Emulative($options);
|
Chris@0
|
14 }
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * @dataProvider provideTestReplaceKeywords
|
Chris@0
|
18 */
|
Chris@0
|
19 public function testReplaceKeywords($keyword, $expectedToken) {
|
Chris@0
|
20 $lexer = $this->getLexer();
|
Chris@0
|
21 $lexer->startLexing('<?php ' . $keyword);
|
Chris@0
|
22
|
Chris@0
|
23 $this->assertSame($expectedToken, $lexer->getNextToken());
|
Chris@0
|
24 $this->assertSame(0, $lexer->getNextToken());
|
Chris@0
|
25 }
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * @dataProvider provideTestReplaceKeywords
|
Chris@0
|
29 */
|
Chris@0
|
30 public function testNoReplaceKeywordsAfterObjectOperator($keyword) {
|
Chris@0
|
31 $lexer = $this->getLexer();
|
Chris@0
|
32 $lexer->startLexing('<?php ->' . $keyword);
|
Chris@0
|
33
|
Chris@0
|
34 $this->assertSame(Tokens::T_OBJECT_OPERATOR, $lexer->getNextToken());
|
Chris@0
|
35 $this->assertSame(Tokens::T_STRING, $lexer->getNextToken());
|
Chris@0
|
36 $this->assertSame(0, $lexer->getNextToken());
|
Chris@0
|
37 }
|
Chris@0
|
38
|
Chris@0
|
39 public function provideTestReplaceKeywords() {
|
Chris@13
|
40 return [
|
Chris@0
|
41 // PHP 5.5
|
Chris@13
|
42 ['finally', Tokens::T_FINALLY],
|
Chris@13
|
43 ['yield', Tokens::T_YIELD],
|
Chris@0
|
44
|
Chris@0
|
45 // PHP 5.4
|
Chris@13
|
46 ['callable', Tokens::T_CALLABLE],
|
Chris@13
|
47 ['insteadof', Tokens::T_INSTEADOF],
|
Chris@13
|
48 ['trait', Tokens::T_TRAIT],
|
Chris@13
|
49 ['__TRAIT__', Tokens::T_TRAIT_C],
|
Chris@0
|
50
|
Chris@0
|
51 // PHP 5.3
|
Chris@13
|
52 ['__DIR__', Tokens::T_DIR],
|
Chris@13
|
53 ['goto', Tokens::T_GOTO],
|
Chris@13
|
54 ['namespace', Tokens::T_NAMESPACE],
|
Chris@13
|
55 ['__NAMESPACE__', Tokens::T_NS_C],
|
Chris@13
|
56 ];
|
Chris@0
|
57 }
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * @dataProvider provideTestLexNewFeatures
|
Chris@0
|
61 */
|
Chris@0
|
62 public function testLexNewFeatures($code, array $expectedTokens) {
|
Chris@0
|
63 $lexer = $this->getLexer();
|
Chris@0
|
64 $lexer->startLexing('<?php ' . $code);
|
Chris@0
|
65
|
Chris@0
|
66 foreach ($expectedTokens as $expectedToken) {
|
Chris@0
|
67 list($expectedTokenType, $expectedTokenText) = $expectedToken;
|
Chris@0
|
68 $this->assertSame($expectedTokenType, $lexer->getNextToken($text));
|
Chris@0
|
69 $this->assertSame($expectedTokenText, $text);
|
Chris@0
|
70 }
|
Chris@0
|
71 $this->assertSame(0, $lexer->getNextToken());
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 /**
|
Chris@0
|
75 * @dataProvider provideTestLexNewFeatures
|
Chris@0
|
76 */
|
Chris@0
|
77 public function testLeaveStuffAloneInStrings($code) {
|
Chris@0
|
78 $stringifiedToken = '"' . addcslashes($code, '"\\') . '"';
|
Chris@0
|
79
|
Chris@0
|
80 $lexer = $this->getLexer();
|
Chris@0
|
81 $lexer->startLexing('<?php ' . $stringifiedToken);
|
Chris@0
|
82
|
Chris@0
|
83 $this->assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text));
|
Chris@0
|
84 $this->assertSame($stringifiedToken, $text);
|
Chris@0
|
85 $this->assertSame(0, $lexer->getNextToken());
|
Chris@0
|
86 }
|
Chris@0
|
87
|
Chris@0
|
88 public function provideTestLexNewFeatures() {
|
Chris@13
|
89 return [
|
Chris@13
|
90 ['yield from', [
|
Chris@13
|
91 [Tokens::T_YIELD_FROM, 'yield from'],
|
Chris@13
|
92 ]],
|
Chris@13
|
93 ["yield\r\nfrom", [
|
Chris@13
|
94 [Tokens::T_YIELD_FROM, "yield\r\nfrom"],
|
Chris@13
|
95 ]],
|
Chris@13
|
96 ['...', [
|
Chris@13
|
97 [Tokens::T_ELLIPSIS, '...'],
|
Chris@13
|
98 ]],
|
Chris@13
|
99 ['**', [
|
Chris@13
|
100 [Tokens::T_POW, '**'],
|
Chris@13
|
101 ]],
|
Chris@13
|
102 ['**=', [
|
Chris@13
|
103 [Tokens::T_POW_EQUAL, '**='],
|
Chris@13
|
104 ]],
|
Chris@13
|
105 ['??', [
|
Chris@13
|
106 [Tokens::T_COALESCE, '??'],
|
Chris@13
|
107 ]],
|
Chris@13
|
108 ['<=>', [
|
Chris@13
|
109 [Tokens::T_SPACESHIP, '<=>'],
|
Chris@13
|
110 ]],
|
Chris@13
|
111 ['0b1010110', [
|
Chris@13
|
112 [Tokens::T_LNUMBER, '0b1010110'],
|
Chris@13
|
113 ]],
|
Chris@13
|
114 ['0b1011010101001010110101010010101011010101010101101011001110111100', [
|
Chris@13
|
115 [Tokens::T_DNUMBER, '0b1011010101001010110101010010101011010101010101101011001110111100'],
|
Chris@13
|
116 ]],
|
Chris@13
|
117 ['\\', [
|
Chris@13
|
118 [Tokens::T_NS_SEPARATOR, '\\'],
|
Chris@13
|
119 ]],
|
Chris@13
|
120 ["<<<'NOWDOC'\nNOWDOC;\n", [
|
Chris@13
|
121 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"],
|
Chris@13
|
122 [Tokens::T_END_HEREDOC, 'NOWDOC'],
|
Chris@13
|
123 [ord(';'), ';'],
|
Chris@13
|
124 ]],
|
Chris@13
|
125 ["<<<'NOWDOC'\nFoobar\nNOWDOC;\n", [
|
Chris@13
|
126 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"],
|
Chris@13
|
127 [Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"],
|
Chris@13
|
128 [Tokens::T_END_HEREDOC, 'NOWDOC'],
|
Chris@13
|
129 [ord(';'), ';'],
|
Chris@13
|
130 ]],
|
Chris@13
|
131 ];
|
Chris@0
|
132 }
|
Chris@0
|
133 }
|