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