1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "gtest/gtest.h"
7 #include "mozilla/Preferences.h"
8 #include "mozilla/intl/Locale.h"
9 #include "mozilla/intl/LocaleService.h"
10 #include "mozilla/intl/Collator.h"
11
12 using namespace mozilla::intl;
13
TEST(Intl_Locale_LocaleService,CanonicalizeLanguageId)14 TEST(Intl_Locale_LocaleService, CanonicalizeLanguageId)
15 {
16 nsCString locale("en-US.POSIX");
17 ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
18 ASSERT_TRUE(locale.EqualsLiteral("en-US"));
19
20 locale.AssignLiteral("en-US_POSIX");
21 ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
22 ASSERT_TRUE(locale.EqualsLiteral("en-US-posix"));
23
24 locale.AssignLiteral("en-US-POSIX");
25 ASSERT_TRUE(LocaleService::CanonicalizeLanguageId(locale));
26 ASSERT_TRUE(locale.EqualsLiteral("en-US-posix"));
27
28 locale.AssignLiteral("C");
29 ASSERT_FALSE(LocaleService::CanonicalizeLanguageId(locale));
30 ASSERT_TRUE(locale.EqualsLiteral("und"));
31
32 locale.AssignLiteral("");
33 ASSERT_FALSE(LocaleService::CanonicalizeLanguageId(locale));
34 ASSERT_TRUE(locale.EqualsLiteral("und"));
35 }
36
TEST(Intl_Locale_LocaleService,GetAppLocalesAsBCP47)37 TEST(Intl_Locale_LocaleService, GetAppLocalesAsBCP47)
38 {
39 nsTArray<nsCString> appLocales;
40 LocaleService::GetInstance()->GetAppLocalesAsBCP47(appLocales);
41
42 ASSERT_FALSE(appLocales.IsEmpty());
43 }
44
TEST(Intl_Locale_LocaleService,GetAppLocalesAsLangTags)45 TEST(Intl_Locale_LocaleService, GetAppLocalesAsLangTags)
46 {
47 nsTArray<nsCString> appLocales;
48 LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
49
50 ASSERT_FALSE(appLocales.IsEmpty());
51 }
52
TEST(Intl_Locale_LocaleService,GetAppLocalesAsLangTags_lastIsPresent)53 TEST(Intl_Locale_LocaleService, GetAppLocalesAsLangTags_lastIsPresent)
54 {
55 nsAutoCString lastFallbackLocale;
56 LocaleService::GetInstance()->GetLastFallbackLocale(lastFallbackLocale);
57
58 nsTArray<nsCString> appLocales;
59 LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
60
61 ASSERT_TRUE(appLocales.Contains(lastFallbackLocale));
62 }
63
TEST(Intl_Locale_LocaleService,GetAppLocaleAsLangTag)64 TEST(Intl_Locale_LocaleService, GetAppLocaleAsLangTag)
65 {
66 nsTArray<nsCString> appLocales;
67 LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales);
68
69 nsAutoCString locale;
70 LocaleService::GetInstance()->GetAppLocaleAsLangTag(locale);
71
72 ASSERT_TRUE(appLocales[0] == locale);
73 }
74
TEST(Intl_Locale_LocaleService,GetRegionalPrefsLocales)75 TEST(Intl_Locale_LocaleService, GetRegionalPrefsLocales)
76 {
77 nsTArray<nsCString> rpLocales;
78 LocaleService::GetInstance()->GetRegionalPrefsLocales(rpLocales);
79
80 int32_t len = rpLocales.Length();
81 ASSERT_TRUE(len > 0);
82 }
83
TEST(Intl_Locale_LocaleService,GetWebExposedLocales)84 TEST(Intl_Locale_LocaleService, GetWebExposedLocales)
85 {
86 const nsTArray<nsCString> spoofLocale{"de"_ns};
87 LocaleService::GetInstance()->SetAvailableLocales(spoofLocale);
88 LocaleService::GetInstance()->SetRequestedLocales(spoofLocale);
89
90 nsTArray<nsCString> pvLocales;
91
92 mozilla::Preferences::SetInt("privacy.spoof_english", 0);
93 LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
94 ASSERT_TRUE(pvLocales.Length() > 0);
95 ASSERT_TRUE(pvLocales[0].Equals("de"_ns));
96
97 mozilla::Preferences::SetCString("intl.locale.privacy.web_exposed", "zh-TW");
98 LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
99 ASSERT_TRUE(pvLocales.Length() > 0);
100 ASSERT_TRUE(pvLocales[0].Equals("zh-TW"_ns));
101
102 mozilla::Preferences::SetInt("privacy.spoof_english", 2);
103 LocaleService::GetInstance()->GetWebExposedLocales(pvLocales);
104 ASSERT_EQ(1u, pvLocales.Length());
105 ASSERT_TRUE(pvLocales[0].Equals("en-US"_ns));
106 }
107
TEST(Intl_Locale_LocaleService,GetRequestedLocales)108 TEST(Intl_Locale_LocaleService, GetRequestedLocales)
109 {
110 nsTArray<nsCString> reqLocales;
111 LocaleService::GetInstance()->GetRequestedLocales(reqLocales);
112
113 int32_t len = reqLocales.Length();
114 ASSERT_TRUE(len > 0);
115 }
116
TEST(Intl_Locale_LocaleService,GetAvailableLocales)117 TEST(Intl_Locale_LocaleService, GetAvailableLocales)
118 {
119 nsTArray<nsCString> availableLocales;
120 LocaleService::GetInstance()->GetAvailableLocales(availableLocales);
121
122 int32_t len = availableLocales.Length();
123 ASSERT_TRUE(len > 0);
124 }
125
TEST(Intl_Locale_LocaleService,GetPackagedLocales)126 TEST(Intl_Locale_LocaleService, GetPackagedLocales)
127 {
128 nsTArray<nsCString> packagedLocales;
129 LocaleService::GetInstance()->GetPackagedLocales(packagedLocales);
130
131 int32_t len = packagedLocales.Length();
132 ASSERT_TRUE(len > 0);
133 }
134
TEST(Intl_Locale_LocaleService,GetDefaultLocale)135 TEST(Intl_Locale_LocaleService, GetDefaultLocale)
136 {
137 nsAutoCString locStr;
138 LocaleService::GetInstance()->GetDefaultLocale(locStr);
139
140 ASSERT_FALSE(locStr.IsEmpty());
141 Locale loc;
142 ASSERT_TRUE(LocaleParser::TryParse(locStr, loc).isOk());
143 }
144
TEST(Intl_Locale_LocaleService,IsAppLocaleRTL)145 TEST(Intl_Locale_LocaleService, IsAppLocaleRTL)
146 {
147 mozilla::Preferences::SetCString("intl.l10n.pseudo", "bidi");
148 ASSERT_TRUE(LocaleService::GetInstance()->IsAppLocaleRTL());
149 mozilla::Preferences::ClearUser("intl.l10n.pseudo");
150 }
151
TEST(Intl_Locale_LocaleService,TryCreateComponent)152 TEST(Intl_Locale_LocaleService, TryCreateComponent)
153 {
154 {
155 // Create a Collator with the app locale.
156 auto result = LocaleService::GetInstance()->TryCreateComponent<Collator>();
157 ASSERT_TRUE(result.isOk());
158 }
159 {
160 // Create a Collator with the "en" locale.
161 auto result =
162 LocaleService::GetInstance()->TryCreateComponentWithLocale<Collator>(
163 "en");
164 ASSERT_TRUE(result.isOk());
165 }
166 {
167 // Fallback to the app locale when an invalid one is used.
168 auto result =
169 LocaleService::GetInstance()->TryCreateComponentWithLocale<Collator>(
170 "$invalidName");
171 ASSERT_TRUE(result.isOk());
172 }
173 }
174