From: Chad Horohoe
Date: Tue, 14 Dec 2010 16:28:52 +0000 (+0000)
Subject: svn ci'd from the wrong directory, missed the deletes in r78383
X-Git-Tag: 1.31.0-rc.0~33305
X-Git-Url: http://git.cyclocoop.org/%24href?a=commitdiff_plain;h=2f2a74de9d92e9724edabe574ee82f46298c2ce9;p=lhc%2Fweb%2Fwiklou.git
svn ci'd from the wrong directory, missed the deletes in r78383
---
diff --git a/maintenance/tests/.svnignore b/maintenance/tests/.svnignore
deleted file mode 100644
index 20cb61e90c..0000000000
--- a/maintenance/tests/.svnignore
+++ /dev/null
@@ -1,6 +0,0 @@
-LocalTestSettings.php
-*~
-bin
-.classpath
-.project
-project.index
diff --git a/maintenance/tests/RunSeleniumTests.php b/maintenance/tests/RunSeleniumTests.php
deleted file mode 100644
index e0c0f247ec..0000000000
--- a/maintenance/tests/RunSeleniumTests.php
+++ /dev/null
@@ -1,220 +0,0 @@
-#!/usr/bin/php
-mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
- $this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
- $this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
- $this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
- $this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
- $this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
- $this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
- $this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
- $this->addOption( 'list-browsers', 'List the available browsers.' );
- $this->addOption( 'verbose', 'Be noisier.' );
- $this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
- $this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
- $this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
- $this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
- $this->deleteOption( 'dbpass' );
- $this->deleteOption( 'dbuser' );
- $this->deleteOption( 'globals' );
- $this->deleteOption( 'wiki' );
- }
-
- public function listBrowsers() {
- $desc = "Available browsers:\n";
-
- foreach ($this->selenium->getAvailableBrowsers() as $k => $v) {
- $desc .= " $k => $v\n";
- }
-
- echo $desc;
- }
-
- protected function startServer() {
- if ( $this->seleniumServerExecPath == '' ) {
- die ( "The selenium server exec path is not set in " .
- "selenium_settings.ini. Cannot start server \n" .
- "as requested - terminating RunSeleniumTests\n" );
- }
- $this->serverManager = new SeleniumServerManager( 'true',
- $this->selenium->getPort(),
- $this->seleniumServerExecPath );
- switch ( $this->serverManager->start() ) {
- case 'started':
- break;
- case 'failed':
- die ( "Unable to start the Selenium Server - " .
- "terminating RunSeleniumTests\n" );
- case 'running':
- echo ( "Warning: The Selenium Server is " .
- "already running\n" );
- break;
- }
-
- return;
- }
-
- protected function stopServer() {
- if ( !isset ( $this->serverManager ) ) {
- echo ( "Warning: Request to stop Selenium Server, but it was " .
- "not stared by RunSeleniumTests\n" .
- "RunSeleniumTests cannot stop a Selenium Server it " .
- "did not start\n" );
- } else {
- switch ( $this->serverManager->stop() ) {
- case 'stopped':
- break;
- case 'failed':
- echo ( "unable to stop the Selenium Server\n" );
- }
- }
- return;
- }
-
- protected function runTests( $seleniumTestSuites = array() ) {
- $result = new PHPUnit_Framework_TestResult;
- $result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
- $result->addListener( $jUnitListener );
- }
-
- foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
- require( $testSuiteFile );
- $suite = new $testSuiteName();
- $suite->setName( $testSuiteName );
- $suite->addTests();
-
- try {
- $suite->run( $result );
- } catch ( Testing_Selenium_Exception $e ) {
- $suite->tearDown();
- throw new MWException( $e->getMessage() );
- }
- }
-
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener->flush();
- }
- }
-
- public function execute() {
- global $wgServer, $wgScriptPath, $wgHooks;
-
- $seleniumSettings;
- $seleniumBrowsers;
- $seleniumTestSuites;
-
- $configFile = $this->getOption( 'seleniumConfig', '' );
- if ( strlen( $configFile ) > 0 ) {
- $this->output("Using Selenium Configuration file: " . $configFile . "\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- $configFile );
- } else if ( !isset( $wgHooks['SeleniumSettings'] ) ) {
- $this->output("No command line configuration file or configuration hook found.\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites
- );
- } else {
- $this->output("Using 'SeleniumSettings' hook for configuration.\n");
- wfRunHooks('SeleniumSettings', array( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites ) );
- }
-
- // State for starting/stopping the Selenium server has nothing to do with the Selenium
- // class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
- // the Maintenance class does not have a setOption()
- if ( isset( $seleniumSettings['startserver'] ) ) $this->getOption( 'startserver', true );
- if ( isset( $seleniumSettings['stopserver'] ) ) $this->getOption( 'stopserver', true );
- if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) $seleniumSettings['seleniumserverexecpath'] = '';
- $this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
-
- //set reasonable defaults if we did not find the settings
- if ( !isset( $seleniumBrowsers ) ) $seleniumBrowsers = array ('firefox' => '*firefox');
- if ( !isset( $seleniumSettings['host'] ) ) $seleniumSettings['host'] = $wgServer . $wgScriptPath;
- if ( !isset( $seleniumSettings['port'] ) ) $seleniumSettings['port'] = '4444';
- if ( !isset( $seleniumSettings['wikiUrl'] ) ) $seleniumSettings['wikiUrl'] = 'http://localhost';
- if ( !isset( $seleniumSettings['username'] ) ) $seleniumSettings['username'] = '';
- if ( !isset( $seleniumSettings['userPassword'] ) ) $seleniumSettings['userPassword'] = '';
- if ( !isset( $seleniumSettings['testBrowser'] ) ) $seleniumSettings['testBrowser'] = 'firefox';
- if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) $seleniumSettings['jUnitLogFile'] = false;
- if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) $seleniumSettings['runAgainstGrid'] = false;
-
- // Setup Selenium class
- $this->selenium = new Selenium( );
- $this->selenium->setAvailableBrowsers( $seleniumBrowsers );
- $this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
- $this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
- $this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
- $this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
- $this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
- $this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
- $this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
- $this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
- $this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
-
- if( $this->hasOption( 'list-browsers' ) ) {
- $this->listBrowsers();
- exit(0);
- }
- if ( $this->hasOption( 'startserver' ) ) {
- $this->startServer();
- }
-
- $logger = new SeleniumTestConsoleLogger;
- $this->selenium->setLogger( $logger );
-
- $this->runTests( $seleniumTestSuites );
-
- if ( $this->hasOption( 'stopserver' ) ) {
- $this->stopServer();
- }
- }
-}
-
-$maintClass = "SeleniumTester";
-
-require_once( DO_MAINTENANCE );
diff --git a/maintenance/tests/parser/extraParserTests.txt b/maintenance/tests/parser/extraParserTests.txt
deleted file mode 100644
index 7eab3ea765..0000000000
Binary files a/maintenance/tests/parser/extraParserTests.txt and /dev/null differ
diff --git a/maintenance/tests/parser/parserTest.inc b/maintenance/tests/parser/parserTest.inc
deleted file mode 100644
index 5173feaf91..0000000000
--- a/maintenance/tests/parser/parserTest.inc
+++ /dev/null
@@ -1,1304 +0,0 @@
-
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * @todo Make this more independent of the configuration (and if possible the database)
- * @todo document
- * @file
- * @ingroup Maintenance
- */
-
-/**
- * @ingroup Maintenance
- */
-class ParserTest {
- /**
- * boolean $color whereas output should be colorized
- */
- private $color;
-
- /**
- * boolean $showOutput Show test output
- */
- private $showOutput;
-
- /**
- * boolean $useTemporaryTables Use temporary tables for the temporary database
- */
- private $useTemporaryTables = true;
-
- /**
- * boolean $databaseSetupDone True if the database has been set up
- */
- private $databaseSetupDone = false;
-
- /**
- * Our connection to the database
- */
- private $db;
-
- /**
- * string $oldTablePrefix Original table prefix
- */
- private $oldTablePrefix;
-
- private $maxFuzzTestLength = 300;
- private $fuzzSeed = 0;
- private $memoryLimit = 50;
- private $uploadDir = null;
-
- public $regex = "";
- private $savedGlobals = array();
- /**
- * Sets terminal colorization and diff/quick modes depending on OS and
- * command-line options (--color and --quick).
- */
- public function __construct( $options = array() ) {
- # Only colorize output if stdout is a terminal.
- $this->color = !wfIsWindows() && posix_isatty( 1 );
-
- if ( isset( $options['color'] ) ) {
- switch( $options['color'] ) {
- case 'no':
- $this->color = false;
- break;
- case 'yes':
- default:
- $this->color = true;
- break;
- }
- }
-
- $this->term = $this->color
- ? new AnsiTermColorer()
- : new DummyTermColorer();
-
- $this->showDiffs = !isset( $options['quick'] );
- $this->showProgress = !isset( $options['quiet'] );
- $this->showFailure = !(
- isset( $options['quiet'] )
- && ( isset( $options['record'] )
- || isset( $options['compare'] ) ) ); // redundant output
-
- $this->showOutput = isset( $options['show-output'] );
-
-
- if ( isset( $options['regex'] ) ) {
- if ( isset( $options['record'] ) ) {
- echo "Warning: --record cannot be used with --regex, disabling --record\n";
- unset( $options['record'] );
- }
- $this->regex = $options['regex'];
- } else {
- # Matches anything
- $this->regex = '';
- }
-
- $this->setupRecorder( $options );
- $this->keepUploads = isset( $options['keep-uploads'] );
-
- if ( isset( $options['seed'] ) ) {
- $this->fuzzSeed = intval( $options['seed'] ) - 1;
- }
-
- $this->runDisabled = isset( $options['run-disabled'] );
-
- $this->hooks = array();
- $this->functionHooks = array();
- self::setUp();
- }
-
- static function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgMessageCache, $wgUseDatabaseMessages, $wgMsgCacheExpiry, $parserMemc,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
- $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath;
-
- $wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
- $wgStylePath = '/skins';
- $wgThumbnailScriptPath = false;
- $wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => wfTempDir() . '/test-repo',
- 'url' => 'http://example.com/images',
- 'deletedDir' => wfTempDir() . '/test-repo/delete',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- );
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
-
- $wgEnableParserCache = false;
- $wgDeferredUpdateList = array();
- $wgMemc = &wfGetMainCache();
- $messageMemc = &wfGetMessageCacheStorage();
- $parserMemc = &wfGetParserCacheStorage();
-
- // $wgContLang = new StubContLang;
- $wgUser = new User;
- $wgLang = new StubUserLang;
- $wgOut = new StubObject( 'wgOut', 'OutputPage' );
- $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = new WebRequest;
-
- $wgMessageCache = new StubObject( 'wgMessageCache', 'MessageCache',
- array( $messageMemc, $wgUseDatabaseMessages,
- $wgMsgCacheExpiry ) );
- if ( $wgStyleDirectory === false ) {
- $wgStyleDirectory = "$IP/skins";
- }
-
- }
-
- public function setupRecorder ( $options ) {
- if ( isset( $options['record'] ) ) {
- $this->recorder = new DbTestRecorder( $this );
- $this->recorder->version = isset( $options['setversion'] ) ?
- $options['setversion'] : SpecialVersion::getVersion();
- } elseif ( isset( $options['compare'] ) ) {
- $this->recorder = new DbTestPreviewer( $this );
- } elseif ( isset( $options['upload'] ) ) {
- $this->recorder = new RemoteTestRecorder( $this );
- } else {
- $this->recorder = new TestRecorder( $this );
- }
- }
-
- /**
- * Remove last character if it is a newline
- * @group utility
- */
- static public function chomp( $s ) {
- if ( substr( $s, -1 ) === "\n" ) {
- return substr( $s, 0, -1 );
- }
- else {
- return $s;
- }
- }
-
- /**
- * Run a fuzz test series
- * Draw input from a set of test files
- */
- function fuzzTest( $filenames ) {
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $dict = $this->getFuzzInput( $filenames );
- $dictSize = strlen( $dict );
- $logMaxLength = log( $this->maxFuzzTestLength );
- $this->setupDatabase();
- ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
-
- $numTotal = 0;
- $numSuccess = 0;
- $user = new User;
- $opts = ParserOptions::newFromUser( $user );
- $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
-
- while ( true ) {
- // Generate test input
- mt_srand( ++$this->fuzzSeed );
- $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
- $input = '';
-
- while ( strlen( $input ) < $totalLength ) {
- $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
- $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
- $offset = mt_rand( 0, $dictSize - $hairLength );
- $input .= substr( $dict, $offset, $hairLength );
- }
-
- $this->setupGlobals();
- $parser = $this->getParser();
-
- // Run the test
- try {
- $parser->parse( $input, $title, $opts );
- $fail = false;
- } catch ( Exception $exception ) {
- $fail = true;
- }
-
- if ( $fail ) {
- echo "Test failed with seed {$this->fuzzSeed}\n";
- echo "Input:\n";
- var_dump( $input );
- echo "\n\n";
- echo "$exception\n";
- } else {
- $numSuccess++;
- }
-
- $numTotal++;
- $this->teardownGlobals();
- $parser->__destruct();
-
- if ( $numTotal % 100 == 0 ) {
- $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
- echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
- if ( $usage > 90 ) {
- echo "Out of memory:\n";
- $memStats = $this->getMemoryBreakdown();
-
- foreach ( $memStats as $name => $usage ) {
- echo "$name: $usage\n";
- }
- $this->abort();
- }
- }
- }
- }
-
- /**
- * Get an input dictionary from a set of parser test files
- */
- function getFuzzInput( $filenames ) {
- $dict = '';
-
- foreach ( $filenames as $filename ) {
- $contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
-
- foreach ( $matches[1] as $match ) {
- $dict .= $match . "\n";
- }
- }
-
- return $dict;
- }
-
- /**
- * Get a memory usage breakdown
- */
- function getMemoryBreakdown() {
- $memStats = array();
-
- foreach ( $GLOBALS as $name => $value ) {
- $memStats['$' . $name] = strlen( serialize( $value ) );
- }
-
- $classes = get_declared_classes();
-
- foreach ( $classes as $class ) {
- $rc = new ReflectionClass( $class );
- $props = $rc->getStaticProperties();
- $memStats[$class] = strlen( serialize( $props ) );
- $methods = $rc->getMethods();
-
- foreach ( $methods as $method ) {
- $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
- }
- }
-
- $functions = get_defined_functions();
-
- foreach ( $functions['user'] as $function ) {
- $rf = new ReflectionFunction( $function );
- $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
- }
-
- asort( $memStats );
-
- return $memStats;
- }
-
- function abort() {
- $this->abort();
- }
-
- /**
- * Run a series of tests listed in the given text files.
- * Each test consists of a brief description, wikitext input,
- * and the expected HTML output.
- *
- * Prints status updates on stdout and counts up the total
- * number and percentage of passed tests.
- *
- * @param $filenames Array of strings
- * @return Boolean: true if passed all tests, false if any tests failed.
- */
- public function runTestsFromFiles( $filenames ) {
- $ok = false;
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $this->recorder->start();
- try {
- $this->setupDatabase();
- $ok = true;
-
- foreach ( $filenames as $filename ) {
- $tests = new TestFileIterator( $filename, $this );
- $ok = $this->runTests( $tests ) && $ok;
- }
-
- $this->teardownDatabase();
- $this->recorder->report();
- } catch (DBError $e) {
- echo $e->getMessage();
- }
- $this->recorder->end();
-
- return $ok;
- }
-
- function runTests( $tests ) {
- $ok = true;
-
- foreach ( $tests as $t ) {
- $result =
- $this->runTest( $t['test'], $t['input'], $t['result'], $t['options'], $t['config'] );
- $ok = $ok && $result;
- $this->recorder->record( $t['test'], $result );
- }
-
- if ( $this->showProgress ) {
- print "\n";
- }
-
- return $ok;
- }
-
- /**
- * Get a Parser object
- */
- function getParser( $preprocessor = null ) {
- global $wgParserConf;
-
- $class = $wgParserConf['class'];
- $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
-
- foreach ( $this->hooks as $tag => $callback ) {
- $parser->setHook( $tag, $callback );
- }
-
- foreach ( $this->functionHooks as $tag => $bits ) {
- list( $callback, $flags ) = $bits;
- $parser->setFunctionHook( $tag, $callback, $flags );
- }
-
- wfRunHooks( 'ParserTestParser', array( &$parser ) );
-
- return $parser;
- }
-
- /**
- * Run a given wikitext input through a freshly-constructed wiki parser,
- * and compare the output against the expected results.
- * Prints status and explanatory messages to stdout.
- *
- * @param $desc String: test's description
- * @param $input String: wikitext to try rendering
- * @param $result String: result to output
- * @param $opts Array: test's options
- * @param $config String: overrides for global variables, one per line
- * @return Boolean
- */
- public function runTest( $desc, $input, $result, $opts, $config ) {
- if ( $this->showProgress ) {
- $this->showTesting( $desc );
- }
-
- $opts = $this->parseOptions( $opts );
- $this->setupGlobals( $opts, $config );
-
- $user = new User();
- $options = ParserOptions::newFromUser( $user );
-
- if ( isset( $opts['title'] ) ) {
- $titleText = $opts['title'];
- }
- else {
- $titleText = 'Parser test';
- }
-
- $local = isset( $opts['local'] );
- $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
- $parser = $this->getParser( $preprocessor );
- $title = Title::newFromText( $titleText );
-
- if ( isset( $opts['pst'] ) ) {
- $out = $parser->preSaveTransform( $input, $title, $user, $options );
- } elseif ( isset( $opts['msg'] ) ) {
- $out = $parser->transformMsg( $input, $options );
- } elseif ( isset( $opts['section'] ) ) {
- $section = $opts['section'];
- $out = $parser->getSection( $input, $section );
- } elseif ( isset( $opts['replace'] ) ) {
- $section = $opts['replace'][0];
- $replace = $opts['replace'][1];
- $out = $parser->replaceSection( $input, $section, $replace );
- } elseif ( isset( $opts['comment'] ) ) {
- $linker = $user->getSkin();
- $out = $linker->formatComment( $input, $title, $local );
- } elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
- } else {
- $output = $parser->parse( $input, $title, $options, true, true, 1337 );
- $out = $output->getText();
-
- if ( isset( $opts['showtitle'] ) ) {
- if ( $output->getTitleText() ) {
- $title = $output->getTitleText();
- }
-
- $out = "$title\n$out";
- }
-
- if ( isset( $opts['ill'] ) ) {
- $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
- } elseif ( isset( $opts['cat'] ) ) {
- global $wgOut;
-
- $wgOut->addCategoryLinks( $output->getCategories() );
- $cats = $wgOut->getCategoryLinks();
-
- if ( isset( $cats['normal'] ) ) {
- $out = $this->tidy( implode( ' ', $cats['normal'] ) );
- } else {
- $out = '';
- }
- }
-
- $result = $this->tidy( $result );
- }
-
- $this->teardownGlobals();
- return $this->showTestResult( $desc, $result, $out );
- }
-
- /**
- *
- */
- function showTestResult( $desc, $result, $out ) {
- if ( $result === $out ) {
- $this->showSuccess( $desc );
- return true;
- } else {
- $this->showFailure( $desc, $result, $out );
- return false;
- }
- }
-
- /**
- * Use a regex to find out the value of an option
- * @param $key String: name of option val to retrieve
- * @param $opts Options array to look in
- * @param $default Mixed: default value returned if not found
- */
- private static function getOptionValue( $key, $opts, $default ) {
- $key = strtolower( $key );
-
- if ( isset( $opts[$key] ) ) {
- return $opts[$key];
- } else {
- return $default;
- }
- }
-
- private function parseOptions( $instring ) {
- $opts = array();
- // foo
- // foo=bar
- // foo="bar baz"
- // foo=[[bar baz]]
- // foo=bar,"baz quux"
- $regex = '/\b
- ([\w-]+) # Key
- \b
- (?:\s*
- = # First sub-value
- \s*
- (
- "
- [^"]* # Quoted val
- "
- |
- \[\[
- [^]]* # Link target
- \]\]
- |
- [\w-]+ # Plain word
- )
- (?:\s*
- , # Sub-vals 1..N
- \s*
- (
- "[^"]*" # Quoted val
- |
- \[\[[^]]*\]\] # Link target
- |
- [\w-]+ # Plain word
- )
- )*
- )?
- /x';
-
- if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
- foreach ( $matches as $bits ) {
- array_shift( $bits );
- $key = strtolower( array_shift( $bits ) );
- if ( count( $bits ) == 0 ) {
- $opts[$key] = true;
- } elseif ( count( $bits ) == 1 ) {
- $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
- } else {
- // Array!
- $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
- }
- }
- }
- return $opts;
- }
-
- private function cleanupOption( $opt ) {
- if ( substr( $opt, 0, 1 ) == '"' ) {
- return substr( $opt, 1, -1 );
- }
-
- if ( substr( $opt, 0, 2 ) == '[[' ) {
- return substr( $opt, 2, -2 );
- }
- return $opt;
- }
-
- /**
- * Set up the global variables for a consistent environment for each test.
- * Ideally this should replace the global configuration entirely.
- */
- private function setupGlobals( $opts = '', $config = '' ) {
- # Find out values for some special options.
- $lang =
- self::getOptionValue( 'language', $opts, 'en' );
- $variant =
- self::getOptionValue( 'variant', $opts, false );
- $maxtoclevel =
- self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
- $linkHolderBatchSize =
- self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
-
- $settings = array(
- 'wgServer' => 'http://Britney-Spears',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgActionPaths' => array(),
- 'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => $this->uploadDir,
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- ),
- 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
- 'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
- 'wgLanguageCode' => $lang,
- 'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
- 'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => false,
- 'wgUseTeX' => isset( $opts['math'] ),
- 'wgMathDirectory' => $this->uploadDir . '/math',
- 'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
- 'wgUseTidy' => false,
- 'wgDefaultLanguageVariant' => $variant,
- 'wgVariantArticlePath' => false,
- 'wgGroupPermissions' => array( '*' => array(
- 'createaccount' => true,
- 'read' => true,
- 'edit' => true,
- 'createpage' => true,
- 'createtalk' => true,
- ) ),
- 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
- 'wgDefaultExternalStore' => array(),
- 'wgForeignFileRepos' => array(),
- 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
- 'wgExperimentalHtmlIds' => false,
- 'wgExternalLinkTarget' => false,
- 'wgAlwaysUseTidy' => false,
- 'wgHtml5' => true,
- 'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
- );
-
- if ( $config ) {
- $configLines = explode( "\n", $config );
-
- foreach ( $configLines as $line ) {
- list( $var, $value ) = explode( '=', $line, 2 );
-
- $settings[$var] = eval( "return $value;" );
- }
- }
-
- $this->savedGlobals = array();
-
- foreach ( $settings as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
-
- $GLOBALS[$var] = $val;
- }
-
- $langObj = Language::factory( $lang );
- $GLOBALS['wgLang'] = $langObj;
- $GLOBALS['wgContLang'] = $langObj;
- $GLOBALS['wgMemc'] = new FakeMemCachedClient;
- $GLOBALS['wgOut'] = new OutputPage;
-
- global $wgHooks;
-
- $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserTestParser'][] = 'ParserTestStaticParserHook::setup';
- $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
- MagicWord::clearCache();
-
- global $wgUser;
- $wgUser = new User();
- }
-
- /**
- * List of temporary tables to create, without prefix.
- * Some of these probably aren't necessary.
- */
- private function listTables() {
- $tables = array( 'user', 'user_properties', 'page', 'page_restrictions',
- 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
- 'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks',
- 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
- 'recentchanges', 'watchlist', 'math', 'interwiki', 'logging',
- 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
- 'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
- );
-
- if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) )
- array_push( $tables, 'searchindex' );
-
- // Allow extensions to add to the list of tables to duplicate;
- // may be necessary if they hook into page save or other code
- // which will require them while running tests.
- wfRunHooks( 'ParserTestTables', array( &$tables ) );
-
- return $tables;
- }
-
- /**
- * Set up a temporary set of wiki tables to work with for the tests.
- * Currently this will only be done once per run, and any changes to
- * the db will be visible to later tests in the run.
- */
- public function setupDatabase() {
- global $wgDBprefix;
-
- if ( $this->databaseSetupDone ) {
- return;
- }
-
- $this->db = wfGetDB( DB_MASTER );
- $dbType = $this->db->getType();
-
- if ( $wgDBprefix === 'parsertest_' || ( $dbType == 'oracle' && $wgDBprefix === 'pt_' ) ) {
- throw new MWException( 'setupDatabase should be called before setupGlobals' );
- }
-
- $this->databaseSetupDone = true;
- $this->oldTablePrefix = $wgDBprefix;
-
- # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
- # It seems to have been fixed since (r55079?).
- # If it fails, $wgCaches[CACHE_DB] = new HashBagOStuff(); should work around it.
-
- # CREATE TEMPORARY TABLE breaks if there is more than one server
- if ( wfGetLB()->getServerCount() != 1 ) {
- $this->useTemporaryTables = false;
- }
-
- $temporary = $this->useTemporaryTables || $dbType == 'postgres';
- $tables = $this->listTables();
-
- foreach ( $tables as $tbl ) {
- # Clean up from previous aborted run. So that table escaping
- # works correctly across DB engines, we need to change the pre-
- # fix back and forth so tableName() works right.
- $this->changePrefix( $this->oldTablePrefix );
- $oldTableName = $this->db->tableName( $tbl );
- $this->changePrefix( $dbType != 'oracle' ? 'parsertest_' : 'pt_' );
- $newTableName = $this->db->tableName( $tbl );
-
- if ( $dbType == 'mysql' ) {
- $this->db->query( "DROP TABLE IF EXISTS $newTableName" );
- } elseif ( in_array( $dbType, array( 'postgres', 'oracle' ) ) ) {
- /* DROPs wouldn't work due to Foreign Key Constraints (bug 14990, r58669)
- * Use "DROP TABLE IF EXISTS $newTableName CASCADE" for postgres? That
- * syntax would also work for mysql.
- */
- } elseif ( $this->db->tableExists( $tbl ) ) {
- $this->db->query( "DROP TABLE $newTableName" );
- }
-
- # Create new table
- $this->db->duplicateTableStructure( $oldTableName, $newTableName, $temporary );
- }
-
- if ( $dbType == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
- $this->changePrefix( $dbType != 'oracle' ? 'parsertest_' : 'pt_' );
-
- if ( $dbType == 'oracle' ) {
- # Insert 0 user to prevent FK violations
-
- # Anonymous user
- $this->db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous' ) );
- }
-
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->db->insert( 'interwiki', array(
- array( 'iw_prefix' => 'wikipedia',
- 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'meatball',
- 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'zh',
- 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'es',
- 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'fr',
- 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'ru',
- 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- ) );
-
-
- # Update certain things in site_stats
- $this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
-
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Make a new message cache
- global $wgMessageCache, $wgMemc;
- $wgMessageCache = new MessageCache( $wgMemc, true, 3600 );
-
- $this->uploadDir = $this->setupUploadDir();
- $user = User::createNew( 'WikiSysop' );
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
- $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
- 'size' => 12345,
- 'width' => 1941,
- 'height' => 220,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
-
- # This image will be blacklisted in [[MediaWiki:Bad image list]]
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
- $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
- 'size' => 12345,
- 'width' => 320,
- 'height' => 240,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
- }
-
- /**
- * Change the table prefix on all open DB connections/
- */
- protected function changePrefix( $prefix ) {
- global $wgDBprefix;
- wfGetLBFactory()->forEachLB( array( $this, 'changeLBPrefix' ), array( $prefix ) );
- $wgDBprefix = $prefix;
- }
-
- public function changeLBPrefix( $lb, $prefix ) {
- $lb->forEachOpenConnection( array( $this, 'changeDBPrefix' ), array( $prefix ) );
- }
-
- public function changeDBPrefix( $db, $prefix ) {
- $db->tablePrefix( $prefix );
- }
-
- public function teardownDatabase() {
- if ( !$this->databaseSetupDone ) {
- $this->teardownGlobals();
- return;
- }
- $this->teardownUploadDir( $this->uploadDir );
-
- $this->changePrefix( $this->oldTablePrefix );
- $this->databaseSetupDone = false;
-
- if ( $this->useTemporaryTables ) {
- # Don't need to do anything
- $this->teardownGlobals();
- return;
- }
-
- $tables = $this->listTables();
-
- foreach ( $tables as $table ) {
- $sql = $this->db->getType() == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
- $this->db->query( $sql );
- }
-
- if ( $this->db->getType() == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
- $this->teardownGlobals();
- }
-
- /**
- * 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;
-
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
-
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- // wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
-
- wfMkdirParents( $dir . '/3/3a' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
- return $dir;
- }
-
- /**
- * Restore default values and perform any necessary clean-up
- * after each test runs.
- */
- private function teardownGlobals() {
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
-
- foreach ( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
- }
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
-
- "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
- "$dir/thumb",
- "$dir/math/f/a/5",
- "$dir/math/f/a",
- "$dir/math/f",
- "$dir/math",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param $files Array: full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param $dirs Array: full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * "Running test $desc..."
- */
- protected function showTesting( $desc ) {
- print "Running test $desc... ";
- }
-
- /**
- * Print a happy success message.
- *
- * @param $desc String: the test name
- * @return Boolean
- */
- protected function showSuccess( $desc ) {
- if ( $this->showProgress ) {
- print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
- }
-
- return true;
- }
-
- /**
- * Print a failure message and provide some explanatory output
- * about what went wrong if so configured.
- *
- * @param $desc String: the test name
- * @param $result String: expected HTML output
- * @param $html String: actual HTML output
- * @return Boolean
- */
- protected function showFailure( $desc, $result, $html ) {
- if ( $this->showFailure ) {
- if ( !$this->showProgress ) {
- # 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->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
-
- if ( $this->showOutput ) {
- print "--- Expected ---\n$result\n--- Actual ---\n$html\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 $input String
- * @param $output String
- * @param $inFileTail String: tailing for the input file name
- * @param $outFileTail String: tailing for the output file name
- * @return String
- */
- protected 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 $data String
- * @param $filename String
- */
- private function dumpToFile( $data, $filename ) {
- $file = fopen( $filename, "wt" );
- fwrite( $file, $data . "\n" );
- fclose( $file );
- }
-
- /**
- * Colorize unified diff output if set for ANSI color output.
- * Subtractions are colored blue, additions red.
- *
- * @param $text String
- * @return String
- */
- protected function colorDiff( $text ) {
- return preg_replace(
- array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
- array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
- $this->term->color( 31 ) . '$1' . $this->term->reset() ),
- $text );
- }
-
- /**
- * Show "Reading tests from ..."
- *
- * @param $path String
- */
- public function showRunFile( $path ) {
- print $this->term->color( 1 ) .
- "Reading tests from \"$path\"..." .
- $this->term->reset() .
- "\n";
- }
-
- /**
- * Insert a temporary test article
- * @param $name String: the title, including any prefix
- * @param $text String: the article text
- * @param $line Integer: the input line number, for reporting errors
- */
- static public function addArticle( $name, $text, $line = 'unknown' ) {
- global $wgCapitalLinks;
-
- $text = self::chomp($text);
-
- $oldCapitalLinks = $wgCapitalLinks;
- $wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637
-
- $name = self::chomp( $name );
- $title = Title::newFromText( $name );
-
- if ( is_null( $title ) ) {
- wfDie( "invalid title ('$name' => '$title') at line $line\n" );
- }
-
- $aid = $title->getArticleID( Title::GAID_FOR_UPDATE );
-
- if ( $aid != 0 ) {
- debug_print_backtrace();
- wfDie( "duplicate article '$name' at line $line\n" );
- }
-
- $art = new Article( $title );
- $art->doEdit( $text, '', EDIT_NEW );
-
- $wgCapitalLinks = $oldCapitalLinks;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if tag hook is present
- */
- public function requireHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mTagHooks[$name] ) ) {
- $this->hooks[$name] = $wgParser->mTagHooks[$name];
- } else {
- echo " This test suite requires the '$name' hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if function hook is present
- */
- public function requireFunctionHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mFunctionHooks[$name] ) ) {
- $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
- } else {
- echo " This test suite requires the '$name' function hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /*
- * Run the "tidy" command on text if the $wgUseTidy
- * global is true
- *
- * @param $text String: the text to tidy
- * @return String
- * @static
- */
- private function tidy( $text ) {
- global $wgUseTidy;
-
- if ( $wgUseTidy ) {
- $text = MWTidy::tidy( $text );
- }
-
- return $text;
- }
-
- private function wellFormed( $text ) {
- $html =
- Sanitizer::hackDocType() .
- '' .
- $text .
- '';
-
- $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;
- }
-
- private function extractFragment( $text, $position ) {
- $start = max( 0, $position - 10 );
- $before = $position - $start;
- $fragment = '...' .
- $this->term->color( 34 ) .
- substr( $text, $start, $before ) .
- $this->term->color( 0 ) .
- $this->term->color( 31 ) .
- $this->term->color( 1 ) .
- substr( $text, $position, 1 ) .
- $this->term->color( 0 ) .
- $this->term->color( 34 ) .
- substr( $text, $position + 1, 9 ) .
- $this->term->color( 0 ) .
- '...';
- $display = str_replace( "\n", ' ', $fragment );
- $caret = ' ' .
- str_repeat( ' ', $before ) .
- $this->term->color( 31 ) .
- '^' .
- $this->term->color( 0 );
-
- return "$display\n$caret";
- }
-
- static function getFakeTimestamp( &$parser, &$ts ) {
- $ts = 123;
- return true;
- }
-}
diff --git a/maintenance/tests/parser/parserTests.txt b/maintenance/tests/parser/parserTests.txt
deleted file mode 100644
index daccf7ccf4..0000000000
--- a/maintenance/tests/parser/parserTests.txt
+++ /dev/null
@@ -1,8315 +0,0 @@
-# MediaWiki Parser test cases
-# Some taken from http://meta.wikimedia.org/wiki/Parser_testing
-# All (C) their respective authors and released under the GPL
-#
-# The syntax should be fairly self-explanatory.
-#
-# Currently supported test options:
-# One of the following three:
-#
-# (default) generate HTML output
-# pst apply pre-save transform
-# msg apply message transform
-#
-# Plus any combination of these:
-#
-# cat add category links
-# ill add inter-language links
-# subpage enable subpages (disabled by default)
-# noxml don't check for XML well formdness
-# title=[[XXX]] run test using article title XXX
-# language=XXX set content language to XXX for this test
-# variant=XXX set the variant of language for this test (eg zh-tw)
-# disabled do not run test
-# showtitle make the first line the title
-# comment run through Linker::formatComment() instead of main parser
-# local format section links in edit comment text as local links
-#
-# For testing purposes, temporary articles can created:
-# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
-# where '/' denotes a newline.
-
-# This is the standard article assumed to exist.
-!! article
-Main Page
-!! text
-blah blah
-!! endarticle
-
-!!article
-Template:Foo
-!!text
-FOO
-!!endarticle
-
-!! article
-Template:Blank
-!! text
-!! endarticle
-
-!! article
-Template:!
-!! text
-|
-!! endarticle
-
-!!article
-MediaWiki:bad image list
-!!text
-* [[File:Bad.jpg]] except [[Nasty page]]
-!!endarticle
-
-###
-### Basic tests
-###
-!! test
-Blank input
-!! input
-!! result
-!! end
-
-
-!! test
-Simple paragraph
-!! input
-This is a simple paragraph.
-!! result
-This is a simple paragraph.
-
-!! end
-
-!! test
-Simple list
-!! input
-* Item 1
-* Item 2
-!! result
-
-
-!! end
-
-!! test
-Italics and bold
-!! input
-* plain
-* plain''italic''plain
-* plain''italic''plain''italic''plain
-* plain'''bold'''plain
-* plain'''bold'''plain'''bold'''plain
-* plain''italic''plain'''bold'''plain
-* plain'''bold'''plain''italic''plain
-* plain''italic'''bold-italic'''italic''plain
-* plain'''bold''bold-italic''bold'''plain
-* plain'''''bold-italic'''italic''plain
-* plain'''''bold-italic''bold'''plain
-* plain''italic'''bold-italic'''''plain
-* plain'''bold''bold-italic'''''plain
-* plain l'''italic''plain
-* plain l''''bold''' plain
-!! result
-- plain
-
- plainitalicplain
-
- plainitalicplainitalicplain
-
- plainboldplain
-
- plainboldplainboldplain
-
- plainitalicplainboldplain
-
- plainboldplainitalicplain
-
- plainitalicbold-italicitalicplain
-
- plainboldbold-italicboldplain
-
- plainbold-italicitalicplain
-
- plainbold-italicboldplain
-
- plainitalicbold-italicplain
-
- plainboldbold-italicplain
-
- plain l'italicplain
-
- plain l'bold plain
-
-
-!! end
-
-###
-### test cases
-###
-
-!! test
- unordered list
-!! input
-* This is not an unordered list item.
-!! result
-* This is not an unordered list item.
-
-!! end
-
-!! test
- spacing
-!! input
-Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-
-!! result
-Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-
-
-!! end
-
-!! test
-nowiki 3
-!! input
-:There is not nowiki.
-:There is nowiki.
-
-#There is not nowiki.
-#There is nowiki.
-
-*There is not nowiki.
-*There is nowiki.
-!! result
-- There is not nowiki.
-
- There is nowiki.
-
-- There is not nowiki.
-
- There is nowiki.
-
-- There is not nowiki.
-
- There is nowiki.
-
-
-!! end
-
-
-###
-### Comments
-###
-!! test
-Comment test 1
-!! input
- asdf
-
-!! result
-asdf
-
-
-!! end
-
-!! test
-Comment test 2
-!! input
-asdf
-
-jkl
-!! result
-asdf
-jkl
-
-!! end
-
-!! test
-Comment test 3
-!! input
-asdf
-
-
-jkl
-!! result
-asdf
-jkl
-
-!! end
-
-!! test
-Comment test 4
-!! input
-asdfjkl
-!! result
-asdfjkl
-
-!! end
-
-!! test
-Comment spacing
-!! input
-a
- b
-c
-!! result
-a
-
- b
-
-c
-
-!! end
-
-!! test
-Comment whitespace
-!! input
-
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters
-!! input
-
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters, redux
-!! input
-
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters: directors cut
-!! input
--->
-!! result
--->
-
-!! end
-
-!! test
-Comment semantics: nesting
-!! input
--->
-!! result
--->
-
-!! end
-
-!! test
-Comment semantics: unclosed comment at end
-!! input
-oo}}
-!! result
-FOO
-
-!! end
-
-!! test
-Comment on its own line post-expand
-!! input
-a
-{{blank}}
-b
-!! result
-a
-
b
-
-!! end
-
-###
-### Preformatted text
-###
-!! test
-Preformatted text
-!! input
- This is some
- Preformatted text
- With ''italic''
- And '''bold'''
- And a [[Main Page|link]]
-!! result
-This is some
-Preformatted text
-With italic
-And bold
-And a link
-
-!! end
-
-!! test
- with inside (compatibility with 1.6 and earlier)
-!! input
-
-
-
-
-
-!! result
-
-<b>
-<cite>
-<em>
-
-
-!! end
-
-!! test
-Regression with preformatted in
-!! input
-
- Blah
-
-!! result
-
-Blah
-
-
-
-!! end
-
-# Expected output in the following test is not really expected (there should be
-# in the output) -- it's only testing for well-formedness.
-!! test
-Bug 6200: Preformatted in
-!! input
-
- Blah
-
-!! result
-
- Blah
-
-
-!! end
-
-!! test
- with attributes (bug 3202)
-!! input
-Bluescreen of WikiDeath
-!! result
-Bluescreen of WikiDeath
-
-!! end
-
-!! test
- with width attribute (bug 3202)
-!! input
-Narrow screen goodies
-!! result
-Narrow screen goodies
-
-!! end
-
-!! test
- with forbidden attribute (bug 3202)
-!! input
-Narrow screen goodies
-!! result
-Narrow screen goodies
-
-!! end
-
-!! test
- with forbidden attribute values (bug 3202)
-!! input
-Narrow screen goodies
-!! result
-Narrow screen goodies
-
-!! end
-
-!! test
- inside (bug 13238)
-!! input
-
-
-
-
-
-
-Foo
-!! result
-
-<nowiki>
-
-
-
-
-<nowiki>Foo</nowiki>
-
-!! end
-
-!! test
- and preference (first one wins)
-!! input
-
-
-
-
-
-
-
-
-
-
-
-
-
-!! result
-
-<nowiki>
-
-</nowiki>
-</pre>
-
-<pre>
-<nowiki>
-</pre>
-
-</pre>
-
-!! end
-
-
-###
-### Definition lists
-###
-!! test
-Simple definition
-!! input
-; name : Definition
-!! result
-
- name
- Definition
-
-
-!! end
-
-!! test
-Definition list for indentation only
-!! input
-: Indented text
-!! result
-- Indented text
-
-
-!! end
-
-!! test
-Definition list with no space
-!! input
-;name:Definition
-!! result
-- name
- Definition
-
-
-!!end
-
-!! test
-Definition list with URL link
-!! input
-; http://example.com/ : definition
-!! result
-- http://example.com/
- definition
-
-
-!! end
-
-!! test
-Definition list with bracketed URL link
-!! input
-;[http://www.example.com/ Example]:Something about it
-!! result
-- Example
- Something about it
-
-
-!! end
-
-!! test
-Definition list with wikilink containing colon
-!! input
-; [[Help:FAQ]]: The least-read page on Wikipedia
-!! result
-- Help:FAQ
- The least-read page on Wikipedia
-
-
-!! end
-
-# At Brion's and JeLuF's insistence... :)
-!! test
-Definition list with news link containing colon
-!! input
-; news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! result
-- news:alt.wikipedia.rox
- This isn't even a real newsgroup!
-
-
-!! end
-
-!! test
-Malformed definition list with colon
-!! input
-; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-!! result
-- news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-
-
-!! end
-
-!! test
-Definition lists: colon in external link text
-!! input
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
-!! result
-- Wikipedia : The Next Generation
- OK, I made that up
-
-
-!! end
-
-!! test
-Definition lists: colon in HTML attribute
-!! input
-;bold
-!! result
-- bold
-
-
-!! end
-
-
-!! test
-Definition lists: self-closed tag
-!! input
-;one
two : two-line fun
-!! result
-- one
two - two-line fun
-
-
-!! end
-
-
-###
-### External links
-###
-!! test
-External links: non-bracketed
-!! input
-Non-bracketed: http://example.com
-!! result
-Non-bracketed: http://example.com
-
-!! end
-
-!! test
-External links: numbered
-!! input
-Numbered: [http://example.com]
-Numbered: [http://example.net]
-Numbered: [http://example.com]
-!! result
-Numbered: [1]
-Numbered: [2]
-Numbered: [3]
-
-!!end
-
-!! test
-External links: specified text
-!! input
-Specified text: [http://example.com link]
-!! result
-Specified text: link
-
-!!end
-
-!! test
-External links: trail
-!! input
-Linktrails should not work for external links: [http://example.com link]s
-!! result
-Linktrails should not work for external links: links
-
-!! end
-
-!! test
-External links: dollar sign in URL
-!! input
-http://example.com/1$2345
-!! result
-http://example.com/1$2345
-
-!! end
-
-!! test
-External links: dollar sign in URL (named)
-!! input
-[http://example.com/1$2345]
-!! result
-[1]
-
-!!end
-
-!! test
-External links: open square bracket forbidden in URL (bug 4377)
-!! input
-http://example.com/1[2345
-!! result
-http://example.com/1[2345
-
-!! end
-
-!! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
-!! input
-[http://example.com/1[2345]
-!! result
-[2345
-
-!!end
-
-!! test
-External links: nowiki in URL link text (bug 6230)
-!!input
-[http://example.com/ ''example site'']
-!! result
-''example site''
-
-!! end
-
-!! test
-External links: newline forbidden in text (bug 6230 regression check)
-!! input
-[http://example.com/ first
-second]
-!! result
-[http://example.com/ first
-second]
-
-!!end
-
-!! test
-External image
-!! input
-External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-External image:
-
-!! end
-
-!! test
-External image from https
-!! input
-External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-External image from https:
-
-!! end
-
-!! test
-Link to non-http image, no img tag
-!! input
-Link to non-http image, no img tag: ftp://example.com/test.jpg
-!! result
-Link to non-http image, no img tag: ftp://example.com/test.jpg
-
-!! end
-
-!! test
-External links: terminating separator
-!! input
-Terminating separator: http://example.com/thing,
-!! result
-Terminating separator: http://example.com/thing,
-
-!! end
-
-!! test
-External links: intervening separator
-!! input
-Intervening separator: http://example.com/1,2,3
-!! result
-Intervening separator: http://example.com/1,2,3
-
-!! end
-
-!! test
-External links: old bug with URL in query
-!! input
-Old bug with URL in query: [http://example.com/thing?url=http://example.com link]
-!! result
-Old bug with URL in query: link
-
-!! end
-
-!! test
-External links: old URL-in-URL bug, mixed protocols
-!! input
-And again with mixed protocols: [ftp://example.com?url=http://example.com link]
-!! result
-And again with mixed protocols: link
-
-!!end
-
-!! test
-External links: URL in text
-!! input
-URL in text: [http://example.com http://example.com]
-!! result
-URL in text: http://example.com
-
-!! end
-
-!! test
-External links: Clickable images
-!! input
-ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! result
-ja-style clickable images:
-
-!!end
-
-!! test
-External links: raw ampersand
-!! input
-Old & use: http://x&y
-!! result
-Old & use: http://x&y
-
-!! end
-
-!! test
-External links: encoded ampersand
-!! input
-Old & use: http://x&y
-!! result
-Old & use: http://x&y
-
-!! end
-
-!! test
-External links: encoded equals (bug 6102)
-!! input
-http://example.com/?foo=bar
-!! result
-http://example.com/?foo=bar
-
-!! end
-
-!! test
-External links: [raw ampersand]
-!! input
-Old & use: [http://x&y]
-!! result
-Old & use: [1]
-
-!! end
-
-!! test
-External links: [encoded ampersand]
-!! input
-Old & use: [http://x&y]
-!! result
-Old & use: [1]
-
-!! end
-
-!! test
-External links: [encoded equals] (bug 6102)
-!! input
-[http://example.com/?foo=bar]
-!! result
-[1]
-
-!! end
-
-!! test
-External links: [IDN ignored character reference in hostname; strip it right off]
-!! input
-[http://example.com/]
-!! result
-[1]
-
-!! end
-
-!! test
-External links: IDN ignored character reference in hostname; strip it right off
-!! input
-http://example.com/
-!! result
-http://example.com/
-
-!! end
-
-!! test
-External links: www.jpeg.org (bug 554)
-!! input
-http://www.jpeg.org
-!!result
-http://www.jpeg.org
-
-!! end
-
-!! test
-External links: URL within URL (original bug 2)
-!! input
-[http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! result
-[1]
-
-!! end
-
-!! test
-BUG 361: URL inside bracketed URL
-!! input
-[http://www.example.com/foo http://www.example.com/bar]
-!! result
-http://www.example.com/bar
-
-!! end
-
-!! test
-BUG 361: URL within URL, not bracketed
-!! input
-http://www.example.com/foo?=http://www.example.com/bar
-!! result
-http://www.example.com/foo?=http://www.example.com/bar
-
-!! end
-
-!! test
-BUG 289: ">"-token in URL-tail
-!! input
-http://www.example.com/
-!! result
-http://www.example.com/<hello>
-
-!!end
-
-!! test
-BUG 289: literal ">"-token in URL-tail
-!! input
-http://www.example.com/html
-!! result
-http://www.example.com/html
-
-!!end
-
-!! test
-BUG 289: ">"-token in bracketed URL
-!! input
-[http://www.example.com/ stuff]
-!! result
-<hello> stuff
-
-!!end
-
-!! test
-BUG 289: literal ">"-token in bracketed URL
-!! input
-[http://www.example.com/html stuff]
-!! result
-html stuff
-
-!!end
-
-!! test
-BUG 289: literal double quote at end of URL
-!! input
-http://www.example.com/"hello"
-!! result
-http://www.example.com/"hello"
-
-!!end
-
-!! test
-BUG 289: literal double quote in bracketed URL
-!! input
-[http://www.example.com/"hello" stuff]
-!! result
-"hello" stuff
-
-!!end
-
-!! test
-External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
-!! input
-[http://www.example.com test]
-!! result
-test
-
-!! end
-
-!! test
-External links: wiki links within external link (Bug 3695)
-!! input
-[http://example.com [[wikilink]] embedded in ext link]
-!! result
-wikilink embedded in ext link
-
-!! end
-
-!! test
-BUG 787: Links with one slash after the url protocol are invalid
-!! input
-http:/example.com
-
-[http:/example.com title]
-!! result
-http:/example.com
-
[http:/example.com title]
-
-!! end
-
-!! test
-Bug 2702: Mismatched , and tags are invalid
-!! input
-''[http://example.com text'']
-[http://example.com '''text]'''
-''Something [http://example.com in italic'']
-''Something [http://example.com mixed''''', even bold]'''
-'''''Now [http://example.com both''''']
-!! result
-text
-text
-Something in italic
-Something mixed, even bold
-Now both
-
-!! end
-
-
-!! test
-Bug 4781: %26 in URL
-!! input
-http://www.example.com/?title=AT%26T
-!! result
-http://www.example.com/?title=AT%26T
-
-!! end
-
-!! test
-Bug 4781, 5267: %26 in URL
-!! input
-http://www.example.com/?title=100%25_Bran
-!! result
-http://www.example.com/?title=100%25_Bran
-
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in URL
-!! input
-http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! result
-http://www.example.com/?title=Ben-Hur_%281959_film%29
-
-!! end
-
-
-!! test
-Bug 4781: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=AT%26T]
-!! result
-[1]
-
-!! end
-
-!! test
-Bug 4781, 5267: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=100%25_Bran]
-!! result
-[1]
-
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in autonumber URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! result
-[1]
-
-!! end
-
-
-!! test
-Bug 4781: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=AT%26T link]
-!! result
-link
-
-!! end
-
-!! test
-Bug 4781, 5267: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=100%25_Bran link]
-!! result
-link
-
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in bracketed URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! result
-link
-
-!! end
-
-!! test
-External link containing double-single-quotes in text '' (bug 4598 sanity check)
-!! input
-Some [http://example.com/ pretty ''italics'' and stuff]!
-!! result
-Some pretty italics and stuff!
-
-!! end
-
-!! test
-External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [http://example.com/ pretty ''italics'' and stuff]!''
-!! result
-Some pretty italics and stuff!
-
-!! end
-
-!! test
-External link containing double-single-quotes with no space separating the url from text in italics
-!! input
-[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (ParÃs)|Museo Picasso]].]
-!! result
-La muerte de Casagemas (1901) en el sitio de Museo Picasso.
-
-!! end
-
-!! test
-URL-encoding in URL functions (single parameter)
-!! input
-{{localurl:Some page|amp=&}}
-!! result
-/index.php?title=Some_page&=&
-
-!! end
-
-!! test
-URL-encoding in URL functions (multiple parameters)
-!! input
-{{localurl:Some page|q=?&=&}}
-!! result
-/index.php?title=Some_page&q=?&=&
-
-!! end
-
-###
-### Quotes
-###
-
-!! test
-Quotes
-!! input
-Normal text. '''Bold text.''' Normal text. ''Italic text.''
-
-Normal text. '''''Bold italic text.''''' Normal text.
-!!result
-Normal text. Bold text. Normal text. Italic text.
-
Normal text. Bold italic text. Normal text.
-
-!! end
-
-
-!! test
-Unclosed and unmatched quotes
-!! input
-'''''Bold italic text '''with bold deactivated''' in between.'''''
-
-'''''Bold italic text ''with italic deactivated'' in between.'''''
-
-'''Bold text..
-
-..spanning two paragraphs (should not work).'''
-
-'''Bold tag left open
-
-''Italic tag left open
-
-Normal text.
-
-
-'''This year''''s election ''should'' beat '''last year''''s.
-
-''Tom'''s car is bigger than ''Susan'''s.
-!! result
-Bold italic text with bold deactivated in between.
-
Bold italic text with italic deactivated in between.
-
Bold text..
-
..spanning two paragraphs (should not work).
-
Bold tag left open
-
Italic tag left open
-
Normal text.
-
This year's election should beat last year's.
-
Toms car is bigger than Susans.
-
-!! end
-
-###
-### Tables
-###
-### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide:_Using_tables
-###
-
-# This should not produce as
-# is the bare minimun required by the spec, see:
-# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
-!! test
-A table with no data.
-!! input
-{||}
-!! result
-!! end
-
-# A table with nothing but a caption is invalid XHTML, we might want to render
-# this as caption
-!! test
-A table with nothing but a caption
-!! input
-{|
-|+ caption
-|}
-!! result
-
-
-!! end
-
-!! test
-Simple table
-!! input
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! result
-
-
-!! end
-
-!! test
-Multiplication table
-!! input
-{| border="1" cellpadding="2"
-|+Multiplication table
-|-
-! × !! 1 !! 2 !! 3
-|-
-! 1
-| 1 || 2 || 3
-|-
-! 2
-| 2 || 4 || 6
-|-
-! 3
-| 3 || 6 || 9
-|-
-! 4
-| 4 || 8 || 12
-|-
-! 5
-| 5 || 10 || 15
-|}
-!! result
-
-Multiplication table
-
-
- × |
- 1 |
- 2 |
- 3
- |
-
- 1
- |
- 1 |
- 2 |
- 3
- |
-
- 2
- |
- 2 |
- 4 |
- 6
- |
-
- 3
- |
- 3 |
- 6 |
- 9
- |
-
- 4
- |
- 4 |
- 8 |
- 12
- |
-
- 5
- |
- 5 |
- 10 |
- 15
- |
-
-!! end
-
-!! test
-Table rowspan
-!! input
-{| align=right border=1
-| Cell 1, row 1
-|rowspan=2| Cell 2, row 1 (and 2)
-| Cell 3, row 1
-|-
-| Cell 1, row 2
-| Cell 3, row 2
-|}
-!! result
-
-
- Cell 1, row 1
- |
- Cell 2, row 1 (and 2)
- |
- Cell 3, row 1
- |
-
- Cell 1, row 2
- |
- Cell 3, row 2
- |
-
-!! end
-
-!! test
-Nested table
-!! input
-{| border=1
-| α
-|
-{| bgcolor=#ABCDEF border=2
-|nested
-|-
-|table
-|}
-|the original table again
-|}
-!! result
-
-
- α
- |
-
-
- |
-the original table again
- |
-
-!! end
-
-!! test
-Invalid attributes in table cell (bug 1830)
-!! input
-{|
-|Cell:|broken
-|}
-!! result
-
-
-!! end
-
-
-!! test
-Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! input
-{|
-| |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! result
-
-
-[ftp://%7Cx |
-]" onmouseover="alert(document.cookie)">test
- |
-
-
-
-!! end
-
-
-###
-### Internal links
-###
-!! test
-Plain link, capitalized
-!! input
-[[Main Page]]
-!! result
-Main Page
-
-!! end
-
-!! test
-Plain link, uncapitalized
-!! input
-[[main Page]]
-!! result
-main Page
-
-!! end
-
-!! test
-Piped link
-!! input
-[[Main Page|The Main Page]]
-!! result
-The Main Page
-
-!! end
-
-!! test
-Broken link
-!! input
-[[Zigzagzogzagzig]]
-!! result
-Zigzagzogzagzig
-
-!! end
-
-!! test
-Broken link with fragment
-!! input
-[[Zigzagzogzagzig#zug]]
-!! result
-Zigzagzogzagzig#zug
-
-!! end
-
-!! test
-Special page link with fragment
-!! input
-[[Special:Version#anchor]]
-!! result
-Special:Version#anchor
-
-!! end
-
-!! test
-Nonexistent special page link with fragment
-!! input
-[[Special:ThisNameWillHopefullyNeverBeUsed#anchor]]
-!! result
-Special:ThisNameWillHopefullyNeverBeUsed#anchor
-
-!! end
-
-!! test
-Link with prefix
-!! input
-xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
-!! result
-xxxmain Page, xxxMain Page, Xxxmain Page XXXmain Page, XXXMain Page
-
-!! end
-
-!! test
-Link with suffix
-!! input
-[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
-!! result
-Main Pagexxx, Main PageXXX, Main Page!!!
-
-!! end
-
-!! test
-Link with 3 brackets
-!! input
-[[[main page]]]
-!! result
-[[[main page]]]
-
-!! end
-
-!! test
-Piped link with 3 brackets
-!! input
-[[[main page|the main page]]]
-!! result
-[[[main page|the main page]]]
-
-!! end
-
-!! test
-Link with multiple pipes
-!! input
-[[Main Page|The|Main|Page]]
-!! result
-The|Main|Page
-
-!! end
-
-!! test
-Link to namespaces
-!! input
-[[Talk:Parser testing]], [[Meta:Disclaimers]]
-!! result
-Talk:Parser testing, Meta:Disclaimers
-
-!! end
-
-!! test
-Piped link to namespace
-!! input
-[[Meta:Disclaimers|The disclaimers]]
-!! result
-The disclaimers
-
-!! end
-
-!! test
-Link containing }
-!! input
-[[Usually caused by a typo (oops}]]
-!! result
-[[Usually caused by a typo (oops}]]
-
-!! end
-
-!! test
-Link containing % (not as a hex sequence)
-!! input
-[[7% Solution]]
-!! result
-7% Solution
-
-!! end
-
-!! test
-Link containing % as a single hex sequence interpreted to char
-!! input
-[[7%25 Solution]]
-!! result
-7% Solution
-
-!!end
-
-!! test
-Link containing % as a double hex sequence interpreted to hex sequence
-!! input
-[[7%2525 Solution]]
-!! result
-[[7%2525 Solution]]
-
-!!end
-
-!! test
-Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
-Example for such a section: == < ==
-!! input
-[[%23%3c]][[%23%3e]]
-!! result
-#<#>
-
-!! end
-
-!! test
-Link containing "<#" and ">#" as a hex sequences
-!! input
-[[%3c%23]][[%3e%23]]
-!! result
-[[%3c%23]][[%3e%23]]
-
-!! end
-
-!! test
-Link containing double-single-quotes '' (bug 4598)
-!! input
-[[Lista d''e paise d''o munno]]
-!! result
-Lista d''e paise d''o munno
-
-!! end
-
-!! test
-Link containing double-single-quotes '' in text (bug 4598 sanity check)
-!! input
-Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-Some pretty italics and stuff!
-
-!! end
-
-!! test
-Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-Some pretty italics and stuff!
-
-!! end
-
-!! test
-Link with double quotes in title part (literal) and alternate part (interpreted)
-!! input
-[[File:Denys Savchenko ''Pentecoste''.jpg]]
-
-[[''Pentecoste'']]
-
-[[''Pentecoste''|Pentecoste]]
-
-[[''Pentecoste''|''Pentecoste'']]
-!! result
-File:Denys Savchenko Pentecoste.jpg
-
''Pentecoste''
-
Pentecoste
-
Pentecoste
-
-!! end
-
-!! test
-Plain link to URL
-!! input
-[[http://www.example.com]]
-!! result
-[[1]]
-
-!! end
-
-# I'm fairly sure the expected result here is wrong.
-# We want these to be URL links, not pseudo-pages with URLs for titles....
-# However the current output is also pretty screwy.
-#
-# ----
-# I'm changing it to match the current output--it arguably makes more
-# sense in the light of the test above. Old expected result was:
-#Piped link to URL: an example URL
-#
-# But I think this test is bordering on "garbage in, garbage out" anyway.
-# -- wtm
-!! test
-Piped link to URL
-!! input
-Piped link to URL: [[http://www.example.com|an example URL]]
-!! result
-Piped link to URL: [example URL]
-
-!! end
-
-!! test
-BUG 2: [[page|http://url/]] should link to page, not http://url/
-!! input
-[[Main Page|http://url/]]
-!! result
-http://url/
-
-!! end
-
-!! test
-BUG 337: Escaped self-links should be bold
-!! options
-title=[[Bug462]]
-!! input
-[[Bug462]] [[Bug462]]
-!! result
-Bug462 Bug462
-
-!! end
-
-!! test
-Self-link to section should not be bold
-!! options
-title=[[Main Page]]
-!! input
-[[Main Page#section]]
-!! result
-Main Page#section
-
-!! end
-
-!! article
-00
-!! text
-This is 00.
-!! endarticle
-
-!!test
-Self-link to numeric title
-!!options
-title=[[0]]
-!!input
-[[0]]
-!!result
-0
-
-!!end
-
-!!test
-Link to numeric-equivalent title
-!!options
-title=[[0]]
-!!input
-[[00]]
-!!result
-00
-
-!!end
-
-!! test
- inside a link
-!! input
-[[Main Page]] [[Main Page|the main page [it's not very good]]]
-!! result
-[[Main Page]] the main page [it's not very good]
-
-!! end
-
-!! test
-Non-breaking spaces in title
-!! input
-[[ Main Page ]]
-!! result
- Main Page
-
-!!end
-
-
-###
-### Interwiki links (see maintenance/interwiki.sql)
-###
-
-!! test
-Inline interwiki link
-!! input
-[[MeatBall:SoftSecurity]]
-!! result
-MeatBall:SoftSecurity
-
-!! end
-
-!! test
-Inline interwiki link with empty title (bug 2372)
-!! input
-[[MeatBall:]]
-!! result
-MeatBall:
-
-!! end
-
-!! test
-Interwiki link encoding conversion (bug 1636)
-!! input
-*[[Wikipedia:ro:Olteniţa]]
-*[[Wikipedia:ro:Olteniţa]]
-!! result
-
-
-!! end
-
-!! test
-Interwiki link with fragment (bug 2130)
-!! input
-[[MeatBall:SoftSecurity#foo]]
-!! result
-MeatBall:SoftSecurity#foo
-
-!! end
-
-!! test
-Interlanguage link
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-Blah blah blah
-
-!! end
-
-!! test
-Double interlanguage link
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-Blah blah blah
-
-!! end
-
-!! test
-Interlanguage link, with prefix links
-!! options
-language=ln
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-Blah blah blah
-
-!! end
-
-!! test
-Double interlanguage link, with prefix links (bug 8897)
-!! options
-language=ln
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-Blah blah blah
-
-!! end
-
-
-##
-## XHTML tidiness
-###
-
-!! test
-
to
-!! input
-1
2
3
-!! result
-1
2
3
-
-!! end
-
-!! test
-Incorrecly removing closing slashes from correctly formed XHTML
-!! input
-
-!! result
-
-
-!! end
-
-!! test
-Failing to transform badly formed HTML into correct XHTML
-!! input
-
-
-
-!! result
-
-
-
-
-!!end
-
-!! test
-Horizontal ruler (should it add that extra space?)
-!! input
-
-
-foo
bar
-!! result
-
-
-foo
bar
-
-!! end
-
-###
-### Block-level elements
-###
-!! test
-Common list
-!! input
-*Common list
-* item 2
-*item 3
-!! result
-- Common list
-
- item 2
-
- item 3
-
-
-!! end
-
-!! test
-Numbered list
-!! input
-#Numbered list
-#item 2
-# item 3
-!! result
-- Numbered list
-
- item 2
-
- item 3
-
-
-!! end
-
-!! test
-Mixed list
-!! input
-*Mixed list
-*# with numbers
-** and bullets
-*# and numbers
-*bullets again
-**bullet level 2
-***bullet level 3
-***#Number on level 4
-**bullet level 2
-**#Number on level 3
-**#Number on level 3
-*#number level 2
-*Level 1
-!! result
-- Mixed list
-
- with numbers
-
-
-- and numbers
-
- - bullets again
-
- bullet level 2
-
- bullet level 3
-
- Number on level 4
-
-
- - bullet level 2
-
- Number on level 3
-
- Number on level 3
-
-
-- number level 2
-
- - Level 1
-
-
-!! end
-
-!! test
-List items are not parsed correctly following a block (bug 785)
-!! input
-* foo
-* bar
-* zar
-!! result
-
-
-!! end
-
-###
-### Magic Words
-###
-
-!! test
-Magic Word: {{CURRENTDAY}}
-!! input
-{{CURRENTDAY}}
-!! result
-1
-
-!! end
-
-!! test
-Magic Word: {{CURRENTDAY2}}
-!! input
-{{CURRENTDAY2}}
-!! result
-01
-
-!! end
-
-!! test
-Magic Word: {{CURRENTDAYNAME}}
-!! input
-{{CURRENTDAYNAME}}
-!! result
-Thursday
-
-!! end
-
-!! test
-Magic Word: {{CURRENTDOW}}
-!! input
-{{CURRENTDOW}}
-!! result
-4
-
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTH}}
-!! input
-{{CURRENTMONTH}}
-!! result
-01
-
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHABBREV}}
-!! input
-{{CURRENTMONTHABBREV}}
-!! result
-Jan
-
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAME}}
-!! input
-{{CURRENTMONTHNAME}}
-!! result
-January
-
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
-{{CURRENTMONTHNAMEGEN}}
-!! result
-January
-
-!! end
-
-!! test
-Magic Word: {{CURRENTTIME}}
-!! input
-{{CURRENTTIME}}
-!! result
-00:02
-
-!! end
-
-!! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
-!! input
-{{CURRENTWEEK}}
-!! result
-1
-
-!! end
-
-!! test
-Magic Word: {{CURRENTYEAR}}
-!! input
-{{CURRENTYEAR}}
-!! result
-1970
-
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAME}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAME}}
-!! result
-User:Ãvar Arnfjörð Bjarmason
-
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAMEE}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAMEE}}
-!! result
-User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-
-!! end
-
-!! test
-Magic Word: {{NAMESPACE}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACE}}
-!! result
-User
-
-!! end
-
-!! test
-Magic Word: {{NAMESPACEE}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACEE}}
-!! result
-User
-
-!! end
-
-!! test
-Magic Word: {{NUMBEROFFILES}}
-!! input
-{{NUMBEROFFILES}}
-!! result
-2
-
-!! end
-
-!! test
-Magic Word: {{PAGENAME}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAME}}
-!! result
-Ãvar Arnfjörð Bjarmason
-
-!! end
-
-!! test
-Magic Word: {{PAGENAMEE}}
-!! options
-title=[[User:Ãvar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAMEE}}
-!! result
-%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-
-!! end
-
-!! test
-Magic Word: {{REVISIONID}}
-!! input
-{{REVISIONID}}
-!! result
-1337
-
-!! end
-
-!! test
-Magic Word: {{SCRIPTPATH}}
-!! input
-{{SCRIPTPATH}}
-!! result
-/
-
-!! end
-
-!! test
-Magic Word: {{SERVER}}
-!! input
-{{SERVER}}
-!! result
-http://Britney-Spears
-
-!! end
-
-!! test
-Magic Word: {{SERVERNAME}}
-!! input
-{{SERVERNAME}}
-!! result
-Britney-Spears
-
-!! end
-
-!! test
-Magic Word: {{SITENAME}}
-!! input
-{{SITENAME}}
-!! result
-MediaWiki
-
-!! end
-
-!! test
-Namespace 1 {{ns:1}}
-!! input
-{{ns:1}}
-!! result
-Talk
-
-!! end
-
-!! test
-Namespace 1 {{ns:01}}
-!! input
-{{ns:01}}
-!! result
-Talk
-
-!! end
-
-!! test
-Namespace 0 {{ns:0}} (bug 4783)
-!! input
-{{ns:0}}
-!! result
-
-!! end
-
-!! test
-Namespace 0 {{ns:00}} (bug 4783)
-!! input
-{{ns:00}}
-!! result
-
-!! end
-
-!! test
-Namespace -1 {{ns:-1}}
-!! input
-{{ns:-1}}
-!! result
-Special
-
-!! end
-
-!! test
-Namespace User {{ns:User}}
-!! input
-{{ns:User}}
-!! result
-User
-
-!! end
-
-!! test
-Namespace User talk {{ns:User_talk}}
-!! input
-{{ns:User_talk}}
-!! result
-User talk
-
-!! end
-
-!! test
-Namespace User talk {{ns:uSeR tAlK}}
-!! input
-{{ns:uSeR tAlK}}
-!! result
-User talk
-
-!! end
-
-!! test
-Namespace File {{ns:File}}
-!! input
-{{ns:File}}
-!! result
-File
-
-!! end
-
-!! test
-Namespace File {{ns:Image}}
-!! input
-{{ns:Image}}
-!! result
-File
-
-!! end
-
-!! test
-Namespace (lang=de) Benutzer {{ns:User}}
-!! options
-language=de
-!! input
-{{ns:User}}
-!! result
-Benutzer
-
-!! end
-
-!! test
-Namespace (lang=de) Benutzer Diskussion {{ns:3}}
-!! options
-language=de
-!! input
-{{ns:3}}
-!! result
-Benutzer Diskussion
-
-!! end
-
-
-!! test
-Urlencode
-!! input
-{{urlencode:hi world?!}}
-{{urlencode:hi world?!|WIKI}}
-{{urlencode:hi world?!|PATH}}
-{{urlencode:hi world?!|QUERY}}
-!! result
-hi+world%3F%21
-hi_world%3F!
-hi%20world%3F%21
-hi+world%3F%21
-
-!! end
-
-###
-### Magic links
-###
-!! test
-Magic links: internal link to RFC (bug 479)
-!! input
-[[RFC 123]]
-!! result
-RFC 123
-
-!! end
-
-!! test
-Magic links: RFC (bug 479)
-!! input
-RFC 822
-!! result
-RFC 822
-
-!! end
-
-!! test
-Magic links: ISBN (bug 1937)
-!! input
-ISBN 0-306-40615-2
-!! result
-ISBN 0-306-40615-2
-
-!! end
-
-!! test
-Magic links: PMID incorrectly converts space to underscore
-!! input
-PMID 1234
-!! result
-PMID 1234
-
-!! end
-
-###
-### Templates
-####
-
-!! test
-Nonexistent template
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-Template:Thistemplatedoesnotexist
-
-!! end
-
-!! article
-Template:test
-!! text
-This is a test template
-!! endarticle
-
-!! test
-Simple template
-!! input
-{{test}}
-!! result
-This is a test template
-
-!! end
-
-!! test
-Template with explicit namespace
-!! input
-{{Template:test}}
-!! result
-This is a test template
-
-!! end
-
-
-!! article
-Template:paramtest
-!! text
-This is a test template with parameter {{{param}}}
-!! endarticle
-
-!! test
-Template parameter
-!! input
-{{paramtest|param=foo}}
-!! result
-This is a test template with parameter foo
-
-!! end
-
-!! article
-Template:paramtestnum
-!! text
-[[{{{1}}}|{{{2}}}]]
-!! endarticle
-
-!! test
-Template unnamed parameter
-!! input
-{{paramtestnum|Main Page|the main page}}
-!! result
-the main page
-
-!! end
-
-!! article
-Template:templatesimple
-!! text
-(test)
-!! endarticle
-
-!! article
-Template:templateredirect
-!! text
-#redirect [[Template:templatesimple]]
-!! endarticle
-
-!! article
-Template:templateasargtestnum
-!! text
-{{{{{1}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest
-!! text
-{{template{{{templ}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest2
-!! text
-{{{{{templ}}}}}
-!! endarticle
-
-!! test
-Template with template name as unnamed argument
-!! input
-{{templateasargtestnum|templatesimple}}
-!! result
-(test)
-
-!! end
-
-!! test
-Template with template name as argument
-!! input
-{{templateasargtest|templ=simple}}
-!! result
-(test)
-
-!! end
-
-!! test
-Template with template name as argument (2)
-!! input
-{{templateasargtest2|templ=templatesimple}}
-!! result
-(test)
-
-!! end
-
-!! article
-Template:templateasargtestdefault
-!! text
-{{{{{templ|templatesimple}}}}}
-!! endarticle
-
-!! article
-Template:templa
-!! text
-'''templ'''
-!! endarticle
-
-!! test
-Template with default value
-!! input
-{{templateasargtestdefault}}
-!! result
-(test)
-
-!! end
-
-!! test
-Template with default value (value set)
-!! input
-{{templateasargtestdefault|templ=templa}}
-!! result
-templ
-
-!! end
-
-!! test
-Template redirect
-!! input
-{{templateredirect}}
-!! result
-(test)
-
-!! end
-
-!! test
-Template with argument in separate line
-!! input
-{{ templateasargtest |
- templ = simple }}
-!! result
-(test)
-
-!! end
-
-!! test
-Template with complex template as argument
-!! input
-{{paramtest|
- param ={{ templateasargtest |
- templ = simple }}}}
-!! result
-This is a test template with parameter (test)
-
-!! end
-
-!! test
-Template with thumb image (with link in description)
-!! input
-{{paramtest|
- param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
-This is a test template with parameter
-
-!! end
-
-!! article
-Template:complextemplate
-!! text
-{{{1}}} {{paramtest|
- param ={{{param}}}}}
-!! endarticle
-
-!! test
-Template with complex arguments
-!! input
-{{complextemplate|
- param ={{ templateasargtest |
- templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
-link This is a test template with parameter (test)
-
-!! end
-
-!! test
-BUG 553: link with two variables in a piped link
-!! input
-{|
-|[[{{{1}}}|{{{2}}}]]
-|}
-!! result
-
-
-!! end
-
-!! test
-Magic variable as template parameter
-!! input
-{{paramtest|param={{SITENAME}}}}
-!! result
-This is a test template with parameter MediaWiki
-
-!! end
-
-!! article
-Template:linktest
-!! text
-[[{{{param}}}|link]]
-!! endarticle
-
-!! test
-Template parameter as link source
-!! input
-{{linktest|param=Main Page}}
-!! result
-link
-
-!! end
-
-
-!!article
-Template:paramtest2
-!! text
-including another template, {{paramtest|param={{{arg}}}}}
-!! endarticle
-
-!! test
-Template passing argument to another template
-!! input
-{{paramtest2|arg='hmm'}}
-!! result
-including another template, This is a test template with parameter 'hmm'
-
-!! end
-
-!! article
-Template:Linktest2
-!! text
-Main Page
-!! endarticle
-
-!! test
-Template as link source
-!! input
-[[{{linktest2}}]]
-!! result
-Main Page
-
-!! end
-
-
-!! article
-Template:loop1
-!! text
-{{loop2}}
-!! endarticle
-
-!! article
-Template:loop2
-!! text
-{{loop1}}
-!! endarticle
-
-!! test
-Template infinite loop
-!! input
-{{loop1}}
-!! result
-Template loop detected: Template:Loop1
-
-!! end
-
-!! test
-Template from main namespace
-!! input
-{{:Main Page}}
-!! result
-blah blah
-
-!! end
-
-!! article
-Template:table
-!! text
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! endarticle
-
-!! test
-BUG 529: Template with table, not included at beginning of line
-!! input
-foo {{table}}
-!! result
-foo
-
-
-
-!! end
-
-!! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
-!! input
-foo
-{{table}}
-!! result
-foo
-
-
-
-!! end
-
-!! test
-BUG 41: Template parameters shown as broken links
-!! input
-{{{parameter}}}
-!! result
-{{{parameter}}}
-
-!! end
-
-
-!! article
-Template:MSGNW test
-!! text
-''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-!! endarticle
-
-# hmm, fix this or just deprecate msgnw and document its behavior?
-!! test
-msgnw keyword
-!! options
-disabled
-!! input
-{{msgnw:MSGNW test}}
-!! result
-''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-
-!! end
-
-!! test
-int keyword
-!! input
-{{int:youhavenewmessages|lots of money|not!}}
-!! result
-You have lots of money (not!).
-
-!! end
-
-!! article
-Template:Includes
-!! text
-Foozarbar
-!! endarticle
-
-!! test
- and being included
-!! input
-{{Includes}}
-!! result
-Foobar
-
-!! end
-
-!! article
-Template:Includes2
-!! text
-Foobar
-!! endarticle
-
-!! test
- being included
-!! input
-{{Includes2}}
-!! result
-Foo
-
-!! end
-
-
-!! article
-Template:Includes3
-!! text
-Foobarzar
-!! endarticle
-
-!! test
- and being included
-!! input
-{{Includes3}}
-!! result
-Foo
-
-!! end
-
-!! test
- and on a page
-!! input
-Foozarbar
-!! result
-Foozar
-
-!! end
-
-!! test
- on a page
-!! input
-Foobar
-!! result
-Foobar
-
-!! end
-
-!! article
-Template:Includeonly section
-!! text
-
-==Includeonly section==
-
-==Section T-1==
-!!endarticle
-
-!! test
-Bug 6563: Edit link generation for section shown by
-!! input
-{{includeonly section}}
-!! result
-[edit] Includeonly section
-[edit] Section T-1
-
-!! end
-
-# Uses same input as the contents of [[Template:Includeonly section]]
-!! test
-Bug 6563: Section extraction for section shown by
-!! options
-section=T-2
-!! input
-
-==Includeonly section==
-
-==Section T-2==
-!! result
-==Section T-2==
-!! end
-
-!! test
-Bug 6563: Edit link generation for section suppressed by
-!! input
-
-==Includeonly section==
-
-==Section 1==
-!! result
-[edit] Section 1
-
-!! end
-
-!! test
-Bug 6563: Section extraction for section suppressed by
-!! options
-section=1
-!! input
-
-==Includeonly section==
-
-==Section 1==
-!! result
-==Section 1==
-!! end
-
-###
-### Pre-save transform tests
-###
-!! test
-pre-save transform: subst:
-!! options
-PST
-!! input
-{{subst:test}}
-!! result
-This is a test template
-!! end
-
-!! test
-pre-save transform: normal template
-!! options
-PST
-!! input
-{{test}}
-!! result
-{{test}}
-!! end
-
-!! test
-pre-save transform: nonexistent template
-!! options
-PST
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-{{thistemplatedoesnotexist}}
-!! end
-
-
-!! test
-pre-save transform: subst magic variables
-!! options
-PST
-!! input
-{{subst:SITENAME}}
-!! result
-MediaWiki
-!! end
-
-# This is bug 89, which I fixed. -- wtm
-!! test
-pre-save transform: subst: templates with parameters
-!! options
-pst
-!! input
-{{subst:paramtest|param="something else"}}
-!! result
-This is a test template with parameter "something else"
-!! end
-
-!! article
-Template:nowikitest
-!! text
-'''not wiki'''
-!! endarticle
-
-!! test
-pre-save transform: nowiki in subst (bug 1188)
-!! options
-pst
-!! input
-{{subst:nowikitest}}
-!! result
-'''not wiki'''
-!! end
-
-
-!! article
-Template:commenttest
-!! text
-This template has in it.
-!! endarticle
-
-!! test
-pre-save transform: comment in subst (bug 1936)
-!! options
-pst
-!! input
-{{subst:commenttest}}
-!! result
-This template has in it.
-!! end
-
-!! test
-pre-save transform: unclosed tag
-!! options
-pst noxml
-!! input
-'''not wiki'''
-!! result
-'''not wiki'''
-!! end
-
-!! test
-pre-save transform: mixed tag case
-!! options
-pst noxml
-!! input
-'''not wiki'''
-!! result
-'''not wiki'''
-!! end
-
-!! test
-pre-save transform: unclosed comment in
-!! options
-pst noxml
-!! input
-wikinowiki
-!!result
-
-!!end
-
-!! test
-pre-save transform: comment containing extension
-!! options
-pst
-!! input
-
-!!result
-
-!!end
-
-!! test
-pre-save transform: comment containing nowiki
-!! options
-pst
-!! input
-
-!!result
-
-!!end
-
-!! test
-pre-save transform: comment containing math
-!! options
-pst
-!! input
-
-!!result
-
-!!end
-
-!! test
-pre-save transform: in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-pre-save transform: in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes2}}
-!! result
-Foo
-!! end
-
-!! article
-Template:SubstTest
-!!text
-{{subst:Includes}}
-!! endarticle
-
-!! article
-Template:SafeSubstTest
-!! text
-{{safesubst:Includes}}
-!! endarticle
-
-!! test
-bug 22297: safesubst: works during PST
-!! options
-pst
-!! input
-{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
-FoobarFoobar
-!! end
-
-!! test
-bug 22297: safesubst: works during normal parse
-!! input
-{{SafeSubstTest}}
-!! result
-Foobar
-
-!! end
-
-!! test:
-subst: does not work during normal parse
-!! input
-{{SubstTest}}
-!! result
-{{subst:Includes}}
-
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick")
-!! options
-pst
-!! input
-[[Article (context)|]]
-[[Bar:Article|]]
-[[:Bar:Article|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
-!! result
-[[Article (context)|Article]]
-[[Bar:Article|Article]]
-[[:Bar:Article|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with interwiki prefix
-!! options
-pst
-!! input
-[[interwiki:Article|]]
-[[:interwiki:Article|]]
-[[interwiki:Bar:Article|]]
-[[:interwiki:Bar:Article|]]
-!! result
-[[interwiki:Article|Article]]
-[[:interwiki:Article|Article]]
-[[interwiki:Bar:Article|Bar:Article]]
-[[:interwiki:Bar:Article|Bar:Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens in title
-!! options
-pst title=[[Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma in title
-!! options
-pst title=[[Someplace, Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace, Elsewhere|]]
-[[Otherplace, Elsewhere, Anywhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace, Elsewhere|Otherplace]]
-[[Otherplace, Elsewhere, Anywhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens and comma
-!! options
-pst title=[[Someplace (IGNORED), Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace (place), Elsewhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace (place), Elsewhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma and parens
-!! options
-pst title=[[Who, me? (context)]]
-!! input
-[[|Yes, you.]]
-[[Me, Myself, and I (1937 song)|]]
-!! result
-[[Yes, you. (context)|Yes, you.]]
-[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace
-!! options
-pst title=[[Ns:Somearticle]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and parens
-!! options
-pst title=[[Ns:Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and comma
-!! options
-pst title=[[Ns:Somearticle, Context, Whatever]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context, Whatever|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, comma and parens
-!! options
-pst title=[[Ns:Somearticle, Context (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, parens and comma
-!! options
-pst title=[[Ns:Somearticle (IGNORED), Context]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context|Article]]
-!! end
-
-
-###
-### Message transform tests
-###
-!! test
-message transform: magic variables
-!! options
-msg
-!! input
-{{SITENAME}}
-!! result
-MediaWiki
-!! end
-
-!! test
-message transform: should not transform wiki markup
-!! options
-msg
-!! input
-''test''
-!! result
-''test''
-!! end
-
-!! test
-message transform: in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-message transform: in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes2}}
-!! result
-Foo
-!! end
-
-!! test
-{{#special:}} page name, known
-!! options
-msg
-!! input
-{{#special:Recentchanges}}
-!! result
-Special:RecentChanges
-!! end
-
-!! test
-{{#special:}} page name with subpage, known
-!! options
-msg
-!! input
-{{#special:Recentchanges/param}}
-!! result
-Special:RecentChanges/param
-!! end
-
-!! test
-{{#special:}} page name, unknown
-!! options
-msg
-!! input
-{{#special:foobarnonexistent}}
-!! result
-No such special page
-!! end
-
-###
-### Images
-###
-!! test
-Simple image
-!! input
-[[Image:foobar.jpg]]
-!! result
-
-
-!! end
-
-!! test
-Right-aligned image
-!! input
-[[Image:foobar.jpg|right]]
-!! result
-
-
-!! end
-
-!! test
-Simple image (using File: namespace, now canonical)
-!! input
-[[File:foobar.jpg]]
-!! result
-
-
-!! end
-
-!! test
-Image with caption
-!! input
-[[Image:foobar.jpg|right|Caption text]]
-!! result
-
-
-!! end
-
-!! test
-Image with link parameter, wiki target
-!! input
-[[Image:foobar.jpg|link=Target page]]
-!! result
-
-
-!! end
-
-!! test
-Image with link parameter, URL target
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! result
-
-
-!! end
-
-!! test
-Image with empty link parameter
-!! input
-[[Image:foobar.jpg|link=]]
-!! result
-
-
-!! end
-
-!! test
-Image with link parameter (wiki target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=Target page|Title]]
-!! result
-
-
-!! end
-
-!! test
-Image with link parameter (URL target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! result
-
-
-!! end
-
-!! test
-Thumbnail image with link parameter
-!! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
-!! result
-
-
-!! end
-
-!! test
-Image with frame and link
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
-
-
-!! end
-
-!! test
-Image with frame and link and explicit alt
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
-!! result
-
-
-!! end
-
-!! test
-Image with wiki markup in implicit alt
-!! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
-!! result
-
-
-!! end
-
-!! test
-Image with wiki markup in explicit alt
-!! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
-!! result
-
-
-!! end
-
-!! test
-Link to image page- image page normally doesn't exists, hence edit link
-Add test with existing image page
-#Image:test
-!! input
-[[:Image:test]]
-!! result
-
Image:test
-
-!! end
-
-!! test
-bug 18784 Link to non-existent image page with caption should use caption as link text
-!! input
-[[:Image:test|caption]]
-!! result
-caption
-
-!! end
-
-!! test
-Frameless image caption with a free URL
-!! input
-[[Image:foobar.jpg|http://example.com]]
-!! result
-
-
-!! end
-
-!! test
-Thumbnail image caption with a free URL
-!! input
-[[Image:foobar.jpg|thumb|http://example.com]]
-!! result
-
-
-!! end
-
-!! test
-Thumbnail image caption with a free URL and explicit alt
-!! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
-!! result
-
-
-!! end
-
-!! test
-BUG 1887: A ISBN with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! result
-
-
-!! end
-
-!! test
-BUG 1887: A RFC with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! result
-
-
-!! end
-
-!! test
-BUG 1887: A mailto link with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! result
-
-
-!! end
-
-!! test
-BUG 1887: A