Merge "Remove ResourceLoaderGetStartupModules hook"
[lhc/web/wiklou.git] / tests / testHelpers.inc
index 847ae32..8c24f39 100644 (file)
@@ -318,7 +318,7 @@ class DbTestRecorder extends DbTestPreviewer {
                        array(
                                'tr_date' => $this->db->timestamp(),
                                'tr_mw_version' => $this->version,
-                               'tr_php_version' => phpversion(),
+                               'tr_php_version' => PHP_VERSION,
                                'tr_db_version' => $this->db->getServerVersion(),
                                'tr_uname' => php_uname()
                        ),
@@ -333,8 +333,8 @@ class DbTestRecorder extends DbTestPreviewer {
        /**
         * Record an individual test item's success or failure to the db
         *
-        * @param $test String
-        * @param $result Boolean
+        * @param string $test
+        * @param bool $result
         */
        function record( $test, $result ) {
                parent::record( $test, $result );
@@ -465,6 +465,22 @@ class TestFileIterator implements Iterator {
                                        continue;
                                }
 
+                               if ( $this->section == 'endtransparenthooks' ) {
+                                       $this->checkSection( 'transparenthooks' );
+
+                                       foreach ( explode( "\n", $this->sectionData['transparenthooks'] ) as $line ) {
+                                               $line = trim( $line );
+
+                                               if ( $line ) {
+                                                       $delayedParserTest->requireTransparentHook( $line );
+                                               }
+                                       }
+
+                                       $this->clearSection();
+
+                                       continue;
+                               }
+
                                if ( $this->section == 'end' ) {
                                        $this->checkSection( 'test' );
                                        // "input" and "result" are old section names allowed
@@ -481,7 +497,7 @@ class TestFileIterator implements Iterator {
                                        }
 
                                        if ( $input == false || $result == false ||
-                                                ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+                                               ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
                                                || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result != 'html/php' && !$this->parserTest->runParsoid )
                                                || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
                                        ) {
@@ -545,9 +561,9 @@ class TestFileIterator implements Iterator {
         * Throw an exception if it is not set, referencing current section
         * and adding the current file name and line number
         *
-        * @param $token String|Array: expected token(s) that should have been
+        * @param string|array $token Expected token(s) that should have been
         * mentioned before closing this section
-        * @param $fatal Boolean: true iff an exception should be thrown if
+        * @param bool $fatal True iff an exception should be thrown if
         * the section is not found.
         */
        private function checkSection( $tokens, $fatal = true ) {
@@ -573,7 +589,7 @@ class TestFileIterator implements Iterator {
                        throw new MWException( sprintf(
                                "'%s' without '%s' at line %s of %s\n",
                                $this->section,
-                               $token,
+                               implode( ',', $tokens ),
                                $this->lineNum,
                                $this->file
                        ) );
@@ -601,6 +617,7 @@ class DelayedParserTest {
        /** Initialized on construction */
        private $hooks;
        private $fnHooks;
+       private $transparentHooks;
 
        public function __construct() {
                $this->reset();
@@ -613,11 +630,13 @@ class DelayedParserTest {
        public function reset() {
                $this->hooks = array();
                $this->fnHooks = array();
+               $this->transparentHooks = array();
        }
 
        /**
         * Called whenever we actually want to run the hook.
         * Should be the case if we found the parserTest is not disabled
+        * @param ParserTest|NewParserTest $parserTest
         */
        public function unleash( &$parserTest ) {
                if ( !( $parserTest instanceof ParserTest || $parserTest instanceof NewParserTest )     ) {
@@ -640,6 +659,14 @@ class DelayedParserTest {
                        }
                }
 
+               # Trigger delayed transparent hooks. Any failure will make us abort
+               foreach ( $this->transparentHooks as $hook ) {
+                       $ret = $parserTest->requireTransparentHook( $hook );
+                       if ( !$ret ) {
+                               return false;
+                       }
+               }
+
                # Delayed execution was successful.
                return true;
        }
@@ -647,6 +674,7 @@ class DelayedParserTest {
        /**
         * Similar to ParserTest object but does not run anything
         * Use unleash() to really execute the hook
+        * @param string $hook
         */
        public function requireHook( $hook ) {
                $this->hooks[] = $hook;
@@ -655,9 +683,55 @@ class DelayedParserTest {
        /**
         * Similar to ParserTest object but does not run anything
         * Use unleash() to really execute the hook function
+        * @param string $fnHook
         */
        public function requireFunctionHook( $fnHook ) {
                $this->fnHooks[] = $fnHook;
        }
 
+       /**
+        * Similar to ParserTest object but does not run anything
+        * Use unleash() to really execute the hook function
+        * @param string $fnHook
+        */
+       public function requireTransparentHook( $hook ) {
+               $this->transparentHooks[] = $hook;
+       }
+
+}
+
+/**
+ * Initialize and detect the DjVu files support
+ */
+class DjVuSupport {
+
+       /**
+        * Initialises DjVu tools global with default values
+        */
+       public function __construct() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions, $wgDjvuTxt;
+
+               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
+               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
+               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+               $wgDjvuTxt = $wgDjvuTxt ? $wgDjvuTxt : '/usr/bin/djvutxt';
+
+               if ( !in_array( 'djvu', $wgFileExtensions ) ) {
+                       $wgFileExtensions[] = 'djvu';
+               }
+       }
+
+       /**
+        * Returns if the DjVu tools are usable
+        *
+        * @return bool
+        */
+       public function isEnabled() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgDjvuTxt;
+
+               return is_executable( $wgDjvuRenderer )
+                       && is_executable( $wgDjvuDump )
+                       && is_executable( $wgDjvuToXML )
+                       && is_executable( $wgDjvuTxt );
+       }
 }