createDocument( '' ); $node = $doc->createElement( 'div' ); $range = new ImmutableRange( $node, 0, $node, 0 ); $makeThreadItem = static function ( array $arr ) use ( &$makeThreadItem, $range ): ContentThreadItem { if ( $arr['type'] === 'comment' ) { $item = new ContentCommentItem( 1, $range, [], new DateTimeImmutable(), $arr['author'] ); } else { $item = new ContentHeadingItem( $range, 2 ); } $item->setId( $arr['id'] ); foreach ( $arr['replies'] as $reply ) { $item->addReply( $makeThreadItem( $reply ) ); } return $item; }; $threadItem = $makeThreadItem( $thread ); static::assertEquals( $expectedAuthors, $threadItem->getAuthorsBelow() ); static::assertEquals( $expectedThreadItemIds, array_map( static function ( ThreadItem $threadItem ): string { return $threadItem->getId(); }, $threadItem->getThreadItemsBelow() ) ); } public function provideAuthors(): array { return static::getJson( '../cases/authors.json' ); } /** * @dataProvider provideTranscludedFrom * @covers ::getTranscludedFrom * @covers \MediaWiki\Extension\DiscussionTools\CommentUtils::unwrapParsoidSections */ public function testGetTranscludedFrom( string $name, string $title, string $dom, string $expected, string $config, string $data ): void { $dom = static::getHtml( $dom ); $expectedPath = $expected; $expected = static::getJson( $expected ); $config = static::getJson( $config ); $data = static::getJson( $data ); $this->setupEnv( $config, $data ); $title = MediaWikiServices::getInstance()->getTitleParser()->parseTitle( $title ); $doc = static::createDocument( $dom ); $container = static::getThreadContainer( $doc ); CommentUtils::unwrapParsoidSections( $container ); $threadItemSet = static::createParser( $data )->parse( $container, $title ); $comments = $threadItemSet->getCommentItems(); $transcludedFrom = []; foreach ( $comments as $comment ) { $transcludedFrom[ $comment->getId() ] = $comment->getTranscludedFrom(); } // Optionally write updated content to the JSON files if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) { static::overwriteJsonFile( $expectedPath, $transcludedFrom ); } static::assertEquals( $expected, $transcludedFrom, $name ); } public function provideTranscludedFrom(): array { return static::getJson( '../cases/transcluded.json' ); } /** * @dataProvider provideGetText * @covers ::getText * @covers \MediaWiki\Extension\DiscussionTools\ThreadItem\ContentCommentItem::getBodyText * @covers \MediaWiki\Extension\DiscussionTools\ImmutableRange::cloneContents */ public function testGetText( string $name, string $title, string $dom, string $expected, string $config, string $data ): void { $dom = static::getHtml( $dom ); $expectedPath = $expected; $expected = static::getJson( $expected ); $config = static::getJson( $config ); $data = static::getJson( $data ); $doc = static::createDocument( $dom ); $container = static::getThreadContainer( $doc ); $this->setupEnv( $config, $data ); $title = MediaWikiServices::getInstance()->getTitleParser()->parseTitle( $title ); $threadItemSet = static::createParser( $data )->parse( $container, $title ); $items = $threadItemSet->getThreadItems(); $output = []; foreach ( $items as $item ) { $output[ $item->getId() ] = CommentUtils::htmlTrim( $item instanceof ContentCommentItem ? $item->getBodyText( true ) : $item->getText() ); } // Optionally write updated content to the JSON files if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) { static::overwriteJsonFile( $expectedPath, $output ); } static::assertEquals( $expected, $output, $name ); } public function provideGetText(): array { return static::getJson( '../cases/getText.json' ); } /** * @dataProvider provideGetHTML * @covers ::getHTML * @covers \MediaWiki\Extension\DiscussionTools\ThreadItem\ContentCommentItem::getBodyHTML * @covers \MediaWiki\Extension\DiscussionTools\ImmutableRange::cloneContents */ public function testGetHTML( string $name, string $title, string $dom, string $expected, string $config, string $data ): void { $dom = static::getHtml( $dom ); $expectedPath = $expected; $expected = static::getJson( $expected ); $config = static::getJson( $config ); $data = static::getJson( $data ); $doc = static::createDocument( $dom ); $container = static::getThreadContainer( $doc ); $this->setupEnv( $config, $data ); $title = MediaWikiServices::getInstance()->getTitleParser()->parseTitle( $title ); $threadItemSet = static::createParser( $data )->parse( $container, $title ); $items = $threadItemSet->getThreadItems(); $output = []; foreach ( $items as $item ) { $output[ $item->getId() ] = CommentUtils::htmlTrim( $item instanceof ContentCommentItem ? $item->getBodyHTML( true ) : $item->getHTML() ); } // Optionally write updated content to the JSON files if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) { static::overwriteJsonFile( $expectedPath, $output ); } static::assertEquals( $expected, $output, $name ); } public function provideGetHTML(): array { return static::getJson( '../cases/getHTML.json' ); } }