Security update for Core, with self-updated composer
[yaffs-website] / vendor / nikic / php-parser / test_old / run.php
diff --git a/vendor/nikic/php-parser/test_old/run.php b/vendor/nikic/php-parser/test_old/run.php
new file mode 100644 (file)
index 0000000..bc14d89
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+
+error_reporting(E_ALL | E_STRICT);
+ini_set('short_open_tag', false);
+
+if ('cli' !== php_sapi_name()) {
+    die('This script is designed for running on the command line.');
+}
+
+function showHelp($error) {
+    die($error . "\n\n" .
+<<<OUTPUT
+This script has to be called with the following signature:
+
+    php run.php [--no-progress] testType pathToTestFiles
+
+The test type must be one of: PHP5, PHP7 or Symfony.
+
+The following options are available:
+
+    --no-progress    Disables showing which file is currently tested.
+
+OUTPUT
+    );
+}
+
+$options = array();
+$arguments = array();
+
+// remove script name from argv
+array_shift($argv);
+
+foreach ($argv as $arg) {
+    if ('-' === $arg[0]) {
+        $options[] = $arg;
+    } else {
+        $arguments[] = $arg;
+    }
+}
+
+if (count($arguments) !== 2) {
+    showHelp('Too little arguments passed!');
+}
+
+$showProgress = true;
+$verbose = false;
+foreach ($options as $option) {
+    if ($option === '--no-progress') {
+        $showProgress = false;
+    } elseif ($option === '--verbose') {
+        $verbose = true;
+    } else {
+        showHelp('Invalid option passed!');
+    }
+}
+
+$testType = $arguments[0];
+$dir = $arguments[1];
+
+switch ($testType) {
+    case 'Symfony':
+        $version = 'Php5';
+        $fileFilter = function($path) {
+            return preg_match('~\.php(?:\.cache)?$~', $path) && false === strpos($path, 'skeleton');
+        };
+        $codeExtractor = function($file, $code) {
+            return $code;
+        };
+        break;
+    case 'PHP5':
+    case 'PHP7':
+    $version = $testType === 'PHP5' ? 'Php5' : 'Php7';
+        $fileFilter = function($path) {
+            return preg_match('~\.phpt$~', $path);
+        };
+        $codeExtractor = function($file, $code) {
+            if (preg_match('~(?:
+# skeleton files
+  ext.gmp.tests.001
+| ext.skeleton.tests.001
+# multibyte encoded files
+| ext.mbstring.tests.zend_multibyte-01
+| Zend.tests.multibyte.multibyte_encoding_001
+| Zend.tests.multibyte.multibyte_encoding_004
+| Zend.tests.multibyte.multibyte_encoding_005
+# pretty print difference due to INF vs 1e1000
+| ext.standard.tests.general_functions.bug27678
+| tests.lang.bug24640
+# pretty print differences due to negative LNumbers
+| Zend.tests.neg_num_string
+| Zend.tests.bug72918
+# pretty print difference due to nop statements
+| ext.mbstring.tests.htmlent
+| ext.standard.tests.file.fread_basic
+)\.phpt$~x', $file)) {
+                return null;
+            }
+
+            if (!preg_match('~--FILE--\s*(.*?)--[A-Z]+--~s', $code, $matches)) {
+                return null;
+            }
+            if (preg_match('~--EXPECT(?:F|REGEX)?--\s*(?:Parse|Fatal) error~', $code)) {
+                return null;
+            }
+
+            return $matches[1];
+        };
+        break;
+    default:
+        showHelp('Test type must be one of: PHP5, PHP7 or Symfony');
+}
+
+require_once dirname(__FILE__) . '/../lib/PhpParser/Autoloader.php';
+PhpParser\Autoloader::register();
+
+$parserName    = 'PhpParser\Parser\\' . $version;
+$parser        = new $parserName(new PhpParser\Lexer\Emulative);
+$prettyPrinter = new PhpParser\PrettyPrinter\Standard;
+$nodeDumper    = new PhpParser\NodeDumper;
+
+$parseFail = $ppFail = $compareFail = $count = 0;
+
+$readTime = $parseTime = $ppTime = $reparseTime = $compareTime = 0;
+$totalStartTime = microtime(true);
+
+foreach (new RecursiveIteratorIterator(
+             new RecursiveDirectoryIterator($dir),
+             RecursiveIteratorIterator::LEAVES_ONLY)
+         as $file) {
+    if (!$fileFilter($file)) {
+        continue;
+    }
+
+    $startTime = microtime(true);
+    $code = file_get_contents($file);
+    $readTime += microtime(true) - $startTime;
+
+    if (null === $code = $codeExtractor($file, $code)) {
+        continue;
+    }
+
+    set_time_limit(10);
+
+    ++$count;
+
+    if ($showProgress) {
+        echo substr(str_pad('Testing file ' . $count . ': ' . substr($file, strlen($dir)), 79), 0, 79), "\r";
+    }
+
+    try {
+        $startTime = microtime(true);
+        $stmts = $parser->parse($code);
+        $parseTime += microtime(true) - $startTime;
+
+        $startTime = microtime(true);
+        $code = '<?php' . "\n" . $prettyPrinter->prettyPrint($stmts);
+        $ppTime += microtime(true) - $startTime;
+
+        try {
+            $startTime = microtime(true);
+            $ppStmts = $parser->parse($code);
+            $reparseTime += microtime(true) - $startTime;
+
+            $startTime = microtime(true);
+            $same = $nodeDumper->dump($stmts) == $nodeDumper->dump($ppStmts);
+            $compareTime += microtime(true) - $startTime;
+
+            if (!$same) {
+                echo $file, ":\n    Result of initial parse and parse after pretty print differ\n";
+                if ($verbose) {
+                    echo "Pretty printer output:\n=====\n$code\n=====\n\n";
+                }
+
+                ++$compareFail;
+            }
+        } catch (PhpParser\Error $e) {
+            echo $file, ":\n    Parse of pretty print failed with message: {$e->getMessage()}\n";
+            if ($verbose) {
+                echo "Pretty printer output:\n=====\n$code\n=====\n\n";
+            }
+
+            ++$ppFail;
+        }
+    } catch (PhpParser\Error $e) {
+        echo $file, ":\n    Parse failed with message: {$e->getMessage()}\n";
+
+        ++$parseFail;
+    }
+}
+
+if (0 === $parseFail && 0 === $ppFail && 0 === $compareFail) {
+    $exit = 0;
+    echo "\n\n", 'All tests passed.', "\n";
+} else {
+    $exit = 1;
+    echo "\n\n", '==========', "\n\n", 'There were: ', "\n";
+    if (0 !== $parseFail) {
+        echo '    ', $parseFail,   ' parse failures.',        "\n";
+    }
+    if (0 !== $ppFail) {
+        echo '    ', $ppFail,      ' pretty print failures.', "\n";
+    }
+    if (0 !== $compareFail) {
+        echo '    ', $compareFail, ' compare failures.',      "\n";
+    }
+}
+
+echo "\n",
+     'Tested files:         ', $count,        "\n",
+     "\n",
+     'Reading files took:   ', $readTime,    "\n",
+     'Parsing took:         ', $parseTime,   "\n",
+     'Pretty printing took: ', $ppTime,      "\n",
+     'Reparsing took:       ', $reparseTime, "\n",
+     'Comparing took:       ', $compareTime, "\n",
+     "\n",
+     'Total time:           ', microtime(true) - $totalStartTime, "\n",
+     'Maximum memory usage: ', memory_get_peak_usage(true), "\n";
+
+exit($exit);