Mercurial > hg > isophonics-drupal-site
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 } |