Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / vendor / nikic / php-parser / test / PhpParser / Lexer / EmulativeTest.php
index 3a33ba820760ed02735fe316d305534b3ebbf853..533547ae4825d8f24558fcfdfca87837c978ff46 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace PhpParser\Lexer;
 
+use PhpParser\ErrorHandler;
 use PhpParser\LexerTest;
 use PhpParser\Parser\Tokens;
 
@@ -63,12 +64,11 @@ class EmulativeTest extends LexerTest
         $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);
+        $tokens = [];
+        while (0 !== $token = $lexer->getNextToken($text)) {
+            $tokens[] = [$token, $text];
         }
-        $this->assertSame(0, $lexer->getNextToken());
+        $this->assertSame($expectedTokens, $tokens);
     }
 
     /**
@@ -85,6 +85,29 @@ class EmulativeTest extends LexerTest
         $this->assertSame(0, $lexer->getNextToken());
     }
 
+    /**
+     * @dataProvider provideTestLexNewFeatures
+     */
+    public function testErrorAfterEmulation($code) {
+        $errorHandler = new ErrorHandler\Collecting;
+        $lexer = $this->getLexer([]);
+        $lexer->startLexing('<?php ' . $code . "\0", $errorHandler);
+
+        $errors = $errorHandler->getErrors();
+        $this->assertCount(1, $errors);
+
+        $error = $errors[0];
+        $this->assertSame('Unexpected null byte', $error->getRawMessage());
+
+        $attrs = $error->getAttributes();
+        $expPos = strlen('<?php ' . $code);
+        $expLine = 1 + substr_count('<?php ' . $code, "\n");
+        $this->assertSame($expPos, $attrs['startFilePos']);
+        $this->assertSame($expPos, $attrs['endFilePos']);
+        $this->assertSame($expLine, $attrs['startLine']);
+        $this->assertSame($expLine, $attrs['endLine']);
+    }
+
     public function provideTestLexNewFeatures() {
         return [
             ['yield from', [
@@ -128,6 +151,43 @@ class EmulativeTest extends LexerTest
                 [Tokens::T_END_HEREDOC, 'NOWDOC'],
                 [ord(';'), ';'],
             ]],
+
+            // Flexible heredoc/nowdoc
+            ["<<<LABEL\nLABEL,", [
+                [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+                [Tokens::T_END_HEREDOC, "LABEL"],
+                [ord(','), ','],
+            ]],
+            ["<<<LABEL\n    LABEL,", [
+                [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+                [Tokens::T_END_HEREDOC, "    LABEL"],
+                [ord(','), ','],
+            ]],
+            ["<<<LABEL\n    Foo\n  LABEL;", [
+                [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+                [Tokens::T_ENCAPSED_AND_WHITESPACE, "    Foo\n"],
+                [Tokens::T_END_HEREDOC, "  LABEL"],
+                [ord(';'), ';'],
+            ]],
+            ["<<<A\n A,<<<A\n A,", [
+                [Tokens::T_START_HEREDOC, "<<<A\n"],
+                [Tokens::T_END_HEREDOC, " A"],
+                [ord(','), ','],
+                [Tokens::T_START_HEREDOC, "<<<A\n"],
+                [Tokens::T_END_HEREDOC, " A"],
+                [ord(','), ','],
+            ]],
+            ["<<<LABEL\nLABELNOPE\nLABEL\n", [
+                [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+                [Tokens::T_ENCAPSED_AND_WHITESPACE, "LABELNOPE\n"],
+                [Tokens::T_END_HEREDOC, "LABEL"],
+            ]],
+            // Interpretation changed
+            ["<<<LABEL\n    LABEL\nLABEL\n", [
+                [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+                [Tokens::T_END_HEREDOC, "    LABEL"],
+                [Tokens::T_STRING, "LABEL"],
+            ]],
         ];
     }
 }