comparison vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents 5fb285c0d0e3
children
comparison
equal deleted inserted replaced
16:c2387f117808 17:129ea1e6d783
1 <?php declare(strict_types=1); 1 <?php declare(strict_types=1);
2 2
3 namespace PhpParser\Lexer; 3 namespace PhpParser\Lexer;
4 4
5 use PhpParser\ErrorHandler;
5 use PhpParser\LexerTest; 6 use PhpParser\LexerTest;
6 use PhpParser\Parser\Tokens; 7 use PhpParser\Parser\Tokens;
7
8 require_once __DIR__ . '/../LexerTest.php';
9 8
10 class EmulativeTest extends LexerTest 9 class EmulativeTest extends LexerTest
11 { 10 {
12 protected function getLexer(array $options = []) { 11 protected function getLexer(array $options = []) {
13 return new Emulative($options); 12 return new Emulative($options);
61 */ 60 */
62 public function testLexNewFeatures($code, array $expectedTokens) { 61 public function testLexNewFeatures($code, array $expectedTokens) {
63 $lexer = $this->getLexer(); 62 $lexer = $this->getLexer();
64 $lexer->startLexing('<?php ' . $code); 63 $lexer->startLexing('<?php ' . $code);
65 64
66 foreach ($expectedTokens as $expectedToken) { 65 $tokens = [];
67 list($expectedTokenType, $expectedTokenText) = $expectedToken; 66 while (0 !== $token = $lexer->getNextToken($text)) {
68 $this->assertSame($expectedTokenType, $lexer->getNextToken($text)); 67 $tokens[] = [$token, $text];
69 $this->assertSame($expectedTokenText, $text);
70 } 68 }
71 $this->assertSame(0, $lexer->getNextToken()); 69 $this->assertSame($expectedTokens, $tokens);
72 } 70 }
73 71
74 /** 72 /**
75 * @dataProvider provideTestLexNewFeatures 73 * @dataProvider provideTestLexNewFeatures
76 */ 74 */
83 $this->assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text)); 81 $this->assertSame(Tokens::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text));
84 $this->assertSame($stringifiedToken, $text); 82 $this->assertSame($stringifiedToken, $text);
85 $this->assertSame(0, $lexer->getNextToken()); 83 $this->assertSame(0, $lexer->getNextToken());
86 } 84 }
87 85
86 /**
87 * @dataProvider provideTestLexNewFeatures
88 */
89 public function testErrorAfterEmulation($code) {
90 $errorHandler = new ErrorHandler\Collecting;
91 $lexer = $this->getLexer([]);
92 $lexer->startLexing('<?php ' . $code . "\0", $errorHandler);
93
94 $errors = $errorHandler->getErrors();
95 $this->assertCount(1, $errors);
96
97 $error = $errors[0];
98 $this->assertSame('Unexpected null byte', $error->getRawMessage());
99
100 $attrs = $error->getAttributes();
101 $expPos = strlen('<?php ' . $code);
102 $expLine = 1 + substr_count('<?php ' . $code, "\n");
103 $this->assertSame($expPos, $attrs['startFilePos']);
104 $this->assertSame($expPos, $attrs['endFilePos']);
105 $this->assertSame($expLine, $attrs['startLine']);
106 $this->assertSame($expLine, $attrs['endLine']);
107 }
108
88 public function provideTestLexNewFeatures() { 109 public function provideTestLexNewFeatures() {
89 return [ 110 return [
111 // PHP 7.4
112 ['??=', [
113 [Tokens::T_COALESCE_EQUAL, '??='],
114 ]],
90 ['yield from', [ 115 ['yield from', [
91 [Tokens::T_YIELD_FROM, 'yield from'], 116 [Tokens::T_YIELD_FROM, 'yield from'],
92 ]], 117 ]],
93 ["yield\r\nfrom", [ 118 ["yield\r\nfrom", [
94 [Tokens::T_YIELD_FROM, "yield\r\nfrom"], 119 [Tokens::T_YIELD_FROM, "yield\r\nfrom"],
126 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"], 151 [Tokens::T_START_HEREDOC, "<<<'NOWDOC'\n"],
127 [Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"], 152 [Tokens::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"],
128 [Tokens::T_END_HEREDOC, 'NOWDOC'], 153 [Tokens::T_END_HEREDOC, 'NOWDOC'],
129 [ord(';'), ';'], 154 [ord(';'), ';'],
130 ]], 155 ]],
156
157 // Flexible heredoc/nowdoc
158 ["<<<LABEL\nLABEL,", [
159 [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
160 [Tokens::T_END_HEREDOC, "LABEL"],
161 [ord(','), ','],
162 ]],
163 ["<<<LABEL\n LABEL,", [
164 [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
165 [Tokens::T_END_HEREDOC, " LABEL"],
166 [ord(','), ','],
167 ]],
168 ["<<<LABEL\n Foo\n LABEL;", [
169 [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
170 [Tokens::T_ENCAPSED_AND_WHITESPACE, " Foo\n"],
171 [Tokens::T_END_HEREDOC, " LABEL"],
172 [ord(';'), ';'],
173 ]],
174 ["<<<A\n A,<<<A\n A,", [
175 [Tokens::T_START_HEREDOC, "<<<A\n"],
176 [Tokens::T_END_HEREDOC, " A"],
177 [ord(','), ','],
178 [Tokens::T_START_HEREDOC, "<<<A\n"],
179 [Tokens::T_END_HEREDOC, " A"],
180 [ord(','), ','],
181 ]],
182 ["<<<LABEL\nLABELNOPE\nLABEL\n", [
183 [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
184 [Tokens::T_ENCAPSED_AND_WHITESPACE, "LABELNOPE\n"],
185 [Tokens::T_END_HEREDOC, "LABEL"],
186 ]],
187 // Interpretation changed
188 ["<<<LABEL\n LABEL\nLABEL\n", [
189 [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
190 [Tokens::T_END_HEREDOC, " LABEL"],
191 [Tokens::T_STRING, "LABEL"],
192 ]],
131 ]; 193 ];
132 } 194 }
133 } 195 }