xref: /aosp_15_r20/external/libtextclassifier/native/utils/resources_test.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
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