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