l10n_util_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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"
185e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/locid.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util_collator.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.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)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_POSIX) && defined(USE_GLIB) && !defined(OS_CHROMEOS)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 1;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 1;
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 0;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_WIN)
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 1;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 0;
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 1;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 0;
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 0;
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 1;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SetDefaultLocaleForTest(const std::string& tag, base::Environment* env) {
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (kUseLocaleFromEnvironment)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", tag);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale(tag);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetAppLocale) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Environment> env;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a temporary locale dir so we don't have to actually build the locale
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pak files for this test.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ScopedPathOverride locale_dir_override(ui::DIR_LOCALES);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_locale_dir;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(ui::DIR_LOCALES, &new_locale_dir));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make fake locale files.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string filenames[] = {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "en-US",
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "en-GB",
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "fr",
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "es-419",
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "es",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "zh-TW",
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "zh-CN",
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "he",
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "fil",
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "nb",
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "am",
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ca",
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ca@valencia",
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(filenames); ++i) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath filename = new_locale_dir.AppendASCII(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filenames[i] + ".pak");
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::WriteFile(filename, "", 0);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep a copy of ICU's default locale before we overwrite it.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string original_locale = base::i18n::GetConfiguredLocale();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (kPlatformHasDefaultLocale && kUseLocaleFromEnvironment) {
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env.reset(base::Environment::Create());
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Test the support of LANGUAGE environment variable.
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("en-US");
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "xx:fr_CA");
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string()));
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "xx:yy:en_gb.utf-8@quot");
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "xx:zh-hk");
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string()));
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We emulate gettext's behavior here, which ignores LANG/LC_MESSAGES/LC_ALL
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // when LANGUAGE is specified. If no language specified in LANGUAGE is
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // valid,
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // then just fallback to the default language, which is en-US for us.
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("fr-FR");
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "xx:yy");
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string()));
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "/fr:zh_CN");
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale(std::string()));
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Test prioritization of the different environment variables.
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANGUAGE", "fr");
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LC_ALL", "es");
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LC_MESSAGES", "he");
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->SetVar("LANG", "nb");
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string()));
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->UnSetVar("LANGUAGE");
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string()));
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->UnSetVar("LC_ALL");
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("he", l10n_util::GetApplicationLocale(std::string()));
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->UnSetVar("LC_MESSAGES");
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("nb", l10n_util::GetApplicationLocale(std::string()));
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    env->UnSetVar("LANG");
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("ca", env.get());
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("ca", l10n_util::GetApplicationLocale(std::string()));
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("ca-ES", env.get());
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("ca", l10n_util::GetApplicationLocale(std::string()));
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("ca@valencia", env.get());
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string()));
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("ca_ES@valencia", env.get());
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string()));
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("ca_ES.UTF8@valencia", env.get());
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string()));
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetDefaultLocaleForTest("en-US", env.get());
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string()));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetDefaultLocaleForTest("xx", env.get());
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string()));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!kPlatformHasDefaultLocale) {
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // ChromeOS & embedded use only browser prefs in GetApplicationLocale(),
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // ignoring the environment, and default to en-US. Other platforms honor
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // the default locale from the OS or environment.
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-GB", env.get());
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(""));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-US", env.get());
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-GB"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-US", env.get());
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-AU"));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-US", env.get());
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-NZ"));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-US", env.get());
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-CA"));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-US", env.get());
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-ZA"));
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Most platforms have an OS-provided locale. This locale is preferred.
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-GB", env.get());
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("fr-CA", env.get());
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string()));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("es-MX", env.get());
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es-419", l10n_util::GetApplicationLocale(std::string()));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("es-AR", env.get());
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es-419", l10n_util::GetApplicationLocale(std::string()));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("es-ES", env.get());
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string()));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("es", env.get());
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string()));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("zh-HK", env.get());
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string()));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("zh-MO", env.get());
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string()));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("zh-SG", env.get());
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale(std::string()));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-CA", env.get());
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-AU", env.get());
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-NZ", env.get());
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SetDefaultLocaleForTest("en-ZA", env.get());
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string()));
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (kSupportsLocalePreference) {
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // On windows, the user can override the locale in preferences.
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("en-US");
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr"));
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr-CA"));
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("en-US");
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Aliases iw, no, tl to he, nb, fil.
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("he", l10n_util::GetApplicationLocale("iw"));
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("nb", l10n_util::GetApplicationLocale("no"));
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("fil", l10n_util::GetApplicationLocale("tl"));
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // es-419 and es-XX (where XX is not Spain) should be
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // mapped to es-419 (Latin American Spanish).
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-419"));
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es", l10n_util::GetApplicationLocale("es-ES"));
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-AR"));
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("es-AR");
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("es", l10n_util::GetApplicationLocale("es"));
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("zh-HK");
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale("zh-CN"));
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::i18n::SetICUDefaultLocale("he");
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en"));
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Amharic should be blocked unless OS is Vista or newer.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::i18n::SetICUDefaultLocale("am");
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(""));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::i18n::SetICUDefaultLocale("en-GB");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("am"));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::i18n::SetICUDefaultLocale("am");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("am", l10n_util::GetApplicationLocale(""));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::i18n::SetICUDefaultLocale("en-GB");
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("am", l10n_util::GetApplicationLocale("am"));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clean up.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::SetICUDefaultLocale(original_locale);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, SortStringsUsingFunction) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<StringWrapper*> strings;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  strings.push_back(new StringWrapper(UTF8ToUTF16("C")));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  strings.push_back(new StringWrapper(UTF8ToUTF16("d")));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  strings.push_back(new StringWrapper(UTF8ToUTF16("b")));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  strings.push_back(new StringWrapper(UTF8ToUTF16("a")));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l10n_util::SortStringsUsingMethod("en-US",
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &strings,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &StringWrapper::string);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(UTF8ToUTF16("a") == strings[0]->string());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(UTF8ToUTF16("b") == strings[1]->string());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(UTF8ToUTF16("C") == strings[2]->string());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(UTF8ToUTF16("d") == strings[3]->string());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&strings);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Helper method for validating strings that require direcitonal markup.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks that parentheses are enclosed in appropriate direcitonal markers.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckUiDisplayNameForLocale(const std::string& locale,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& display_locale,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool is_rtl) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(true, base::i18n::IsRTL());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 result = l10n_util::GetDisplayNameForLocale(locale,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       display_locale,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       /* is_for_ui */ true);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rtl_direction = true;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < result.length() - 1; i++) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char16 ch = result.at(i);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ch) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::i18n::kLeftToRightMark:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::i18n::kLeftToRightEmbeddingMark:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rtl_direction = false;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::i18n::kRightToLeftMark:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::i18n::kRightToLeftEmbeddingMark:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rtl_direction = true;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case '(':
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ')':
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(is_rtl, rtl_direction);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForLocale) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jungshik): Make this test more extensive.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test zh-CN and zh-TW are treated as zh-Hans and zh-Hant.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 result = l10n_util::GetDisplayNameForLocale("zh-CN", "en", false);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Chinese (Simplified Han)"), result);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForLocale("zh-TW", "en", false);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Chinese (Traditional Han)"), result);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForLocale("pt-BR", "en", false);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Portuguese (Brazil)"), result);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForLocale("es-419", "en", false);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Spanish (Latin America)"), result);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForLocale("-BR", "en", false);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Brazil"), result);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForLocale("xyz-xyz", "en", false);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("xyz (XYZ)"), result);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(TOOLKIT_GTK)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for directional markers when using RTL languages to ensure that
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // direction neutral characters such as parentheses are properly formatted.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep a copy of ICU's default locale before we overwrite it.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string original_locale = base::i18n::GetConfiguredLocale();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::i18n::SetICUDefaultLocale("he");
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUiDisplayNameForLocale("en-US", "en", false);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUiDisplayNameForLocale("en-US", "he", true);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clean up.
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::SetICUDefaultLocale(original_locale);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ToUpper and ToLower should work with embedded NULLs.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t length_with_null = 4;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char16 buf_with_null[length_with_null] = { 0, 'a', 0, 'b' };
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 string16_with_null(buf_with_null, length_with_null);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 upper_with_null = base::i18n::ToUpper(string16_with_null);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(length_with_null, upper_with_null.size());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(upper_with_null[0] == 0 && upper_with_null[1] == 'A' &&
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              upper_with_null[2] == 0 && upper_with_null[3] == 'B');
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 lower_with_null = base::i18n::ToLower(upper_with_null);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(length_with_null, upper_with_null.size());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(lower_with_null[0] == 0 && lower_with_null[1] == 'a' &&
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              lower_with_null[2] == 0 && lower_with_null[3] == 'b');
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForCountry) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 result = l10n_util::GetDisplayNameForCountry("BR", "en");
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Brazil"), result);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForCountry("419", "en");
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Latin America"), result);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = l10n_util::GetDisplayNameForCountry("xyz", "en");
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("XYZ"), result);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetParentLocales) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> locales;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string top_locale("sr_Cyrl_RS");
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l10n_util::GetParentLocales(top_locale, &locales);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, locales.size());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sr_Cyrl_RS", locales[0]);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sr_Cyrl", locales[1]);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sr", locales[2]);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, IsValidLocaleSyntax) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test valid locales.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en"));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr"));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("de"));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt"));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh"));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fil"));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("haw"));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en-US"));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_US"));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_GB"));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt-BR"));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_CN"));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans"));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans_CN"));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant"));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant_TW"));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr_CA"));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("i-klingon"));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("es-419"));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_PREEURO"));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_u_cu_IEP"));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE@currency=IEP"));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr@x=y"));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zn_CN@foo=bar"));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax(
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "fr@collation=phonebook;calendar=islamic-civil"));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(l10n_util::IsValidLocaleSyntax(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "sr_Latn_RS_REVISED@currency=USD"));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test invalid locales.
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax(std::string()));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("x"));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("12"));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("456"));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("a1"));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("enUS"));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("zhcn"));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en.US"));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en#US"));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("-en-US"));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US-"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("123-en-US"));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("Latin"));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("German"));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("pt--BR"));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("sl-macedonia"));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("@"));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@"));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x"));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x="));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@=y"));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
480