Pull merge.
[yaffs-website] / vendor / nikic / php-parser / test_old / run.php
index bc14d893a7e100f87fd2f9af7ee2f5f2ab02aab6..8b74ab479bc8f80c03897bfe34b0006813b9d921 100644 (file)
@@ -59,9 +59,24 @@ $dir = $arguments[1];
 
 switch ($testType) {
     case 'Symfony':
-        $version = 'Php5';
+        $version = 'Php7';
         $fileFilter = function($path) {
-            return preg_match('~\.php(?:\.cache)?$~', $path) && false === strpos($path, 'skeleton');
+            if (!preg_match('~\.php$~', $path)) {
+                return false;
+            }
+
+            if (preg_match('~(?:
+# invalid php code
+  dependency-injection.Tests.Fixtures.xml.xml_with_wrong_ext
+# difference in nop statement
+| framework-bundle.Resources.views.Form.choice_widget_options\.html
+# difference due to INF
+| yaml.Tests.InlineTest
+)\.php$~x', $path)) {
+                return false;
+            }
+
+            return true;
         };
         $codeExtractor = function($file, $code) {
             return $code;
@@ -77,26 +92,31 @@ switch ($testType) {
             if (preg_match('~(?:
 # skeleton files
   ext.gmp.tests.001
-| ext.skeleton.tests.001
+| ext.skeleton.tests.00\d
 # 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
+# invalid code due to missing WS after opening tag
+| tests.run-test.bug75042-3
 # pretty print difference due to INF vs 1e1000
 | ext.standard.tests.general_functions.bug27678
 | tests.lang.bug24640
+| Zend.tests.bug74947
 # 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
+# its too hard to emulate these on old PHP versions
+| Zend.tests.flexible-heredoc-complex-test[1-4]
 )\.phpt$~x', $file)) {
                 return null;
             }
 
-            if (!preg_match('~--FILE--\s*(.*?)--[A-Z]+--~s', $code, $matches)) {
+            if (!preg_match('~--FILE--\s*(.*?)\n--[A-Z]+--~s', $code, $matches)) {
                 return null;
             }
             if (preg_match('~--EXPECT(?:F|REGEX)?--\s*(?:Parse|Fatal) error~', $code)) {
@@ -110,17 +130,24 @@ switch ($testType) {
         showHelp('Test type must be one of: PHP5, PHP7 or Symfony');
 }
 
-require_once dirname(__FILE__) . '/../lib/PhpParser/Autoloader.php';
-PhpParser\Autoloader::register();
+require_once __DIR__ . '/../vendor/autoload.php';
 
-$parserName    = 'PhpParser\Parser\\' . $version;
-$parser        = new $parserName(new PhpParser\Lexer\Emulative);
+$lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [
+    'comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos',
+]]);
+$parserName = 'PhpParser\Parser\\' . $version;
+/** @var PhpParser\Parser $parser */
+$parser = new $parserName($lexer);
 $prettyPrinter = new PhpParser\PrettyPrinter\Standard;
-$nodeDumper    = new PhpParser\NodeDumper;
+$nodeDumper = new PhpParser\NodeDumper;
 
-$parseFail = $ppFail = $compareFail = $count = 0;
+$cloningTraverser = new PhpParser\NodeTraverser;
+$cloningTraverser->addVisitor(new PhpParser\NodeVisitor\CloningVisitor);
 
-$readTime = $parseTime = $ppTime = $reparseTime = $compareTime = 0;
+$parseFail = $fpppFail = $ppFail = $compareFail = $count = 0;
+
+$readTime = $parseTime = $cloneTime = 0;
+$fpppTime = $ppTime = $reparseTime = $compareTime = 0;
 $totalStartTime = microtime(true);
 
 foreach (new RecursiveIteratorIterator(
@@ -132,10 +159,10 @@ foreach (new RecursiveIteratorIterator(
     }
 
     $startTime = microtime(true);
-    $code = file_get_contents($file);
+    $origCode = file_get_contents($file);
     $readTime += microtime(true) - $startTime;
 
-    if (null === $code = $codeExtractor($file, $code)) {
+    if (null === $origCode = $codeExtractor($file, $origCode)) {
         continue;
     }
 
@@ -149,11 +176,30 @@ foreach (new RecursiveIteratorIterator(
 
     try {
         $startTime = microtime(true);
-        $stmts = $parser->parse($code);
+        $origStmts = $parser->parse($origCode);
         $parseTime += microtime(true) - $startTime;
 
+        $origTokens = $lexer->getTokens();
+
+        $startTime = microtime(true);
+        $stmts = $cloningTraverser->traverse($origStmts);
+        $cloneTime += microtime(true) - $startTime;
+
         $startTime = microtime(true);
-        $code = '<?php' . "\n" . $prettyPrinter->prettyPrint($stmts);
+        $code = $prettyPrinter->printFormatPreserving($stmts, $origStmts, $origTokens);
+        $fpppTime += microtime(true) - $startTime;
+
+        if ($code !== $origCode) {
+            echo $file, ":\n Result of format-preserving pretty-print differs\n";
+            if ($verbose) {
+                echo "FPPP output:\n=====\n$code\n=====\n\n";
+            }
+
+            ++$fpppFail;
+        }
+
+        $startTime = microtime(true);
+        $code = "<?php\n" . $prettyPrinter->prettyPrint($stmts);
         $ppTime += microtime(true) - $startTime;
 
         try {
@@ -200,6 +246,9 @@ if (0 === $parseFail && 0 === $ppFail && 0 === $compareFail) {
     if (0 !== $ppFail) {
         echo '    ', $ppFail,      ' pretty print failures.', "\n";
     }
+    if (0 !== $fpppFail) {
+        echo '    ', $fpppFail,      ' FPPP failures.', "\n";
+    }
     if (0 !== $compareFail) {
         echo '    ', $compareFail, ' compare failures.',      "\n";
     }
@@ -210,6 +259,8 @@ echo "\n",
      "\n",
      'Reading files took:   ', $readTime,    "\n",
      'Parsing took:         ', $parseTime,   "\n",
+     'Cloning took:         ', $cloneTime,   "\n",
+     'FPPP took:            ', $fpppTime,    "\n",
      'Pretty printing took: ', $ppTime,      "\n",
      'Reparsing took:       ', $reparseTime, "\n",
      'Comparing took:       ', $compareTime, "\n",