jenkins-bot has submitted this change and it was merged. Change subject: Track fallback languages used via parser function. ......................................................................
Track fallback languages used via parser function. This factors the tracking logic into a decorator implementation of SnakFormatter. This moves the tracking closer to the actual usage in the ValueFormatter, and reduces the number of places that need to care about usage tracking. This change includes several modifications to test cases to ensure that the SnakFormatter decorator is applied and configured correctly. Note that this only covers usages via the Parser Function, not via Lua. Lua is to be addressed in a later change. Bug: T93056 Change-Id: I0fe2b184e8c8f096af37bcff6a7f6ecd9355d663 --- M client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php M client/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactory.php M client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php M client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php M client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php M client/includes/DataAccess/StatementTransclusionInteractor.php A client/includes/Usage/UsageTrackingSnakFormatter.php R client/includes/Usage/UsageTrackingTermLookup.php M client/tests/phpunit/includes/DataAccess/PropertyParserFunction/LanguageAwareRendererTest.php M client/tests/phpunit/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactoryTest.php M client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php M client/tests/phpunit/includes/DataAccess/StatementTransclusionInteractorTest.php M client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php A client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php R client/tests/phpunit/includes/Usage/UsageTrackingTermLookupTest.php 15 files changed, 318 insertions(+), 107 deletions(-) Approvals: Addshore: Looks good to me, approved jenkins-bot: Verified diff --git a/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php b/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php index 05ff7e8..0cb201d 100644 --- a/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php +++ b/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php @@ -5,7 +5,6 @@ use InvalidArgumentException; use Language; use Status; -use Wikibase\Client\Usage\UsageAccumulator; use Wikibase\DataAccess\StatementTransclusionInteractor; use Wikibase\DataModel\Entity\EntityId; use Wikibase\Lib\PropertyLabelNotResolvedException; @@ -35,23 +34,15 @@ private $statementTransclusionInteractor; /** - * @var UsageAccumulator - */ - private $usageAccumulator; - - /** * @param Language $language * @param StatementTransclusionInteractor $statementTransclusionInteractor - * @param UsageAccumulator $usageAccumulator */ public function __construct( Language $language, - StatementTransclusionInteractor $statementTransclusionInteractor, - UsageAccumulator $usageAccumulator + StatementTransclusionInteractor $statementTransclusionInteractor ) { $this->language = $language; $this->statementTransclusionInteractor = $statementTransclusionInteractor; - $this->usageAccumulator = $usageAccumulator; } /** @@ -65,7 +56,6 @@ $status = Status::newGood( $this->statementTransclusionInteractor->render( $entityId, - $this->usageAccumulator, $propertyLabelOrId ) ); diff --git a/client/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactory.php b/client/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactory.php index 050e9f5..b726219 100644 --- a/client/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactory.php +++ b/client/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactory.php @@ -7,6 +7,7 @@ use ValueFormatters\FormatterOptions; use Wikibase\Client\Usage\ParserOutputUsageAccumulator; use Wikibase\Client\Usage\UsageAccumulator; +use Wikibase\Client\Usage\UsageTrackingSnakFormatter; use Wikibase\DataAccess\PropertyIdResolver; use Wikibase\DataAccess\StatementTransclusionInteractor; use Wikibase\DataAccess\SnaksFinder; @@ -93,7 +94,7 @@ /** * @param Language $language - * @param UsageAccumulator|null $usageAccumulator + * @param UsageAccumulator $usageAccumulator * * @return LanguageAwareRenderer */ @@ -102,20 +103,19 @@ $language, $this->propertyIdResolver, $this->snaksFinder, - $this->newSnakFormatterForLanguage( $language ), + $this->newSnakFormatterForLanguage( $language, $usageAccumulator ), $this->entityLookup ); return new LanguageAwareRenderer( $language, - $entityStatementsRenderer, - $usageAccumulator + $entityStatementsRenderer ); } /** * @param string $languageCode - * @param UsageAccumulator|null $usageAccumulator + * @param UsageAccumulator $usageAccumulator * * @return LanguageAwareRenderer */ @@ -130,7 +130,7 @@ /** * @param string $languageCode - * @param UsageAccumulator|null $usageAccumulator + * @param UsageAccumulator $usageAccumulator * * @return LanguageAwareRenderer */ @@ -145,7 +145,7 @@ /** * @param string[] $variants - * @param UsageAccumulator|null $usageAccumulator + * @param UsageAccumulator $usageAccumulator * * @return VariantsAwareRenderer */ @@ -187,10 +187,11 @@ /** * @param Language $language + * @param UsageAccumulator $usageAccumulator * * @return SnakFormatter */ - private function newSnakFormatterForLanguage( Language $language ) { + private function newSnakFormatterForLanguage( Language $language, UsageAccumulator $usageAccumulator ) { $languageFallbackChain = $this->languageFallbackChainFactory->newFromLanguage( $language, LanguageFallbackChainFactory::FALLBACK_SELF | LanguageFallbackChainFactory::FALLBACK_VARIANTS @@ -201,9 +202,13 @@ // ...more options... (?) ) ); - $snakFormatter = $this->snakFormatterFactory->getSnakFormatter( - SnakFormatter::FORMAT_WIKI, - $options + $snakFormatter = new UsageTrackingSnakFormatter( + $this->snakFormatterFactory->getSnakFormatter( + SnakFormatter::FORMAT_WIKI, + $options + ), + $usageAccumulator, + $languageFallbackChain->getFetchLanguageCodes() ); return $snakFormatter; diff --git a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php index 34e07be..1d6e1f9 100644 --- a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php +++ b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php @@ -1,6 +1,7 @@ <?php use ValueFormatters\FormatterOptions; +use Wikibase\Client\Usage\UsageTrackingSnakFormatter; use Wikibase\DataAccess\StatementTransclusionInteractor; use Wikibase\DataAccess\PropertyIdResolver; use Wikibase\DataAccess\SnaksFinder; @@ -41,10 +42,15 @@ $wikibaseClient = WikibaseClient::getDefaultInstance(); - $formatterOptions = new FormatterOptions( array( "language" => $wgContLang ) ); + $formatterOptions = new FormatterOptions( array( SnakFormatter::OPT_LANG => $wgContLang->getCode() ) ); + $usageAccumulator = new ParserOutputUsageAccumulator( $this->getParser()->getOutput() ); - $snakFormatter = $wikibaseClient->getSnakFormatterFactory()->getSnakFormatter( - SnakFormatter::FORMAT_WIKI, $formatterOptions + $snakFormatter = new UsageTrackingSnakFormatter( + $wikibaseClient->getSnakFormatterFactory()->getSnakFormatter( + SnakFormatter::FORMAT_WIKI, $formatterOptions + ), + $usageAccumulator, + array( $wgContLang->getCode() ) //FIXME: fallback ); $entityLookup = $wikibaseClient->getStore()->getEntityLookup(); @@ -65,7 +71,7 @@ return new WikibaseLuaEntityBindings( $entityStatementsRenderer, $wikibaseClient->getEntityIdParser(), - new ParserOutputUsageAccumulator( $this->getParser()->getOutput() ), + $usageAccumulator, $wikibaseClient->getSettings()->getSetting( 'siteGlobalID' ) ); } diff --git a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php index 0cab673..41f4076 100644 --- a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php +++ b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php @@ -2,7 +2,7 @@ use Deserializers\Exceptions\DeserializationException; use ValueFormatters\FormatterOptions; -use Wikibase\Client\Store\UsageTrackingTermLookup; +use Wikibase\Client\Usage\UsageTrackingTermLookup; use Wikibase\Client\DataAccess\Scribunto\EntityAccessor; use Wikibase\Client\DataAccess\Scribunto\SnakSerializationRenderer; use Wikibase\Client\DataAccess\Scribunto\WikibaseLuaBindings; diff --git a/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php b/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php index 69b4843..cda35c8 100644 --- a/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php +++ b/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php @@ -71,7 +71,6 @@ return $this->statementTransclusionInteractor->render( $entityId, - $this->usageAccumulator, $propertyLabelOrId, $acceptableRanks ); diff --git a/client/includes/DataAccess/StatementTransclusionInteractor.php b/client/includes/DataAccess/StatementTransclusionInteractor.php index 071bbd3..814f422 100644 --- a/client/includes/DataAccess/StatementTransclusionInteractor.php +++ b/client/includes/DataAccess/StatementTransclusionInteractor.php @@ -3,7 +3,6 @@ namespace Wikibase\DataAccess; use Language; -use Wikibase\Client\Usage\UsageAccumulator; use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Snak\Snak; use Wikibase\DataModel\StatementListProvider; @@ -70,7 +69,6 @@ /** * @param EntityId $entityId - * @param UsageAccumulator $usageAccumulator * @param string $propertyLabelOrId property label or ID (pXXX) * @param int[]|null $acceptableRanks * @@ -79,7 +77,6 @@ */ public function render( EntityId $entityId, - UsageAccumulator $usageAccumulator, $propertyLabelOrId, $acceptableRanks = null ) { @@ -99,8 +96,6 @@ $propertyId, $acceptableRanks ); - - $usageAccumulator->addLabelUsageForSnaks( $snaks, $this->language->getCode() ); return $this->formatSnaks( $snaks ); } diff --git a/client/includes/Usage/UsageTrackingSnakFormatter.php b/client/includes/Usage/UsageTrackingSnakFormatter.php new file mode 100644 index 0000000..1d764e6 --- /dev/null +++ b/client/includes/Usage/UsageTrackingSnakFormatter.php @@ -0,0 +1,105 @@ +<?php + +namespace Wikibase\Client\Usage; + +use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdValue; +use Wikibase\DataModel\Snak\PropertyValueSnak; +use Wikibase\DataModel\Snak\Snak; +use Wikibase\Lib\SnakFormatter; + +/** + * SnakFormatter decorator that records entity usage. + * + * @see UsageAccumulator + * + * @since 0.5 + * + * @licence GNU GPL v2+ + * @author Daniel Kinzler + */ +class UsageTrackingSnakFormatter implements SnakFormatter { + + /** + * @var SnakFormatter + */ + private $snakFormatter; + + /** + * @var UsageAccumulator + */ + private $usageAccumulator; + + /** + * @var string[] + */ + private $languages; + + /** + * @param SnakFormatter $snakFormatter + * @param UsageAccumulator $usageAccumulator + * @param string[] $languages language codes to consider used for formatting + */ + public function __construct( SnakFormatter $snakFormatter, UsageAccumulator $usageAccumulator, array $languages ) { + $this->snakFormatter = $snakFormatter; + $this->usageAccumulator = $usageAccumulator; + $this->languages = $languages; + } + + /** + * Formats a snak. + * + * @param Snak $snak + * + * @return string + */ + public function formatSnak( Snak $snak ) { + if ( $snak instanceof PropertyValueSnak ) { + $value = $snak->getDataValue(); + + if ( $value instanceof EntityIdValue ) { + $entityId = $value->getEntityId(); + $this->addLabelUsage( $value->getEntityId() ); + $this->usageAccumulator->addTitleUsage( $entityId ); + } + } + + return $this->snakFormatter->formatSnak( $snak ); + } + + /** + * @param EntityId $id + */ + private function addLabelUsage( EntityId $id ) { + foreach ( $this->languages as $lang ) { + $this->usageAccumulator->addLabelUsage( $id, $lang ); + } + } + + /** + * Checks whether this SnakFormatter can format the given snak. + * + * @param Snak $snak + * + * @return bool + */ + public function canFormatSnak( Snak $snak ) { + return $this->snakFormatter->canFormatSnak( $snak ); + } + + /** + * Returns the format ID of the format this formatter generates. + * This uses the FORMAT_XXX constants defined in OutputFormatSnakFormatterFactory. + * + * @see SnakFormatter::FORMAT_PLAIN + * @see SnakFormatter::FORMAT_WIKI + * @see SnakFormatter::FORMAT_HTML + * @see SnakFormatter::FORMAT_HTML_WIDGET + * + * @return string + */ + public function getFormat() { + return $this->snakFormatter->getFormat(); + } + +} diff --git a/client/includes/store/UsageTrackingTermLookup.php b/client/includes/Usage/UsageTrackingTermLookup.php similarity index 96% rename from client/includes/store/UsageTrackingTermLookup.php rename to client/includes/Usage/UsageTrackingTermLookup.php index 2d0ae8b..7832f23 100644 --- a/client/includes/store/UsageTrackingTermLookup.php +++ b/client/includes/Usage/UsageTrackingTermLookup.php @@ -1,9 +1,8 @@ <?php -namespace Wikibase\Client\Store; +namespace Wikibase\Client\Usage; use OutOfBoundsException; -use Wikibase\Client\Usage\UsageAccumulator; use Wikibase\DataModel\Entity\EntityId; use Wikibase\Lib\Store\TermLookup; diff --git a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/LanguageAwareRendererTest.php b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/LanguageAwareRendererTest.php index e77ec0c..5c33ac6 100644 --- a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/LanguageAwareRendererTest.php +++ b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/LanguageAwareRendererTest.php @@ -6,7 +6,6 @@ use Language; use Wikibase\Client\Usage\EntityUsage; use Wikibase\Client\Usage\HashUsageAccumulator; -use Wikibase\Client\Usage\UsageAccumulator; use Wikibase\DataAccess\PropertyIdResolver; use Wikibase\DataAccess\PropertyParserFunction\LanguageAwareRenderer; use Wikibase\DataAccess\SnaksFinder; @@ -37,15 +36,13 @@ * @param PropertyIdResolver $propertyIdResolver * @param SnaksFinder $snaksFinder * @param string $languageCode - * @param UsageAccumulator|null $usageAccumulator * * @return LanguageAwareRenderer */ private function getRenderer( PropertyIdResolver $propertyIdResolver, SnaksFinder $snaksFinder, - $languageCode, - UsageAccumulator $usageAccumulator = null + $languageCode ) { $targetLanguage = Language::factory( $languageCode ); @@ -59,8 +56,7 @@ return new LanguageAwareRenderer( $targetLanguage, - $entityStatementsRenderer, - $usageAccumulator ?: new HashUsageAccumulator() + $entityStatementsRenderer ); } @@ -82,34 +78,6 @@ $expected = 'a kitten!, two kittens!!'; $this->assertEquals( $expected, $result ); - } - - public function testRender_trackUsage() { - $q22 = new ItemId( 'Q22' ); - $q23 = new ItemId( 'Q23' ); - $propertyId = new PropertyId( 'P1337' ); - $snaks = array( - 'Q42$22' => new PropertyValueSnak( $propertyId, new EntityIdValue( $q22 ) ), - 'Q42$23' => new PropertyValueSnak( $propertyId, new EntityIdValue( $q23 ) ) - ); - - $accumulator = new HashUsageAccumulator(); - $renderer = $this->getRenderer( - $this->getPropertyIdResolver(), - $this->getSnaksFinder( $snaks ), - 'en', - $accumulator - ); - - $q42 = new ItemId( 'Q42' ); - $renderer->render( $q42, 'p1337' ); - - $expectedUsage = array( - new EntityUsage( $q22, EntityUsage::LABEL_USAGE, 'en' ), - new EntityUsage( $q23, EntityUsage::LABEL_USAGE, 'en' ), - ); - - $this->assertSameUsages( $expectedUsage, $accumulator->getUsages() ); } /** diff --git a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactoryTest.php b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactoryTest.php index 1257596..e5439e3 100644 --- a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactoryTest.php +++ b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/PropertyClaimsRendererFactoryTest.php @@ -7,7 +7,16 @@ use ParserOptions; use Title; use User; +use Wikibase\Client\Usage\ParserOutputUsageAccumulator; use Wikibase\DataAccess\PropertyParserFunction\PropertyClaimsRendererFactory; +use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdValue; +use Wikibase\DataModel\Entity\Item; +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\DataModel\Entity\PropertyId; +use Wikibase\DataModel\Snak\PropertyValueSnak; +use Wikibase\DataModel\StatementListProvider; +use Wikibase\LanguageFallbackChainFactory; /** * @covers Wikibase\DataAccess\PropertyParserFunction\PropertyClaimsRendererFactory @@ -105,13 +114,27 @@ ); } + public function testNewRenderer_usageTracking() { + $parser = $this->getParser( 'en', true, false, false, Parser::OT_HTML ); + + $rendererFactory = $this->getPropertyClaimsRendererFactory(); + $renderer = $rendererFactory->newRendererFromParser( $parser ); + + $usageAccumulator = new ParserOutputUsageAccumulator( $parser->getOutput() ); + $this->assertEquals( "Kittens!", $renderer->render( new ItemId( 'Q1' ), 'P1' ) ); + + $usages = $usageAccumulator->getUsages(); + $this->assertArrayHasKey( 'Q7#L.en', $usages ); + $this->assertArrayHasKey( 'Q7#T', $usages ); + } + private function getPropertyClaimsRendererFactory() { return new PropertyClaimsRendererFactory( $this->getPropertyIdResolver(), $this->getSnaksFinder(), $this->getLanguageFallbackChainFactory(), $this->getSnakFormatterFactory(), - $this->getMock( 'Wikibase\Lib\Store\EntityLookup' ) + $this->getEntityLookup() ); } @@ -121,6 +144,12 @@ ) ->disableOriginalConstructor() ->getMock(); + + $propertyIdResolver->expects( $this->any() ) + ->method( 'resolvePropertyId' ) + ->will( $this->returnCallback( function ( $name, $lang ) { + return new PropertyId( $name ); + } ) ); return $propertyIdResolver; } @@ -132,23 +161,29 @@ ->disableOriginalConstructor() ->getMock(); + $snakListFinder->expects( $this->any() ) + ->method( 'findSnaks' ) + ->will( $this->returnCallback( function ( StatementListProvider $statementListProvider, PropertyId $propertyId, $acceptableRanks = null ) { + return array( + new PropertyValueSnak( $propertyId, new EntityIdValue( new ItemId( 'Q7' ) ) ) + ); + } ) ); + return $snakListFinder; } private function getLanguageFallbackChainFactory() { - $languageFallbackChainFactory = $this->getMockBuilder( - 'Wikibase\LanguageFallbackChainFactory' - ) - ->disableOriginalConstructor() - ->getMock(); - - return $languageFallbackChainFactory; + return new LanguageFallbackChainFactory(); } private function getSnakFormatterFactory() { $snakFormatter = $this->getMockBuilder( 'Wikibase\Lib\SnakFormatter' ) ->disableOriginalConstructor() ->getMock(); + + $snakFormatter->expects( $this->any() ) + ->method( 'formatSnak' ) + ->will( $this->returnValue( 'Kittens!' ) ); $snakFormatterFactory = $this->getMockBuilder( 'Wikibase\Lib\OutputFormatSnakFormatterFactory' @@ -163,6 +198,20 @@ return $snakFormatterFactory; } + private function getEntityLookup() { + $entityLookup = $this->getMockBuilder( 'Wikibase\Lib\Store\EntityLookup' ) + ->disableOriginalConstructor() + ->getMock(); + + $entityLookup->expects( $this->any() ) + ->method( 'getEntity' ) + ->will( $this->returnCallback( function ( EntityId $id ) { + return new Item( $id ); + } ) ); + + return $entityLookup; + } + private function getParser( $languageCode, $interfaceMessage, $disableContentConversion, $disableTitleConversion, $outputType ) { diff --git a/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php b/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php index 02c79ed..e125363 100644 --- a/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php +++ b/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php @@ -32,7 +32,7 @@ $entityStatementsRenderer->expects( $this->any() ) ->method( 'render' ) - ->with( new ItemId( 'Q12' ), $usageAccumulator, 'some label', array( Statement::RANK_DEPRECATED ) ) + ->with( new ItemId( 'Q12' ), 'some label', array( Statement::RANK_DEPRECATED ) ) ->will( $this->returnValue( 'Kittens > Cats' ) ); return new WikibaseLuaEntityBindings( diff --git a/client/tests/phpunit/includes/DataAccess/StatementTransclusionInteractorTest.php b/client/tests/phpunit/includes/DataAccess/StatementTransclusionInteractorTest.php index 2590297..bbdf580 100644 --- a/client/tests/phpunit/includes/DataAccess/StatementTransclusionInteractorTest.php +++ b/client/tests/phpunit/includes/DataAccess/StatementTransclusionInteractorTest.php @@ -69,7 +69,7 @@ ); $q42 = new ItemId( 'Q42' ); - $result = $renderer->render( $q42, new HashUsageAccumulator(), 'p1337' ); + $result = $renderer->render( $q42, 'p1337' ); $expected = 'a kitten!, two kittens!!'; $this->assertEquals( $expected, $result ); @@ -83,30 +83,7 @@ ); $this->setExpectedException( 'Wikibase\Lib\PropertyLabelNotResolvedException' ); - $renderer->render( new ItemId( 'Q42' ), new HashUsageAccumulator(), 'blah' ); - } - - public function testRender_trackUsage() { - $q22 = new ItemId( 'Q22' ); - $q23 = new ItemId( 'Q23' ); - $propertyId = new PropertyId( 'P1337' ); - $snaks = array( - 'Q42$22' => new PropertyValueSnak( $propertyId, new EntityIdValue( $q22 ) ), - 'Q42$23' => new PropertyValueSnak( $propertyId, new EntityIdValue( $q23 ) ) - ); - - $accumulator = new HashUsageAccumulator(); - $renderer = $this->getInteractor( $this->getPropertyIdResolver(), $this->getSnaksFinder( $snaks ), 'en' ); - - $q42 = new ItemId( 'Q42' ); - $renderer->render( $q42, $accumulator, 'p1337' ); - - $expectedUsage = array( - new EntityUsage( $q22, EntityUsage::LABEL_USAGE, 'en' ), - new EntityUsage( $q23, EntityUsage::LABEL_USAGE, 'en' ), - ); - - $this->assertSameUsages( $expectedUsage, $accumulator->getUsages() ); + $renderer->render( new ItemId( 'Q42' ), 'blah' ); } /** diff --git a/client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php b/client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php index bdd00c5..86a55b2 100644 --- a/client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php +++ b/client/tests/phpunit/includes/DataAccess/WikibaseDataAccessTestItemSetUpHelper.php @@ -6,6 +6,7 @@ use DataValues\StringValue; use Wikibase\Client\WikibaseClient; use Wikibase\DataModel\Claim\Claim; +use Wikibase\DataModel\Entity\EntityIdValue; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\ItemId; use Wikibase\DataModel\Entity\Property; @@ -52,6 +53,7 @@ } $stringProperty = $this->getTestProperty( new PropertyId( 'P342' ), 'string', 'LuaTestStringProperty' ); + $itemProperty = $this->getTestProperty( new PropertyId( 'P456' ), 'wikibase-item', 'LuaTestItemProperty' ); $stringSnak = $this->getTestSnak( $stringProperty->getId(), @@ -82,6 +84,7 @@ $stringProperty->getStatements()->addStatement( $statement1 ); $this->siteLinkLookup->putEntity( $stringProperty ); + $this->siteLinkLookup->putEntity( $itemProperty ); $stringSnak2 = $this->getTestSnak( $stringProperty->getId(), @@ -90,6 +93,14 @@ $statement2 = $this->getTestStatement( $stringSnak2 ); $statement2->setRank( Statement::RANK_NORMAL ); + + $itemSnak = $this->getTestSnak( + $itemProperty->getId(), + new EntityIdValue( new ItemId( 'Q885588' ) ) + ); + + $statement3 = $this->getTestStatement( $itemSnak ); + $statement3->setRank( Statement::RANK_NORMAL ); $siteLinks = array( $siteLink ); $siteLinks[] = new SiteLink( @@ -104,7 +115,7 @@ $this->createTestItem( new ItemId( 'Q32487' ), $labels, array( $statement1, $statement2 ), $siteLinks ); - $this->createTestItem( new ItemId( 'Q32488' ), array(), array( $statement1 ), array() ); + $this->createTestItem( new ItemId( 'Q32488' ), array(), array( $statement1, $statement3 ), array() ); // Create another test item to test arbitrary access $this->createTestItem( new ItemId( 'Q199024' ), array( 'de' => 'Arbitrary access \o/' ) ); diff --git a/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php b/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php new file mode 100644 index 0000000..dec4f66 --- /dev/null +++ b/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php @@ -0,0 +1,107 @@ +<?php + +namespace Wikibase\Client\Tests\Usage; + +use DataValues\StringValue; +use Wikibase\Client\Usage\UsageTrackingSnakFormatter; +use Wikibase\Client\Usage\HashUsageAccumulator; +use Wikibase\DataModel\Entity\EntityIdValue; +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\DataModel\Entity\PropertyId; +use Wikibase\DataModel\Snak\PropertyNoValueSnak; +use Wikibase\DataModel\Snak\PropertyValueSnak; +use Wikibase\Lib\SnakFormatter; + +/** + * @covers Wikibase\Lib\Store\UsageTrackingSnakFormatter + * + * @group Wikibase + * @group WikibaseLib + * @group WikibaseStore + * + * @licence GNU GPL v2+ + * @author Daniel Kinzler + */ +class UsageTrackingSnakFormatterTest extends \MediaWikiTestCase { + + /** + * @return SnakFormatter + */ + private function getMockSnakFormatter( $method, $return ) { + $mockFormatter = $this->getMock( 'Wikibase\Lib\SnakFormatter' ); + + $mockFormatter->expects( $this->once() ) + ->method( $method ) + ->will( $this->returnValue( $return ) ); + + return $mockFormatter; + } + + public function testFormatSnak_item() { + $p1 = new PropertyId( 'P1' ); + $q1 = new ItemId( 'Q1' ); + $itemSnak = new PropertyValueSnak( $p1, new EntityIdValue( $q1 ) ); + + $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 'test' ); + $acc = new HashUsageAccumulator(); + $formatter = new UsageTrackingSnakFormatter( $mockFormatter, $acc, array( 'ru', 'en' ) ); + + $formatter->formatSnak( $itemSnak ); + + $usages = $acc->getUsages(); + $this->assertArrayHasKey( 'Q1#L.ru', $usages ); + $this->assertArrayHasKey( 'Q1#L.en', $usages ); + $this->assertArrayHasKey( 'Q1#T', $usages ); + } + + public function testFormatSnak_novalue() { + $p1 = new PropertyId( 'P1' ); + $novalueSnak = new PropertyNoValueSnak( $p1 ); + + $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 'test' ); + $acc = new HashUsageAccumulator(); + $formatter = new UsageTrackingSnakFormatter( $mockFormatter, $acc, array( 'ru', 'en' ) ); + + $formatter->formatSnak( $novalueSnak ); + $this->assertEmpty( $acc->getUsages(), 'novalue' ); + } + + public function testFormatSnak_string() { + $p1 = new PropertyId( 'P1' ); + $stringSnak = new PropertyValueSnak( $p1, new StringValue( 'xxx' ) ); + + $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 'test' ); + $acc = new HashUsageAccumulator(); + $formatter = new UsageTrackingSnakFormatter( $mockFormatter, $acc, array( 'ru', 'en' ) ); + + $formatter->formatSnak( $stringSnak ); + $this->assertEmpty( $acc->getUsages(), 'string value' ); + } + + public function testCanFormatSnak() { + $p1 = new PropertyId( 'P1' ); + $q1 = new ItemId( 'Q1' ); + $itemSnak = new PropertyValueSnak( $p1, new EntityIdValue( $q1 ) ); + + $mockFormatter = $this->getMockSnakFormatter( 'canFormatSnak', true ); + + $acc = new HashUsageAccumulator(); + + $formatter = new UsageTrackingSnakFormatter( $mockFormatter, $acc, array( 'ru', 'en' ) ); + + $this->assertTrue( $formatter->canFormatSnak( $itemSnak ), 'canFormatSnak' ); + $this->assertCount( 0, $acc->getUsages() ); + } + + public function testGetFormat() { + $mockFormatter = $this->getMockSnakFormatter( 'getFormat', 'TEST' ); + + $acc = new HashUsageAccumulator(); + + $formatter = new UsageTrackingSnakFormatter( $mockFormatter, $acc, array( 'ru', 'en' ) ); + + $this->assertEquals( 'TEST', $formatter->getFormat(), 'getFormat' ); + $this->assertCount( 0, $acc->getUsages() ); + } + +} diff --git a/client/tests/phpunit/includes/store/UsageTrackingTermLookupTest.php b/client/tests/phpunit/includes/Usage/UsageTrackingTermLookupTest.php similarity index 92% rename from client/tests/phpunit/includes/store/UsageTrackingTermLookupTest.php rename to client/tests/phpunit/includes/Usage/UsageTrackingTermLookupTest.php index 51bc3ce..13a182e 100644 --- a/client/tests/phpunit/includes/store/UsageTrackingTermLookupTest.php +++ b/client/tests/phpunit/includes/Usage/UsageTrackingTermLookupTest.php @@ -1,14 +1,14 @@ <?php -namespace Wikibase\Test; +namespace Wikibase\Client\Tests\Usage; -use Wikibase\Client\Store\UsageTrackingTermLookup; +use Wikibase\Client\Usage\UsageTrackingTermLookup; use Wikibase\Client\Usage\HashUsageAccumulator; use Wikibase\DataModel\Entity\ItemId; use Wikibase\Lib\Store\TermLookup; /** - * @covers Wikibase\Lib\Store\UsageTrackingTermLookup + * @covers Wikibase\Client\Usage\UsageTrackingTermLookup * * @group Wikibase * @group WikibaseLib -- To view, visit https://gerrit.wikimedia.org/r/209753 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I0fe2b184e8c8f096af37bcff6a7f6ecd9355d663 Gerrit-PatchSet: 11 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Hoo man <h...@online.de> Gerrit-Reviewer: Jackmcbarn <jackmcb...@gmail.com> Gerrit-Reviewer: JanZerebecki <jan.wikime...@zerebecki.de> Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits