wiki.techinc.nl/tests/phpunit/includes/diff/TextSlotDiffRendererTest.php
Thiemo Kreuz b655f382db Remove broken/outdated @param/@throws tags from @dataProviders
My personal best practice is to not document @params when there
is a @dataProvider. I mean, these test…() functions are not
meant to be called from anywhere. They do not really need
documentation. @param tags don't do much but duplicate what the
@dataProvider does. This is error-prone, as demonstrated by the
examples in this patch.

This patch also removes @throws tags from tests. A test…() can
never throw an exception. Otherwise the test would fail.

Most of these are found by the not yet released I10559d8.

Change-Id: I3782bca43f875687cd2be972144a7ab6b298454e
2021-01-21 03:42:42 +00:00

132 lines
3.9 KiB
PHP

<?php
use MediaWiki\MediaWikiServices;
use Wikimedia\Assert\ParameterTypeException;
/**
* @covers TextSlotDiffRenderer
*/
class TextSlotDiffRendererTest extends MediaWikiIntegrationTestCase {
public function testGetExtraCacheKeys() {
$slotDiffRenderer = $this->getTextSlotDiffRenderer();
$key = $slotDiffRenderer->getExtraCacheKeys();
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2_INLINE );
$inlineKey = $slotDiffRenderer->getExtraCacheKeys();
$this->assertSame( $key, [] );
$this->assertSame( $inlineKey, [ phpversion( 'wikidiff2' ), 'inline' ] );
}
/**
* @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 ParameterTypeException( '$oldContent', 'TextContent|null' ),
],
'non-text right content' => [
[ "aaa\nbbb\nccc" ],
[ '', 'testing-nontext' ],
new ParameterTypeException( '$newContent', 'TextContent|null' ),
],
];
}
// no separate test for getTextDiff() as getDiff() is just a thin wrapper around it
/**
* @return TextSlotDiffRenderer
*/
private function getTextSlotDiffRenderer() {
$slotDiffRenderer = new TextSlotDiffRenderer();
$slotDiffRenderer->setStatsdDataFactory( new NullStatsdDataFactory() );
$slotDiffRenderer->setLanguage(
MediaWikiServices::getInstance()->getLanguageFactory()->getLanguage( 'en' ) );
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP );
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( '&nbsp;' ) => ' ',
html_entity_decode( '&minus;' ) => '-',
];
// Preserve markers when stripping tags
$diff = str_replace( '<td class="diff-marker"></td>', ' ', $diff );
$diff = str_replace( '<td colspan="2"></td>', ' ', $diff );
$diff = preg_replace( '/data-marker="([^"]*)">/', '>$1', $diff );
return str_replace( array_keys( $replacements ), array_values( $replacements ),
trim( strip_tags( $diff ), "\n" ) );
}
/**
* @param string $str
* @param string $model
* @return null|TextContent
*/
private static function makeContent( $str, $model = CONTENT_MODEL_TEXT ) {
return ContentHandler::makeContent( $str, null, $model );
}
}