Quick start on a mindlessly simply parser test suite.
authorBrion Vibber <brion@users.mediawiki.org>
Wed, 22 Sep 2004 12:25:40 +0000 (12:25 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Wed, 22 Sep 2004 12:25:40 +0000 (12:25 +0000)
Works on a standalone parser object, not through the globals or the web interface, which is created anew for each test. Pretty primitive so far, but this at least allows accumulation of tests for now.

maintenance/parserTests.php [new file with mode: 0644]
maintenance/parserTests.txt [new file with mode: 0644]

diff --git a/maintenance/parserTests.php b/maintenance/parserTests.php
new file mode 100644 (file)
index 0000000..14f0a04
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * @todo document
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+/** */
+require_once( 'commandLine.inc' );
+include_once( 'InitialiseMessages.inc' );
+
+$wgTitle = Title::newFromText( 'Parser test script' );
+
+class ParserTest {
+       function runTestsFromFile( $filename ) {
+               $infile = fopen( $filename, 'rt' );
+               if( !$infile ) {
+                       die( "Couldn't open parserTests.txt\n" );
+               }
+               
+               $data = array();
+               $section = null;
+               $success = 0;
+               $total = 0;
+               $n = 0;
+               while( false !== ($line = fgets( $infile ) ) ) {
+                       $n++;
+                       if( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
+                               $section = strtolower( $matches[1] );
+                               if( $section == 'end' ) {
+                                       if( !isset( $data['test'] ) ) {
+                                               die( "'end' without 'test' at line $n\n" );
+                                       }
+                                       if( !isset( $data['input'] ) ) {
+                                               die( "'end' without 'input' at line $n\n" );
+                                       }
+                                       if( !isset( $data['result'] ) ) {
+                                               die( "'end' without 'result' at line $n\n" );
+                                       }
+                                       if( $this->runTest(
+                                               rtrim( $data['test'] ),
+                                               rtrim( $data['input'] ),
+                                               rtrim( $data['result'] ) ) ) {
+                                               $success++;
+                                       }
+                                       $total++;
+                                       $data = array();
+                                       $section = null;
+                                       continue;
+                               }
+                               $data[$section] = '';
+                               continue;
+                       }
+                       if( $section ) {
+                               $data[$section] .= $line;
+                       }
+               }
+               if( $total > 0 ) {
+                       $ratio = IntVal( 100.0 * $success / $total );
+                       print "\nPassed $success of $total tests ($ratio%)\n";
+               }
+       }
+
+       /**
+        * @param string $input Wikitext to try rendering
+        * @param string $result Result to output
+        * @return bool
+        */
+       function runTest( $desc, $input, $result ) {
+               print "Running test $desc...";
+
+               $user =& new User();
+               $options =& ParserOptions::newFromUser( $user );
+               $parser =& new Parser();
+               $title =& Title::makeTitle( NS_MAIN, 'Parser_test' );
+
+               $output =& $parser->parse( $input, $title, $options );
+               
+               $html = $output->getText();
+               # $languageLinks = $output->getLanguageLinks();
+               # $categoryLinks = $output->getCategoryLinks();
+               
+               if( $result == rtrim( $html ) ) {
+                       return $this->showSuccess( $desc );
+               } else {
+                       return $this->showFailure( $desc, $result, $html );
+               }
+       }
+       
+       function showSuccess( $desc ) {
+               print "ok\n";
+               return true;
+       }
+       
+       function showFailure( $desc, $result, $html ) {
+               print "FAILED\n";
+               print "!! Expected:\n$result\n";
+               print "!! Received:\n$html\n!!\n";
+               return false;
+       }
+}
+
+$tester =& new ParserTest();
+$tester->runTestsFromFile( 'maintenance/parserTests.txt' );
+
+?>
\ No newline at end of file
diff --git a/maintenance/parserTests.txt b/maintenance/parserTests.txt
new file mode 100644 (file)
index 0000000..d6c8e62
--- /dev/null
@@ -0,0 +1,60 @@
+!! test
+Blank input
+!! input
+!! result
+!! end
+
+!! test
+Simple paragraph
+!! input
+This is a simple paragraph.
+!! result
+<p>This is a simple paragraph.
+</p>
+!! end
+
+!! test
+Simple list
+!! input
+* Item 1
+* Item 2
+!! result
+<ul><li> Item 1
+</li><li> Item 2
+</li></ul>
+!! 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
+!! result
+<ul><li> plain
+</li><li> plain<i>italic</i>plain
+</li><li> plain<i>italic</i>plain<i>italic</i>plain
+</li><li> plain<b>bold</b>plain
+</li><li> plain<b>bold</b>plain<b>bold</b>plain
+</li><li> plain<i>italic</i>plain<b>bold</b>plain
+</li><li> plain<b>bold</b>plain<i>italic</i>plain
+</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
+</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
+</li><li> plain<i><b>bold-italic</b>italic</i>plain
+</li><li> plain<b><i>bold-italic</i>bold</b>plain
+</li><li> plain<i>italic<b>bold-italic</b></i>plain
+</li><li> plain<b>bold<i>bold-italic</i></b>plain
+</li><li> plain l'<i>italic</i>plain
+</li></ul>
+!! end