/**
  * @dataProvider provideExtractPreferredValueOrAny
  */
 public function testExtractPreferredValueOrAny($languageCode, $mode, $data, $expected)
 {
     $factory = new LanguageFallbackChainFactory();
     $chain = $factory->newFromLanguage(Language::factory($languageCode), $mode);
     $resolved = $chain->extractPreferredValueOrAny($data);
     $this->assertEquals($expected, $resolved);
 }
 /**
  * Get the chain stored for display.
  *
  * @return LanguageFallbackChain
  */
 public function getLanguageFallbackChain()
 {
     if ($this->chain === null) {
         $this->setLanguageFallbackChain($this->factory->newFromContext($this->getContext()));
     }
     return $this->chain;
 }
 /**
  * Set service objects to use. Unit tests may call this to substitute mock
  * services.
  */
 public function initServices(DataTypeFactory $dataTypeFactory, PropertyInfoStore $propertyInfoStore, EntityIdFormatterFactory $entityIdFormatterFactory, LanguageFallbackChainFactory $languageFallbackChainFactory, EntityTitleLookup $titleLookup, BufferingTermLookup $bufferingTermLookup)
 {
     $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL;
     $this->labelDescriptionLookup = new LanguageFallbackLabelDescriptionLookup($bufferingTermLookup, $languageFallbackChainFactory->newFromLanguage($this->getLanguage(), $fallbackMode));
     $this->dataTypeFactory = $dataTypeFactory;
     $this->propertyInfoStore = $propertyInfoStore;
     $this->entityIdFormatter = $entityIdFormatterFactory->getEntityIdFormatter($this->labelDescriptionLookup);
     $this->titleLookup = $titleLookup;
     $this->bufferingTermLookup = $bufferingTermLookup;
 }
 private function getEntityAccessor(EntityLookup $entityLookup = null, UsageAccumulator $usageAccumulator = null, $langCode = 'en')
 {
     $language = new Language($langCode);
     $propertyDataTypeLookup = $this->getMock('Wikibase\\DataModel\\Services\\Lookup\\PropertyDataTypeLookup');
     $propertyDataTypeLookup->expects($this->any())->method('getDataTypeIdForProperty')->will($this->returnValue('structured-cat'));
     $fallbackChainFactory = new LanguageFallbackChainFactory();
     $fallbackChain = $fallbackChainFactory->newFromLanguage($language, LanguageFallbackChainFactory::FALLBACK_SELF | LanguageFallbackChainFactory::FALLBACK_VARIANTS);
     $termsLanguages = $this->getMock('Wikibase\\Lib\\ContentLanguages');
     $termsLanguages->expects($this->any())->method('getLanguages')->will($this->returnValue(array('de', $langCode, 'es', 'ja')));
     return new EntityAccessor(new BasicEntityIdParser(), $entityLookup ?: new MockRepository(), $usageAccumulator ? $usageAccumulator : new HashUsageAccumulator(), $propertyDataTypeLookup, $fallbackChain, $language, $termsLanguages);
 }
 /**
  * Returns a LabelDescriptionLookup where terms are prefetched for the given
  * entity ids with a language fallback chain applied for the given language.
  *
  * @param Language $language
  * @param EntityId[] $entityIds Array of entity ids that should be prefetched. Only relevant
  *  when a TermBuffer was set in the constructor. Default is no prefetching.
  * @param string[] $termTypes Array with one or more of the types 'label', 'alias' and
  *  'description'. Default is only 'label'.
  *
  * @return LabelDescriptionLookup
  */
 public function newLabelDescriptionLookup(Language $language, array $entityIds = array(), array $termTypes = array('label'))
 {
     $languageFallbackChain = $this->languageFallbackChainFactory->newFromLanguage($language, $this->fallbackMode);
     $languages = $languageFallbackChain->getFetchLanguageCodes();
     $labelDescriptionLookup = new LanguageFallbackLabelDescriptionLookup($this->termLookup, $languageFallbackChain);
     // Optionally prefetch the terms of the entities passed in here
     // $termLookup and $termBuffer should be the same BufferingTermLookup then
     if ($this->termBuffer !== null) {
         $this->termBuffer->prefetchTerms($entityIds, $termTypes, $languages);
     }
     return $labelDescriptionLookup;
 }
 /**
  * @param Language $language
  * @param UsageAccumulator $usageAccumulator
  *
  * @return SnakFormatter
  */
 private function newSnakFormatterForLanguage(Language $language, UsageAccumulator $usageAccumulator)
 {
     $languageFallbackChain = $this->languageFallbackChainFactory->newFromLanguage($language, LanguageFallbackChainFactory::FALLBACK_SELF | LanguageFallbackChainFactory::FALLBACK_VARIANTS);
     $options = new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallbackChain, ValueFormatter::OPT_LANG => $language->getCode()));
     $snakFormatter = new UsageTrackingSnakFormatter($this->snakFormatterFactory->getSnakFormatter(SnakFormatter::FORMAT_WIKI, $options), $usageAccumulator, $languageFallbackChain->getFetchLanguageCodes());
     return $snakFormatter;
 }
 /**
  * @param string[] $languageCodes
  *
  * @return string[]
  */
 private function addFallbackLanguageCodes(array $languageCodes)
 {
     $languageCodesWithFallback = array();
     foreach ($languageCodes as $languageCode) {
         $fallbackChain = $this->languageFallbackChainFactory->newFromLanguageCode($languageCode);
         $languageCodesWithFallback = array_merge($languageCodesWithFallback, $fallbackChain->getFetchLanguageCodes());
     }
     return array_unique($languageCodesWithFallback);
 }
 /**
  * @param array $params
  *
  * @return array
  *     0 => string[] languageCodes that the user wants returned
  *     1 => LanguageFallbackChain[] Keys are requested lang codes
  */
 private function getLanguageCodesAndFallback(array $params)
 {
     $languageCodes = is_array($params['languages']) ? $params['languages'] : array();
     $fallbackChains = array();
     if ($params['languagefallback']) {
         $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL;
         foreach ($languageCodes as $languageCode) {
             $fallbackChains[$languageCode] = $this->languageFallbackChainFactory->newFromLanguageCode($languageCode, $fallbackMode);
         }
     }
     return array(array_unique($languageCodes), $fallbackChains);
 }
 /**
  * Initializes the options keys ValueFormatter::OPT_LANG and
  * FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN if they are not yet set.
  *
  * @param FormatterOptions $options The options to modify.
  *
  * @throws InvalidArgumentException
  * @todo  : Sort out how the desired language is specified. We have two language options,
  *        each accepting different ways of specifying the language. That's not good.
  * @todo: this shouldn't be public at all. Perhaps factor it out into a helper class.
  */
 public function applyLanguageDefaults(FormatterOptions $options)
 {
     $options->defaultOption(ValueFormatter::OPT_LANG, $this->defaultLanguage->getCode());
     $lang = $options->getOption(ValueFormatter::OPT_LANG);
     if (!is_string($lang)) {
         throw new InvalidArgumentException('The value of OPT_LANG must be a language code. For a fallback chain, use OPT_LANGUAGE_FALLBACK_CHAIN.');
     }
     $fallbackOption = FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN;
     if (!$options->hasOption($fallbackOption)) {
         $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL;
         $options->setOption($fallbackOption, $this->languageFallbackChainFactory->newFromLanguageCode($lang, $fallbackMode));
     }
     if (!$options->getOption($fallbackOption) instanceof LanguageFallbackChain) {
         throw new InvalidArgumentException('The value of OPT_LANGUAGE_FALLBACK_CHAIN must be ' . 'an instance of LanguageFallbackChain.');
     }
 }
 /**
  * @dataProvider newFromContextForPageViewProvider
  */
 public function testNewFromContextForPageView($anonymousPageViewCached, $msg)
 {
     $context = new RequestContext();
     $context->setLanguage(Language::factory('es'));
     $user = User::newFromId(0);
     $context->setUser($user);
     $factory = new LanguageFallbackChainFactory($anonymousPageViewCached);
     $fallbackChain = $factory->newFromContextForPageView($context);
     $this->assertInstanceOf('Wikibase\\LanguageFallbackChain', $fallbackChain, $msg);
 }
 /**
  * @dataProvider provideTestAddEntityRevisionFallback
  */
 public function testAddEntityRevisionFallback($addMetaData, array $expected)
 {
     $item = new Item(new ItemId('Q123101'));
     $item->getFingerprint()->setLabel('de', 'Oslo-de');
     $item->getFingerprint()->setLabel('en', 'Oslo-en');
     $item->getFingerprint()->setDescription('es', 'desc-es');
     $item->getFingerprint()->setDescription('zh-sg', 'desc-zh-sg');
     $entityRevision = new EntityRevision($item);
     $fallbackChainFactory = new LanguageFallbackChainFactory();
     $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL;
     $fallbackChains = array('de-formal' => $fallbackChainFactory->newFromLanguageCode('de-formal', $fallbackMode), 'es' => $fallbackChainFactory->newFromLanguageCode('es', $fallbackMode), 'qug' => $fallbackChainFactory->newFromLanguageCode('qug', $fallbackMode), 'zh-my' => $fallbackChainFactory->newFromLanguageCode('zh-my', $fallbackMode));
     $filterLangCodes = array_keys($fallbackChains);
     $result = $this->getDefaultResult();
     $resultBuilder = $this->getResultBuilder($result, $addMetaData);
     $resultBuilder->addEntityRevision(null, $entityRevision, array('labels', 'descriptions'), array(), $filterLangCodes, $fallbackChains);
     $data = $result->getResultData();
     $this->assertEquals($expected, $data);
 }
 /**
  * @param Language $language
  *
  * @return LanguageFallbackChain
  */
 private function getLanguageFallbackChain(Language $language)
 {
     // Language fallback must depend ONLY on the target language,
     // so we don't confuse the parser cache with user specific HTML.
     return $this->languageFallbackChainFactory->newFromLanguage($language);
 }
 public function provideApplyLanguageDefaults()
 {
     $languageFallbackFactory = new LanguageFallbackChainFactory();
     $languageFallback = $languageFallbackFactory->newFromLanguage(Language::factory('fr'));
     return array('empty' => array(new FormatterOptions(array()), 'en', 'en'), 'language code set' => array(new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de')), 'de', 'de'), 'language fallback set' => array(new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallback)), 'en', 'fr'), 'language code and fallback set' => array(new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de', FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallback)), 'de', 'fr'));
 }
 public function provideNewFormatter_LabelDescriptionLookupOption()
 {
     $labelDescriptionLookup = $this->getMock('Wikibase\\DataModel\\Services\\Lookup\\LabelDescriptionLookup');
     $labelDescriptionLookup->expects($this->any())->method('getLabel')->will($this->returnValue(new Term('xy', 'Custom LabelDescriptionLookup')));
     $fallbackFactory = new LanguageFallbackChainFactory();
     $fallbackChain = $fallbackFactory->newFromLanguage(Language::factory('de-ch'));
     return array('language option' => array('newEntityIdFormatter', new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de')), new EntityIdValue(new ItemId('Q5')), '@>Name für Q5<@'), 'fallback option' => array('newEntityIdFormatter', new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $fallbackChain)), new EntityIdValue(new ItemId('Q5')), '@>Name für Q5<@'), 'LabelDescriptionLookup option' => array('newEntityIdFormatter', new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LABEL_DESCRIPTION_LOOKUP => $labelDescriptionLookup)), new EntityIdValue(new ItemId('Q5')), '@>Custom LabelDescriptionLookup<@'));
 }