/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "gtest/gtest.h" #include "mozilla/intl/Locale.h" #include "mozilla/Span.h" #include "TestBuffer.h" namespace mozilla::intl { TEST(IntlLocale, LocaleSettersAndGetters) { Locale locale; locale.SetLanguage("fr"); locale.SetRegion("CA"); locale.SetScript("Latn"); ASSERT_TRUE( locale.SetUnicodeExtension(MakeStringSpan("u-ca-gregory")).isOk()); ASSERT_TRUE(locale.Language().EqualTo("fr")); ASSERT_TRUE(locale.Region().EqualTo("CA")); ASSERT_TRUE(locale.Script().EqualTo("Latn")); ASSERT_EQ(locale.GetUnicodeExtension().value(), MakeStringSpan("u-ca-gregory")); TestBuffer buffer; ASSERT_TRUE(locale.ToString(buffer).isOk()); ASSERT_TRUE(buffer.verboseMatches("fr-Latn-CA-u-ca-gregory")); // No setters for variants or other extensions... Locale locale2; ASSERT_TRUE(LocaleParser::TryParse( MakeStringSpan("fr-CA-fonipa-t-es-AR-h0-hybrid"), locale2) .isOk()); ASSERT_EQ(locale2.Variants()[0], MakeStringSpan("fonipa")); ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("t-es-AR-h0-hybrid")); locale2.ClearVariants(); ASSERT_EQ(locale2.Variants().length(), 0UL); } TEST(IntlLocale, LocaleMove) { Locale locale; ASSERT_TRUE( LocaleParser::TryParse( MakeStringSpan( "fr-Latn-CA-fonipa-u-ca-gregory-t-es-AR-h0-hybrid-x-private"), locale) .isOk()); ASSERT_TRUE(locale.Language().EqualTo("fr")); ASSERT_TRUE(locale.Script().EqualTo("Latn")); ASSERT_TRUE(locale.Region().EqualTo("CA")); ASSERT_EQ(locale.Variants()[0], MakeStringSpan("fonipa")); ASSERT_EQ(locale.Extensions()[0], MakeStringSpan("u-ca-gregory")); ASSERT_EQ(locale.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid")); ASSERT_EQ(locale.GetUnicodeExtension().value(), MakeStringSpan("u-ca-gregory")); ASSERT_EQ(locale.PrivateUse().value(), MakeStringSpan("x-private")); Locale locale2 = std::move(locale); ASSERT_TRUE(locale2.Language().EqualTo("fr")); ASSERT_TRUE(locale2.Script().EqualTo("Latn")); ASSERT_TRUE(locale2.Region().EqualTo("CA")); ASSERT_EQ(locale2.Variants()[0], MakeStringSpan("fonipa")); ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("u-ca-gregory")); ASSERT_EQ(locale2.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid")); ASSERT_EQ(locale2.GetUnicodeExtension().value(), MakeStringSpan("u-ca-gregory")); ASSERT_EQ(locale2.PrivateUse().value(), MakeStringSpan("x-private")); } TEST(IntlLocale, LocaleParser) { const char* tags[] = { "en-US", "en-GB", "es-AR", "it", "zh-Hans-CN", "de-AT", "pl", "fr-FR", "de-AT", "sr-Cyrl-SR", "nb-NO", "fr-FR", "mk", "uk", "und-PL", "und-Latn-AM", "ug-Cyrl", "sr-ME", "mn-Mong", "lif-Limb", "gan", "zh-Hant", "yue-Hans", "unr", "unr-Deva", "und-Thai-CN", "ug-Cyrl", "en-Latn-DE", "pl-FR", "de-CH", "tuq", "sr-ME", "ng", "klx", "kk-Arab", "en-Cyrl", "und-Cyrl-UK", "und-Arab", "und-Arab-FO"}; for (const auto* tag : tags) { Locale locale; ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan(tag), locale).isOk()); } } TEST(IntlLocale, LikelySubtags) { Locale locale; ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan("zh"), locale).isOk()); ASSERT_TRUE(locale.AddLikelySubtags().isOk()); TestBuffer buffer; ASSERT_TRUE(locale.ToString(buffer).isOk()); ASSERT_TRUE(buffer.verboseMatches("zh-Hans-CN")); ASSERT_TRUE(locale.RemoveLikelySubtags().isOk()); buffer.clear(); ASSERT_TRUE(locale.ToString(buffer).isOk()); ASSERT_TRUE(buffer.verboseMatches("zh")); } TEST(IntlLocale, Canonicalize) { Locale locale; ASSERT_TRUE( LocaleParser::TryParse(MakeStringSpan("nob-bokmal"), locale).isOk()); ASSERT_TRUE(locale.Canonicalize().isOk()); TestBuffer buffer; ASSERT_TRUE(locale.ToString(buffer).isOk()); ASSERT_TRUE(buffer.verboseMatches("nb")); } // These tests are dependent on the machine that this test is being run on. TEST(IntlLocale, SystemDependentTests) { // e.g. "en_US" const char* locale = Locale::GetDefaultLocale(); ASSERT_TRUE(locale != nullptr); } TEST(IntlLocale, GetAvailableLocales) { using namespace std::literals; int32_t english = 0; int32_t german = 0; int32_t chinese = 0; // Since this list is dependent on ICU, and may change between upgrades, only // test a subset of the available locales. for (const char* locale : Locale::GetAvailableLocales()) { if (locale == "en"sv) { english++; } else if (locale == "de"sv) { german++; } else if (locale == "zh"sv) { chinese++; } } // Each locale should be found exactly once. ASSERT_EQ(english, 1); ASSERT_EQ(german, 1); ASSERT_EQ(chinese, 1); } } // namespace mozilla::intl