]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - maintenance/tests/MediaWikiParserTest.php
MediaWiki 1.16.0
[autoinstallsdev/mediawiki.git] / maintenance / tests / MediaWikiParserTest.php
diff --git a/maintenance/tests/MediaWikiParserTest.php b/maintenance/tests/MediaWikiParserTest.php
new file mode 100644 (file)
index 0000000..a545b3b
--- /dev/null
@@ -0,0 +1,283 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       exit;
+}
+
+global $IP;
+define( "NO_COMMAND_LINE", 1 );
+define( "PARSER_TESTS", "$IP/maintenance/parserTests.txt" );
+
+require_once( "$IP/maintenance/parserTests.inc" );
+
+class PHPUnitTestRecorder extends TestRecorder {
+
+       function record( $test, $result ) {
+               $this->total++;
+               $this->success += $result;
+
+       }
+
+       function reportPercentage( $success, $total ) {}
+}
+
+class MediaWikiParserTestSuite extends PHPUnit_Framework_TestSuite {
+#implements PHPUnit_Framework_SelfDescribing {
+       static private $count;
+       static public $parser;
+       static public $iter;
+
+       public static function suite() {
+        $suite = new PHPUnit_Framework_TestSuite();
+
+               self::$iter = new TestFileIterator( PARSER_TESTS );
+
+               foreach(self::$iter as $i => $test) {
+                       $suite->addTest(new ParserUnitTest($i, $test['test']));
+                       self::$count++;
+               }
+               unset($tests);
+
+               self::$parser = new PTShell;
+               self::$iter->setParser(self::$parser);
+               self::$parser->recorder->start();
+               self::$parser->setupDatabase();
+               self::$iter->rewind();
+       /* } */
+       /* function setUp() { */
+               global $wgParser,  $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
+                  $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
+                  $wgMessageCache, $wgUseDatabaseMessages, $wgMsgCacheExpiry, $parserMemc,
+                  $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
+                  $wgNamespacesWithSubpages, $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' => '',
+                       'url' => 'http://example.com/images',
+                       '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 StubUser;
+               $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, wfWikiID() ) );
+               if( $wgStyleDirectory === false) $wgStyleDirectory   = "$IP/skins";
+
+               return $suite;
+       }
+
+       public function tearDown() {
+               $this->teardownDatabase();
+               $this->recorder->report();
+               $this->recorder->end();
+               $this->teardownUploadDir($this->uploadDir);
+       }
+
+       public function count() {return self::$count;}
+
+       public function toString() {
+               return "MediaWiki Parser Tests";
+       }
+
+
+       private $db;
+       private $uploadDir;
+       private $keepUploads;
+       /**
+        * 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",
+                       )
+               );
+
+               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",
+                       )
+               );
+       }
+
+       /**
+        * Delete the specified files, if they exist.
+        * @param array $files 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 array $dirs full paths to directories to delete.
+        */
+       private static function deleteDirs( $dirs ) {
+               foreach( $dirs as $dir ) {
+                       if( is_dir( $dir ) ) {
+                               rmdir( $dir );
+                       }
+               }
+       }
+
+       /**
+        * 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;
+       }
+}
+
+class ParserUnitTest extends PHPUnit_Framework_TestCase {
+       private $number = 0;
+       private $test = "";
+
+       public function __construct($number, $test) {
+               $this->number = $number;
+               $this->test = $test;
+       }
+
+       function count() {return 1;}
+
+       public function run(PHPUnit_Framework_TestResult $result = NULL) {
+        PHPUnit_Framework_Assert::resetCount();
+        if ($result === NULL) {
+            $result = new PHPUnit_Framework_TestResult;
+        }
+
+               $t = MediaWikiParserTestSuite::$iter->current();
+               $k = MediaWikiParserTestSuite::$iter->key();
+
+               if(!MediaWikiParserTestSuite::$iter->valid()) {
+                       return;
+               }
+
+               // The only way this should happen is if the parserTest.txt
+               // file were modified while the script is running.
+               if($k != $this->number) {
+                       $i = $this->number;
+                       wfDie("I got confused!\n");
+               }
+
+               $result->startTest($this);
+               PHPUnit_Util_Timer::start();
+
+               $r = false;
+               try {
+                       $r = MediaWikiParserTestSuite::$parser->runTest(
+                               $t['test'], $t['input'], $t['result'], $t['options'], $t['config']
+                       );
+                       PHPUnit_Framework_Assert::assertTrue(true, $t['test']);
+               }
+               catch (PHPUnit_Framework_AssertionFailedError $e) {
+                       $result->addFailure($this, $e, PHPUnit_Util_Timer::stop());
+               }
+               catch (Exception $e) {
+                       $result->addError($this, $e, PHPUnit_Util_Timer::stop());
+               }
+               PHPUnit_Framework_Assert::assertTrue(true, $t['test']);
+
+               $result->endTest($this, PHPUnit_Util_Timer::stop());
+
+               MediaWikiParserTestSuite::$parser->recorder->record($t['test'], $r);
+               MediaWikiParserTestSuite::$iter->next();
+               $this->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
+
+               return $result;
+       }
+
+}
+
+class PTShell extends ParserTest {
+       function showTesting( $desc ) {
+       }
+
+       function showRunFile( $path ) {
+       }
+
+       function showSuccess( $desc ) {
+               PHPUnit_Framework_Assert::assertTrue(true, $desc);
+               return true;
+       }
+
+       function showFailure( $desc, $expected, $got ) {
+               PHPUnit_Framework_Assert::assertEquals($expected, $got, $desc);
+       }
+
+}
+
+