Handle multiple warnings correctly in ApiBase::setWarning(). Calling this function...
[lhc/web/wiklou.git] / includes / Parser_DiffTest.php
index e4a9362..be3702c 100644 (file)
@@ -1,24 +1,38 @@
 <?php
 
+/**
+ * @ingroup Parser
+ */
 class Parser_DiffTest
 {
        var $parsers, $conf;
 
+       var $dfUniqPrefix;
+
        function __construct( $conf ) {
                if ( !isset( $conf['parsers'] ) ) {
                        throw new MWException( __METHOD__ . ': no parsers specified' );
                }
                $this->conf = $conf;
+               $this->dtUniqPrefix = "\x7fUNIQ" . Parser::getRandomString();
        }
 
        function init() {
                if ( !is_null( $this->parsers ) ) {
                        return;
                }
+
+               global $wgHooks;
+               static $doneHook = false;
+               if ( !$doneHook ) {
+                       $doneHook = true;
+                       $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
+               }
+
                foreach ( $this->conf['parsers'] as $i => $parserConf ) {
                        if ( !is_array( $parserConf ) ) {
                                $class = $parserConf;
-                               $parserconf = array( 'class' => $parserConf );
+                               $parserConf = array( 'class' => $parserConf );
                        } else {
                                $class = $parserConf['class'];
                        }
@@ -37,8 +51,14 @@ class Parser_DiffTest
                        if ( $first ) {
                                $first = false;
                        } else {
-                               if ( $lastResult !== $currentResult ) {
-                                       $mismatch = true;
+                               if ( is_object( $lastResult ) ) {
+                                       if ( $lastResult != $currentResult ) {
+                                               $mismatch = true;
+                                       }
+                               } else {
+                                       if ( $lastResult !== $currentResult ) {
+                                               $mismatch = true;
+                                       }
                                }
                        }
                        $results[$i] = $currentResult;
@@ -46,7 +66,7 @@ class Parser_DiffTest
                }
                if ( $mismatch ) {
                        throw new MWException( "Parser_DiffTest: results mismatch on call to $name\n" .
-                               'Arguments: ' . var_export( $args, true ) . "\n" . 
+                               'Arguments: ' . var_export( $args, true ) . "\n" .
                                'Results: ' . var_export( $results, true ) . "\n" );
                }
                return $lastResult;
@@ -58,5 +78,10 @@ class Parser_DiffTest
                        $parser->setFunctionHook( $id, $callback, $flags );
                }
        }
-}
 
+       function onClearState( &$parser ) {
+               // hack marker prefixes to get identical output
+               $parser->mUniqPrefix = $this->dtUniqPrefix;
+               return true;
+       }
+}