1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker *
4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker *
8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker *
10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker */
16*993b0882SAndroid Build Coastguard Worker
17*993b0882SAndroid Build Coastguard Worker #include "utils/resources.h"
18*993b0882SAndroid Build Coastguard Worker
19*993b0882SAndroid Build Coastguard Worker #include "utils/i18n/locale.h"
20*993b0882SAndroid Build Coastguard Worker #include "utils/resources_generated.h"
21*993b0882SAndroid Build Coastguard Worker #include "gmock/gmock.h"
22*993b0882SAndroid Build Coastguard Worker #include "gtest/gtest.h"
23*993b0882SAndroid Build Coastguard Worker
24*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
25*993b0882SAndroid Build Coastguard Worker namespace {
26*993b0882SAndroid Build Coastguard Worker
27*993b0882SAndroid Build Coastguard Worker class ResourcesTest : public testing::Test {
28*993b0882SAndroid Build Coastguard Worker protected:
ResourcesTest()29*993b0882SAndroid Build Coastguard Worker ResourcesTest() {}
30*993b0882SAndroid Build Coastguard Worker
BuildTestResources(bool add_default_language=true) const31*993b0882SAndroid Build Coastguard Worker std::string BuildTestResources(bool add_default_language = true) const {
32*993b0882SAndroid Build Coastguard Worker ResourcePoolT test_resources;
33*993b0882SAndroid Build Coastguard Worker
34*993b0882SAndroid Build Coastguard Worker // Test locales.
35*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
36*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "en";
37*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "US";
38*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
39*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "en";
40*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "GB";
41*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
42*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "de";
43*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "DE";
44*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
45*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "fr";
46*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "FR";
47*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
48*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "pt";
49*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "PT";
50*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
51*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "pt";
52*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
53*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "zh";
54*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->script = "Hans";
55*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "CN";
56*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
57*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "zh";
58*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
59*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "fr";
60*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->region = "CA";
61*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT);
62*993b0882SAndroid Build Coastguard Worker test_resources.locale.back()->language = "in";
63*993b0882SAndroid Build Coastguard Worker if (add_default_language) {
64*993b0882SAndroid Build Coastguard Worker test_resources.locale.emplace_back(new LanguageTagT); // default
65*993b0882SAndroid Build Coastguard Worker }
66*993b0882SAndroid Build Coastguard Worker
67*993b0882SAndroid Build Coastguard Worker // Test entries.
68*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.emplace_back(new ResourceEntryT);
69*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->name = /*resource_name=*/"A";
70*993b0882SAndroid Build Coastguard Worker
71*993b0882SAndroid Build Coastguard Worker // en-US, default
72*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
73*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content = "localize";
74*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(0);
75*993b0882SAndroid Build Coastguard Worker if (add_default_language) {
76*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(
77*993b0882SAndroid Build Coastguard Worker 10);
78*993b0882SAndroid Build Coastguard Worker }
79*993b0882SAndroid Build Coastguard Worker
80*993b0882SAndroid Build Coastguard Worker // en-GB
81*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
82*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content = "localise";
83*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(1);
84*993b0882SAndroid Build Coastguard Worker
85*993b0882SAndroid Build Coastguard Worker // de-DE
86*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
87*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content =
88*993b0882SAndroid Build Coastguard Worker "lokalisieren";
89*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(2);
90*993b0882SAndroid Build Coastguard Worker
91*993b0882SAndroid Build Coastguard Worker // fr-FR, fr-CA
92*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
93*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content =
94*993b0882SAndroid Build Coastguard Worker "localiser";
95*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(3);
96*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(8);
97*993b0882SAndroid Build Coastguard Worker
98*993b0882SAndroid Build Coastguard Worker // pt-PT
99*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
100*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content =
101*993b0882SAndroid Build Coastguard Worker "localizar";
102*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(4);
103*993b0882SAndroid Build Coastguard Worker
104*993b0882SAndroid Build Coastguard Worker // pt
105*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
106*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content =
107*993b0882SAndroid Build Coastguard Worker "concentrar";
108*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(5);
109*993b0882SAndroid Build Coastguard Worker
110*993b0882SAndroid Build Coastguard Worker // zh-Hans-CN
111*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
112*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content = "龙";
113*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(6);
114*993b0882SAndroid Build Coastguard Worker
115*993b0882SAndroid Build Coastguard Worker // zh
116*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
117*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content = "龍";
118*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(7);
119*993b0882SAndroid Build Coastguard Worker
120*993b0882SAndroid Build Coastguard Worker // in
121*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.emplace_back(new ResourceT);
122*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->content =
123*993b0882SAndroid Build Coastguard Worker "Apa kabar";
124*993b0882SAndroid Build Coastguard Worker test_resources.resource_entry.back()->resource.back()->locale.push_back(9);
125*993b0882SAndroid Build Coastguard Worker
126*993b0882SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder;
127*993b0882SAndroid Build Coastguard Worker builder.Finish(ResourcePool::Pack(builder, &test_resources));
128*993b0882SAndroid Build Coastguard Worker
129*993b0882SAndroid Build Coastguard Worker return std::string(
130*993b0882SAndroid Build Coastguard Worker reinterpret_cast<const char*>(builder.GetBufferPointer()),
131*993b0882SAndroid Build Coastguard Worker builder.GetSize());
132*993b0882SAndroid Build Coastguard Worker }
133*993b0882SAndroid Build Coastguard Worker };
134*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,CorrectlyHandlesExactMatch)135*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, CorrectlyHandlesExactMatch) {
136*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
137*993b0882SAndroid Build Coastguard Worker Resources resources(
138*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
139*993b0882SAndroid Build Coastguard Worker std::string content;
140*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("en-US")},
141*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
142*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localize", content);
143*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("en-GB")},
144*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
145*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localise", content);
146*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("pt-PT")},
147*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
148*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localizar", content);
149*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-Hans-CN")},
150*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
151*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龙", content);
152*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh")},
153*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
154*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龍", content);
155*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("fr-CA")},
156*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
157*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localiser", content);
158*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("id")},
159*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
160*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("Apa kabar", content);
161*993b0882SAndroid Build Coastguard Worker }
162*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,CorrectlyHandlesTie)163*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, CorrectlyHandlesTie) {
164*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
165*993b0882SAndroid Build Coastguard Worker Resources resources(
166*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
167*993b0882SAndroid Build Coastguard Worker // Uses first best match in case of a tie.
168*993b0882SAndroid Build Coastguard Worker std::string content;
169*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("en-CA")},
170*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
171*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localize", content);
172*993b0882SAndroid Build Coastguard Worker }
173*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,RequiresLanguageMatch)174*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, RequiresLanguageMatch) {
175*993b0882SAndroid Build Coastguard Worker {
176*993b0882SAndroid Build Coastguard Worker std::string test_resources =
177*993b0882SAndroid Build Coastguard Worker BuildTestResources(/*add_default_language=*/false);
178*993b0882SAndroid Build Coastguard Worker Resources resources(
179*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
180*993b0882SAndroid Build Coastguard Worker EXPECT_FALSE(resources.GetResourceContent({Locale::FromBCP47("es-US")},
181*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A",
182*993b0882SAndroid Build Coastguard Worker /*result=*/nullptr));
183*993b0882SAndroid Build Coastguard Worker }
184*993b0882SAndroid Build Coastguard Worker {
185*993b0882SAndroid Build Coastguard Worker std::string test_resources =
186*993b0882SAndroid Build Coastguard Worker BuildTestResources(/*add_default_language=*/true);
187*993b0882SAndroid Build Coastguard Worker Resources resources(
188*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
189*993b0882SAndroid Build Coastguard Worker std::string content;
190*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("es-US")},
191*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A",
192*993b0882SAndroid Build Coastguard Worker /*result=*/&content));
193*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localize", content);
194*993b0882SAndroid Build Coastguard Worker }
195*993b0882SAndroid Build Coastguard Worker }
196*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,HandlesFallback)197*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, HandlesFallback) {
198*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
199*993b0882SAndroid Build Coastguard Worker Resources resources(
200*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
201*993b0882SAndroid Build Coastguard Worker std::string content;
202*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("fr-CH")},
203*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
204*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localiser", content);
205*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-Hans")},
206*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
207*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龙", content);
208*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-Hans-ZZ")},
209*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
210*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龙", content);
211*993b0882SAndroid Build Coastguard Worker
212*993b0882SAndroid Build Coastguard Worker // Fallback to default, en-US.
213*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("ru")},
214*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
215*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localize", content);
216*993b0882SAndroid Build Coastguard Worker }
217*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,HandlesFallbackMultipleLocales)218*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, HandlesFallbackMultipleLocales) {
219*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
220*993b0882SAndroid Build Coastguard Worker Resources resources(
221*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
222*993b0882SAndroid Build Coastguard Worker std::string content;
223*993b0882SAndroid Build Coastguard Worker
224*993b0882SAndroid Build Coastguard Worker // Still use inexact match with primary locale if language matches,
225*993b0882SAndroid Build Coastguard Worker // even though secondary locale would match exactly.
226*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent(
227*993b0882SAndroid Build Coastguard Worker {Locale::FromBCP47("fr-CH"), Locale::FromBCP47("en-US")},
228*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
229*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localiser", content);
230*993b0882SAndroid Build Coastguard Worker
231*993b0882SAndroid Build Coastguard Worker // Use secondary language instead of default fallback if that is an exact
232*993b0882SAndroid Build Coastguard Worker // language match.
233*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent(
234*993b0882SAndroid Build Coastguard Worker {Locale::FromBCP47("ru"), Locale::FromBCP47("de")},
235*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
236*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("lokalisieren", content);
237*993b0882SAndroid Build Coastguard Worker
238*993b0882SAndroid Build Coastguard Worker // Use tertiary language.
239*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent(
240*993b0882SAndroid Build Coastguard Worker {Locale::FromBCP47("ru"), Locale::FromBCP47("it-IT"),
241*993b0882SAndroid Build Coastguard Worker Locale::FromBCP47("de")},
242*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
243*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("lokalisieren", content);
244*993b0882SAndroid Build Coastguard Worker
245*993b0882SAndroid Build Coastguard Worker // Default fallback if no locale matches.
246*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent(
247*993b0882SAndroid Build Coastguard Worker {Locale::FromBCP47("ru"), Locale::FromBCP47("it-IT"),
248*993b0882SAndroid Build Coastguard Worker Locale::FromBCP47("es")},
249*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
250*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("localize", content);
251*993b0882SAndroid Build Coastguard Worker }
252*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,PreferGenericCallback)253*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, PreferGenericCallback) {
254*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
255*993b0882SAndroid Build Coastguard Worker Resources resources(
256*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
257*993b0882SAndroid Build Coastguard Worker std::string content;
258*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("pt-BR")},
259*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
260*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("concentrar", content); // Falls back to pt, not pt-PT.
261*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-Hant")},
262*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
263*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龍", content); // Falls back to zh, not zh-Hans-CN.
264*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-Hant-CN")},
265*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
266*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龍", content); // Falls back to zh, not zh-Hans-CN.
267*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("zh-CN")},
268*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
269*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("龍", content); // Falls back to zh, not zh-Hans-CN.
270*993b0882SAndroid Build Coastguard Worker }
271*993b0882SAndroid Build Coastguard Worker
TEST_F(ResourcesTest,PreferGenericWhenGeneric)272*993b0882SAndroid Build Coastguard Worker TEST_F(ResourcesTest, PreferGenericWhenGeneric) {
273*993b0882SAndroid Build Coastguard Worker std::string test_resources = BuildTestResources();
274*993b0882SAndroid Build Coastguard Worker Resources resources(
275*993b0882SAndroid Build Coastguard Worker flatbuffers::GetRoot<ResourcePool>(test_resources.data()));
276*993b0882SAndroid Build Coastguard Worker std::string content;
277*993b0882SAndroid Build Coastguard Worker EXPECT_TRUE(resources.GetResourceContent({Locale::FromBCP47("pt")},
278*993b0882SAndroid Build Coastguard Worker /*resource_name=*/"A", &content));
279*993b0882SAndroid Build Coastguard Worker
280*993b0882SAndroid Build Coastguard Worker // Uses pt, not pt-PT.
281*993b0882SAndroid Build Coastguard Worker EXPECT_EQ("concentrar", content);
282*993b0882SAndroid Build Coastguard Worker }
283*993b0882SAndroid Build Coastguard Worker
284*993b0882SAndroid Build Coastguard Worker } // namespace
285*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
286