wiki.techinc.nl/tests/phpunit/includes/diff/TextDiffer/ManifoldTextDifferTest.php
Tim Starling 2aa87cdf2c Factor out TextDiffer hierarchy from TextSlotDiffRenderer
* Follow the TODO comment in TextSlotDiffRenderer
  ::getTextDiffInternal() by moving the code out to three parallel
  implementations, namely ExternalTextDiffer, PhpTextDiffer and
  Wikidiff2TextDiffer.
* Add a container/factory class ManifoldTextDiffer to glue them
  together and collate available formats.
* Move the inline legend to Wikidiff2TextDiffer. Not the toggle since
  the ability to toggle depends on the available format, not the current
  format.
* Update the diff cache keys so that ManifoldTextDiffer can store the
  engine=>format map it used to generate the diff.
* Drop support for the second parameter to TextSlotDiffRenderer
 ::setEngine(), since nothing used it anymore.
* Provide a format batch API, since some engines are able to efficiently
  generate multiple formats. This might be used by DifferenceEngine in
  future.

Needs risky change notification for the cache key change.

Bug: T339184
Depends-On: I8a35b9b8ec1622c9a36d2496bdd24f51bc52c85f
Change-Id: I5c506e39162855aff53dd420dd8145156739059c
2023-07-19 12:38:18 +10:00

122 lines
3.2 KiB
PHP

<?php
use MediaWiki\Diff\TextDiffer\ManifoldTextDiffer;
use MediaWiki\Tests\Diff\TextDiffer\TextDifferData;
/**
* @covers \MediaWiki\Diff\TextDiffer\ManifoldTextDiffer
* @covers \MediaWiki\Diff\TextDiffer\BaseTextDiffer
*/
class ManifoldTextDifferTest extends MediaWikiIntegrationTestCase {
private function createDiffer( $configVars = [] ) {
$services = $this->getServiceContainer();
return new ManifoldTextDiffer(
RequestContext::getMain(),
$services->getLanguageFactory()->getLanguage( 'en' ),
$configVars['DiffEngine'] ?? null,
$configVars['ExternalDiffEngine'] ?? null
);
}
public function testGetName() {
$this->assertSame( 'manifold', $this->createDiffer()->getName() );
}
public function testGetFormats() {
if ( extension_loaded( 'wikidiff2' ) ) {
$formats = [ 'table', 'inline' ];
} else {
$formats = [ 'table' ];
}
$this->assertSame(
$formats,
$this->createDiffer()->getFormats()
);
}
public function testHasFormat() {
$differ = $this->createDiffer();
$this->assertTrue( $differ->hasFormat( 'table' ) );
if ( extension_loaded( 'wikidiff2' ) ) {
$this->assertTrue( $differ->hasFormat( 'inline' ) );
}
$this->assertFalse( $differ->hasFormat( 'external' ) );
$this->assertFalse( $differ->hasFormat( 'nonexistent' ) );
}
public function testHasFormatExternal() {
$differ = $this->createDiffer( [
'ExternalDiffEngine' => __DIR__ . '/externalDiffTest.sh'
] );
$this->assertTrue( $differ->hasFormat( 'external' ) );
}
public function testRenderForcePhp() {
$differ = $this->createDiffer( [
'DiffEngine' => 'php'
] );
$result = $differ->render( 'foo', 'bar', 'table' );
$this->assertSame(
TextDifferData::PHP_TABLE,
$result
);
}
/**
* @requires extension wikidiff2
*/
public function testRenderUnforcedWikidiff2() {
$differ = $this->createDiffer();
$result = $differ->render( 'foo', 'bar', 'table' );
$this->assertSame(
TextDifferData::WIKIDIFF2_TABLE,
$result
);
}
/**
* @requires extension wikidiff2
*/
public function testRenderBatchWikidiff2External() {
if ( !is_executable( '/bin/sh' ) ) {
$this->markTestSkipped( 'ExternalTextDiffer can\'t pass extra ' .
'arguments like $wgPhpCli, so it\'s hard to be platform-independent' );
}
$differ = $this->createDiffer( [
'ExternalDiffEngine' => __DIR__ . '/externalDiffTest.sh'
] );
$result = $differ->renderBatch( 'foo', 'bar', [ 'table', 'inline', 'external' ] );
$this->assertSame(
[
'table' => TextDifferData::WIKIDIFF2_TABLE,
'inline' => TextDifferData::WIKIDIFF2_INLINE,
'external' => TextDifferData::EXTERNAL
],
$result
);
}
public static function provideAddRowWrapper() {
return [
[ 'table', false ],
[ 'external', false ],
];
}
/**
* @dataProvider provideAddRowWrapper
* @param string $format
* @param bool $isWrap
*/
public function testAddRowWrapper( $format, $isWrap ) {
$differ = $this->createDiffer( [
'ExternalDiffEngine' => __DIR__ . '/externalDiffTest.sh'
] );
$result = $differ->addRowWrapper( $format, 'foo' );
if ( $isWrap ) {
$this->assertSame( '<tr><td colspan="4">foo</td></tr>', $result );
} else {
$this->assertSame( 'foo', $result );
}
}
}