parsertests.inc

来自「php 开发的内容管理系统」· INC 代码 · 共 792 行 · 第 1/2 页

INC
792
字号
	 * Currently this will only be done once per run, and any changes to	 * the db will be visible to later tests in the run.	 *	 * @private	 */	function setupDatabase() {		static $setupDB = false;		global $wgDBprefix;		# Make sure we don't mess with the live DB		if (!$setupDB && $wgDBprefix === 'parsertest_') {			# oh teh horror			$GLOBALS['wgLoadBalancer'] = LoadBalancer::newFromParams( $GLOBALS['wgDBservers'] );			$db =& wfGetDB( DB_MASTER );			$tables = $this->listTables();			if (!(strcmp($db->getServerVersion(), '4.1') < 0 and stristr($db->getSoftwareLink(), 'MySQL'))) {				# Database that supports CREATE TABLE ... LIKE				global $wgDBtype;				if( $wgDBtype == 'postgres' ) {					$def = 'INCLUDING DEFAULTS';				} else {					$def = '';				}				foreach ($tables as $tbl) {					$newTableName = $db->tableName( $tbl );					$tableName = $this->oldTableNames[$tbl];					$db->query("CREATE TEMPORARY TABLE $newTableName (LIKE $tableName $def)");				}			} else {				# Hack for MySQL versions < 4.1, which don't support				# "CREATE TABLE ... LIKE". Note that				# "CREATE TEMPORARY TABLE ... SELECT * FROM ... LIMIT 0"				# would not create the indexes we need....				foreach ($tables as $tbl) {					$res = $db->query("SHOW CREATE TABLE {$this->oldTableNames[$tbl]}");					$row = $db->fetchRow($res);					$create = $row[1];					$create_tmp = preg_replace('/CREATE TABLE `(.*?)`/', 'CREATE TEMPORARY TABLE `'						. $wgDBprefix . $tbl .'`', $create);					if ($create === $create_tmp) {						# Couldn't do replacement						wfDie("could not create temporary table $tbl");					}					$db->query($create_tmp);				}			}			# Hack: insert a few Wikipedia in-project interwiki prefixes,			# for testing inter-language links			$db->insert( 'interwiki', array(				array( 'iw_prefix' => 'Wikipedia',				       'iw_url'    => 'http://en.wikipedia.org/wiki/$1',				       'iw_local'  => 0 ),				array( 'iw_prefix' => 'MeatBall',				       'iw_url'    => 'http://www.usemod.com/cgi-bin/mb.pl?$1',				       'iw_local'  => 0 ),				array( 'iw_prefix' => 'zh',				       'iw_url'    => 'http://zh.wikipedia.org/wiki/$1',				       'iw_local'  => 1 ),				array( 'iw_prefix' => 'es',				       'iw_url'    => 'http://es.wikipedia.org/wiki/$1',				       'iw_local'  => 1 ),				array( 'iw_prefix' => 'fr',				       'iw_url'    => 'http://fr.wikipedia.org/wiki/$1',				       'iw_local'  => 1 ),				array( 'iw_prefix' => 'ru',				       'iw_url'    => 'http://ru.wikipedia.org/wiki/$1',				       'iw_local'  => 1 ),				) );			# Hack: Insert an image to work with			$db->insert( 'image', array(				'img_name'        => 'Foobar.jpg',				'img_size'        => 12345,				'img_description' => 'Some lame file',				'img_user'        => 1,				'img_user_text'   => 'WikiSysop',				'img_timestamp'   => $db->timestamp( '20010115123500' ),				'img_width'       => 1941,				'img_height'      => 220,				'img_bits'        => 24,				'img_media_type'  => MEDIATYPE_BITMAP,				'img_major_mime'  => "image",				'img_minor_mime'  => "jpeg",				) );							# Update certain things in site_stats			$db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 1, 'ss_good_articles' => 1 ) );			$setupDB = true;		}	}	/**	 * Create a dummy uploads directory which will contain a couple	 * of files in order to pass existence tests.	 * @return string The directory	 * @private	 */	function setupUploadDir() {		global $IP;		$dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";		mkdir( $dir );		mkdir( $dir . '/3' );		mkdir( $dir . '/3/3a' );		$img = "$IP/skins/monobook/headbg.jpg";		$h = fopen($img, 'r');		$c = fread($h, filesize($img));		fclose($h);		$f = fopen( $dir . '/3/3a/Foobar.jpg', 'wb' );		fwrite( $f, $c );		fclose( $f );		return $dir;	}	/**	 * Restore default values and perform any necessary clean-up	 * after each test runs.	 *	 * @private	 */	function teardownGlobals() {		foreach( $this->savedGlobals as $var => $val ) {			$GLOBALS[$var] = $val;		}		if( isset( $this->uploadDir ) ) {			$this->teardownUploadDir( $this->uploadDir );			unset( $this->uploadDir );		}	}	/**	 * Remove the dummy uploads directory	 * @private	 */	function teardownUploadDir( $dir ) {		unlink( "$dir/3/3a/Foobar.jpg" );		rmdir( "$dir/3/3a" );		rmdir( "$dir/3" );		@rmdir( "$dir/thumb/6/65" );		@rmdir( "$dir/thumb/6" );		@unlink( "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" );		@rmdir( "$dir/thumb/3/3a/Foobar.jpg" );		@rmdir( "$dir/thumb/3/3a" );		@rmdir( "$dir/thumb/3/39" ); # wtf?		@rmdir( "$dir/thumb/3" );		@rmdir( "$dir/thumb" );		@rmdir( "$dir" );	}	/**	 * "Running test $desc..."	 * @private	 */	function showTesting( $desc ) {		print "Running test $desc... ";	}	/**	 * Print a happy success message.	 *	 * @param string $desc The test name	 * @return bool	 * @private	 */	function showSuccess( $desc ) {		if( !$this->quiet ) {			print $this->termColor( '1;32' ) . 'PASSED' . $this->termReset() . "\n";		}		return true;	}	/**	 * Print a failure message and provide some explanatory output	 * about what went wrong if so configured.	 *	 * @param string $desc The test name	 * @param string $result Expected HTML output	 * @param string $html Actual HTML output	 * @return bool	 * @private	 */	function showFailure( $desc, $result, $html ) {		if( $this->quiet ) {			# In quiet mode we didn't show the 'Testing' message before the			# test, in case it succeeded. Show it now:			$this->showTesting( $desc );		}		print $this->termColor( '1;31' ) . 'FAILED!' . $this->termReset() . "\n";		if( $this->showDiffs ) {			print $this->quickDiff( $result, $html );			if( !$this->wellFormed( $html ) ) {				print "XML error: $this->mXmlError\n";			}		}		return false;	}	/**	 * Run given strings through a diff and return the (colorized) output.	 * Requires writable /tmp directory and a 'diff' command in the PATH.	 *	 * @param string $input	 * @param string $output	 * @param string $inFileTail Tailing for the input file name	 * @param string $outFileTail Tailing for the output file name	 * @return string	 * @private	 */	function quickDiff( $input, $output, $inFileTail='expected', $outFileTail='actual' ) {		$prefix = wfTempDir() . "/mwParser-" . mt_rand();		$infile = "$prefix-$inFileTail";		$this->dumpToFile( $input, $infile );		$outfile = "$prefix-$outFileTail";		$this->dumpToFile( $output, $outfile );		$diff = `diff -au $infile $outfile`;		unlink( $infile );		unlink( $outfile );		return $this->colorDiff( $diff );	}	/**	 * Write the given string to a file, adding a final newline.	 *	 * @param string $data	 * @param string $filename	 * @private	 */	function dumpToFile( $data, $filename ) {		$file = fopen( $filename, "wt" );		fwrite( $file, $data . "\n" );		fclose( $file );	}	/**	 * Return ANSI terminal escape code for changing text attribs/color,	 * or empty string if color output is disabled.	 *	 * @param string $color Semicolon-separated list of attribute/color codes	 * @return string	 * @private	 */	function termColor( $color ) {		if($this->lightcolor) {			return $this->color ? "\x1b[1;{$color}m" : '';		} else {			return $this->color ? "\x1b[{$color}m" : '';		}	}	/**	 * Return ANSI terminal escape code for restoring default text attributes,	 * or empty string if color output is disabled.	 *	 * @return string	 * @private	 */	function termReset() {		return $this->color ? "\x1b[0m" : '';	}	/**	 * Colorize unified diff output if set for ANSI color output.	 * Subtractions are colored blue, additions red.	 *	 * @param string $text	 * @return string	 * @private	 */	function colorDiff( $text ) {		return preg_replace(			array( '/^(-.*)$/m', '/^(\+.*)$/m' ),			array( $this->termColor( 34 ) . '$1' . $this->termReset(),			       $this->termColor( 31 ) . '$1' . $this->termReset() ),			$text );	}	/**	 * Insert a temporary test article	 * @param string $name the title, including any prefix	 * @param string $text the article text	 * @param int $line the input line number, for reporting errors	 * @private	 */	function addArticle($name, $text, $line) {		$this->setupGlobals();		$title = Title::newFromText( $name );		if ( is_null($title) ) {			wfDie( "invalid title at line $line\n" );		}		$aid = $title->getArticleID( GAID_FOR_UPDATE );		if ($aid != 0) {			wfDie( "duplicate article at line $line\n" );		}		$art = new Article($title);		$art->insertNewArticle($text, '', false, false );		$this->teardownGlobals();	}		/**	 * Steal a callback function from the primary parser, save it for	 * application to our scary parser. If the hook is not installed,	 * die a painful dead to warn the others.	 * @param string $name	 */	private function requireHook( $name ) {		global $wgParser;		if( isset( $wgParser->mTagHooks[$name] ) ) {			$this->hooks[$name] = $wgParser->mTagHooks[$name];		} else {			wfDie( "This test suite requires the '$name' hook extension.\n" );		}	}	/*	 * Run the "tidy" command on text if the $wgUseTidy	 * global is true	 *	 * @param string $text the text to tidy	 * @return string	 * @static	 * @private	 */	function tidy( $text ) {		global $wgUseTidy;		if ($wgUseTidy) {			$text = Parser::tidy($text);		}		return $text;	}	function wellFormed( $text ) {		$html =			Sanitizer::hackDocType() .			'<html>' .			$text .			'</html>';		$parser = xml_parser_create( "UTF-8" );		# case folding violates XML standard, turn it off		xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );		if( !xml_parse( $parser, $html, true ) ) {			$err = xml_error_string( xml_get_error_code( $parser ) );			$position = xml_get_current_byte_index( $parser );			$fragment = $this->extractFragment( $html, $position );			$this->mXmlError = "$err at byte $position:\n$fragment";			xml_parser_free( $parser );			return false;		}		xml_parser_free( $parser );		return true;	}	function extractFragment( $text, $position ) {		$start = max( 0, $position - 10 );		$before = $position - $start;		$fragment = '...' .			$this->termColor( 34 ) .			substr( $text, $start, $before ) .			$this->termColor( 0 ) .			$this->termColor( 31 ) .			$this->termColor( 1 ) .			substr( $text, $position, 1 ) .			$this->termColor( 0 ) .			$this->termColor( 34 ) .			substr( $text, $position + 1, 9 ) .			$this->termColor( 0 ) .			'...';		$display = str_replace( "\n", ' ', $fragment );		$caret = '   ' .			str_repeat( ' ', $before ) .			$this->termColor( 31 ) .			'^' .			$this->termColor( 0 );		return "$display\n$caret";	}}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?