Two changes to parserTest:
authorWil Mahan <wmahan@users.mediawiki.org>
Thu, 23 Sep 2004 21:52:09 +0000 (21:52 +0000)
committerWil Mahan <wmahan@users.mediawiki.org>
Thu, 23 Sep 2004 21:52:09 +0000 (21:52 +0000)
1) Use 'parsertest' database prefix and temporary tables to allow
creating articles for testing without modifying the normal DB.
Right now this is ugly because the new tables have to be created by
hand.
2) Allow tests to specify articles using !!article ... !!text
... !!endarticle syntax. This is useful for templates, categories,
and I hope more tests.

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

index 7b718e5..c33b38d 100644 (file)
@@ -84,6 +84,18 @@ class ParserTest {
                        $n++;
                        if( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
                                $section = strtolower( $matches[1] );
+                               if( $section == 'endarticle') {
+                                       if( !isset( $data['text'] ) ) {
+                                               die( "'endarticle' without 'text' at line $n\n" );
+                                       }
+                                       if( !isset( $data['article'] ) ) {
+                                               die( "'endarticle' without 'article' at line $n\n" );
+                                       }
+                                       $this->addArticle(rtrim($data['article']), rtrim($data['text']));
+                                       $data = array();
+                                       $section = null;
+                                       continue;
+                               }
                                if( $section == 'end' ) {
                                        if  (isset ($data['disabled'])) {
                                                # disabled test
@@ -100,10 +112,14 @@ class ParserTest {
                                        if( !isset( $data['result'] ) ) {
                                                die( "'end' without 'result' at line $n\n" );
                                        }
+                                       if( !isset( $data['options'] ) ) {
+                                               $data['options'] = '';
+                                       }
                                        if( $this->runTest(
                                                rtrim( $data['test'] ),
                                                rtrim( $data['input'] ),
-                                               rtrim( $data['result'] ) ) ) {
+                                               rtrim( $data['result'] ),
+                                               rtrim( $data['options'] ) ) ) {
                                                $success++;
                                        }
                                        $total++;
@@ -136,24 +152,57 @@ class ParserTest {
         * @param string $result Result to output
         * @return bool
         */
-       function runTest( $desc, $input, $result ) {
+       function runTest( $desc, $input, $result, $opts ) {
                print "Running test $desc... ";
 
                $this->setupGlobals();
                
+               # This is ugly, but we need a way to modify the database
+               # without breaking anything. Currently it isn't possible
+               # to roll back transactions, which might help with this.
+               # -- wtm
+               static $setupDB = false;
+               if (!$setupDB && $GLOBALS['wgDBprefix'] === 'parsertest') {
+                       $db =& wfGetDB( DB_MASTER );
+                       if (0) {
+                               # XXX CREATE TABLE ... LIKE requires MySQL 4.1
+                               $tables = array('cur', 'interwiki', 'brokenlinks', 'recentchanges');
+                               foreach ($tables as $tbl) {
+                                       $db->query('CREATE TEMPORARY TABLE ' . $GLOBALS['wgDBprefix'] . "$tbl LIKE $tbl");
+                               }
+                       }
+                       else {
+                               # HACK, sorry
+                               dbsource( 'maintenance/parserTests.sql', $db );
+                       }
+                       $setupDB = true;
+               }
+
                $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 (preg_match('/pst/i', $opts)) {
+                       $out = $parser->preSaveTransform( $input, $title, $user, $options );
+               }
+               else if (preg_match('/msg/i', $opts)) {
+                       $out = $parser->transformMsg( $input, $options );
+               }
+               else {
+                       $output =& $parser->parse( $input, $title, $options );
+                       $out = $output->getText();
+
+                       $op = new OutputPage();
+                       $op->replaceLinkHolders($out);
 
-               $op = new OutputPage();
-               $op->replaceLinkHolders($html);
+                       #if (preg_match('/ill/i', $opts)) {
+                       #       $out .= $output->getLanguageLinks();
+                       #}
+                       #if (preg_match('/cat/i', $opts)) {
+                       #       $out .= $output->getCategoryLinks();
+                       #}
+               }
 
                global $wgUseTidy;
                if ($wgUseTidy) {
@@ -166,10 +215,10 @@ class ParserTest {
                
                $this->teardownGlobals();
                
-               if( rtrim($result) === rtrim($html) ) {
+               if( rtrim($result) === rtrim($out) ) {
                        return $this->showSuccess( $desc );
                } else {
-                       return $this->showFailure( $desc, $result, $html );
+                       return $this->showFailure( $desc, $result, $out );
                }
        }
        
@@ -189,6 +238,7 @@ class ParserTest {
                        'wgLanguageCode' => 'en',
                        'wgUseLatin1' => false,
                        'wgLang' => new LanguageUtf8(),
+                       'wgDBprefix' => 'parsertest',
                        );
                $this->savedGlobals = array();
                foreach( $settings as $var => $val ) {
@@ -315,6 +365,19 @@ class ParserTest {
                               $this->termColor( 31 ) . '$1' . $this->termReset() ),
                        $text );
        }
+
+       /**
+        * Insert a temporary test article
+        * @param $name string the title, including any prefix
+        * @param $text string the article text
+        * @static
+        * @access private
+        */
+       function addArticle($name, $text) {
+               $title = Title::newFromText( $name );
+               $art = new Article($title);
+               $art->insertNewArticle($text, '', false, false );
+       }
 }
 
 $wgTitle = Title::newFromText( 'Parser test script' );
diff --git a/maintenance/parserTests.sql b/maintenance/parserTests.sql
new file mode 100644 (file)
index 0000000..438be85
--- /dev/null
@@ -0,0 +1,292 @@
+-- HACK: this should go away when there is a better way
+
+CREATE TEMPORARY TEMPORARY TABLE parsertestuser (
+  user_id int(5) unsigned NOT NULL auto_increment,
+  user_name varchar(255) binary NOT NULL default '',
+  user_real_name varchar(255) binary NOT NULL default '',
+  user_password tinyblob NOT NULL default '',
+  user_newpassword tinyblob NOT NULL default '',
+  user_email tinytext NOT NULL default '',
+  user_options blob NOT NULL default '',
+  user_touched char(14) binary NOT NULL default '',
+  PRIMARY KEY user_id (user_id),
+  INDEX user_name (user_name(10))
+);
+
+CREATE TEMPORARY TEMPORARY TABLE parsertestcur (
+  cur_id int(8) unsigned NOT NULL auto_increment,
+  cur_namespace tinyint(2) unsigned NOT NULL default '0',
+  cur_title varchar(255) binary NOT NULL default '',
+  cur_text mediumtext NOT NULL default '',
+  cur_comment tinyblob NOT NULL default '',
+  cur_user int(5) unsigned NOT NULL default '0',
+  cur_user_text varchar(255) binary NOT NULL default '',
+  cur_timestamp char(14) binary NOT NULL default '',
+  cur_restrictions tinyblob NOT NULL default '',
+  cur_counter bigint(20) unsigned NOT NULL default '0',
+  cur_is_redirect tinyint(1) unsigned NOT NULL default '0',
+  cur_minor_edit tinyint(1) unsigned NOT NULL default '0',
+  cur_is_new tinyint(1) unsigned NOT NULL default '0',
+  cur_random real unsigned NOT NULL,
+  cur_touched char(14) binary NOT NULL default '',
+  inverse_timestamp char(14) binary NOT NULL default '',
+  PRIMARY KEY cur_id (cur_id),
+  UNIQUE INDEX name_title (cur_namespace,cur_title),
+  
+  -- Is this one necessary?
+  INDEX cur_title (cur_title(20)),
+  
+  INDEX cur_timestamp (cur_timestamp),
+  INDEX (cur_random),
+  INDEX name_title_timestamp (cur_namespace,cur_title,inverse_timestamp),
+  INDEX user_timestamp (cur_user,inverse_timestamp),
+  INDEX usertext_timestamp (cur_user_text,inverse_timestamp),
+  INDEX namespace_redirect_timestamp(cur_namespace,cur_is_redirect,cur_timestamp)
+);
+
+CREATE TEMPORARY TABLE parsertestold (
+  old_id int(8) unsigned NOT NULL auto_increment,
+  old_namespace tinyint(2) unsigned NOT NULL default '0',
+  old_title varchar(255) binary NOT NULL default '',
+  old_text mediumtext NOT NULL default '',
+  old_comment tinyblob NOT NULL default '',
+  old_user int(5) unsigned NOT NULL default '0',
+  old_user_text varchar(255) binary NOT NULL,
+  old_timestamp char(14) binary NOT NULL default '',
+  old_minor_edit tinyint(1) NOT NULL default '0',
+  old_flags tinyblob NOT NULL default '',
+  inverse_timestamp char(14) binary NOT NULL default '',
+  
+  PRIMARY KEY old_id (old_id),
+  INDEX old_timestamp (old_timestamp),
+  INDEX name_title_timestamp (old_namespace,old_title,inverse_timestamp),
+  INDEX user_timestamp (old_user,inverse_timestamp),
+  INDEX usertext_timestamp (old_user_text,inverse_timestamp)
+);
+
+CREATE TEMPORARY TABLE parsertestlinks (
+  l_from int(8) unsigned NOT NULL default '0',
+  l_to int(8) unsigned NOT NULL default '0',
+  UNIQUE KEY l_from(l_from,l_to),
+  KEY (l_to)
+);
+
+CREATE TEMPORARY TEMPORARY TABLE parsertestbrokenlinks (
+  bl_from int(8) unsigned NOT NULL default '0',
+  bl_to varchar(255) binary NOT NULL default '',
+  UNIQUE KEY bl_from(bl_from,bl_to),
+  KEY (bl_to)
+);
+
+CREATE TEMPORARY TEMPORARY TABLE parsertestimagelinks (
+  il_from int(8) unsigned NOT NULL default '0',
+  il_to varchar(255) binary NOT NULL default '',
+  UNIQUE KEY il_from(il_from,il_to),
+  KEY (il_to)
+);
+
+CREATE TEMPORARY TABLE parsertestcategorylinks (
+  cl_from int(8) unsigned NOT NULL default '0',
+  cl_to varchar(255) binary NOT NULL default '',
+  cl_sortkey varchar(255) binary NOT NULL default '',
+  cl_timestamp timestamp NOT NULL,
+  UNIQUE KEY cl_from(cl_from,cl_to),
+  KEY cl_sortkey(cl_to,cl_sortkey(128)),
+  KEY cl_timestamp(cl_to,cl_timestamp)
+);
+
+--
+-- Stores (possibly gzipped) serialized objects with
+-- cache arrays to reduce database load slurping up
+-- from links and brokenlinks.
+--
+CREATE TEMPORARY TABLE parsertestlinkscc (
+  lcc_pageid INT UNSIGNED NOT NULL UNIQUE KEY,
+  lcc_cacheobj MEDIUMBLOB NOT NULL
+);
+
+CREATE TEMPORARY TABLE parsertestsite_stats (
+  ss_row_id int(8) unsigned NOT NULL,
+  ss_total_views bigint(20) unsigned default '0',
+  ss_total_edits bigint(20) unsigned default '0',
+  ss_good_articles bigint(20) unsigned default '0',
+  UNIQUE KEY ss_row_id (ss_row_id)
+);
+
+CREATE TEMPORARY TABLE parsertesthitcounter (
+  hc_id INTEGER UNSIGNED NOT NULL
+) TYPE=HEAP MAX_ROWS=25000;
+
+CREATE TEMPORARY TABLE parsertestipblocks (
+  ipb_id int(8) NOT NULL auto_increment,
+  ipb_address varchar(40) binary NOT NULL default '',
+  ipb_user int(8) unsigned NOT NULL default '0',
+  ipb_by int(8) unsigned NOT NULL default '0',
+  ipb_reason tinyblob NOT NULL default '',
+  ipb_timestamp char(14) binary NOT NULL default '',
+  ipb_auto tinyint(1) NOT NULL default '0',
+  ipb_expiry char(14) binary NOT NULL default '',
+
+  PRIMARY KEY ipb_id (ipb_id),
+  INDEX ipb_address (ipb_address),
+  INDEX ipb_user (ipb_user)
+);
+
+CREATE TEMPORARY TABLE parsertestimage (
+  img_name varchar(255) binary NOT NULL default '',
+  img_size int(8) unsigned NOT NULL default '0',
+  img_description tinyblob NOT NULL default '',
+  img_user int(5) unsigned NOT NULL default '0',
+  img_user_text varchar(255) binary NOT NULL default '',
+  img_timestamp char(14) binary NOT NULL default '',
+  PRIMARY KEY img_name (img_name),
+  INDEX img_size (img_size),
+  INDEX img_timestamp (img_timestamp)
+);
+
+CREATE TEMPORARY TABLE parsertestoldimage (
+  oi_name varchar(255) binary NOT NULL default '',
+  oi_archive_name varchar(255) binary NOT NULL default '',
+  oi_size int(8) unsigned NOT NULL default 0,
+  oi_description tinyblob NOT NULL default '',
+  oi_user int(5) unsigned NOT NULL default '0',
+  oi_user_text varchar(255) binary NOT NULL default '',
+  oi_timestamp char(14) binary NOT NULL default '',
+  INDEX oi_name (oi_name(10))
+);
+
+CREATE TEMPORARY TABLE parsertestrecentchanges (
+  rc_id int(8) NOT NULL auto_increment,
+  rc_timestamp varchar(14) binary NOT NULL default '',
+  rc_cur_time varchar(14) binary NOT NULL default '',
+  rc_user int(10) unsigned NOT NULL default '0',
+  rc_user_text varchar(255) binary NOT NULL default '',
+  rc_namespace tinyint(3) NOT NULL default '0',
+  rc_title varchar(255) binary NOT NULL default '',
+  rc_comment varchar(255) binary NOT NULL default '',
+  rc_minor tinyint(3) unsigned NOT NULL default '0',
+  rc_bot tinyint(3) unsigned NOT NULL default '0',
+  rc_new tinyint(3) unsigned NOT NULL default '0',
+  rc_cur_id int(10) unsigned NOT NULL default '0',
+  rc_this_oldid int(10) unsigned NOT NULL default '0',
+  rc_last_oldid int(10) unsigned NOT NULL default '0',
+  rc_type tinyint(3) unsigned NOT NULL default '0',
+  rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
+  rc_moved_to_title varchar(255) binary NOT NULL default '',
+  rc_patrolled tinyint(3) unsigned NOT NULL default '0',
+  rc_ip char(15) NOT NULL default '',
+  
+  PRIMARY KEY rc_id (rc_id),
+  INDEX rc_timestamp (rc_timestamp),
+  INDEX rc_namespace_title (rc_namespace, rc_title),
+  INDEX rc_cur_id (rc_cur_id),
+  INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
+  INDEX rc_ip (rc_ip)
+);
+
+CREATE TEMPORARY TABLE parsertestwatchlist (
+  wl_user int(5) unsigned NOT NULL,
+  wl_namespace tinyint(2) unsigned NOT NULL default '0',
+  wl_title varchar(255) binary NOT NULL default '',
+  UNIQUE KEY (wl_user, wl_namespace, wl_title),
+  KEY namespace_title (wl_namespace,wl_title)
+);
+
+CREATE TEMPORARY TABLE parsertestmath (
+  math_inputhash varchar(16) NOT NULL,
+  math_outputhash varchar(16) NOT NULL,
+  math_html_conservativeness tinyint(1) NOT NULL,
+  math_html text,
+  math_mathml text,
+  UNIQUE KEY math_inputhash (math_inputhash)
+);
+
+
+-- Table searchindex must be MyISAM for fulltext support
+
+CREATE TEMPORARY TABLE parsertestsearchindex (
+  si_page int(8) unsigned NOT NULL,
+  si_title varchar(255) NOT NULL default '',
+  si_text mediumtext NOT NULL default '',
+  UNIQUE KEY (si_page),
+  FULLTEXT si_title (si_title),
+  FULLTEXT si_text (si_text)
+
+) TYPE=MyISAM;
+
+CREATE TEMPORARY TABLE parsertestinterwiki (
+  iw_prefix char(32) NOT NULL,
+  iw_url char(127) NOT NULL,
+  iw_local BOOL NOT NULL,
+  UNIQUE KEY iw_prefix (iw_prefix)
+);
+
+-- Used for caching expensive grouped queries
+CREATE TEMPORARY TABLE parsertestquerycache (
+  qc_type char(32) NOT NULL,
+  qc_value int(5) unsigned NOT NULL default '0',
+  qc_namespace tinyint(2) unsigned NOT NULL default '0',
+  qc_title char(255) binary NOT NULL default '',
+  KEY (qc_type,qc_value)
+);
+
+-- For a few generic cache operations if not using Memcached
+CREATE TEMPORARY TABLE parsertestobjectcache (
+  keyname char(255) binary not null default '',
+  value mediumblob,
+  exptime datetime,
+  unique key (keyname),
+  key (exptime)
+);
+
+-- For storing revision text
+CREATE TEMPORARY TABLE parsertestblobs (
+  blob_index char(255) binary NOT NULL default '',
+  blob_data longblob NOT NULL default '',
+  UNIQUE key blob_index (blob_index)
+);
+
+-- For article validation
+
+CREATE TEMPORARY TABLE `parsertestvalidate` (
+  `val_user` int(11) NOT NULL default '0',
+  `val_title` varchar(255) binary NOT NULL default '',
+  `val_timestamp` varchar(14) binary NOT NULL default '',
+  `val_type` int(10) unsigned NOT NULL default '0',
+  `val_value` int(11) default '0',
+  `val_comment` varchar(255) NOT NULL default '',
+  KEY `val_user` (`val_user`,`val_title`,`val_timestamp`)
+);
+
+
+CREATE TEMPORARY TABLE parsertestlogging (
+  -- Symbolic keys for the general log type and the action type
+  -- within the log. The output format will be controlled by the
+  -- action field, but only the type controls categorization.
+  log_type char(10) NOT NULL default '',
+  log_action char(10) NOT NULL default '',
+  
+  -- Timestamp. Duh.
+  log_timestamp char(14) NOT NULL default '19700101000000',
+  
+  -- The user who performed this action; key to user_id
+  log_user int unsigned NOT NULL default 0,
+  
+  -- Key to the page affected. Where a user is the target,
+  -- this will point to the user page.
+  log_namespace tinyint unsigned NOT NULL default 0,
+  log_title varchar(255) NOT NULL default '',
+  
+  -- Freeform text. Interpreted as edit history comments.
+  log_comment varchar(255) NOT NULL default '',
+  
+  KEY type_time (log_type, log_timestamp),
+  KEY user_time (log_user, log_timestamp),
+  KEY page_time (log_namespace, log_title, log_timestamp)
+);
+
+INSERT INTO parsertestinterwiki VALUES('MeatBall',
+       'http://www.usemod.com/cgi-bin/mb.pl?$1',
+       0
+);
+