1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
<?php
use Wikimedia\Assert\ParameterTypeException;
/**
* @covers TextSlotDiffRenderer
*/
class TextSlotDiffRendererTest extends MediaWikiTestCase {
/**
* @dataProvider provideGetDiff
* @param Content|null $oldContent
* @param Content|null $newContent
* @param string|Exception $expectedResult
* @throws Exception
*/
public function testGetDiff(
Content $oldContent = null, Content $newContent = null, $expectedResult
) {
if ( $expectedResult instanceof Exception ) {
$this->setExpectedException( get_class( $expectedResult ), $expectedResult->getMessage() );
}
$slotDiffRenderer = $this->getTextSlotDiffRenderer();
$diff = $slotDiffRenderer->getDiff( $oldContent, $newContent );
if ( $expectedResult instanceof Exception ) {
return;
}
$plainDiff = $this->getPlainDiff( $diff );
$this->assertSame( $expectedResult, $plainDiff );
}
public function provideGetDiff() {
$this->mergeMwGlobalArrayValue( 'wgContentHandlers', [
'testing' => DummyContentHandlerForTesting::class,
'testing-nontext' => DummyNonTextContentHandler::class,
] );
return [
'same text' => [
$this->makeContent( "aaa\nbbb\nccc" ),
$this->makeContent( "aaa\nbbb\nccc" ),
"",
],
'different text' => [
$this->makeContent( "aaa\nbbb\nccc" ),
$this->makeContent( "aaa\nxxx\nccc" ),
" aaa aaa\n-bbb+xxx\n ccc ccc",
],
'no right content' => [
$this->makeContent( "aaa\nbbb\nccc" ),
null,
"-aaa+ \n-bbb \n-ccc ",
],
'no left content' => [
null,
$this->makeContent( "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' => [
$this->makeContent( '', 'testing-nontext' ),
$this->makeContent( "aaa\nbbb\nccc" ),
new ParameterTypeException( '$oldContent', 'TextContent|null' ),
],
'non-text right content' => [
$this->makeContent( "aaa\nbbb\nccc" ),
$this->makeContent( '', '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( Language::factory( 'en' ) );
$slotDiffRenderer->setWikiDiff2MovedParagraphDetectionCutoff( 0 );
$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( ' ' ) => ' ',
html_entity_decode( '−' ) => '-',
];
return str_replace( array_keys( $replacements ), array_values( $replacements ),
trim( strip_tags( $diff ), "\n" ) );
}
/**
* @param string $str
* @param string $model
* @return null|TextContent
*/
private function makeContent( $str, $model = CONTENT_MODEL_TEXT ) {
return ContentHandler::makeContent( $str, null, $model );
}
}
|