diff vendor/nikic/php-parser/test/PhpParser/CodeTestParser.php @ 13:5fb285c0d0e3

Update Drupal core to 8.4.7 via Composer. Security update; I *think* we've been lucky to get away with this so far, as we don't support self-registration which seems to be used by the so-called "drupalgeddon 2" attack that 8.4.5 was vulnerable to.
author Chris Cannam
date Mon, 23 Apr 2018 09:33:26 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/nikic/php-parser/test/PhpParser/CodeTestParser.php	Mon Apr 23 09:33:26 2018 +0100
@@ -0,0 +1,68 @@
+<?php declare(strict_types=1);
+
+namespace PhpParser;
+
+class CodeTestParser
+{
+    public function parseTest($code, $chunksPerTest) {
+        $code = canonicalize($code);
+
+        // evaluate @@{expr}@@ expressions
+        $code = preg_replace_callback(
+            '/@@\{(.*?)\}@@/',
+            function($matches) {
+                return eval('return ' . $matches[1] . ';');
+            },
+            $code
+        );
+
+        // parse sections
+        $parts = preg_split("/\n-----(?:\n|$)/", $code);
+
+        // first part is the name
+        $name = array_shift($parts);
+
+        // multiple sections possible with always two forming a pair
+        $chunks = array_chunk($parts, $chunksPerTest);
+        $tests = [];
+        foreach ($chunks as $i => $chunk) {
+            $lastPart = array_pop($chunk);
+            list($lastPart, $mode) = $this->extractMode($lastPart);
+            $tests[] = [$mode, array_merge($chunk, [$lastPart])];
+        }
+
+        return [$name, $tests];
+    }
+
+    public function reconstructTest($name, array $tests) {
+        $result = $name;
+        foreach ($tests as list($mode, $parts)) {
+            $lastPart = array_pop($parts);
+            foreach ($parts as $part) {
+                $result .= "\n-----\n$part";
+            }
+
+            $result .= "\n-----\n";
+            if (null !== $mode) {
+                $result .= "!!$mode\n";
+            }
+            $result .= $lastPart;
+        }
+        return $result;
+    }
+
+    private function extractMode($expected) {
+        $firstNewLine = strpos($expected, "\n");
+        if (false === $firstNewLine) {
+            $firstNewLine = strlen($expected);
+        }
+
+        $firstLine = substr($expected, 0, $firstNewLine);
+        if (0 !== strpos($firstLine, '!!')) {
+            return [$expected, null];
+        }
+
+        $expected = (string) substr($expected, $firstNewLine + 1);
+        return [$expected, substr($firstLine, 2)];
+    }
+}