/**
  * @dataProvider provideExtractPreferredValue
  */
 public function testExtractPreferredValue($languageCode, $mode, $data, $expected)
 {
     $factory = new LanguageFallbackChainFactory();
     $chain = $factory->newFromLanguageCode($languageCode, $mode);
     $resolved = $chain->extractPreferredValue($data);
     $this->assertEquals($expected, $resolved);
 }
 private function newFormatterOptions($lang = 'en')
 {
     $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL;
     $fallbackChainFactory = new LanguageFallbackChainFactory();
     $fallbackChain = $fallbackChainFactory->newFromLanguageCode($lang, $fallbackMode);
     return new FormatterOptions(array(ValueFormatter::OPT_LANG => $lang, FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $fallbackChain));
 }
 /**
  * @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 provideNewFromLanguageCodeException
  * @expectedException MWException
  */
 public function testNewFromLanguageCodeException($langCode)
 {
     $factory = new LanguageFallbackChainFactory();
     $factory->newFromLanguageCode($langCode);
 }
 /**
  * @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);
 }