152 lines
5 KiB
C++
152 lines
5 KiB
C++
/* 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<char> 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<char> 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<char> 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
|