l10n_util_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/case_conversion.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util_collator.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unicode/locid.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/test/data/resource.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringWrapper { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit StringWrapper(const string16& string) : string_(string) {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& string() const { return string_; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 string_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StringWrapper); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class L10nUtilTest : public PlatformTest { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): disabled until app strings move to app. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, DISABLED_GetString) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string s = l10n_util::GetStringUTF8(IDS_SIMPLE); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Hello World!"), s); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = l10n_util::GetStringFUTF8(IDS_PLACEHOLDERS, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("chrome"), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("10")); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Hello, chrome. Your number is 10."), s); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 s16 = l10n_util::GetStringFUTF16Int(IDS_PLACEHOLDERS_2, 20); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(UTF8ToUTF16("You owe me $20."), s16); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Mac, we are disabling this test because GetApplicationLocale() as an 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API isn't something that we'll easily be able to unit test in this manner. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The meaning of that API, on the Mac, is "the locale used by Cocoa's main 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nib file", which clearly can't be stubbed by a test app that doesn't use 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cocoa. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Android, we are disabling this test since GetApplicationLocale() just 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns the system's locale, which, similarly, is not easily unit tested. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetDefaultLocaleForTest(const std::string& tag, base::Environment* env) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_CHROMEOS) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", tag); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(tag); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetAppLocale) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a temporary locale dir so we don't have to actually build the locale 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pak files for this test. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ScopedPathOverride locale_dir_override(ui::DIR_LOCALES); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath new_locale_dir; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(ui::DIR_LOCALES, &new_locale_dir)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make fake locale files. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string filenames[] = { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-US", 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-GB", 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fr", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "es-419", 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "es", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zh-TW", 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zh-CN", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "he", 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fil", 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nb", 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "am", 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ca", 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ca@valencia", 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(filenames); ++i) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath filename = new_locale_dir.AppendASCII( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filenames[i] + ".pak"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::WriteFile(filename, "", 0); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a copy of ICU's default locale before we overwrite it. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu::Locale locale = icu::Locale::getDefault(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_CHROMEOS) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env.reset(base::Environment::Create()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test the support of LANGUAGE environment variable. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "xx:fr_CA"); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("")); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "xx:yy:en_gb.utf-8@quot"); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "xx:zh-hk"); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale("")); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We emulate gettext's behavior here, which ignores LANG/LC_MESSAGES/LC_ALL 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when LANGUAGE is specified. If no language specified in LANGUAGE is valid, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then just fallback to the default language, which is en-US for us. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("fr-FR"); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "xx:yy"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "/fr:zh_CN"); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale("")); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test prioritization of the different environment variables. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANGUAGE", "fr"); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LC_ALL", "es"); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LC_MESSAGES", "he"); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LANG", "nb"); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("")); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("LANGUAGE"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("")); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("LC_ALL"); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("he", l10n_util::GetApplicationLocale("")); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("LC_MESSAGES"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("nb", l10n_util::GetApplicationLocale("")); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("LANG"); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("ca", env.get()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ca", l10n_util::GetApplicationLocale("")); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("ca-ES", env.get()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ca", l10n_util::GetApplicationLocale("")); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("ca@valencia", env.get()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale("")); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("ca_ES@valencia", env.get()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale("")); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("ca_ES.UTF8@valencia", env.get()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale("")); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_CHROMEOS) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("xx", env.get()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ChromeOS honors preferred locale first in GetApplicationLocale(), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // defaulting to en-US, while other targets first honor other signals. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-GB"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-GB")); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-AU")); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-NZ")); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-CA")); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-ZA")); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // !defined(OS_CHROMEOS) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-GB", env.get()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("fr-CA", env.get()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("")); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("es-MX", env.get()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("")); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("es-AR", env.get()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("")); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("es-ES", env.get()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("")); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("es", env.get()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("")); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("zh-HK", env.get()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale("")); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("zh-MO", env.get()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale("")); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("zh-SG", env.get()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale("")); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-CA", env.get()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-AU", env.get()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-NZ", env.get()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-ZA", env.get()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("")); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't allow user prefs for locale on linux/mac. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr")); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr-CA")); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aliases iw, no, tl to he, nb, fil. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("he", l10n_util::GetApplicationLocale("iw")); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("nb", l10n_util::GetApplicationLocale("no")); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fil", l10n_util::GetApplicationLocale("tl")); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // es-419 and es-XX (where XX is not Spain) should be 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mapped to es-419 (Latin American Spanish). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-419")); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("es-ES")); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-AR")); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("es-AR"); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("es")); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("zh-HK"); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale("zh-CN")); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en")); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Amharic should be blocked unless OS is Vista or newer. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::GetVersion() < base::win::VERSION_VISTA) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("am"); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-GB"); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("am")); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("am"); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("am", l10n_util::GetApplicationLocale("")); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-GB"); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("am", l10n_util::GetApplicationLocale("am")); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UErrorCode error_code = U_ZERO_ERROR; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu::Locale::setDefault(locale, error_code); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_MACOSX) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, SortStringsUsingFunction) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<StringWrapper*> strings; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("C"))); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("d"))); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("b"))); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("a"))); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::SortStringsUsingMethod("en-US", 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &strings, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &StringWrapper::string); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("a") == strings[0]->string()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("b") == strings[1]->string()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("C") == strings[2]->string()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("d") == strings[3]->string()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&strings); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Helper method for validating strings that require direcitonal markup. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks that parentheses are enclosed in appropriate direcitonal markers. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckUiDisplayNameForLocale(const std::string& locale, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_locale, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_rtl) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(true, base::i18n::IsRTL()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result = l10n_util::GetDisplayNameForLocale(locale, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_locale, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* is_for_ui */ true); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rtl_direction = true; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < result.length() - 1; i++) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char16 ch = result.at(i); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ch) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kLeftToRightMark: 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kLeftToRightEmbeddingMark: 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rtl_direction = false; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kRightToLeftMark: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kRightToLeftEmbeddingMark: 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rtl_direction = true; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '(': 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ')': 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(is_rtl, rtl_direction); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForLocale) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): Make this test more extensive. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test zh-CN and zh-TW are treated as zh-Hans and zh-Hant. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result = l10n_util::GetDisplayNameForLocale("zh-CN", "en", false); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Chinese (Simplified Han)"), result); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("zh-TW", "en", false); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Chinese (Traditional Han)"), result); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("pt-BR", "en", false); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Portuguese (Brazil)"), result); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("es-419", "en", false); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Spanish (Latin America)"), result); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("-BR", "en", false); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Brazil"), result); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("xyz-xyz", "en", false); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("xyz (XYZ)"), result); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(TOOLKIT_GTK) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for directional markers when using RTL languages to ensure that 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // direction neutral characters such as parentheses are properly formatted. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a copy of ICU's default locale before we overwrite it. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu::Locale locale = icu::Locale::getDefault(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckUiDisplayNameForLocale("en-US", "en", false); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckUiDisplayNameForLocale("en-US", "he", true); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UErrorCode error_code = U_ZERO_ERROR; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu::Locale::setDefault(locale, error_code); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ToUpper and ToLower should work with embedded NULLs. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t length_with_null = 4; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char16 buf_with_null[length_with_null] = { 0, 'a', 0, 'b' }; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 string16_with_null(buf_with_null, length_with_null); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 upper_with_null = base::i18n::ToUpper(string16_with_null); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(length_with_null, upper_with_null.size()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(upper_with_null[0] == 0 && upper_with_null[1] == 'A' && 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_with_null[2] == 0 && upper_with_null[3] == 'B'); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 lower_with_null = base::i18n::ToLower(upper_with_null); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(length_with_null, upper_with_null.size()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lower_with_null[0] == 0 && lower_with_null[1] == 'a' && 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_with_null[2] == 0 && lower_with_null[3] == 'b'); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForCountry) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result = l10n_util::GetDisplayNameForCountry("BR", "en"); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Brazil"), result); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForCountry("419", "en"); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Latin America"), result); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForCountry("xyz", "en"); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("XYZ"), result); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetParentLocales) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> locales; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string top_locale("sr_Cyrl_RS"); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetParentLocales(top_locale, &locales); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, locales.size()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr_Cyrl_RS", locales[0]); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr_Cyrl", locales[1]); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr", locales[2]); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, IsValidLocaleSyntax) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test valid locales. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en")); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr")); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("de")); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt")); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh")); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fil")); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("haw")); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en-US")); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_US")); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_GB")); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt-BR")); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_CN")); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans")); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans_CN")); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant")); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant_TW")); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr_CA")); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("i-klingon")); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("es-419")); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_PREEURO")); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_u_cu_IEP")); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE@currency=IEP")); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr@x=y")); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zn_CN@foo=bar")); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fr@collation=phonebook;calendar=islamic-civil")); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sr_Latn_RS_REVISED@currency=USD")); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid locales. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("")); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("x")); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("12")); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("456")); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("a1")); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("enUS")); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("zhcn")); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en.US")); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en#US")); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("-en-US")); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US-")); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("123-en-US")); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("Latin")); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("German")); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("pt--BR")); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("sl-macedonia")); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("@")); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@")); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x")); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x=")); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@=y")); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465