| // 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 <stddef.h> |
| #include <string.h> |
| |
| #include "base/macros.h" |
| #include "base/stl_util.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 |
| "an", // Aragonese |
| "ar", // Arabic |
| "ast", // Asturian |
| "az", // Azerbaijani |
| "be", // Belarusian |
| "bg", // Bulgarian |
| "bh", // Bihari |
| "bn", // Bengali |
| "br", // Breton |
| "bs", // Bosnian |
| "ca", // Catalan |
| "ceb", // Cebuano |
| "ckb", // Sorani (Kurdish-Arabic) |
| "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 |
| "hmn", // Hmong |
| "hr", // Croatian |
| "ht", // Haitian Creole |
| "hu", // Hungarian |
| "hy", // Armenian |
| "ia", // Interlingua |
| "id", // Indonesian |
| "ig", // Igbo |
| "is", // Icelandic |
| "ja", // Japanese |
| "jv", // Javanese |
| "ka", // Georgian |
| "kk", // Kazakh |
| "km", // Cambodian |
| "kn", // Kannada |
| "ko", // Korean |
| "ku", // Kurdish |
| "ky", // Kyrgyz |
| "la", // Latin |
| "lb", // Luxembourgish |
| "ln", // Lingala |
| "lo", // Laothian |
| "lt", // Lithuanian |
| "lv", // Latvian |
| "mg", // Malagasy |
| "mi", // Maori |
| "mk", // Macedonian |
| "ml", // Malayalam |
| "mn", // Mongolian |
| "mo", // Moldavian |
| "mr", // Marathi |
| "ms", // Malay |
| "mt", // Maltese |
| "my", // Burmese |
| "nb", // Norwegian (Bokmal) |
| "ne", // Nepali |
| "nl", // Dutch |
| "nn", // Norwegian (Nynorsk) |
| "no", // Norwegian |
| "ny", // Nyanja |
| "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 |
| "sm", // Samoan |
| "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 |
| "wa", // Walloon |
| "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")); |
| EXPECT_FALSE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("en", "en-US")); |
| EXPECT_FALSE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("en-GB", "en-US")); |
| |
| // 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")); |
| |
| EXPECT_TRUE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh", "zh-CN")); |
| EXPECT_TRUE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("zh-CN", "zh-TW")); |
| EXPECT_TRUE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("es", "es-419")); |
| EXPECT_TRUE( |
| LocaleChangeGuard::ShouldShowLocaleChangeNotification("es", "es-ES")); |
| } |
| |
| 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 bool notification_allowed = |
| base::ContainsValue(kShowNotificationLanguages, language); |
| |
| 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 |