| // Copyright 2013 The Flutter 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 "flutter/shell/platform/glfw/system_utils.h" |
| |
| #include <cstdlib> |
| |
| #include "gtest/gtest.h" |
| |
| namespace flutter { |
| namespace { |
| |
| // This is a helper for setting up the different environment variables to |
| // specific strings, calling GetPreferredLanguageInfo, and then restoring those |
| // environment variables to any previously existing values. |
| std::vector<LanguageInfo> SetAndRestoreLanguageAroundGettingLanguageInfo( |
| const char* language, |
| const char* lc_all, |
| const char* lc_messages, |
| const char* lang) { |
| std::vector<const char*> env_vars{ |
| "LANGUAGE", |
| "LC_ALL", |
| "LC_MESSAGES", |
| "LANG", |
| }; |
| std::map<const char*, const char*> new_values{ |
| {env_vars[0], language}, |
| {env_vars[1], lc_all}, |
| {env_vars[2], lc_messages}, |
| {env_vars[3], lang}, |
| }; |
| std::map<const char*, const char*> prior_values; |
| for (auto var : env_vars) { |
| const char* value = getenv(var); |
| if (value != nullptr) { |
| prior_values.emplace(var, value); |
| } |
| const char* new_value = new_values.at(var); |
| if (new_value != nullptr) { |
| setenv(var, new_value, 1); |
| } else { |
| unsetenv(var); |
| } |
| } |
| |
| std::vector<LanguageInfo> languages = GetPreferredLanguageInfo(); |
| |
| for (auto [var, value] : prior_values) { |
| setenv(var, value, 1); |
| } |
| |
| return languages; |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoFull) { |
| const char* locale_string = "en_GB.ISO-8859-1@euro:en_US:sv:zh_CN.UTF-8"; |
| |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(locale_string, nullptr, |
| nullptr, nullptr); |
| |
| EXPECT_EQ(languages.size(), 15UL); |
| |
| EXPECT_STREQ(languages[0].language.c_str(), "en"); |
| EXPECT_STREQ(languages[0].territory.c_str(), "GB"); |
| EXPECT_STREQ(languages[0].codeset.c_str(), "ISO-8859-1"); |
| EXPECT_STREQ(languages[0].modifier.c_str(), "euro"); |
| |
| EXPECT_STREQ(languages[1].language.c_str(), "en"); |
| EXPECT_STREQ(languages[1].territory.c_str(), "GB"); |
| EXPECT_STREQ(languages[1].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[1].modifier.c_str(), "euro"); |
| |
| EXPECT_STREQ(languages[2].language.c_str(), "en"); |
| EXPECT_STREQ(languages[2].territory.c_str(), ""); |
| EXPECT_STREQ(languages[2].codeset.c_str(), "ISO-8859-1"); |
| EXPECT_STREQ(languages[2].modifier.c_str(), "euro"); |
| |
| EXPECT_STREQ(languages[3].language.c_str(), "en"); |
| EXPECT_STREQ(languages[3].territory.c_str(), ""); |
| EXPECT_STREQ(languages[3].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[3].modifier.c_str(), "euro"); |
| |
| EXPECT_STREQ(languages[4].language.c_str(), "en"); |
| EXPECT_STREQ(languages[4].territory.c_str(), "GB"); |
| EXPECT_STREQ(languages[4].codeset.c_str(), "ISO-8859-1"); |
| EXPECT_STREQ(languages[4].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[5].language.c_str(), "en"); |
| EXPECT_STREQ(languages[5].territory.c_str(), "GB"); |
| EXPECT_STREQ(languages[5].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[5].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[6].language.c_str(), "en"); |
| EXPECT_STREQ(languages[6].territory.c_str(), ""); |
| EXPECT_STREQ(languages[6].codeset.c_str(), "ISO-8859-1"); |
| EXPECT_STREQ(languages[6].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[7].language.c_str(), "en"); |
| EXPECT_STREQ(languages[7].territory.c_str(), ""); |
| EXPECT_STREQ(languages[7].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[7].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[8].language.c_str(), "en"); |
| EXPECT_STREQ(languages[8].territory.c_str(), "US"); |
| EXPECT_STREQ(languages[8].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[8].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[9].language.c_str(), "en"); |
| EXPECT_STREQ(languages[9].territory.c_str(), ""); |
| EXPECT_STREQ(languages[9].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[9].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[10].language.c_str(), "sv"); |
| EXPECT_STREQ(languages[10].territory.c_str(), ""); |
| EXPECT_STREQ(languages[10].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[10].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[11].language.c_str(), "zh"); |
| EXPECT_STREQ(languages[11].territory.c_str(), "CN"); |
| EXPECT_STREQ(languages[11].codeset.c_str(), "UTF-8"); |
| EXPECT_STREQ(languages[11].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[12].language.c_str(), "zh"); |
| EXPECT_STREQ(languages[12].territory.c_str(), "CN"); |
| EXPECT_STREQ(languages[12].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[12].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[13].language.c_str(), "zh"); |
| EXPECT_STREQ(languages[13].territory.c_str(), ""); |
| EXPECT_STREQ(languages[13].codeset.c_str(), "UTF-8"); |
| EXPECT_STREQ(languages[13].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[14].language.c_str(), "zh"); |
| EXPECT_STREQ(languages[14].territory.c_str(), ""); |
| EXPECT_STREQ(languages[14].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[14].modifier.c_str(), ""); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoWeird) { |
| const char* locale_string = "tt_RU@iqtelif.UTF-8"; |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(locale_string, nullptr, |
| nullptr, nullptr); |
| |
| EXPECT_EQ(languages.size(), 4UL); |
| |
| EXPECT_STREQ(languages[0].language.c_str(), "tt"); |
| EXPECT_STREQ(languages[0].territory.c_str(), "RU"); |
| EXPECT_STREQ(languages[0].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[0].modifier.c_str(), "iqtelif.UTF-8"); |
| |
| EXPECT_STREQ(languages[1].language.c_str(), "tt"); |
| EXPECT_STREQ(languages[1].territory.c_str(), ""); |
| EXPECT_STREQ(languages[1].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[1].modifier.c_str(), "iqtelif.UTF-8"); |
| |
| EXPECT_STREQ(languages[2].language.c_str(), "tt"); |
| EXPECT_STREQ(languages[2].territory.c_str(), "RU"); |
| EXPECT_STREQ(languages[2].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[2].modifier.c_str(), ""); |
| |
| EXPECT_STREQ(languages[3].language.c_str(), "tt"); |
| EXPECT_STREQ(languages[3].territory.c_str(), ""); |
| EXPECT_STREQ(languages[3].codeset.c_str(), ""); |
| EXPECT_STREQ(languages[3].modifier.c_str(), ""); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEmpty) { |
| const char* locale_string = ""; |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo( |
| locale_string, locale_string, locale_string, locale_string); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| |
| EXPECT_STREQ(languages[0].language.c_str(), "C"); |
| EXPECT_TRUE(languages[0].territory.empty()); |
| EXPECT_TRUE(languages[0].codeset.empty()); |
| EXPECT_TRUE(languages[0].modifier.empty()); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering1) { |
| const char* language = "de"; |
| const char* lc_all = "en"; |
| const char* lc_messages = "zh"; |
| const char* lang = "tt"; |
| |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(language, lc_all, |
| lc_messages, lang); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| EXPECT_STREQ(languages[0].language.c_str(), language); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering2) { |
| const char* lc_all = "en"; |
| const char* lc_messages = "zh"; |
| const char* lang = "tt"; |
| |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, lc_all, |
| lc_messages, lang); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| EXPECT_STREQ(languages[0].language.c_str(), lc_all); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering3) { |
| const char* lc_messages = "zh"; |
| const char* lang = "tt"; |
| |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr, |
| lc_messages, lang); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| EXPECT_STREQ(languages[0].language.c_str(), lc_messages); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering4) { |
| const char* lang = "tt"; |
| |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr, nullptr, |
| lang); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| EXPECT_STREQ(languages[0].language.c_str(), lang); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering5) { |
| std::vector<LanguageInfo> languages = |
| SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr, nullptr, |
| nullptr); |
| |
| EXPECT_EQ(languages.size(), 1UL); |
| EXPECT_STREQ(languages[0].language.c_str(), "C"); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, ConvertToFlutterLocaleEmpty) { |
| std::vector<LanguageInfo> languages; |
| |
| std::vector<FlutterLocale> locales = ConvertToFlutterLocale(languages); |
| |
| EXPECT_TRUE(locales.empty()); |
| } |
| |
| TEST(FlutterGlfwSystemUtilsTest, ConvertToFlutterLocaleNonEmpty) { |
| std::vector<LanguageInfo> languages; |
| languages.push_back(LanguageInfo{"en", "US", "", ""}); |
| languages.push_back(LanguageInfo{"tt", "RU", "", "iqtelif.UTF-8"}); |
| languages.push_back(LanguageInfo{"sv", "", "", ""}); |
| languages.push_back(LanguageInfo{"de", "DE", "UTF-8", "euro"}); |
| languages.push_back(LanguageInfo{"zh", "CN", "UTF-8", ""}); |
| |
| std::vector<FlutterLocale> locales = ConvertToFlutterLocale(languages); |
| |
| EXPECT_EQ(locales.size(), 5UL); |
| |
| EXPECT_EQ(locales[0].struct_size, sizeof(FlutterLocale)); |
| EXPECT_STREQ(locales[0].language_code, "en"); |
| EXPECT_STREQ(locales[0].country_code, "US"); |
| EXPECT_EQ(locales[0].script_code, nullptr); |
| EXPECT_EQ(locales[0].variant_code, nullptr); |
| |
| EXPECT_STREQ(locales[1].language_code, "tt"); |
| EXPECT_STREQ(locales[1].country_code, "RU"); |
| EXPECT_EQ(locales[1].script_code, nullptr); |
| EXPECT_STREQ(locales[1].variant_code, "iqtelif.UTF-8"); |
| |
| EXPECT_STREQ(locales[2].language_code, "sv"); |
| EXPECT_EQ(locales[2].country_code, nullptr); |
| EXPECT_EQ(locales[2].script_code, nullptr); |
| EXPECT_EQ(locales[2].variant_code, nullptr); |
| |
| EXPECT_STREQ(locales[3].language_code, "de"); |
| EXPECT_STREQ(locales[3].country_code, "DE"); |
| EXPECT_STREQ(locales[3].script_code, "UTF-8"); |
| EXPECT_STREQ(locales[3].variant_code, "euro"); |
| |
| EXPECT_STREQ(locales[4].language_code, "zh"); |
| EXPECT_STREQ(locales[4].country_code, "CN"); |
| EXPECT_STREQ(locales[4].script_code, "UTF-8"); |
| EXPECT_EQ(locales[4].variant_code, nullptr); |
| } |
| |
| } // namespace |
| } // namespace flutter |