getTextSlotDiffRenderer(); $key = $slotDiffRenderer->getExtraCacheKeys(); $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2_INLINE ); $inlineKey = $slotDiffRenderer->getExtraCacheKeys(); ksort( $key ); ksort( $inlineKey ); $this->assertSame( [ '10-formats-and-engines' => 'php=table' ], $key ); $this->assertSame( [ '10-formats-and-engines' => 'wikidiff2=inline', '20-wikidiff2-version' => '1.14.1', '21-wikidiff2-options' => 'bc2a06be', ], $inlineKey ); } /** * @dataProvider provideGetDiff * @param array|null $oldContentArgs To pass to makeContent() (if not null) * @param array|null $newContentArgs * @param string|Exception $expectedResult */ public function testGetDiff( ?array $oldContentArgs, ?array $newContentArgs, $expectedResult ) { $this->mergeMwGlobalArrayValue( 'wgContentHandlers', [ 'testing' => DummyContentHandlerForTesting::class, 'testing-nontext' => DummyNonTextContentHandler::class, ] ); $oldContent = $oldContentArgs ? self::makeContent( ...$oldContentArgs ) : null; $newContent = $newContentArgs ? self::makeContent( ...$newContentArgs ) : null; if ( $expectedResult instanceof Exception ) { $this->expectException( get_class( $expectedResult ) ); $this->expectExceptionMessage( $expectedResult->getMessage() ); } $slotDiffRenderer = $this->getTextSlotDiffRenderer(); $diff = $slotDiffRenderer->getDiff( $oldContent, $newContent ); if ( $expectedResult instanceof Exception ) { return; } $plainDiff = $this->getPlainDiff( $diff ); $this->assertSame( $expectedResult, $plainDiff ); } public static function provideGetDiff() { return [ 'same text' => [ [ "aaa\nbbb\nccc" ], [ "aaa\nbbb\nccc" ], "", ], 'different text' => [ [ "aaa\nbbb\nccc" ], [ "aaa\nxxx\nccc" ], " aaa aaa\n-bbb+xxx\n ccc ccc", ], 'no right content' => [ [ "aaa\nbbb\nccc" ], null, "-aaa+ \n-bbb \n-ccc ", ], 'no left content' => [ null, [ "aaa\nbbb\nccc" ], "- +aaa\n +bbb\n +ccc", ], 'no content' => [ null, null, new InvalidArgumentException( '$oldContent and $newContent cannot both be null' ), ], 'non-text left content' => [ [ '', 'testing-nontext' ], [ "aaa\nbbb\nccc" ], new IncompatibleDiffTypesException( 'testing-nontext', 'text' ), ], 'non-text right content' => [ [ "aaa\nbbb\nccc" ], [ '', 'testing-nontext' ], new ParameterTypeException( '$newContent', 'MediaWiki\Content\TextContent|null' ), ], ]; } // no separate test for getTextDiff() as getDiff() is just a thin wrapper around it /** * @param string $langCode * @return TextSlotDiffRenderer */ private function getTextSlotDiffRenderer( $langCode = 'en' ) { $slotDiffRenderer = new TextSlotDiffRenderer(); $slotDiffRenderer->setStatsdDataFactory( new NullStatsdDataFactory() ); $lang = $this->getServiceContainer()->getLanguageFactory()->getLanguage( $langCode ); $context = new RequestContext; $context->setLanguage( $lang ); $differ = new ManifoldTextDiffer( $context, $lang, 'php', null, [] ); $slotDiffRenderer->setTextDiffer( $differ ); $slotDiffRenderer->setFormat( 'table' ); return $slotDiffRenderer; } /** * Convert a HTML diff to a human-readable format and hopefully make the test less fragile. * @param string $diff * @return string */ private function getPlainDiff( $diff ) { $replacements = [ html_entity_decode( ' ' ) => ' ', html_entity_decode( '−' ) => '-', ]; // Preserve markers when stripping tags $diff = str_replace( '