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

Reply via email to