/** * @group medium * @dataProvider parserTestProvider * @param string $desc * @param string $input * @param string $result * @param array $opts * @param array $config */ public function testParserTest($desc, $input, $result, $opts, $config) { if ($this->regex != '' && !preg_match('/' . $this->regex . '/', $desc)) { $this->assertTrue(true); // XXX: don't flood output with "test made no assertions" // $this->markTestSkipped( 'Filtered out by the user' ); return; } if (!$this->isWikitextNS(NS_MAIN)) { // parser tests frequently assume that the main namespace contains wikitext. // @todo When setting up pages, force the content model. Only skip if // $wgtContentModelUseDB is false. $this->markTestSkipped("Main namespace does not support wikitext," . "skipping parser test: {$desc}"); } wfDebug("Running parser test: {$desc}\n"); $opts = $this->parseOptions($opts); $context = $this->setupGlobals($opts, $config); $user = $context->getUser(); $options = ParserOptions::newFromContext($context); if (isset($opts['title'])) { $titleText = $opts['title']; } else { $titleText = 'Parser test'; } $local = isset($opts['local']); $preprocessor = isset($opts['preprocessor']) ? $opts['preprocessor'] : null; $parser = $this->getParser($preprocessor); $title = Title::newFromText($titleText); # Parser test requiring math. Make sure texvc is executable # or just skip such tests. if (isset($opts['math']) || isset($opts['texvc'])) { global $wgTexvc; if (!isset($wgTexvc)) { $this->markTestSkipped("SKIPPED: \$wgTexvc is not set"); } elseif (!is_executable($wgTexvc)) { $this->markTestSkipped("SKIPPED: texvc binary does not exist" . " or is not executable.\n" . "Current configuration is:\n\$wgTexvc = '{$wgTexvc}'"); } } if (isset($opts['djvu'])) { if (!$this->djVuSupport->isEnabled()) { $this->markTestSkipped("SKIPPED: djvu binaries do not exist or are not executable.\n"); } } if (isset($opts['tidy'])) { if (!$this->tidySupport->isEnabled()) { $this->markTestSkipped("SKIPPED: tidy extension is not installed.\n"); } else { $options->setTidy(true); } } if (isset($opts['pst'])) { $out = $parser->preSaveTransform($input, $title, $user, $options); } elseif (isset($opts['msg'])) { $out = $parser->transformMsg($input, $options, $title); } elseif (isset($opts['section'])) { $section = $opts['section']; $out = $parser->getSection($input, $section); } elseif (isset($opts['replace'])) { $section = $opts['replace'][0]; $replace = $opts['replace'][1]; $out = $parser->replaceSection($input, $section, $replace); } elseif (isset($opts['comment'])) { $out = Linker::formatComment($input, $title, $local); } elseif (isset($opts['preload'])) { $out = $parser->getPreloadText($input, $title, $options); } else { $output = $parser->parse($input, $title, $options, true, true, 1337); $output->setTOCEnabled(!isset($opts['notoc'])); $out = $output->getText(); if (isset($opts['tidy'])) { $out = preg_replace('/\\s+$/', '', $out); } if (isset($opts['showtitle'])) { if ($output->getTitleText()) { $title = $output->getTitleText(); } $out = "{$title}\n{$out}"; } if (isset($opts['showindicators'])) { $indicators = ''; foreach ($output->getIndicators() as $id => $content) { $indicators .= "{$id}={$content}\n"; } $out = $indicators . $out; } if (isset($opts['ill'])) { $out = implode(' ', $output->getLanguageLinks()); } elseif (isset($opts['cat'])) { $outputPage = $context->getOutput(); $outputPage->addCategoryLinks($output->getCategories()); $cats = $outputPage->getCategoryLinks(); if (isset($cats['normal'])) { $out = implode(' ', $cats['normal']); } else { $out = ''; } } $parser->mPreprocessor = null; } $this->teardownGlobals(); $this->assertEquals($result, $out, $desc); }
/** * Run a given wikitext input through a freshly-constructed wiki parser, * and compare the output against the expected results. * Prints status and explanatory messages to stdout. * * staticSetup() and setupWikiData() must be called before this function * is entered. * * @param array $test The test parameters: * - test: The test name * - desc: The subtest description * - input: Wikitext to try rendering * - options: Array of test options * - config: Overrides for global variables, one per line * * @return ParserTestResult or false if skipped */ public function runTest($test) { wfDebug(__METHOD__ . ": running {$test['desc']}"); $opts = $this->parseOptions($test['options']); $teardownGuard = $this->perTestSetup($test); $context = RequestContext::getMain(); $user = $context->getUser(); $options = ParserOptions::newFromContext($context); if (isset($opts['tidy'])) { if (!$this->tidySupport->isEnabled()) { $this->recorder->skipped($test, 'tidy extension is not installed'); return false; } else { $options->setTidy(true); } } if (isset($opts['title'])) { $titleText = $opts['title']; } else { $titleText = 'Parser test'; } $local = isset($opts['local']); $preprocessor = isset($opts['preprocessor']) ? $opts['preprocessor'] : null; $parser = $this->getParser($preprocessor); $title = Title::newFromText($titleText); if (isset($opts['pst'])) { $out = $parser->preSaveTransform($test['input'], $title, $user, $options); } elseif (isset($opts['msg'])) { $out = $parser->transformMsg($test['input'], $options, $title); } elseif (isset($opts['section'])) { $section = $opts['section']; $out = $parser->getSection($test['input'], $section); } elseif (isset($opts['replace'])) { $section = $opts['replace'][0]; $replace = $opts['replace'][1]; $out = $parser->replaceSection($test['input'], $section, $replace); } elseif (isset($opts['comment'])) { $out = Linker::formatComment($test['input'], $title, $local); } elseif (isset($opts['preload'])) { $out = $parser->getPreloadText($test['input'], $title, $options); } else { $output = $parser->parse($test['input'], $title, $options, true, true, 1337); $output->setTOCEnabled(!isset($opts['notoc'])); $out = $output->getText(); if (isset($opts['tidy'])) { $out = preg_replace('/\\s+$/', '', $out); } if (isset($opts['showtitle'])) { if ($output->getTitleText()) { $title = $output->getTitleText(); } $out = "{$title}\n{$out}"; } if (isset($opts['showindicators'])) { $indicators = ''; foreach ($output->getIndicators() as $id => $content) { $indicators .= "{$id}={$content}\n"; } $out = $indicators . $out; } if (isset($opts['ill'])) { $out = implode(' ', $output->getLanguageLinks()); } elseif (isset($opts['cat'])) { $out = ''; foreach ($output->getCategories() as $name => $sortkey) { if ($out !== '') { $out .= "\n"; } $out .= "cat={$name} sort={$sortkey}"; } } } ScopedCallback::consume($teardownGuard); $expected = $test['result']; if (count($this->normalizationFunctions)) { $expected = ParserTestResultNormalizer::normalize($test['expected'], $this->normalizationFunctions); $out = ParserTestResultNormalizer::normalize($out, $this->normalizationFunctions); } $testResult = new ParserTestResult($test, $expected, $out); return $testResult; }