Файл: gapps/vendor/nikic/php-parser/test_old/run.php
Строк: 185
<?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 . "nn" .
<<<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
# token_get_all bug (https://bugs.php.net/bug.php?id=60097)
| Zend.tests.bug47516
# pretty print difference due to INF vs 1e1000
| ext.standard.tests.general_functions.bug27678
| tests.lang.bug24640
# pretty print difference due to nop statements
| ext.mbstring.tests.htmlent
| ext.standard.tests.file.fread_basic
# tests using __halt_compiler as semi reserved keyword
| Zend.tests.grammar.semi_reserved_001
| Zend.tests.grammar.semi_reserved_002
| Zend.tests.grammar.semi_reserved_005
).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';
PhpParserAutoloader::register();
$parserName = 'PhpParserParser\' . $version;
$parser = new $parserName(new PhpParserLexerEmulative);
$prettyPrinter = new PhpParserPrettyPrinterStandard;
$nodeDumper = new PhpParserNodeDumper;
$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 differn";
if ($verbose) {
echo "Pretty printer output:n=====n$coden=====nn";
}
++$compareFail;
}
} catch (PhpParserError $e) {
echo $file, ":n Parse of pretty print failed with message: {$e->getMessage()}n";
if ($verbose) {
echo "Pretty printer output:n=====n$coden=====nn";
}
++$ppFail;
}
} catch (PhpParserError $e) {
echo $file, ":n Parse failed with message: {$e->getMessage()}n";
++$parseFail;
}
}
if (0 === $parseFail && 0 === $ppFail && 0 === $compareFail) {
$exit = 0;
echo "nn", 'All tests passed.', "n";
} else {
$exit = 1;
echo "nn", '==========', "nn", '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);