Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/xampp/php/tests/ |
<?php /** * Test suite for the PHP_CompatInfo class * * PHP version 5 * * @category PHP * @package PHP_CompatInfo * @author Laurent Laville <pear@laurent-laville.org> * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version CVS: $Id: PHP_CompatInfo_TestSuite_Standard.php,v 1.54 2008/12/31 14:32:28 farell Exp $ * @link http://pear.php.net/package/PHP_CompatInfo * @since File available since Release 1.6.0 */ if (!defined("PHPUnit_MAIN_METHOD")) { define("PHPUnit_MAIN_METHOD", "PHP_CompatInfo_TestSuite_Standard::main"); } require_once "PHPUnit/Framework/TestCase.php"; require_once "PHPUnit/Framework/TestSuite.php"; require_once 'PHP/CompatInfo.php'; /** * Test suite class to test standard PHP_CompatInfo API. * * @category PHP * @package PHP_CompatInfo * @author Laurent Laville <pear@laurent-laville.org> * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version Release: 1.9.0 * @link http://pear.php.net/package/PHP_CompatInfo * @since File available since Release 1.6.0 */ class PHP_CompatInfo_TestSuite_Standard extends PHPUnit_Framework_TestCase { /** * A PCI object * @var object */ protected $pci; /** * Filename where to write results of debug pci events notification * @var string * @since 1.8.0RC1 */ private $destLogFile; /** * Runs the test methods of this class. * * @return void */ public static function main() { include_once "PHPUnit/TextUI/TestRunner.php"; $suite = new PHPUnit_Framework_TestSuite('PHP_CompatInfo Standard Tests'); PHPUnit_TextUI_TestRunner::run($suite); } /** * Sets up the fixture. * This method is called before a test is executed. * * @return void */ protected function setUp() { $this->destLogFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . __CLASS__ . '.log'; $this->pci = new PHP_CompatInfo('null'); $this->pci->addListener(array(&$this, 'debugNotify')); } /** * Tears down the fixture. * This method is called after a test is executed. * * @return void */ protected function tearDown() { unset($this->pci); } /** * PCI Events notification observer for debug purpose only * * @param object &$auditEvent Instance of Event_Notification object * * @return void */ public function debugNotify(&$auditEvent) { $notifyName = $auditEvent->getNotificationName(); $notifyInfo = $auditEvent->getNotificationInfo(); if ($notifyName == PHP_COMPATINFO_EVENT_AUDITSTARTED) { $dbt = debug_backtrace(); error_log('backtrace: '. $dbt[7]['function'] . PHP_EOL, 3, $this->destLogFile); error_log($notifyName.':'. PHP_EOL . var_export($notifyInfo, true) . PHP_EOL, 3, $this->destLogFile); } elseif ($notifyName == PHP_COMPATINFO_EVENT_AUDITFINISHED) { error_log($notifyName.':'. PHP_EOL . var_export($notifyInfo, true) . PHP_EOL, 3, $this->destLogFile); } } /** * Retrieve files list to be ignore by parsing process * * @param string $dir Directory to parse * @param array $options Parser options * * @return array * @since version 1.8.0RC1 */ private function getIgnoredFileList($dir, $options) { $files = $this->pci->parser->getFileList($dir, $options); $ff = new File_Find(); $ff->dirsep = DIRECTORY_SEPARATOR; list(, $allfiles) = $ff->maptree($dir); $ignored_files = PHP_CompatInfo_Parser::_arrayDiff($allfiles, $files); return $ignored_files; } /** * Test if a dictionary for an Extension is available or not * * @param array $resources List of Extension dictionaries * that should be present to perform a unit test * @param array &$testSkipped Reasons of tests skipped * * @return bool * @since version 1.9.0b2 */ private function isResourceAvailable($resources, &$testSkipped) { $dict = array(); foreach ($resources as $ext) { if (!isset($GLOBALS['_PHP_COMPATINFO_FUNC_'.strtoupper($ext)])) { $dict[] = $ext; } } if (count($dict) == 1) { $testSkipped[] = 'The '. $dict[0] . ' function dictionary is not available.'; } elseif (count($dict) > 1) { $testSkipped[] = 'The '. implode(',', $dict) . ' function dictionaries are not available.'; } return (count($testSkipped) == 0); } /** * Tests tokenizer with a single file and empty contents * * @return void * @group standard */ public function testTokenizerWithEmptyFile() { if (token_name(311) !== 'T_INLINE_HTML') { $this->markTestSkipped('Tokens values of Tokenizer have changed'); } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'empty.php'; $r = $this->pci->parser->_tokenize($fn, false); $empty = array(0 => array ( 0 => 311, 1 => "\n", 2 => 1)); $this->assertSame($empty, $r); $r = $this->pci->parser->_tokenize($fn, false, true); $empty = array(0 => array ( 0 => 311, 1 => "\n", 2 => 1, 3 => 'T_INLINE_HTML')); $this->assertSame($empty, $r); } /** * Tests parsing a single file that does not exists * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseInvalidFile() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'nothere.php'; $r = $this->pci->parseFile($fn); $this->assertFalse($r); } /** * Tests parsing a single file with empty contents * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseEmptyFile() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'empty.php'; $r = $this->pci->parseFile($fn); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.0.0', 'classes' => array(), 'functions' => array(), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseNotEmptyFile() { $resources = array('bcmath', 'pcre'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'math.php'; $r = $this->pci->parseFile($fn); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.0.0', 'classes' => array(), 'functions' => array('bcsub', 'preg_match'), 'extensions' => array('bcmath', 'pcre'), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_functions' option * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreFunctions() { $resources = array('date'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_functions' => array('simplexml_load_file')); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('simplexml_load_file'), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.1', 'classes' => array(), 'functions' => array('basename', 'date', 'debug_backtrace', 'define', 'defined', 'dirname', 'function_exists', 'phpversion', 'simplexml_load_file', 'strtoupper', 'substr', 'version_compare'), 'extensions' => array('date'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_EOL', 'PHP_OS', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_constants' option * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreConstants() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_constants' => array('PHP_EOL')); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array('PHP_EOL'), 'max_version' => '', 'version' => '5.1.1', 'classes' => array(), 'functions' => array('basename', 'date', 'debug_backtrace', 'define', 'defined', 'dirname', 'function_exists', 'phpversion', 'simplexml_load_file', 'strtoupper', 'substr', 'version_compare'), 'extensions' => array('date', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_EOL', 'PHP_OS', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_extensions' option * * @return void * @link http://www.php.net/zip * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreExtensions() { $resources = array('zip'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'zip.php'; $opt = array('ignore_extensions' => array('zip')); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('zip_close', 'zip_entry_compressedsize', 'zip_entry_compressionmethod', 'zip_entry_filesize', 'zip_entry_name', 'zip_open', 'zip_read'), 'ignored_extensions' => array('zip'), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.0.0', 'classes' => array(), 'functions' => array('zip_close', 'zip_entry_compressedsize', 'zip_entry_compressionmethod', 'zip_entry_filesize', 'zip_entry_name', 'zip_open', 'zip_read'), 'extensions' => array('zip'), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_versions' option * Ignored all PHP functions between 4.3.10 and 4.4.8 * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreVersions() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_versions' => array('4.3.10', '4.4.8')); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.1', 'classes' => array(), 'functions' => array('basename', 'date', 'debug_backtrace', 'define', 'defined', 'dirname', 'function_exists', 'phpversion', 'simplexml_load_file', 'strtoupper', 'substr', 'version_compare'), 'extensions' => array('date', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_OS', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5)); $this->assertSame($exp, $r); } /** * Tests parsing an invalid input * * @return void * @covers PHP_CompatInfo::parseString * @group parseString * @group standard */ public function testParseInvalidString() { $in = array(); $r = $this->pci->parseString($in); $this->assertFalse($r); } /** * Tests parsing a string * * @return void * @covers PHP_CompatInfo::parseString * @group parseString * @group standard */ public function testParseNotEmptyString() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'sample_req6056.php'; $str = file_get_contents($fn); $r = $this->pci->parseString($str); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '5.0.4', 'version' => '5.1.0', 'classes' => array(), 'functions' => array('array_diff_key', 'php_check_syntax'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing string DATE constants * * @return void * @link http://php.net/manual/en/ref.datetime.php Predefined Date Constants * @covers PHP_CompatInfo::parseString * @group parseString * @group standard */ public function testParseDate511String() { $str = '<?php $nl = "\n"; echo "$nl Atom = " . DATE_ATOM; echo "$nl Cookie = " . DATE_COOKIE; echo "$nl Iso8601 = " . DATE_ISO8601; echo "$nl Rfc822 = " . DATE_RFC822; echo "$nl Rfc850 = " . DATE_RFC850; echo "$nl Rfc1036 = " . DATE_RFC1036; echo "$nl Rfc1123 = " . DATE_RFC1123; echo "$nl Rfc2822 = " . DATE_RFC2822; echo "$nl RSS = " . DATE_RSS; echo "$nl W3C = " . DATE_W3C; ?>'; $r = $this->pci->parseString($str); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.1', 'classes' => array(), 'functions' => array(), 'extensions' => array(), 'constants' => array('DATE_ATOM', 'DATE_COOKIE', 'DATE_ISO8601', 'DATE_RFC1036', 'DATE_RFC1123', 'DATE_RFC2822', 'DATE_RFC822', 'DATE_RFC850', 'DATE_RSS', 'DATE_W3C'), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing string DATE constants * * @return void * @link http://php.net/manual/en/ref.datetime.php Predefined Date Constants * @covers PHP_CompatInfo::parseString * @group parseString * @group standard */ public function testParseDate513String() { $str = '<?php $nl = "\n"; echo "$nl Rfc3339 = " . DATE_RFC3339; echo "$nl RSS = " . DATE_RSS; ?>'; $r = $this->pci->parseString($str); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.3', 'classes' => array(), 'functions' => array(), 'extensions' => array(), 'constants' => array('DATE_RFC3339', 'DATE_RSS'), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing string UPLOAD_ERR constants * * @return void * @link http://www.php.net/features.file-upload.errors * File Upload Error specific Constants * @covers PHP_CompatInfo::parseString * @group parseString * @group standard */ public function testParseUploadErrString() { $str = '<?php $uploadErrors = array( UPLOAD_ERR_INI_SIZE => "The uploaded file exceeds the upload_max_filesize directive in php.ini.", UPLOAD_ERR_FORM_SIZE => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.", UPLOAD_ERR_PARTIAL => "The uploaded file was only partially uploaded.", UPLOAD_ERR_NO_FILE => "No file was uploaded.", UPLOAD_ERR_NO_TMP_DIR => "Missing a temporary folder.", UPLOAD_ERR_CANT_WRITE => "Failed to write file to disk.", UPLOAD_ERR_EXTENSION => "File upload stopped by extension.", ); $errorCode = $_FILES["myUpload"]["error"]; if ($errorCode !== UPLOAD_ERR_OK) { if (isset($uploadErrors[$errorCode])) { throw new Exception($uploadErrors[$errorCode]); } else { throw new Exception("Unknown error uploading file."); } } ?>'; $r = $this->pci->parseString($str); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'functions' => array(), 'extensions' => array(), 'constants' => array('UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('throw'), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a directory that does not exists * * @return void * @covers PHP_CompatInfo::parseFolder * @group parseDir * @group standard */ public function testParseInvalidDirectory() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds . 'nothere'; $r = $this->pci->parseFolder($dir); $this->assertFalse($r); } /** * Tests parsing a directory without recursive 'recurse_dir' option * * @return void * @covers PHP_CompatInfo::parseDir * @group parseDir * @group standard */ public function testParseNoRecursiveDirectory() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir'; $opt = array('recurse_dir' => false); $r = $this->pci->parseDir($dir, $opt); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'phpinfo', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(2), $dir . $ds . 'extensions.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(2)), $dir . $ds . 'phpinfo.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.0.0', 'classes' => array(), 'functions' => array('phpinfo'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0))); $this->assertSame($exp, $r); } /** * Tests parsing a directory with 'recurse_dir' option active * and filter files by extension with 'file_ext' option * * @return void * @covers PHP_CompatInfo::parseDir * @group parseDir * @group standard */ public function testParseRecursiveDirectory() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $r = $this->pci->parseDir($dir, $opt); $exp = array('ignored_files' => $this->getIgnoredFileList($dir, $opt), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'phpinfo', 'print_r', 'sqlite_libversion', 'str_replace', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE', 'UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('abstract', 'catch', 'clone', 'final', 'implements', 'instanceof', 'interface', 'private', 'protected', 'public', 'throw', 'try'), 'cond_code' => array(2), $dir . 'extensions.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(2)), $dir . 'phpinfo.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.0.0', 'classes' => array(), 'functions' => array('phpinfo'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)), $dir . 'PHP5' . $ds . 'tokens.php5' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array('Exception'), 'functions' => array('str_replace'), 'extensions' => array(), 'constants' => array(), 'tokens' => array('abstract', 'catch', 'clone', 'final', 'implements', 'instanceof', 'interface', 'private', 'protected', 'public', 'throw', 'try'), 'cond_code' => array(0)), $dir . 'PHP5' . $ds . 'upload_error.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'functions' => array(), 'extensions' => array(), 'constants' => array('UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('throw'), 'cond_code' => array(0))); $this->assertSame($exp, $r); } /** * Tests parsing a directory with 'recurse_dir' option active * with 'ignore_files' options * * @return void * @covers PHP_CompatInfo::parseDir * @group parseDir * @group standard */ public function testParseRecursiveDirectoryWithIgnoreFiles() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'ignore_files' => array($dir . 'phpinfo.php'), 'file_ext' => array('php')); $r = $this->pci->parseDir($dir, $opt); $exp = array('ignored_files' => $this->getIgnoredFileList($dir, $opt), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE', 'UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('throw'), 'cond_code' => array(2), $dir . 'extensions.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(2)), $dir . 'PHP5' . $ds . 'upload_error.php' => array('ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'functions' => array(), 'extensions' => array(), 'constants' => array('UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('throw'), 'cond_code' => array(0))); $this->assertSame($exp, $r); } /** * Tests parsing multiple file data sources reference * * @return void * @covers PHP_CompatInfo::parseArray * @group parseArray * @group standard */ public function testParseArrayFile() { $resources = array('pcre'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseFile'; $src = array($dir . $ds . 'File_Find-1.3.0__Find.php'); $r = $this->pci->parseArray($src); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.0', 'classes' => array('File_Find'), 'functions' => array('_file_find_match_shell_get_pattern', 'addcslashes', 'array_merge', 'array_pop', 'array_push', 'basename', 'closedir', 'count', 'define', 'defined', 'each', 'explode', 'glob', 'implode', 'is_a', 'is_array', 'is_dir', 'is_readable', 'maptree', 'maptreemultiple', 'opendir', 'preg_match', 'preg_replace', 'preg_split', 'print_r', 'readdir', 'reset', 'search', 'sizeof', 'str_replace', 'strcasecmp', 'strlen', 'strpos', 'substr', 'substr_count'), 'extensions' => array('pcre'), 'constants' => array('FALSE', 'NULL', 'PREG_SPLIT_DELIM_CAPTURE', 'PREG_SPLIT_NO_EMPTY', 'TRUE'), 'tokens' => array(), 'cond_code' => array(4)); $this->assertSame($exp, $r); } /** * Tests parsing multiple file data sources reference * with option 'ignore_files' * * @return void * @covers PHP_CompatInfo::parseArray * @group parseArray * @group standard */ public function testParseArrayFileWithIgnoreFiles() { $resources = array('pcre'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $inc = get_included_files(); $dir = dirname(__FILE__) . $ds . 'parseFile'; $src = array($dir . $ds . 'File_Find-1.3.0__Find.php'); $excl = array(); foreach ($inc as $file) { if (basename($file) == 'PEAR.php') { $excl[] = $file; $src[] = $file; } } $opt = array('ignore_files' => $excl); $r = $this->pci->parseArray($src, $opt); $exp = array('ignored_files' => $excl, 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.0', 'classes' => array('File_Find'), 'functions' => array('_file_find_match_shell_get_pattern', 'addcslashes', 'array_merge', 'array_pop', 'array_push', 'basename', 'closedir', 'count', 'define', 'defined', 'each', 'explode', 'glob', 'implode', 'is_a', 'is_array', 'is_dir', 'is_readable', 'maptree', 'maptreemultiple', 'opendir', 'preg_match', 'preg_replace', 'preg_split', 'print_r', 'readdir', 'reset', 'search', 'sizeof', 'str_replace', 'strcasecmp', 'strlen', 'strpos', 'substr', 'substr_count'), 'extensions' => array('pcre'), 'constants' => array('FALSE', 'NULL', 'PREG_SPLIT_DELIM_CAPTURE', 'PREG_SPLIT_NO_EMPTY', 'TRUE'), 'tokens' => array(), 'cond_code' => array(4)); $this->assertSame($exp, $r); } /** * Tests parsing multiple strings (chunk of code) * * @return void * @covers PHP_CompatInfo::parseArray * @group parseArray * @group standard */ public function testParseArrayString() { $code1 = "<?php php_check_syntax('somefile.php'); ?>"; $code2 = "<?php \$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); \$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8); \$diff = array_diff_key(\$array1, \$array2); ?>"; $data = array($code1, $code2); $opt = array('is_string' => true); $r = $this->pci->parseArray($data, $opt); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '5.0.4', 'version' => '5.1.0', 'classes' => array(), 'functions' => array('array_diff_key', 'php_check_syntax'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0), 'string_1' => array( 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '5.0.4', 'version' => '5.0.0', 'classes' => array(), 'functions' => array('php_check_syntax'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)), 'string_2' => array( 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.0', 'classes' => array(), 'functions' => array('array_diff_key'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)) ); $this->assertSame($exp, $r); } /** * Tests parsing nothing (all files are excluded from scope) * * @return void * @covers PHP_CompatInfo::parseArray * @group parseArray * @group standard */ public function testParseArrayWithNoFiles() { $files = get_included_files(); $opt = array('ignore_files' => $files); $r = $this->pci->parseArray($files, $opt); $this->assertFalse($r); } /** * Tests loading functions list for a PHP version * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersion() { $resources = array('date', 'filter', 'gd', 'gmp', 'mbstring', 'ming', 'mysql', 'openssl', 'pgsql', 'posix', 'snmp', 'spl'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $r = $this->pci->loadVersion('5.2.0'); $exp = array('array_fill_keys', 'error_get_last', 'filter_has_var', 'filter_id', 'filter_input', 'filter_input_array', 'filter_list', 'filter_var', 'filter_var_array', 'gmp_nextprime', 'imagegrabscreen', 'imagegrabwindow', 'iterator_apply', 'mb_list_encodings_alias_names', 'mb_list_mime_names', 'mb_stripos', 'mb_stristr', 'mb_strrchr', 'mb_strrichr', 'mb_strripos', 'mb_strstr', 'memory_get_peak_usage', 'ming_setswfcompression', 'mysql_set_charset', 'openssl_csr_get_public_key', 'openssl_csr_get_subject', 'openssl_pkcs12_export', 'openssl_pkcs12_export_to_file', 'openssl_pkcs12_read', 'openssl_pkey_get_details', 'pg_field_table', 'php_ini_loaded_file', 'posix_initgroups', 'preg_last_error', 'snmp_set_oid_output_format', 'spl_object_hash', 'stream_is_local', 'stream_socket_shutdown', 'sys_get_temp_dir', 'timezone_transitions_get'); $this->assertSame($exp, $r); } /** * Tests loading functions list for a PHP version range * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersionRange() { $resources = array('date', 'filter', 'gd', 'gmp', 'mbstring', 'ming', 'openssl', 'pgsql', 'posix', 'snmp', 'spl'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $r = $this->pci->loadVersion('5.2.0', '5.2.2'); $exp = array('array_fill_keys', 'error_get_last', 'filter_has_var', 'filter_id', 'filter_input', 'filter_input_array', 'filter_list', 'filter_var', 'filter_var_array', 'gmp_nextprime', 'imagegrabscreen', 'imagegrabwindow', 'iterator_apply', 'mb_list_encodings_alias_names', 'mb_list_mime_names', 'mb_stripos', 'mb_stristr', 'mb_strrchr', 'mb_strrichr', 'mb_strripos', 'mb_strstr', 'memory_get_peak_usage', 'ming_setswfcompression', 'openssl_csr_get_public_key', 'openssl_csr_get_subject', 'openssl_pkcs12_export', 'openssl_pkcs12_export_to_file', 'openssl_pkcs12_read', 'openssl_pkey_get_details', 'pg_field_table', 'posix_initgroups', 'preg_last_error', 'snmp_set_oid_output_format', 'spl_object_hash', 'stream_socket_shutdown', 'sys_get_temp_dir', 'timezone_transitions_get'); $this->assertSame($exp, $r); } /** * Tests loading function list for a range of PHP version, * group by version number * * What's new with versions 4.3.2 to 4.4.0 : 13 + 30 + 5 functions * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersionRangeGroupByVersion() { $resources = array('bz2', 'gd', 'imap', 'oci8', 'snmp', 'zlib'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $r = $this->pci->loadVersion('4.3.2', '4.4.0', false, true); $exp = array('4.3.2' => array('apache_get_modules', 'apache_get_version', 'domxml_attr_set_value', 'domxml_doc_free_doc', 'imageantialias', 'imagecolorallocatealpha', 'imageistruecolor', 'imagesavealpha', 'memory_get_usage', 'ocipasswordchange', 'session_regenerate_id', 'stream_wrapper_register', 'zlib_get_coding_type'), '4.3.3' => array('bzclose', 'bzcompress', 'bzdecompress', 'bzerrno', 'bzerror', 'bzerrstr', 'bzflush', 'bzopen', 'bzread', 'bzwrite', 'imap_timeout', 'nsapi_request_headers', 'nsapi_response_headers', 'nsapi_virtual', 'snmp_get_valueretrieval', 'snmp_set_valueretrieval', 'solid_fetch_prev', 'swfmovie_add', 'swfmovie_init', 'swfmovie_labelframe', 'swfmovie_nextframe', 'swfmovie_output', 'swfmovie_save', 'swfmovie_savetofile', 'swfmovie_setbackground', 'swfmovie_setdimension', 'swfmovie_setframes', 'swfmovie_setrate', 'swfmovie_streammp3', 'swfsprite_labelframe'), '4.4.0' => array('session_commit', 'snmp2_get', 'snmp2_real_walk', 'snmp2_set', 'snmp2_walk')); $this->assertSame($exp, $r); } /** * Tests loading function+constant list for a single PHP version * * What's new with version 4.3.10 : 0 functions and 2 new constants * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersionRangeWithConstant() { $r = $this->pci->loadVersion('4.3.10', '4.3.10', true); $exp = array('functions' => array(), 'constants' => array('PHP_EOL', 'UPLOAD_ERR_NO_TMP_DIR')); $this->assertSame($exp, $r); } /** * Tests loading function list for a range of PHP version, * group by version number * * What's new with versions 4.3.2 to 4.4.0 : 13 + 30 + 5 functions * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersionRangeWithConstantGroupByVersion() { $resources = array('bz2', 'gd', 'imap', 'oci8', 'snmp', 'zlib'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $r = $this->pci->loadVersion('4.3.2', '4.4.0', true, true); $exp = array('functions' => array( '4.3.2' => array('apache_get_modules', 'apache_get_version', 'domxml_attr_set_value', 'domxml_doc_free_doc', 'imageantialias', 'imagecolorallocatealpha', 'imageistruecolor', 'imagesavealpha', 'memory_get_usage', 'ocipasswordchange', 'session_regenerate_id', 'stream_wrapper_register', 'zlib_get_coding_type'), '4.3.3' => array('bzclose', 'bzcompress', 'bzdecompress', 'bzerrno', 'bzerror', 'bzerrstr', 'bzflush', 'bzopen', 'bzread', 'bzwrite', 'imap_timeout', 'nsapi_request_headers', 'nsapi_response_headers', 'nsapi_virtual', 'snmp_get_valueretrieval', 'snmp_set_valueretrieval', 'solid_fetch_prev', 'swfmovie_add', 'swfmovie_init', 'swfmovie_labelframe', 'swfmovie_nextframe', 'swfmovie_output', 'swfmovie_save', 'swfmovie_savetofile', 'swfmovie_setbackground', 'swfmovie_setdimension', 'swfmovie_setframes', 'swfmovie_setrate', 'swfmovie_streammp3', 'swfsprite_labelframe'), '4.4.0' => array('session_commit', 'snmp2_get', 'snmp2_real_walk', 'snmp2_set', 'snmp2_walk')), 'constants' => array( '4.3.10' => array('PHP_EOL', 'UPLOAD_ERR_NO_TMP_DIR') )); $this->assertSame($exp, $r); } /** * Tests loading function+constant list for a PHP version range * * What's new with since version 5.2.1 : 24 new functions and 0 constant * * @return void * @covers PHP_CompatInfo::loadVersion * @group loadVersion * @group standard */ public function testLoadVersionWithConstant() { $resources = array('gd', 'ming', 'openssl'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $r = $this->pci->loadVersion('5.2.1', false, true); $exp = array('functions' => array('imagegrabscreen', 'imagegrabwindow', 'ming_setswfcompression', 'mysql_set_charset', 'openssl_pkcs12_export', 'openssl_pkcs12_export_to_file', 'openssl_pkcs12_read', 'php_ini_loaded_file', 'stream_is_local', 'stream_socket_shutdown', 'sys_get_temp_dir'), 'constants' => array('PCRE_VERSION', 'PREG_BAD_UTF8_OFFSET_ERROR')); $this->assertSame($exp, $r); } /** * Tests the PHP Method chaining feature introduced with PHP5 * Sample #1 * * @link http://cowburn.info/php/php5-method-chaining/ * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testPHP5MethodChainingSamp1() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'php5_method_chaining.php'; $r = $this->pci->parseFile($fn); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array('Person'), 'functions' => array('printf'), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests the PHP Method chaining feature introduced with PHP5. * Sample #2 * * @return void * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testPHP5MethodChainingSamp2() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'php5_method_chaining_samp2.php'; $r = $this->pci->parseFile($fn); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array(), 'functions' => array(), 'extensions' => array(), 'constants' => array(), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_functions_match' option * Sample #1 * * Exclude all functions that are referenced by php function_exists(), * and match regular expressions : * - word file_put_contents (case insensitive) * - beginning with debug (case sensitive) * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreFunctionsMatchSamp1() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'ignore_functions_match.php'; $opt = array('ignore_functions_match' => array('function_exists', array('/^File_put_contents$/i', '/^debug/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('debug_backtrace', 'file_put_contents'), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array(), 'functions' => array('debug_backtrace', 'debug_print_backtrace', 'fclose', 'file_put_contents', 'fopen', 'fwrite'), 'extensions' => array(), 'constants' => array('FALSE'), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_functions_match' option * Sample #2 * * Exclude (from scope) all functions that are 'debug' prefixed (case sensitive). * * If you want a case-insensitive search add an "i" after the pattern delimiter, * like that: '/^debug/i' * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreFunctionsMatchSamp2() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'ignore_functions_match.php'; $opt = array('ignore_functions_match' => array('preg_match', array('/^debug/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('debug_backtrace', 'debug_print_backtrace'), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array(), 'functions' => array('debug_backtrace', 'debug_print_backtrace', 'fclose', 'file_put_contents', 'fopen', 'function_exists', 'fwrite'), 'extensions' => array(), 'constants' => array('FALSE'), 'tokens' => array(), 'cond_code' => array(1)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_functions_match' option * Sample #3 * * When I don't know the script to parse (most case), I would really * exclude from scope all functions that are conditionned by function_exists(). * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreFunctionsMatchSamp3() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'ignore_functions_match.php'; $opt = array('ignore_functions_match' => array('function_exists', array('/.*/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('debug_backtrace', 'file_put_contents'), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.0.0', 'classes' => array(), 'functions' => array('debug_backtrace', 'debug_print_backtrace', 'fclose', 'file_put_contents', 'fopen', 'fwrite'), 'extensions' => array(), 'constants' => array('FALSE'), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_extensions_match' option * Sample #1 * * Exclude all extensions (and their functions) that are referenced by * php extension_loaded(), and match regular expressions * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreExtensionsMatchSamp1() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseDir' . $ds . 'extensions.php'; $opt = array('ignore_extensions_match' => array('extension_loaded', array('/^SQLite$/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('sqlite_libversion'), 'ignored_extensions' => array('SQLite'), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(0)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_extensions_match' option * Sample #2 * * Exclude all extensions (and their functions) that are referenced freely by * preg_match clause, and match regular expression: * - beginning with 'xdebug' (case sensitive) * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreExtensionsMatchSamp2() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseDir' . $ds . 'extensions.php'; $opt = array('ignore_extensions_match' => array('preg_match', array('/^xdebug/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array('xdebug_start_trace', 'xdebug_stop_trace'), 'ignored_extensions' => array('xdebug'), 'ignored_constants' => array(), 'max_version' => '', 'version' => '4.3.2', 'classes' => array(), 'functions' => array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE'), 'tokens' => array(), 'cond_code' => array(2)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_constants_match' option * Sample #1 * * Exclude all constants that are referenced by php defined(), * and match regular expressions * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreConstantsMatchSamp1() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_constants_match' => array('defined', array('/^directory/i'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array('DIRECTORY_SEPARATOR'), 'max_version' => '', 'version' => '5.1.1', 'classes' => array(), 'functions' => array('basename', 'date', 'debug_backtrace', 'define', 'dirname', 'function_exists', 'phpversion', 'simplexml_load_file', 'strtoupper', 'substr', 'version_compare'), 'extensions' => array( 'date', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_EOL', 'PHP_OS', '__FILE__'), 'tokens' => array(), 'cond_code' => array(1)); $this->assertSame($exp, $r); } /** * Tests parsing a single file with 'ignore_constants_match' option * Sample #2 * * Exclude all constants that freely match regular expressions * * @return void * @since version 1.7.0 * @covers PHP_CompatInfo::parseFile * @group parseFile * @group standard */ public function testParseFileWithIgnoreConstantsMatchSamp2() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_constants_match' => array('preg_match', array('/^dir/i', '/^DATE_W3C$/'))); $r = $this->pci->parseFile($fn, $opt); $this->assertType('array', $r); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR'), 'max_version' => '', 'version' => '5.0.0', 'classes' => array(), 'functions' => array('basename', 'date', 'debug_backtrace', 'define', 'defined', 'dirname', 'function_exists', 'phpversion', 'simplexml_load_file', 'strtoupper', 'substr', 'version_compare'), 'extensions' => array('date', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_EOL', 'PHP_OS', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5)); $this->assertSame($exp, $r); } /** * Tests parsing multiple strings (chunk of code) * and return minimum PHP version required * * @return void * @covers PHP_CompatInfo::getVersion * @group getVersion * @group standard */ public function testGetVersion() { $code1 = "<?php php_check_syntax('somefile.php'); ?>"; $code2 = "<?php \$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); \$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8); \$diff = array_diff_key(\$array1, \$array2); ?>"; $data = array($code1, $code2); $opt = array('is_string' => true); $this->pci->parseArray($data, $opt); $r = $this->pci->getVersion(); $exp = '5.1.0'; $this->assertEquals($exp, $r); } /** * Tests parsing multiple strings (chunk of code) * and return maximum PHP version * * @return void * @covers PHP_CompatInfo::getVersion * @group getVersion * @group standard */ public function testGetVersionWithMax() { $code1 = "<?php php_check_syntax('somefile.php'); ?>"; $code2 = "<?php \$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); \$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8); \$diff = array_diff_key(\$array1, \$array2); ?>"; $data = array($code1, $code2); $opt = array('is_string' => true); $this->pci->parseArray($data, $opt); $r = $this->pci->getVersion(false, true); $exp = '5.0.4'; $this->assertEquals($exp, $r); } /** * Tests parsing a file and get classes declared (end-user defined) * * @return void * @covers PHP_CompatInfo::getClasses * @group getClasses * @group standard */ public function testGetClasses() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'php5_method_chaining.php'; $this->pci->parseFile($fn); $r = $this->pci->getClasses(); $exp = array('Person'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get classes declared (internal) * * @return void * @covers PHP_CompatInfo::getClasses * @group getClasses * @group standard */ public function testGetClassesInternal() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'PHP5' . $ds . 'tokens.php5'; $r = $this->pci->getClasses($f); $exp = array('Exception'); $this->assertSame($exp, $r); } /** * Tests parsing a file and get functions declared * (internal and end-user defined) * * @return void * @covers PHP_CompatInfo::getFunctions * @group getFunctions * @group standard */ public function testGetFunctions() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseFile'; $src = $dir . $ds . 'File_Find-1.3.0__Find.php'; $this->pci->parseFile($src); $r = $this->pci->getFunctions(); $exp = array('_file_find_match_shell_get_pattern', 'addcslashes', 'array_merge', 'array_pop', 'array_push', 'basename', 'closedir', 'count', 'define', 'defined', 'each', 'explode', 'glob', 'implode', 'is_a', 'is_array', 'is_dir', 'is_readable', 'maptree', 'maptreemultiple', 'opendir', 'preg_match', 'preg_replace', 'preg_split', 'print_r', 'readdir', 'reset', 'search', 'sizeof', 'str_replace', 'strcasecmp', 'strlen', 'strpos', 'substr', 'substr_count'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get functions declared * (internal and end-user defined) for a specific file * * @return void * @covers PHP_CompatInfo::getFunctions * @group getFunctions * @group standard */ public function testGetFunctionsByFile() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'extensions.php'; $r = $this->pci->getFunctions($f); $exp = array('apache_get_modules', 'dl', 'extension_loaded', 'imageantialias', 'imagecreate', 'print_r', 'sqlite_libversion', 'xdebug_start_trace', 'xdebug_stop_trace'); $this->assertSame($exp, $r); } /** * Tests parsing a file and get constants declared * (internal and end-user defined) * * @return void * @covers PHP_CompatInfo::getConstants * @group getConstants * @group standard */ public function testGetConstants() { $ds = DIRECTORY_SEPARATOR; $src = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $this->pci->parseFile($src); $r = $this->pci->getConstants(); $exp = array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'PHP_EOL', 'PHP_OS', '__FILE__'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get constants declared * (internal and end-user defined) for a specific file * * @return void * @covers PHP_CompatInfo::getConstants * @group getConstants * @group standard */ public function testGetConstantsByFile() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'PHP5' . $ds . 'upload_error.php'; $r = $this->pci->getConstants($f); $exp = array('UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'); $this->assertSame($exp, $r); } /** * Tests parsing a file and get tokens declared * * @return void * @covers PHP_CompatInfo::getTokens * @group getTokens * @group standard */ public function testGetTokens() { $ds = DIRECTORY_SEPARATOR; $src = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $this->pci->parseFile($src); $r = $this->pci->getTokens(); $exp = array(); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get tokens declared * for a specific file * * @return void * @covers PHP_CompatInfo::getTokens * @group getTokens * @group standard */ public function testGetTokensByFile() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'PHP5' . $ds . 'tokens.php5'; $r = $this->pci->getTokens($f); $exp = array('abstract', 'catch', 'clone', 'final', 'implements', 'instanceof', 'interface', 'private', 'protected', 'public', 'throw', 'try'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and retrieve the Code Condition level * * @return void * @covers PHP_CompatInfo::getConditions * @group getConditions * @group standard */ public function testGetConditionsWithoutContext() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('debug' => true, 'recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $r = $this->pci->getConditions(false, true); $exp = 2; // extension condition code level $this->assertEquals($exp, $r); } /** * Tests parsing a directory and retrieve the Code Condition * contextual data * * @return void * @covers PHP_CompatInfo::getConditions * @group getConditions * @group standard */ public function testGetConditionsWithContext() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('debug' => true, 'recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $r = $this->pci->getConditions(); $exp = array(2, array(array(), array('SQLite'), array())); $this->assertSame($exp, $r); } /** * Tests parsing a directory and retrieve the Code Condition * of a specific file * * @return void * @covers PHP_CompatInfo::getConditions * @group getConditions * @group standard */ public function testGetConditionsByFile() { $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('debug' => false, 'recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'phpinfo.php'; $r = $this->pci->getConditions($f); $exp = array(0); // no condition code $this->assertSame($exp, $r); } /** * Tests parsing a file and get extensions used * * @return void * @covers PHP_CompatInfo::getExtensions * @group getExtensions * @group standard */ public function testGetExtensions() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $this->pci->parseFile($fn); $r = $this->pci->getExtensions(); $exp = array('date', 'SimpleXML'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get extensions used * for a specific file * * @return void * @covers PHP_CompatInfo::getExtensions * @group getExtensions * @group standard */ public function testGetExtensionsByFile() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseDir($dir, $opt); $f = $dir . 'extensions.php'; $r = $this->pci->getExtensions($f); $exp = array('gd', 'SQLite', 'xdebug'); $this->assertSame($exp, $r); } /** * Tests parsing a single file and get list of ignored functions * * @return void * @covers PHP_CompatInfo::getIgnoredFunctions * @group getIgnoredFunctions * @group standard */ public function testGetIgnoredFunctions() { $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'ignore_functions_match.php'; $opt = array('ignore_functions_match' => array('preg_match', array('/^debug/'))); $this->pci->parseFile($fn, $opt); $r = $this->pci->getIgnoredFunctions(); $exp = array('debug_backtrace', 'debug_print_backtrace'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get list of ignored functions * for a specific file * * @return void * @covers PHP_CompatInfo::getIgnoredFunctions * @group getIgnoredFunctions * @group standard */ public function testGetIgnoredFunctionsByFile() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('ignore_functions_match' => array('preg_match', array('/debug/'))); $this->pci->parseDir($dir, $opt); $f = $dir . 'extensions.php'; $r = $this->pci->getIgnoredFunctions($f); $exp = array('xdebug_start_trace', 'xdebug_stop_trace'); $this->assertSame($exp, $r); } /** * Tests parsing a single file and get list of ignored extensions * * @return void * @covers PHP_CompatInfo::getIgnoredExtensions * @group getIgnoredExtensions * @group standard */ public function testGetIgnoredExtensions() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseDir' . $ds . 'extensions.php'; $opt = array('ignore_extensions_match' => array('preg_match', array('/SQL/'))); $this->pci->parseFile($fn, $opt); $r = $this->pci->getIgnoredExtensions(); $exp = array('SQLite'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get list of ignored extensions * for a specific file * * @return void * @covers PHP_CompatInfo::getIgnoredExtensions * @group getIgnoredExtensions * @group standard */ public function testGetIgnoredExtensionsByFile() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('ignore_extensions' => array('gd')); $this->pci->parseDir($dir, $opt); $f = $dir . 'extensions.php'; $r = $this->pci->getIgnoredExtensions($f); $exp = array('gd'); $this->assertSame($exp, $r); } /** * Tests parsing a single file and get list of ignored constants * * @return void * @covers PHP_CompatInfo::getIgnoredConstants * @group getIgnoredConstants * @group standard */ public function testGetIgnoredConstants() { $resources = array('date', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'conditional.php'; $opt = array('ignore_constants' => array('PHP_EOL', '__LINE__')); $this->pci->parseFile($fn, $opt); $r = $this->pci->getIgnoredConstants(); $exp = array('PHP_EOL'); $this->assertSame($exp, $r); } /** * Tests parsing a directory and get list of ignored constants * for a specific file * * @return void * @covers PHP_CompatInfo::getIgnoredConstants * @group getIgnoredConstants * @group standard */ public function testGetIgnoredConstantsByFile() { $resources = array('bcmath', 'date', 'pcre', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseFile' . $ds; $opt = array('ignore_constants' => array('PHP_EOL', '__LINE__')); $this->pci->parseDir($dir, $opt); $f = $dir . 'conditional.php'; $r = $this->pci->getIgnoredConstants($f); $exp = array('PHP_EOL'); $this->assertSame($exp, $r); } /** * Tests parsing multiple data sources and get only the summary result * without the function list returns only by debug mode * * @return void * @covers PHP_CompatInfo::getSummary * @group getSummary * @group standard */ public function testGetSummaryWithoutFunctionsForArrayFile() { $resources = array('date', 'pcre', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseFile'; $fn1 = $dir . $ds . 'File_Find-1.3.0__Find.php'; $fn2 = $dir . $ds . 'conditional.php'; $opt = array('debug' => false); $this->pci->parseData(array($fn1, $fn2), $opt); $r = $this->pci->getSummary(); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.1', 'classes' => array('File_Find'), 'extensions' => array('date', 'pcre', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'NULL', 'PHP_EOL', 'PHP_OS', 'PREG_SPLIT_DELIM_CAPTURE', 'PREG_SPLIT_NO_EMPTY', 'TRUE', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5)); $this->assertSame($exp, $r); } /** * Tests parsing multiple data sources and get only the summary result * including the function list returns by debug mode * * @return void * @covers PHP_CompatInfo::getSummary * @group getSummary * @group standard */ public function testGetSummaryWithFunctionsForArrayFile() { $resources = array('date', 'pcre', 'SimpleXML'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseFile'; $fn1 = $dir . $ds . 'File_Find-1.3.0__Find.php'; $fn2 = $dir . $ds . 'conditional.php'; $opt = array('debug' => true); $this->pci->parseData(array($fn1, $fn2), $opt); $r = $this->pci->getSummary(); $exp = array('ignored_files' => array(), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.1.1', 'classes' => array('File_Find'), 'functions' => array('_file_find_match_shell_get_pattern', 'addcslashes', 'array_merge', 'array_pop', 'array_push', 'basename', 'closedir', 'count', 'date', 'debug_backtrace', 'define', 'defined', 'dirname', 'each', 'explode', 'function_exists', 'glob', 'implode', 'is_a', 'is_array', 'is_dir', 'is_readable', 'maptree', 'maptreemultiple', 'opendir', 'phpversion', 'preg_match', 'preg_replace', 'preg_split', 'print_r', 'readdir', 'reset', 'search', 'simplexml_load_file', 'sizeof', 'str_replace', 'strcasecmp', 'strlen', 'strpos', 'strtoupper', 'substr', 'substr_count', 'version_compare'), 'extensions' => array('date', 'pcre', 'SimpleXML'), 'constants' => array('DATE_W3C', 'DIRECTORY_SEPARATOR', 'FALSE', 'NULL', 'PHP_EOL', 'PHP_OS', 'PREG_SPLIT_DELIM_CAPTURE', 'PREG_SPLIT_NO_EMPTY', 'TRUE', '__FILE__'), 'tokens' => array(), 'cond_code' => array(5, array( array('debug_backtrace', 'simplexml_load_file'), array(), array('DIRECTORY_SEPARATOR', 'FILE_FIND_DEBUG'), )) ); $this->assertSame($exp, $r); } /** * Tests parsing directory and get only the summary result * without the function list returns only by debug mode * * @return void * @covers PHP_CompatInfo::getSummary * @group getSummary * @group standard */ public function testGetSummaryForDirectory() { $resources = array('gd', 'SQLite', 'xdebug'); $testSkipped = array(); if (!$this->isResourceAvailable($resources, $testSkipped)) { foreach ($testSkipped as $reason) { $this->markTestSkipped($reason); } } $ds = DIRECTORY_SEPARATOR; $dir = dirname(__FILE__) . $ds . 'parseDir' . $ds; $opt = array('recurse_dir' => true, 'file_ext' => array('php', 'php5')); $this->pci->parseData($dir, $opt); $r = $this->pci->getSummary(); $exp = array('ignored_files' => $this->getIgnoredFileList($dir, $opt), 'ignored_functions' => array(), 'ignored_extensions' => array(), 'ignored_constants' => array(), 'max_version' => '', 'version' => '5.2.0', 'classes' => array('Exception'), 'extensions' => array('gd', 'SQLite', 'xdebug'), 'constants' => array('PHP_SHLIB_SUFFIX', 'TRUE', 'UPLOAD_ERR_CANT_WRITE', 'UPLOAD_ERR_EXTENSION', 'UPLOAD_ERR_FORM_SIZE', 'UPLOAD_ERR_INI_SIZE', 'UPLOAD_ERR_NO_FILE', 'UPLOAD_ERR_NO_TMP_DIR', 'UPLOAD_ERR_OK', 'UPLOAD_ERR_PARTIAL'), 'tokens' => array('abstract', 'catch', 'clone', 'final', 'implements', 'instanceof', 'interface', 'private', 'protected', 'public', 'throw', 'try'), 'cond_code' => array(2)); $this->assertSame($exp, $r); } } // Call PHP_CompatInfo_TestSuite_Standard::main() if file is executed directly. if (PHPUnit_MAIN_METHOD == "PHP_CompatInfo_TestSuite_Standard::main") { PHP_CompatInfo_TestSuite_Standard::main(); } ?>