Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / vendor / nikic / php-parser / test / PhpParser / CodeTestParser.php
diff --git a/vendor/nikic/php-parser/test/PhpParser/CodeTestParser.php b/vendor/nikic/php-parser/test/PhpParser/CodeTestParser.php
new file mode 100644 (file)
index 0000000..f63dc92
--- /dev/null
@@ -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)];
+    }
+}