summaryrefslogtreecommitdiffstats
path: root/intl/locale/tests/gtest
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /intl/locale/tests/gtest
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'intl/locale/tests/gtest')
-rw-r--r--intl/locale/tests/gtest/TestAppDateTimeFormat.cpp310
-rw-r--r--intl/locale/tests/gtest/TestLocaleService.cpp173
-rw-r--r--intl/locale/tests/gtest/TestLocaleServiceNegotiate.cpp53
-rw-r--r--intl/locale/tests/gtest/TestOSPreferences.cpp205
-rw-r--r--intl/locale/tests/gtest/moz.build14
5 files changed, 755 insertions, 0 deletions
diff --git a/intl/locale/tests/gtest/TestAppDateTimeFormat.cpp b/intl/locale/tests/gtest/TestAppDateTimeFormat.cpp
new file mode 100644
index 0000000000..a83b373428
--- /dev/null
+++ b/intl/locale/tests/gtest/TestAppDateTimeFormat.cpp
@@ -0,0 +1,310 @@
+#include "gtest/gtest.h"
+#include "mozilla/gtest/MozAssertions.h"
+#include "mozilla/intl/AppDateTimeFormat.h"
+#include "mozilla/intl/DateTimeFormat.h"
+
+namespace mozilla::intl {
+using Style = DateTimeFormat::Style;
+using StyleBag = DateTimeFormat::StyleBag;
+using ComponentsBag = DateTimeFormat::ComponentsBag;
+
+static DateTimeFormat::StyleBag ToStyleBag(Maybe<DateTimeFormat::Style> date,
+ Maybe<DateTimeFormat::Style> time) {
+ DateTimeFormat::StyleBag style;
+ style.date = date;
+ style.time = time;
+ return style;
+}
+
+TEST(AppDateTimeFormat, FormatPRExplodedTime)
+{
+ PRTime prTime = 0;
+ PRExplodedTime prExplodedTime;
+ PR_ExplodeTime(prTime, PR_GMTParameters, &prExplodedTime);
+
+ AppDateTimeFormat::sLocale = new nsCString("en-US");
+ AppDateTimeFormat::DeleteCache();
+ StyleBag style = ToStyleBag(Some(Style::Long), Some(Style::Long));
+
+ nsAutoString formattedTime;
+ nsresult rv =
+ AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"January") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"12:00:00 AM") != kNotFound ||
+ formattedTime.Find(u"12:00:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"00:00:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 19, 0, 1, 0, 1970, 4, 0, {(19 * 60), 0}};
+
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"January") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"12:19:00 AM") != kNotFound ||
+ formattedTime.Find(u"12:19:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"00:19:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 0, 7, 1,
+ 0, 1970, 4, 0, {(6 * 60 * 60), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"January") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"7:00:00 AM") != kNotFound ||
+ formattedTime.Find(u"7:00:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"07:00:00") != kNotFound);
+
+ prExplodedTime = {
+ 0, 0, 29, 11, 1,
+ 0, 1970, 4, 0, {(10 * 60 * 60) + (29 * 60), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"January") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"11:29:00 AM") != kNotFound ||
+ formattedTime.Find(u"11:29:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"11:29:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 37, 23, 31, 11, 1969, 3, 364, {-(23 * 60), 0}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"December") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"31") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"11:37:00 PM") != kNotFound ||
+ formattedTime.Find(u"11:37:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"23:37:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 0, 17, 31, 11, 1969, 3, 364, {-(7 * 60 * 60), 0}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"December") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"31") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"5:00:00 PM") != kNotFound ||
+ formattedTime.Find(u"5:00:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"17:00:00") != kNotFound);
+
+ prExplodedTime = {
+ 0, 0, 47, 14, 31,
+ 11, 1969, 3, 364, {-((10 * 60 * 60) + (13 * 60)), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"December") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"31") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"2:47:00 PM") != kNotFound ||
+ formattedTime.Find(u"2:47:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"14:47:00") != kNotFound);
+}
+
+TEST(AppDateTimeFormat, DateFormatSelectors)
+{
+ PRTime prTime = 0;
+ PRExplodedTime prExplodedTime;
+ PR_ExplodeTime(prTime, PR_GMTParameters, &prExplodedTime);
+
+ AppDateTimeFormat::sLocale = new nsCString("en-US");
+ AppDateTimeFormat::DeleteCache();
+
+ nsAutoString formattedTime;
+
+ {
+ ComponentsBag components{};
+ components.year = Some(DateTimeFormat::Numeric::Numeric);
+ components.month = Some(DateTimeFormat::Month::TwoDigit);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("01/1970", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.year = Some(DateTimeFormat::Numeric::Numeric);
+ components.month = Some(DateTimeFormat::Month::Long);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("January 1970", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.month = Some(DateTimeFormat::Month::Long);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("January", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.weekday = Some(DateTimeFormat::Text::Short);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Thu", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+}
+
+TEST(AppDateTimeFormat, FormatPRExplodedTimeForeign)
+{
+ PRTime prTime = 0;
+ PRExplodedTime prExplodedTime;
+ PR_ExplodeTime(prTime, PR_GMTParameters, &prExplodedTime);
+
+ AppDateTimeFormat::sLocale = new nsCString("de-DE");
+ AppDateTimeFormat::DeleteCache();
+ StyleBag style = ToStyleBag(Some(Style::Long), Some(Style::Long));
+
+ nsAutoString formattedTime;
+ nsresult rv =
+ AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"1.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Januar") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"12:00:00 AM") != kNotFound ||
+ formattedTime.Find(u"12:00:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"00:00:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 19, 0, 1, 0, 1970, 4, 0, {(19 * 60), 0}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"1.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Januar") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"12:19:00 AM") != kNotFound ||
+ formattedTime.Find(u"12:19:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"00:19:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 0, 7, 1,
+ 0, 1970, 4, 0, {(6 * 60 * 60), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"1.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Januar") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"7:00:00 AM") != kNotFound ||
+ formattedTime.Find(u"7:00:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"07:00:00") != kNotFound);
+
+ prExplodedTime = {
+ 0, 0, 29, 11, 1,
+ 0, 1970, 4, 0, {(10 * 60 * 60) + (29 * 60), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"1.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Januar") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1970") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"11:29:00 AM") != kNotFound ||
+ formattedTime.Find(u"11:29:00\u202FAM") != kNotFound ||
+ formattedTime.Find(u"11:29:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 37, 23, 31, 11, 1969, 3, 364, {-(23 * 60), 0}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"31.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Dezember") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"11:37:00 PM") != kNotFound ||
+ formattedTime.Find(u"11:37:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"23:37:00") != kNotFound);
+
+ prExplodedTime = {0, 0, 0, 17, 31, 11, 1969, 3, 364, {-(7 * 60 * 60), 0}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"31.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Dezember") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"5:00:00 PM") != kNotFound ||
+ formattedTime.Find(u"5:00:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"17:00:00") != kNotFound);
+
+ prExplodedTime = {
+ 0, 0, 47, 14, 31,
+ 11, 1969, 3, 364, {-((10 * 60 * 60) + (13 * 60)), (1 * 60 * 60)}};
+ rv = AppDateTimeFormat::Format(style, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_TRUE(formattedTime.Find(u"31.") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"Dezember") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"1969") != kNotFound);
+ ASSERT_TRUE(formattedTime.Find(u"2:47:00 PM") != kNotFound ||
+ formattedTime.Find(u"2:47:00\u202FPM") != kNotFound ||
+ formattedTime.Find(u"14:47:00") != kNotFound);
+}
+
+TEST(AppDateTimeFormat, DateFormatSelectorsForeign)
+{
+ PRTime prTime = 0;
+ PRExplodedTime prExplodedTime;
+ PR_ExplodeTime(prTime, PR_GMTParameters, &prExplodedTime);
+
+ AppDateTimeFormat::sLocale = new nsCString("de-DE");
+ AppDateTimeFormat::DeleteCache();
+
+ nsAutoString formattedTime;
+ {
+ ComponentsBag components{};
+ components.year = Some(DateTimeFormat::Numeric::Numeric);
+ components.month = Some(DateTimeFormat::Month::TwoDigit);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("01.1970", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.year = Some(DateTimeFormat::Numeric::Numeric);
+ components.month = Some(DateTimeFormat::Month::Long);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Januar 1970", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.weekday = Some(DateTimeFormat::Text::Short);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Do", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.weekday = Some(DateTimeFormat::Text::Long);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Donnerstag", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.month = Some(DateTimeFormat::Month::Long);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Januar", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+ {
+ ComponentsBag components{};
+ components.weekday = Some(DateTimeFormat::Text::Short);
+
+ nsresult rv =
+ AppDateTimeFormat::Format(components, &prExplodedTime, formattedTime);
+ ASSERT_NS_SUCCEEDED(rv);
+ ASSERT_STREQ("Do", NS_ConvertUTF16toUTF8(formattedTime).get());
+ }
+}
+
+} // namespace mozilla::intl
diff --git a/intl/locale/tests/gtest/TestLocaleService.cpp b/intl/locale/tests/gtest/TestLocaleService.cpp
new file mode 100644
index 0000000000..2cf19727d6
--- /dev/null
+++ b/intl/locale/tests/gtest/TestLocaleService.cpp
@@ -0,0 +1,173 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/Preferences.h"
+#include "mozilla/intl/Locale.h"
+#include "mozilla/intl/LocaleService.h"
+#include "mozilla/intl/Collator.h"
+
+using namespace mozilla::intl;
+
+TEST(Intl_Locale_LocaleService, CanonicalizeLanguageId)
+{
+ nsCString locale("en-US.POSIX");
+ ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
+ ASSERT_TRUE(locale.EqualsLiteral("en-US"));
+
+ locale.AssignLiteral("en-US_POSIX");
+ ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
+ ASSERT_TRUE(locale.EqualsLiteral("en-US-posix"));
+
+ locale.AssignLiteral("en-US-POSIX");
+ ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
+ ASSERT_TRUE(locale.EqualsLiteral("en-US-posix"));
+
+ locale.AssignLiteral("C");
+ ASSERT_FALSE(LocaleService::CanonicalizeLanguageId(locale));
+ ASSERT_TRUE(locale.EqualsLiteral("und"));
+
+ locale.AssignLiteral("");
+ ASSERT_FALSE(LocaleService::CanonicalizeLanguageId(locale));
+ ASSERT_TRUE(locale.EqualsLiteral("und"));
+}
+
+TEST(Intl_Locale_LocaleService, GetAppLocalesAsBCP47)
+{
+ nsTArray<nsCString> appLocales;
+ LocaleService::GetInstance()->GetAppLocalesAsBCP47(appLocales);
+
+ ASSERT_FALSE(appLocales.IsEmpty());
+}
+
+TEST(Intl_Locale_LocaleService, GetAppLocalesAsLangTags)
+{
+ nsTArray<nsCString> appLocales;
+ LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
+
+ ASSERT_FALSE(appLocales.IsEmpty());
+}
+
+TEST(Intl_Locale_LocaleService, GetAppLocalesAsLangTags_lastIsPresent)
+{
+ nsAutoCString lastFallbackLocale;
+ LocaleService::GetInstance()->GetLastFallbackLocale(lastFallbackLocale);
+
+ nsTArray<nsCString> appLocales;
+ LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
+
+ ASSERT_TRUE(appLocales.Contains(lastFallbackLocale));
+}
+
+TEST(Intl_Locale_LocaleService, GetAppLocaleAsLangTag)
+{
+ nsTArray<nsCString> appLocales;
+ LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
+
+ nsAutoCString locale;
+ LocaleService::GetInstance()->GetAppLocaleAsLangTag(locale);
+
+ ASSERT_TRUE(appLocales[0] == locale);
+}
+
+TEST(Intl_Locale_LocaleService, GetRegionalPrefsLocales)
+{
+ nsTArray<nsCString> rpLocales;
+ LocaleService::GetInstance()->GetRegionalPrefsLocales(rpLocales);
+
+ int32_t len = rpLocales.Length();
+ ASSERT_TRUE(len > 0);
+}
+
+TEST(Intl_Locale_LocaleService, GetWebExposedLocales)
+{
+ const nsTArray<nsCString> spoofLocale{"de"_ns};
+ LocaleService::GetInstance()->SetAvailableLocales(spoofLocale);
+ LocaleService::GetInstance()->SetRequestedLocales(spoofLocale);
+
+ nsTArray<nsCString> pvLocales;
+
+ mozilla::Preferences::SetInt("privacy.spoof_english", 0);
+ LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
+ ASSERT_TRUE(pvLocales.Length() > 0);
+ ASSERT_TRUE(pvLocales[0].Equals("de"_ns));
+
+ mozilla::Preferences::SetCString("intl.locale.privacy.web_exposed", "zh-TW");
+ LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
+ ASSERT_TRUE(pvLocales.Length() > 0);
+ ASSERT_TRUE(pvLocales[0].Equals("zh-TW"_ns));
+
+ mozilla::Preferences::SetInt("privacy.spoof_english", 2);
+ LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
+ ASSERT_EQ(1u, pvLocales.Length());
+ ASSERT_TRUE(pvLocales[0].Equals("en-US"_ns));
+}
+
+TEST(Intl_Locale_LocaleService, GetRequestedLocales)
+{
+ nsTArray<nsCString> reqLocales;
+ LocaleService::GetInstance()->GetRequestedLocales(reqLocales);
+
+ int32_t len = reqLocales.Length();
+ ASSERT_TRUE(len > 0);
+}
+
+TEST(Intl_Locale_LocaleService, GetAvailableLocales)
+{
+ nsTArray<nsCString> availableLocales;
+ LocaleService::GetInstance()->GetAvailableLocales(availableLocales);
+
+ int32_t len = availableLocales.Length();
+ ASSERT_TRUE(len > 0);
+}
+
+TEST(Intl_Locale_LocaleService, GetPackagedLocales)
+{
+ nsTArray<nsCString> packagedLocales;
+ LocaleService::GetInstance()->GetPackagedLocales(packagedLocales);
+
+ int32_t len = packagedLocales.Length();
+ ASSERT_TRUE(len > 0);
+}
+
+TEST(Intl_Locale_LocaleService, GetDefaultLocale)
+{
+ nsAutoCString locStr;
+ LocaleService::GetInstance()->GetDefaultLocale(locStr);
+
+ ASSERT_FALSE(locStr.IsEmpty());
+ Locale loc;
+ ASSERT_TRUE(LocaleParser::TryParse(locStr, loc).isOk());
+}
+
+TEST(Intl_Locale_LocaleService, IsAppLocaleRTL)
+{
+ mozilla::Preferences::SetCString("intl.l10n.pseudo", "bidi");
+ ASSERT_TRUE(LocaleService::GetInstance()->IsAppLocaleRTL());
+ mozilla::Preferences::ClearUser("intl.l10n.pseudo");
+}
+
+TEST(Intl_Locale_LocaleService, TryCreateComponent)
+{
+ {
+ // Create a Collator with the app locale.
+ auto result = LocaleService::GetInstance()->TryCreateComponent<Collator>();
+ ASSERT_TRUE(result.isOk());
+ }
+ {
+ // Create a Collator with the "en" locale.
+ auto result =
+ LocaleService::GetInstance()->TryCreateComponentWithLocale<Collator>(
+ "en");
+ ASSERT_TRUE(result.isOk());
+ }
+ {
+ // Fallback to the app locale when an invalid one is used.
+ auto result =
+ LocaleService::GetInstance()->TryCreateComponentWithLocale<Collator>(
+ "$invalidName");
+ ASSERT_TRUE(result.isOk());
+ }
+}
diff --git a/intl/locale/tests/gtest/TestLocaleServiceNegotiate.cpp b/intl/locale/tests/gtest/TestLocaleServiceNegotiate.cpp
new file mode 100644
index 0000000000..c428e81c8d
--- /dev/null
+++ b/intl/locale/tests/gtest/TestLocaleServiceNegotiate.cpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/LocaleService.h"
+
+using namespace mozilla::intl;
+
+TEST(Intl_Locale_LocaleService, Negotiate)
+{
+ nsTArray<nsCString> requestedLocales;
+ nsTArray<nsCString> availableLocales;
+ nsTArray<nsCString> supportedLocales;
+ nsAutoCString defaultLocale("en-US");
+ int32_t strategy = LocaleService::kLangNegStrategyFiltering;
+
+ requestedLocales.AppendElement("sr"_ns);
+
+ availableLocales.AppendElement("sr-Cyrl"_ns);
+ availableLocales.AppendElement("sr-Latn"_ns);
+
+ LocaleService::GetInstance()->NegotiateLanguages(
+ requestedLocales, availableLocales, defaultLocale, strategy,
+ supportedLocales);
+
+ ASSERT_TRUE(supportedLocales.Length() == 2);
+ ASSERT_TRUE(supportedLocales[0].EqualsLiteral("sr-Cyrl"));
+ ASSERT_TRUE(supportedLocales[1].EqualsLiteral("en-US"));
+}
+
+TEST(Intl_Locale_LocaleService, UseLSDefaultLocale)
+{
+ nsTArray<nsCString> requestedLocales;
+ nsTArray<nsCString> availableLocales;
+ nsTArray<nsCString> supportedLocales;
+ nsAutoCString defaultLocale("en-US");
+ int32_t strategy = LocaleService::kLangNegStrategyLookup;
+
+ requestedLocales.AppendElement("sr"_ns);
+
+ availableLocales.AppendElement("de"_ns);
+
+ LocaleService::GetInstance()->NegotiateLanguages(
+ requestedLocales, availableLocales, defaultLocale, strategy,
+ supportedLocales);
+
+ nsAutoCString lsDefaultLocale;
+ LocaleService::GetInstance()->GetDefaultLocale(lsDefaultLocale);
+ ASSERT_TRUE(supportedLocales.Length() == 1);
+ ASSERT_TRUE(supportedLocales[0].Equals(lsDefaultLocale));
+}
diff --git a/intl/locale/tests/gtest/TestOSPreferences.cpp b/intl/locale/tests/gtest/TestOSPreferences.cpp
new file mode 100644
index 0000000000..7e3b71582b
--- /dev/null
+++ b/intl/locale/tests/gtest/TestOSPreferences.cpp
@@ -0,0 +1,205 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/ArrayUtils.h"
+#include "mozilla/gtest/MozAssertions.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/intl/LocaleService.h"
+#include "mozilla/intl/OSPreferences.h"
+
+using namespace mozilla::intl;
+
+/**
+ * We test that on all platforms we test against (irrelevant of the tier),
+ * we will be able to retrieve at least a single locale out of the system.
+ *
+ * In theory, that may not be true, but if we encounter such platform we should
+ * decide how to handle this and special case and this test should make
+ * it not happen without us noticing.
+ */
+TEST(Intl_Locale_OSPreferences, GetSystemLocales)
+{
+ nsTArray<nsCString> systemLocales;
+ ASSERT_TRUE(NS_SUCCEEDED(
+ OSPreferences::GetInstance()->GetSystemLocales(systemLocales)));
+
+ ASSERT_FALSE(systemLocales.IsEmpty());
+}
+
+/**
+ * We test that on all platforms we test against (irrelevant of the tier),
+ * we will be able to retrieve at least a single locale out of the system.
+ *
+ * In theory, that may not be true, but if we encounter such platform we should
+ * decide how to handle this and special case and this test should make
+ * it not happen without us noticing.
+ */
+TEST(Intl_Locale_OSPreferences, GetRegionalPrefsLocales)
+{
+ nsTArray<nsCString> rgLocales;
+ ASSERT_TRUE(NS_SUCCEEDED(
+ OSPreferences::GetInstance()->GetRegionalPrefsLocales(rgLocales)));
+
+ ASSERT_FALSE(rgLocales.IsEmpty());
+}
+
+/**
+ * We test that on all platforms we test against,
+ * we will be able to retrieve a date and time pattern.
+ *
+ * This may come back empty on platforms where we don't have platforms
+ * bindings for, so effectively, we're testing for crashes. We should
+ * never crash.
+ */
+TEST(Intl_Locale_OSPreferences, GetDateTimePattern)
+{
+ nsAutoCString pattern;
+ OSPreferences* osprefs = OSPreferences::GetInstance();
+
+ struct Test {
+ int dateStyle;
+ int timeStyle;
+ const char* locale;
+ };
+ Test tests[] = {{0, 0, ""}, {1, 0, "pl"}, {2, 0, "de-DE"}, {3, 0, "fr"},
+ {4, 0, "ar"},
+
+ {0, 1, ""}, {0, 2, "it"}, {0, 3, ""}, {0, 4, "ru"},
+
+ {4, 1, ""}, {3, 2, "cs"}, {2, 3, ""}, {1, 4, "ja"}};
+
+ for (unsigned i = 0; i < mozilla::ArrayLength(tests); i++) {
+ const Test& t = tests[i];
+ if (NS_SUCCEEDED(osprefs->GetDateTimePattern(
+ t.dateStyle, t.timeStyle, nsDependentCString(t.locale), pattern))) {
+ ASSERT_TRUE((t.dateStyle == 0 && t.timeStyle == 0) || !pattern.IsEmpty());
+ }
+ }
+
+ // If the locale is not specified, we should get the pattern corresponding to
+ // the first regional prefs locale.
+ AutoTArray<nsCString, 10> rpLocales;
+ LocaleService::GetInstance()->GetRegionalPrefsLocales(rpLocales);
+ ASSERT_TRUE(rpLocales.Length() > 0);
+
+ nsAutoCString rpLocalePattern;
+ ASSERT_TRUE(NS_SUCCEEDED(
+ osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleLong,
+ mozIOSPreferences::dateTimeFormatStyleLong,
+ rpLocales[0], rpLocalePattern)));
+ ASSERT_TRUE(NS_SUCCEEDED(
+ osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleLong,
+ mozIOSPreferences::dateTimeFormatStyleLong,
+ nsDependentCString(""), pattern)));
+ ASSERT_EQ(rpLocalePattern, pattern);
+}
+
+/**
+ * Test that is possible to override the OS defaults through a pref.
+ */
+TEST(Intl_Locale_OSPreferences, GetDateTimePatternPrefOverrides)
+{
+ nsresult nr;
+ nsAutoCString default_pattern, pattern;
+ OSPreferences* osprefs = OSPreferences::GetInstance();
+
+ struct {
+ const char* DatePref;
+ const char* TimePref;
+ int32_t DateTimeFormatStyle;
+ } configs[] = {{"intl.date_time.pattern_override.date_short",
+ "intl.date_time.pattern_override.time_short",
+ mozIOSPreferences::dateTimeFormatStyleShort},
+ {"intl.date_time.pattern_override.date_medium",
+ "intl.date_time.pattern_override.time_medium",
+ mozIOSPreferences::dateTimeFormatStyleMedium},
+ {"intl.date_time.pattern_override.date_long",
+ "intl.date_time.pattern_override.time_long",
+ mozIOSPreferences::dateTimeFormatStyleLong},
+ {"intl.date_time.pattern_override.date_full",
+ "intl.date_time.pattern_override.time_full",
+ mozIOSPreferences::dateTimeFormatStyleFull}};
+
+ for (const auto& config : configs) {
+ // Get default value for the OS
+ nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
+ mozIOSPreferences::dateTimeFormatStyleNone,
+ nsDependentCString(""), default_pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+
+ // Override date format
+ mozilla::Preferences::SetCString(config.DatePref, "yy-MM");
+ nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
+ mozIOSPreferences::dateTimeFormatStyleNone,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_TRUE(pattern.EqualsASCII("yy-MM"));
+
+ // Override time format
+ mozilla::Preferences::SetCString(config.TimePref, "HH:mm");
+ nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleNone,
+ config.DateTimeFormatStyle,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_TRUE(pattern.EqualsASCII("HH:mm"));
+
+ // Override both
+ nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
+ config.DateTimeFormatStyle,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_TRUE(pattern.Find("yy-MM") != kNotFound);
+ ASSERT_TRUE(pattern.Find("HH:mm") != kNotFound);
+
+ // Clear overrides, we should get the default value back.
+ mozilla::Preferences::ClearUser(config.DatePref);
+ mozilla::Preferences::ClearUser(config.TimePref);
+ nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
+ mozIOSPreferences::dateTimeFormatStyleNone,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_EQ(default_pattern, pattern);
+ }
+
+ // Test overriding connector
+ nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
+ mozIOSPreferences::dateTimeFormatStyleShort,
+ nsDependentCString(""), default_pattern);
+
+ mozilla::Preferences::SetCString("intl.date_time.pattern_override.date_short",
+ "yyyy-MM-dd");
+ mozilla::Preferences::SetCString("intl.date_time.pattern_override.time_short",
+ "HH:mm:ss");
+ mozilla::Preferences::SetCString(
+ "intl.date_time.pattern_override.connector_short", "{1} {0}");
+ nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
+ mozIOSPreferences::dateTimeFormatStyleShort,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_TRUE(pattern.EqualsASCII("yyyy-MM-dd HH:mm:ss"));
+
+ // Reset to date and time to defaults
+ mozilla::Preferences::ClearUser("intl.date_time.pattern_override.date_short");
+ mozilla::Preferences::ClearUser("intl.date_time.pattern_override.time_short");
+
+ // Invalid patterns are ignored
+ mozilla::Preferences::SetCString(
+ "intl.date_time.pattern_override.connector_short", "hello, world!");
+ nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
+ mozIOSPreferences::dateTimeFormatStyleShort,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_EQ(default_pattern, pattern);
+
+ // Clearing the override results in getting the default pattern back.
+ mozilla::Preferences::ClearUser(
+ "intl.date_time.pattern_override.connector_short");
+ nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
+ mozIOSPreferences::dateTimeFormatStyleShort,
+ nsDependentCString(""), pattern);
+ ASSERT_NS_SUCCEEDED(nr);
+ ASSERT_EQ(default_pattern, pattern);
+}
diff --git a/intl/locale/tests/gtest/moz.build b/intl/locale/tests/gtest/moz.build
new file mode 100644
index 0000000000..bd2a2b8f86
--- /dev/null
+++ b/intl/locale/tests/gtest/moz.build
@@ -0,0 +1,14 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+UNIFIED_SOURCES += [
+ "TestAppDateTimeFormat.cpp",
+ "TestLocaleService.cpp",
+ "TestLocaleServiceNegotiate.cpp",
+ "TestOSPreferences.cpp",
+]
+
+FINAL_LIBRARY = "xul-gtest"