blob: 7f0ddd8ff200662c3ecd04bfbe4636ab2632b03b [file] [log] [blame]
// 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