Index: chrome/browser/chromeos/locale_change_guard_unittest.cc |
diff --git a/chrome/browser/chromeos/locale_change_guard_unittest.cc b/chrome/browser/chromeos/locale_change_guard_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..503a9786d59b60f3944c31dc91e982ed8597947a |
--- /dev/null |
+++ b/chrome/browser/chromeos/locale_change_guard_unittest.cc |
@@ -0,0 +1,212 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/chromeos/locale_change_guard.h" |
+ |
+#include <string.h> |
+ |
+#include "base/macros.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace { |
+ |
+// These languages require user notification when locale is automatically |
+// switched between different regions within the same language. |
+const char* const kShowNotificationLanguages[] = { |
+ "af", // Afrikaans |
+ "am", // Amharic |
+ "ar", // Arabic |
+ "az", // Azerbaijani |
+ "be", // Belarusian |
+ "bg", // Bulgarian |
+ "bh", // Bihari |
+ "bn", // Bengali |
+ "br", // Breton |
+ "bs", // Bosnian |
+ "ca", // Catalan |
+ "co", // Corsican |
+ "cs", // Czech |
+ "cy", // Welsh |
+ "da", // Danish |
+ "el", // Greek |
+ "eo", // Esperanto |
+ "es", // Spanish |
+ "et", // Estonian |
+ "eu", // Basque |
+ "fa", // Persian |
+ "fi", // Finnish |
+ "fil", // Filipino |
+ "fo", // Faroese |
+ "fy", // Frisian |
+ "ga", // Irish |
+ "gd", // Scots Gaelic |
+ "gl", // Galician |
+ "gn", // Guarani |
+ "gu", // Gujarati |
+ "ha", // Hausa |
+ "haw", // Hawaiian |
+ "he", // Hebrew |
+ "hi", // Hindi |
+ "hr", // Croatian |
+ "hu", // Hungarian |
+ "hy", // Armenian |
+ "ia", // Interlingua |
+ "id", // Indonesian |
+ "is", // Icelandic |
+ "ja", // Japanese |
+ "jw", // Javanese |
+ "ka", // Georgian |
+ "kk", // Kazakh |
+ "km", // Cambodian |
+ "kn", // Kannada |
+ "ko", // Korean |
+ "ku", // Kurdish |
+ "ky", // Kyrgyz |
+ "la", // Latin |
+ "ln", // Lingala |
+ "lo", // Laothian |
+ "lt", // Lithuanian |
+ "lv", // Latvian |
+ "mk", // Macedonian |
+ "ml", // Malayalam |
+ "mn", // Mongolian |
+ "mo", // Moldavian |
+ "mr", // Marathi |
+ "ms", // Malay |
+ "mt", // Maltese |
+ "nb", // Norwegian (Bokmal) |
+ "ne", // Nepali |
+ "nl", // Dutch |
+ "nn", // Norwegian (Nynorsk) |
+ "no", // Norwegian |
+ "oc", // Occitan |
+ "om", // Oromo |
+ "or", // Oriya |
+ "pa", // Punjabi |
+ "pl", // Polish |
+ "ps", // Pashto |
+ "pt", // Portuguese |
+ "qu", // Quechua |
+ "rm", // Romansh |
+ "ro", // Romanian |
+ "ru", // Russian |
+ "sd", // Sindhi |
+ "sh", // Serbo-Croatian |
+ "si", // Sinhalese |
+ "sk", // Slovak |
+ "sl", // Slovenian |
+ "sn", // Shona |
+ "so", // Somali |
+ "sq", // Albanian |
+ "sr", // Serbian |
+ "st", // Sesotho |
+ "su", // Sundanese |
+ "sv", // Swedish |
+ "sw", // Swahili |
+ "ta", // Tamil |
+ "te", // Telugu |
+ "tg", // Tajik |
+ "th", // Thai |
+ "ti", // Tigrinya |
+ "tk", // Turkmen |
+ "to", // Tonga |
+ "tr", // Turkish |
+ "tt", // Tatar |
+ "tw", // Twi |
+ "ug", // Uighur |
+ "uk", // Ukrainian |
+ "ur", // Urdu |
+ "uz", // Uzbek |
+ "vi", // Vietnamese |
+ "xh", // Xhosa |
+ "yi", // Yiddish |
+ "yo", // Yoruba |
+ "zh", // Chinese |
+ "zu", // Zulu |
+}; |
+ |
+} // anonymous namespace |
+ |
+namespace chromeos { |
+ |
+TEST(LocaleChangeGuardTest, ShowNotificationLocaleChanged) { |
+ // "en" is used as "global default" in many places. |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en", "it")); |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("it", "en")); |
+ |
+ // Between two latin locales. |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("fr", "it")); |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("it", "fr")); |
+ |
+ // en <-> non-latin locale |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en", "zh")); |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh", "en")); |
+ |
+ // latin <-> non-latin locale |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("fr", "zh")); |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh", "fr")); |
+ |
+ // same language |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en", "en")); |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("fr", "fr")); |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh", "zh")); |
+ |
+ // Different regions within the same language |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en", "en-au")); |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en-AU", "en")); |
+ EXPECT_FALSE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("en-AU", "en-GB")); |
jungshik at Google
2014/07/16 23:29:04
Please, add test for pairs of 'es-419' and 'es-ES'
Alexander Alekseev
2014/08/15 16:44:15
Done.
|
+ |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh", "zh-CN")); |
+ EXPECT_TRUE( |
+ LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh-CN", "zh-TW")); |
+} |
+ |
+TEST(LocaleChangeGuardTest, ShowNotificationLocaleChangedList) { |
+ for (size_t i = 0; i < l10n_util::GetAcceptLanguageListSizeForTesting(); |
+ ++i) { |
+ const char* const locale = l10n_util::GetAcceptLanguageListForTesting()[i]; |
+ const char* const dash = strchr(locale, '-'); |
+ const std::string language = |
+ (dash ? std::string(locale, dash - locale) : std::string(locale)); |
+ |
+ const char* const* allowed_begin = kShowNotificationLanguages; |
+ const char* const* allowed_end = |
+ kShowNotificationLanguages + arraysize(kShowNotificationLanguages); |
+ const bool notification_allowed = |
+ (std::find(allowed_begin, allowed_end, language) != allowed_end); |
+ |
+ const char* const* skipped_begin = |
+ LocaleChangeGuard::GetSkipShowNotificationLanguagesForTesting(); |
+ const char* const* skipped_end = |
+ skipped_begin + |
+ LocaleChangeGuard::GetSkipShowNotificationLanguagesSizeForTesting(); |
+ const bool notification_skipped = |
+ (std::find(skipped_begin, skipped_end, language) != skipped_end); |
+ |
+ EXPECT_TRUE(notification_allowed ^ notification_skipped) |
+ << "Language '" << language << "' (from locale '" << locale |
+ << "') must be in exactly one list: either " |
+ "kSkipShowNotificationLanguages (found=" << notification_skipped |
+ << ") or kShowNotificationLanguages (found=" << notification_allowed |
+ << ")."; |
+ } |
+} |
+ |
+} // namespace chromeos |