15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/at_exit.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/basictypes.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/compiler_specific.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/macros.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/singleton.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/values.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/customization_document.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/l10n_util_test_util.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/ime/component_extension_ime_manager.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/system/statistics_provider.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace chromeos {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MachineStatisticsInitializer {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MachineStatisticsInitializer();
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static MachineStatisticsInitializer* GetInstance();
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MachineStatisticsInitializer);
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MachineStatisticsInitializer::MachineStatisticsInitializer() {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::MessageLoop loop;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::system::StatisticsProvider::GetInstance()->
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      StartLoadingMachineStatistics(loop.message_loop_proxy(), false);
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  loop.RunUntilIdle();
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MachineStatisticsInitializer* MachineStatisticsInitializer::GetInstance() {
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Singleton<MachineStatisticsInitializer>::get();
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VerifyOnlyUILanguages(const base::ListValue& list) {
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (size_t i = 0; i < list.GetSize(); ++i) {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::DictionaryValue* dict;
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(list.GetDictionary(i, &dict));
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::string code;
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(dict->GetString("code", &code));
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_NE("is", code)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        << "Icelandic is an example language which has input method "
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        << "but can't use it as UI language.";
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VerifyLanguageCode(const base::ListValue& list,
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        size_t index,
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const std::string& expected_code) {
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const base::DictionaryValue* dict;
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(list.GetDictionary(index, &dict));
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string actual_code;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(dict->GetString("code", &actual_code));
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(expected_code, actual_code)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      << "Wrong language code at index " << index << ".";
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class L10nUtilTest : public testing::Test {
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  L10nUtilTest();
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~L10nUtilTest();
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // testing::Test:
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetInputMethods1();
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetInputMethods2();
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::ShadowingAtExitManager at_exit_manager_;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockInputMethodManagerWithInputMethods* input_manager_;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)L10nUtilTest::L10nUtilTest()
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : input_manager_(new MockInputMethodManagerWithInputMethods) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)L10nUtilTest::~L10nUtilTest() {
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void L10nUtilTest::SetUp() {
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::input_method::InitializeForTesting(input_manager_);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->SetComponentExtensionIMEManager(
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      make_scoped_ptr(new ComponentExtensionIMEManager));
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MachineStatisticsInitializer::GetInstance();  // Ignore result.
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void L10nUtilTest::TearDown() {
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::input_method::Shutdown();
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void L10nUtilTest::SetInputMethods1() {
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:us::eng", "us", "en-US");
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:fr::fra", "fr", "fr");
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:be::fra", "be", "fr");
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:is::ice", "is", "is");
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void L10nUtilTest::SetInputMethods2() {
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:us::eng", "us", "en-US");
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:ch:fr:fra", "ch(fr)", "fr");
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:ch::ger", "ch", "de");
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:it::ita", "it", "it");
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  input_manager_->AddInputMethod("xkb:is::ice", "is", "is");
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(L10nUtilTest, GetUILanguageList) {
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetInputMethods1();
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This requires initialized StatisticsProvider (see L10nUtilTest()).
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::ListValue> list(GetUILanguageList(NULL, std::string()));
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyOnlyUILanguages(*list);
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(L10nUtilTest, FindMostRelevantLocale) {
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::ListValue available_locales;
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict->SetString("value", "de");
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  available_locales.Append(dict.release());
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict.reset(new base::DictionaryValue);
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict->SetString("value", "fr");
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  available_locales.Append(dict.release());
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict.reset(new base::DictionaryValue);
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict->SetString("value", "en-GB");
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  available_locales.Append(dict.release());
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<std::string> most_relevant_language_codes;
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("en-US", FindMostRelevantLocale(most_relevant_language_codes,
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            available_locales,
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            "en-US"));
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  most_relevant_language_codes.push_back("xx");
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("en-US", FindMostRelevantLocale(most_relevant_language_codes,
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            available_locales,
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            "en-US"));
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  most_relevant_language_codes.push_back("fr");
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("fr", FindMostRelevantLocale(most_relevant_language_codes,
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         available_locales,
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         "en-US"));
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  most_relevant_language_codes.push_back("de");
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("fr", FindMostRelevantLocale(most_relevant_language_codes,
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         available_locales,
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         "en-US"));
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void InitStartupCustomizationDocumentForTesting(const std::string& manifest) {
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  StartupCustomizationDocument::GetInstance()->LoadManifestFromString(manifest);
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  StartupCustomizationDocument::GetInstance()->Init(
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      chromeos::system::StatisticsProvider::GetInstance());
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kStartupManifest[] =
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "{\n"
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"version\": \"1.0\",\n"
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"initial_locale\" : \"fr,en-US,de,is,it\",\n"
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"initial_timezone\" : \"Europe/Zurich\",\n"
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"keyboard_layout\" : \"xkb:ch:fr:fra\",\n"
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"registration_url\" : \"http://www.google.com\",\n"
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  \"setup_content\" : {\n"
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "    \"default\" : {\n"
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "      \"help_page\" : \"file:///opt/oem/help/en-US/help.html\",\n"
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "      \"eula_page\" : \"file:///opt/oem/eula/en-US/eula.html\",\n"
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "    },\n"
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "  },"
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    "}";
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(L10nUtilTest, GetUILanguageListMulti) {
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InitStartupCustomizationDocumentForTesting(kStartupManifest);
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetInputMethods2();
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This requires initialized StatisticsProvider (see L10nUtilTest()).
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::ListValue> list(GetUILanguageList(NULL, std::string()));
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyOnlyUILanguages(*list);
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // (4 languages (except Icelandic) + divider) = 5 + all other languages
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_LE(5u, list->GetSize());
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 0, "fr");
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 1, "en-US");
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 2, "de");
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 3, "it");
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 4, kMostRelevantLanguagesDivider);
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(L10nUtilTest, GetUILanguageListWithMostRelevant) {
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<std::string> most_relevant_language_codes;
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  most_relevant_language_codes.push_back("it");
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  most_relevant_language_codes.push_back("de");
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  most_relevant_language_codes.push_back("nonexistent");
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This requires initialized StatisticsProvider (see L10nUtilTest()).
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<base::ListValue>
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      list(GetUILanguageList(&most_relevant_language_codes, std::string()));
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyOnlyUILanguages(*list);
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_LE(3u, list->GetSize());
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 0, "it");
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 1, "de");
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  VerifyLanguageCode(*list, 2, kMostRelevantLanguagesDivider);
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace chromeos
225