gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Parser/InTextAnnotationParserTempl...

146 lines
3.5 KiB
PHP

<?php
namespace SMW\Tests\Integration\Parser;
use MediaWiki\Context\RequestContext;
use MediaWiki\MediaWikiServices;
use MediaWiki\Parser\ParserOptions;
use MediaWiki\Parser\ParserOutput;
use MediaWiki\Title\Title;
use SMW\Services\ServicesFactory as ApplicationFactory;
use SMW\Tests\PHPUnitCompat;
use SMW\Tests\TestEnvironment;
/**
* @group semantic-mediawiki
*
* @license GPL-2.0-or-later
* @since 1.9
*
* @author mwjames
*/
class InTextAnnotationParserTemplateTransclusionTest extends \PHPUnit\Framework\TestCase {
use PHPUnitCompat;
private $semanticDataValidator;
private $testEnvironment;
private $applicationFactory;
protected function setUp(): void {
parent::setUp();
$this->testEnvironment = new TestEnvironment();
$this->semanticDataValidator = $this->testEnvironment->getUtilityFactory()->newValidatorFactory()->newSemanticDataValidator();
$store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$this->testEnvironment->registerObject( 'Store', $store );
$this->applicationFactory = ApplicationFactory::getInstance();
}
protected function tearDown(): void {
$this->testEnvironment->tearDown();
parent::tearDown();
}
/**
* Helper method for processing a template transclusion by simulating template
* expensions using a callback to avoid having to integrate DB read/write
* process in order to access a Template
*
* @note Part of the routine has been taken from MW's ExtraParserTest
*
* @return text
*/
private function runTemplateTransclusion( Title $title, $text, $return ) {
$parser = MediaWikiServices::getInstance()->getParserFactory()->create();
$user = RequestContext::getMain()->getUser();
$options = new ParserOptions( $user );
$options->setTemplateCallback( static function ( $title, $parser = false ) use ( $return ) {
$text = $return;
$deps = [];
return [
'text' => $text,
'finalTitle' => $title,
'deps' => $deps
];
} );
return $parser->preprocess( $text, $title, $options );
}
/**
* @dataProvider templateDataProvider
*/
public function testPreprocessTemplateAndParse( $namespace, array $settings, $text, $tmplValue, array $expected ) {
$parserOutput = new ParserOutput();
$title = Title::newFromText( __METHOD__, $namespace );
$outputText = $this->runTemplateTransclusion( $title, $text, $tmplValue );
$this->testEnvironment->withConfiguration( $settings );
$parserData = $this->applicationFactory->newParserData(
$title,
$parserOutput
);
$instance = $this->applicationFactory->newInTextAnnotationParser(
$parserData
);
$instance->parse( $outputText );
$this->assertContains(
$expected['resultText'],
$outputText
);
$parserData = $this->applicationFactory->newParserData(
$title,
$parserOutput
);
$this->assertInstanceOf(
'\SMW\SemanticData',
$parserData->getSemanticData()
);
$this->semanticDataValidator->assertThatPropertiesAreSet(
$expected,
$parserData->getSemanticData()
);
}
public function templateDataProvider() {
$provider = [];
// #0 Bug 54967
$provider[] = [
NS_MAIN,
[
'smwgNamespacesWithSemanticLinks' => [ NS_MAIN => true ],
'smwgLinksInValues' => false,
'smwgParserFeatures' => SMW_PARSER_INL_ERROR,
'smwgMainCacheType' => 'hash'
],
'[[Foo::{{Bam}}]]',
'?bar',
[
'resultText' => '[[:?bar|?bar]]',
'propertyCount' => 1,
'propertyLabels' => [ 'Foo' ],
'propertyValues' => [ '?bar' ]
]
];
return $provider;
}
}