setMwGlobals( 'wgMathValidModes', [ MathConfig::MODE_SOURCE, MathConfig::MODE_LATEXML ] ); $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', [ 'math' => MathConfig::MODE_SOURCE ] ); $this->setService( 'Math.RendererFactory', new class( new ServiceOptions( RendererFactory::CONSTRUCTOR_OPTIONS, [ 'MathoidCli' => false, 'MathEnableExperimentalInputFormats' => false, 'MathValidModes' => [ MathConfig::MODE_SOURCE ], ] ), $this->getServiceContainer()->getUserOptionsLookup(), new NullLogger() ) extends RendererFactory { public function getRenderer( string $tex, array $params = [], string $mode = MathConfig::MODE_MATHML ): MathRenderer { return new class( $mode, $tex, $params ) extends MathRenderer { public function __construct( $mode, $tex = '', $params = [] ) { parent::__construct( $tex, $params ); $this->mode = $mode; } public function render() { return true; } public function checkTeX() { return true; } public function getHtmlOutput( bool $svg = true ): string { return "$this->mode:$this->tex"; } protected function getMathTableName() { return 'whatever'; } }; } } ); } /** * @covers ::onParserOptionsRegister */ public function testMathParserOption() { $user = $this->getTestUser()->getUserIdentity(); $defaultMode = $this->getServiceContainer()->getUserOptionsLookup()->getOption( $user, 'math' ); $this->assertSame( $defaultMode, ParserOptions::newFromUser( $user )->getOption( 'math' ) ); // 3 corresponds to 'source', see Hooks::mathModeToString $this->getServiceContainer()->getUserOptionsManager()->setOption( $user, 'math', 3 ); $this->assertSame( MathConfig::MODE_SOURCE, ParserOptions::newFromUser( $user )->getOption( 'math' ) ); } public function testParserCacheIntegration() { $this->setupDummyRendering(); $page = $this->getExistingTestPage( __METHOD__ ); $this->assertStatusGood( $this->editPage( $page, 'TEST_FORMULA' ), 'Sanity: edited page' ); $parserOutputAccess = $this->getServiceContainer()->getParserOutputAccess(); // source was set as a default, so the rendering will be shared with // canonical rendering produced by page edit $parserOptions1 = ParserOptions::newCanonical( 'canonical' ); $parserOptions1->setOption( 'math', MathConfig::MODE_SOURCE ); $render = $parserOutputAccess->getCachedParserOutput( $page, $parserOptions1 ); $this->assertNotNull( $render ); $this->assertStringContainsString( "source:TEST_FORMULA", $render->getText() ); // Now render with 'mathml' and make sure we didn't get the cached output $parserOptions2 = ParserOptions::newCanonical( 'canonical' ); $parserOptions2->setOption( 'math', MathConfig::MODE_MATHML ); $this->assertNull( $parserOutputAccess->getCachedParserOutput( $page, $parserOptions2 ) ); $renderStatus = $parserOutputAccess->getParserOutput( $page, $parserOptions2 ); $this->assertStatusGood( $renderStatus ); $this->assertStringContainsString( "mathml:TEST_FORMULA", $renderStatus->getValue()->getText() ); // Fetch from cache with source $cachedWithDummy1 = $parserOutputAccess->getCachedParserOutput( $page, $parserOptions1 ); $this->assertNotNull( $cachedWithDummy1 ); $this->assertStringContainsString( "source:TEST_FORMULA", $cachedWithDummy1->getText() ); // Fetch from cache with mathml $cachedWithDummy2 = $parserOutputAccess->getCachedParserOutput( $page, $parserOptions2 ); $this->assertNotNull( $cachedWithDummy2 ); $this->assertStringContainsString( "mathml:TEST_FORMULA", $cachedWithDummy2->getText() ); } public function testMathInLink() { $this->setupDummyRendering(); $po = ParserOptions::newFromAnon(); $po->setOption( 'math', MathConfig::MODE_SOURCE ); $res = $this->getServiceContainer() ->getParser() ->parse( '[[test|formula]]', PageReferenceValue::localReference( NS_MAIN, __METHOD__ ), $po ) ->getText(); $this->assertStringMatchesFormat( '%Amathml:formula%A', $res ); } }