3 use MediaWiki\MediaWikiServices
;
6 * @group ContentHandler
9 * ^--- needed, because we do need the database to test link updates
11 class WikitextContentTest
extends TextContentTest
{
12 public static $sections = "Intro
24 public function newContent( $text ) {
25 return new WikitextContent( $text );
28 public static function dataGetParserOutput() {
31 "WikitextContentTest_testGetParserOutput",
32 CONTENT_MODEL_WIKITEXT
,
34 "<div class=\"mw-parser-output\"><p>hello <i>world</i>\n</p>\n\n\n</div>"
40 public static function dataGetSecondaryDataUpdates() {
42 [ "WikitextContentTest_testGetSecondaryDataUpdates_1",
43 CONTENT_MODEL_WIKITEXT
, "hello ''world''\n",
45 LinksUpdate
::class => [
51 [ "WikitextContentTest_testGetSecondaryDataUpdates_2",
52 CONTENT_MODEL_WIKITEXT
, "hello [[world test 21344]]\n",
54 LinksUpdate
::class => [
57 [ 'World_test_21344' => 0 ]
67 * @dataProvider dataGetSecondaryDataUpdates
69 * @covers WikitextContent::getSecondaryDataUpdates
71 public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
72 $ns = $this->getDefaultWikitextNS();
73 $title = Title
::newFromText( $title, $ns );
75 $content = ContentHandler
::makeContent( $text, $title, $model );
77 $page = WikiPage
::factory( $title );
78 $page->doEditContent( $content, '' );
80 $updates = $content->getSecondaryDataUpdates( $title );
82 // make updates accessible by class name
83 foreach ( $updates as $update ) {
84 $class = get_class( $update );
85 $updates[$class] = $update;
88 foreach ( $expectedStuff as $class => $fieldValues ) {
89 $this->assertArrayHasKey( $class, $updates, "missing an update of type $class" );
91 $update = $updates[$class];
93 foreach ( $fieldValues as $field => $value ) {
94 $v = $update->$field; # if the field doesn't exist, just crash and burn
98 "unexpected value for field $field in instance of $class"
103 $page->doDeleteArticle( '' );
106 public static function dataGetSection() {
125 * @dataProvider dataGetSection
126 * @covers WikitextContent::getSection
128 public function testGetSection( $text, $sectionId, $expectedText ) {
129 $content = $this->newContent( $text );
131 $sectionContent = $content->getSection( $sectionId );
132 if ( is_object( $sectionContent ) ) {
133 $sectionText = $sectionContent->getText();
135 $sectionText = $sectionContent;
138 $this->assertEquals( $expectedText, $sectionText );
141 public static function dataReplaceSection() {
147 trim( preg_replace( '/^Intro/sm', 'No more', self
::$sections ) )
157 "== TEST ==\nmore fun",
160 '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==",
174 trim( self
::$sections ) . "\n\n\n== New ==\n\nNo more"
180 * @dataProvider dataReplaceSection
181 * @covers WikitextContent::replaceSection
183 public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
184 $content = $this->newContent( $text );
185 /** @var WikitextContent $c */
186 $c = $content->replaceSection( $section, $this->newContent( $with ), $sectionTitle );
188 $this->assertEquals( $expected, $c ?
$c->getText() : null );
192 * @covers WikitextContent::addSectionHeader
194 public function testAddSectionHeader() {
195 $content = $this->newContent( 'hello world' );
196 $content = $content->addSectionHeader( 'test' );
198 $this->assertEquals( "== test ==\n\nhello world", $content->getText() );
201 public static function dataPreSaveTransform() {
203 [ 'hello this is ~~~',
204 "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
206 [ 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
207 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
216 public static function dataPreloadTransform() {
223 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
224 'hello \'\'this\'\' is bar',
229 public static function dataGetRedirectTarget() {
231 [ '#REDIRECT [[Test]]',
237 [ '* #REDIRECT [[Test]]',
243 public static function dataGetTextForSummary() {
253 [ '[[hello world]].',
260 public static function dataIsCountable() {
292 [ '#REDIRECT [[bar]]',
297 [ '#REDIRECT [[bar]]',
306 * @covers WikitextContent::matchMagicWord
308 public function testMatchMagicWord() {
309 $mw = MediaWikiServices
::getInstance()->getMagicWordFactory()->get( "staticredirect" );
311 $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
312 $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
314 $content = $this->newContent( "#REDIRECT [[FOO]]" );
316 $content->matchMagicWord( $mw ),
317 "should not have matched magic word"
322 * @covers WikitextContent::updateRedirect
324 public function testUpdateRedirect() {
325 $target = Title
::newFromText( "testUpdateRedirect_target" );
327 // test with non-redirect page
328 $content = $this->newContent( "hello world." );
329 $newContent = $content->updateRedirect( $target );
331 $this->assertTrue( $content->equals( $newContent ), "content should be unchanged" );
333 // test with actual redirect
334 $content = $this->newContent( "#REDIRECT [[Someplace]]" );
335 $newContent = $content->updateRedirect( $target );
337 $this->assertFalse( $content->equals( $newContent ), "content should have changed" );
338 $this->assertTrue( $newContent->isRedirect(), "new content should be a redirect" );
341 $target->getFullText(),
342 $newContent->getRedirectTarget()->getFullText()
347 * @covers WikitextContent::getModel
349 public function testGetModel() {
350 $content = $this->newContent( "hello world." );
352 $this->assertEquals( CONTENT_MODEL_WIKITEXT
, $content->getModel() );
356 * @covers WikitextContent::getContentHandler
358 public function testGetContentHandler() {
359 $content = $this->newContent( "hello world." );
361 $this->assertEquals( CONTENT_MODEL_WIKITEXT
, $content->getContentHandler()->getModelID() );
365 * @covers ParserOptions::getRedirectTarget
366 * @covers ParserOptions::setRedirectTarget
368 public function testRedirectParserOption() {
369 $title = Title
::newFromText( 'testRedirectParserOption' );
371 // Set up hook and its reporting variables
373 $redirectTarget = null;
374 $this->mergeMwGlobalArrayValue( 'wgHooks', [
375 'InternalParseBeforeLinks' => [
376 function ( &$parser, &$text, &$stripState ) use ( &$wikitext, &$redirectTarget ) {
378 $redirectTarget = $parser->getOptions()->getRedirectTarget();
383 // Test with non-redirect page
385 $redirectTarget = false;
386 $content = $this->newContent( 'hello world.' );
387 $options = ParserOptions
::newCanonical( 'canonical' );
388 $options->setRedirectTarget( $title );
389 $content->getParserOutput( $title, null, $options );
390 $this->assertEquals( 'hello world.', $wikitext,
391 'Wikitext passed to hook was not as expected'
393 $this->assertEquals( null, $redirectTarget, 'Redirect seen in hook was not null' );
394 $this->assertEquals( $title, $options->getRedirectTarget(),
395 'ParserOptions\' redirectTarget was changed'
398 // Test with a redirect page
400 $redirectTarget = false;
401 $content = $this->newContent(
402 "#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect."
404 $options = ParserOptions
::newCanonical( 'canonical' );
405 $content->getParserOutput( $title, null, $options );
409 'Wikitext passed to hook was not as expected'
411 $this->assertNotEquals(
414 'Redirect seen in hook was null' );
416 'TestRedirectParserOption/redir',
417 $redirectTarget->getFullText(),
418 'Redirect seen in hook was not the expected title'
422 $options->getRedirectTarget(),
423 'ParserOptions\' redirectTarget was changed'
427 public static function dataEquals() {
429 [ new WikitextContent( "hallo" ), null, false ],
430 [ new WikitextContent( "hallo" ), new WikitextContent( "hallo" ), true ],
431 [ new WikitextContent( "hallo" ), new JavaScriptContent( "hallo" ), false ],
432 [ new WikitextContent( "hallo" ), new TextContent( "hallo" ), false ],
433 [ new WikitextContent( "hallo" ), new WikitextContent( "HALLO" ), false ],
437 public static function dataGetDeletionUpdates() {
440 CONTENT_MODEL_WIKITEXT
, "hello ''world''\n",
441 [ LinksDeletionUpdate
::class => [] ]
444 CONTENT_MODEL_WIKITEXT
, "hello [[world test 21344]]\n",
445 [ LinksDeletionUpdate
::class => [] ]
452 * @covers WikitextContent::preSaveTransform
453 * @covers WikitextContent::fillParserOutput
455 public function testHadSignature() {
456 $titleObj = Title
::newFromText( __CLASS__
);
458 $content = new WikitextContent( '~~~~' );
459 $pstContent = $content->preSaveTransform(
460 $titleObj, $this->getTestUser()->getUser(), new ParserOptions()
463 $this->assertTrue( $pstContent->getParserOutput( $titleObj )->getFlag( 'user-signature' ) );