TestLocale.cpp (5282B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 #include "gtest/gtest.h" 5 6 #include "mozilla/intl/Locale.h" 7 #include "mozilla/Span.h" 8 9 #include "TestBuffer.h" 10 11 namespace mozilla::intl { 12 13 TEST(IntlLocale, LocaleSettersAndGetters) 14 { 15 Locale locale; 16 locale.SetLanguage("fr"); 17 locale.SetRegion("CA"); 18 locale.SetScript("Latn"); 19 Locale::VariantsVector variants; 20 ASSERT_TRUE(variants.append(VariantSubtag{MakeStringSpan("fonipa")})); 21 locale.SetVariants(std::move(variants)); 22 ASSERT_TRUE( 23 locale.SetUnicodeExtension(MakeStringSpan("u-ca-gregory")).isOk()); 24 ASSERT_TRUE(locale.Language().EqualTo("fr")); 25 ASSERT_TRUE(locale.Region().EqualTo("CA")); 26 ASSERT_TRUE(locale.Script().EqualTo("Latn")); 27 ASSERT_EQ(locale.Variants().length(), 1UL); 28 ASSERT_EQ(locale.Variants()[0], MakeStringSpan("fonipa")); 29 ASSERT_EQ(locale.GetUnicodeExtension().value(), 30 MakeStringSpan("u-ca-gregory")); 31 32 TestBuffer<char> buffer; 33 ASSERT_TRUE(locale.ToString(buffer).isOk()); 34 ASSERT_TRUE(buffer.verboseMatches("fr-Latn-CA-fonipa-u-ca-gregory")); 35 36 locale.ClearVariants(); 37 ASSERT_EQ(locale.Variants().length(), 0UL); 38 39 // No setters for other extensions... 40 Locale locale2; 41 ASSERT_TRUE( 42 LocaleParser::TryParse(MakeStringSpan("fr-CA-t-es-AR-h0-hybrid"), locale2) 43 .isOk()); 44 ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("t-es-AR-h0-hybrid")); 45 } 46 47 TEST(IntlLocale, LocaleMove) 48 { 49 Locale locale; 50 ASSERT_TRUE( 51 LocaleParser::TryParse( 52 MakeStringSpan( 53 "fr-Latn-CA-fonipa-u-ca-gregory-t-es-AR-h0-hybrid-x-private"), 54 locale) 55 .isOk()); 56 57 ASSERT_TRUE(locale.Language().EqualTo("fr")); 58 ASSERT_TRUE(locale.Script().EqualTo("Latn")); 59 ASSERT_TRUE(locale.Region().EqualTo("CA")); 60 ASSERT_EQ(locale.Variants()[0], MakeStringSpan("fonipa")); 61 ASSERT_EQ(locale.Extensions()[0], MakeStringSpan("u-ca-gregory")); 62 ASSERT_EQ(locale.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid")); 63 ASSERT_EQ(locale.GetUnicodeExtension().value(), 64 MakeStringSpan("u-ca-gregory")); 65 ASSERT_EQ(locale.PrivateUse().value(), MakeStringSpan("x-private")); 66 67 Locale locale2 = std::move(locale); 68 69 ASSERT_TRUE(locale2.Language().EqualTo("fr")); 70 ASSERT_TRUE(locale2.Script().EqualTo("Latn")); 71 ASSERT_TRUE(locale2.Region().EqualTo("CA")); 72 ASSERT_EQ(locale2.Variants()[0], MakeStringSpan("fonipa")); 73 ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("u-ca-gregory")); 74 ASSERT_EQ(locale2.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid")); 75 ASSERT_EQ(locale2.GetUnicodeExtension().value(), 76 MakeStringSpan("u-ca-gregory")); 77 ASSERT_EQ(locale2.PrivateUse().value(), MakeStringSpan("x-private")); 78 } 79 80 TEST(IntlLocale, LocaleParser) 81 { 82 const char* tags[] = { 83 "en-US", "en-GB", "es-AR", "it", "zh-Hans-CN", 84 "de-AT", "pl", "fr-FR", "de-AT", "sr-Cyrl-SR", 85 "nb-NO", "fr-FR", "mk", "uk", "und-PL", 86 "und-Latn-AM", "ug-Cyrl", "sr-ME", "mn-Mong", "lif-Limb", 87 "gan", "zh-Hant", "yue-Hans", "unr", "unr-Deva", 88 "und-Thai-CN", "ug-Cyrl", "en-Latn-DE", "pl-FR", "de-CH", 89 "tuq", "sr-ME", "ng", "klx", "kk-Arab", 90 "en-Cyrl", "und-Cyrl-UK", "und-Arab", "und-Arab-FO"}; 91 92 for (const auto* tag : tags) { 93 Locale locale; 94 ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan(tag), locale).isOk()); 95 } 96 } 97 98 TEST(IntlLocale, LikelySubtags) 99 { 100 Locale locale; 101 ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan("zh"), locale).isOk()); 102 ASSERT_TRUE(locale.AddLikelySubtags().isOk()); 103 TestBuffer<char> buffer; 104 ASSERT_TRUE(locale.ToString(buffer).isOk()); 105 ASSERT_TRUE(buffer.verboseMatches("zh-Hans-CN")); 106 ASSERT_TRUE(locale.RemoveLikelySubtags().isOk()); 107 buffer.clear(); 108 ASSERT_TRUE(locale.ToString(buffer).isOk()); 109 ASSERT_TRUE(buffer.verboseMatches("zh")); 110 } 111 112 TEST(IntlLocale, Canonicalize) 113 { 114 Locale locale; 115 ASSERT_TRUE( 116 LocaleParser::TryParse(MakeStringSpan("nob-bokmal"), locale).isOk()); 117 ASSERT_TRUE(locale.Canonicalize().isOk()); 118 TestBuffer<char> buffer; 119 ASSERT_TRUE(locale.ToString(buffer).isOk()); 120 ASSERT_TRUE(buffer.verboseMatches("nb")); 121 } 122 123 // These tests are dependent on the machine that this test is being run on. 124 TEST(IntlLocale, SystemDependentTests) 125 { 126 // e.g. "en_US" 127 const char* locale = Locale::GetDefaultLocale(); 128 ASSERT_TRUE(locale != nullptr); 129 } 130 131 TEST(IntlLocale, GetAvailableLocales) 132 { 133 using namespace std::literals; 134 135 int32_t english = 0; 136 int32_t german = 0; 137 int32_t chinese = 0; 138 139 // Since this list is dependent on ICU, and may change between upgrades, only 140 // test a subset of the available locales. 141 for (const char* locale : Locale::GetAvailableLocales()) { 142 if (locale == "en"sv) { 143 english++; 144 } else if (locale == "de"sv) { 145 german++; 146 } else if (locale == "zh"sv) { 147 chinese++; 148 } 149 } 150 151 // Each locale should be found exactly once. 152 ASSERT_EQ(english, 1); 153 ASSERT_EQ(german, 1); 154 ASSERT_EQ(chinese, 1); 155 } 156 157 } // namespace mozilla::intl