xref: /aosp_15_r20/frameworks/minikin/tests/unittest/FontCollectionItemizeTest.cpp (revision 834a2baab5fdfc28e9a428ee87c7ea8f6a06a53d)
1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker  *
4*834a2baaSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker  *
8*834a2baaSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker  *
10*834a2baaSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker  * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker  */
16*834a2baaSAndroid Build Coastguard Worker 
17*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontCollection.h"
18*834a2baaSAndroid Build Coastguard Worker 
19*834a2baaSAndroid Build Coastguard Worker #include <memory>
20*834a2baaSAndroid Build Coastguard Worker 
21*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*834a2baaSAndroid Build Coastguard Worker 
23*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontFamily.h"
24*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontFileParser.h"
25*834a2baaSAndroid Build Coastguard Worker #include "minikin/LocaleList.h"
26*834a2baaSAndroid Build Coastguard Worker #include "minikin/MinikinPaint.h"
27*834a2baaSAndroid Build Coastguard Worker 
28*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
29*834a2baaSAndroid Build Coastguard Worker #include "FreeTypeMinikinFontForTest.h"
30*834a2baaSAndroid Build Coastguard Worker #include "Locale.h"
31*834a2baaSAndroid Build Coastguard Worker #include "LocaleListCache.h"
32*834a2baaSAndroid Build Coastguard Worker #include "MinikinInternal.h"
33*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
34*834a2baaSAndroid Build Coastguard Worker 
35*834a2baaSAndroid Build Coastguard Worker namespace minikin {
36*834a2baaSAndroid Build Coastguard Worker 
37*834a2baaSAndroid Build Coastguard Worker const char kItemizeFontXml[] = "itemize.xml";
38*834a2baaSAndroid Build Coastguard Worker const char kCherokeeFont[] = "Cherokee.ttf";
39*834a2baaSAndroid Build Coastguard Worker const char kEmojiFont[] = "Emoji.ttf";
40*834a2baaSAndroid Build Coastguard Worker const char kJAFont[] = "Ja.ttf";
41*834a2baaSAndroid Build Coastguard Worker const char kKOFont[] = "Ko.ttf";
42*834a2baaSAndroid Build Coastguard Worker const char kLatinBoldFont[] = "Bold.ttf";
43*834a2baaSAndroid Build Coastguard Worker const char kLatinBoldItalicFont[] = "BoldItalic.ttf";
44*834a2baaSAndroid Build Coastguard Worker const char kLatinFont[] = "Regular.ttf";
45*834a2baaSAndroid Build Coastguard Worker const char kLatinItalicFont[] = "Italic.ttf";
46*834a2baaSAndroid Build Coastguard Worker const char kZH_HansFont[] = "ZhHans.ttf";
47*834a2baaSAndroid Build Coastguard Worker const char kZH_HantFont[] = "ZhHant.ttf";
48*834a2baaSAndroid Build Coastguard Worker const char kAsciiFont[] = "Ascii.ttf";
49*834a2baaSAndroid Build Coastguard Worker 
50*834a2baaSAndroid Build Coastguard Worker const char kEmojiXmlFile[] = "emoji.xml";
51*834a2baaSAndroid Build Coastguard Worker const char kNoGlyphFont[] = "NoGlyphFont.ttf";
52*834a2baaSAndroid Build Coastguard Worker const char kColorEmojiFont[] = "ColorEmojiFont.ttf";
53*834a2baaSAndroid Build Coastguard Worker const char kTextEmojiFont[] = "TextEmojiFont.ttf";
54*834a2baaSAndroid Build Coastguard Worker const char kMixedEmojiFont[] = "ColorTextMixedEmojiFont.ttf";
55*834a2baaSAndroid Build Coastguard Worker 
56*834a2baaSAndroid Build Coastguard Worker const char kHasCmapFormat14Font[] = "NoCmapFormat14.ttf";
57*834a2baaSAndroid Build Coastguard Worker const char kNoCmapFormat14Font[] = "VariationSelectorTest-Regular.ttf";
58*834a2baaSAndroid Build Coastguard Worker 
59*834a2baaSAndroid Build Coastguard Worker struct Run {
60*834a2baaSAndroid Build Coastguard Worker     FakedFont fakedFont;
61*834a2baaSAndroid Build Coastguard Worker     int start;
62*834a2baaSAndroid Build Coastguard Worker     int end;
63*834a2baaSAndroid Build Coastguard Worker };
64*834a2baaSAndroid Build Coastguard Worker 
65*834a2baaSAndroid Build Coastguard Worker // Utility functions for calling itemize function.
itemize(const std::shared_ptr<FontCollection> & collection,const char * str,FontStyle style,const std::string & localeList)66*834a2baaSAndroid Build Coastguard Worker std::vector<Run> itemize(const std::shared_ptr<FontCollection>& collection, const char* str,
67*834a2baaSAndroid Build Coastguard Worker                          FontStyle style, const std::string& localeList) {
68*834a2baaSAndroid Build Coastguard Worker     const size_t BUF_SIZE = 256;
69*834a2baaSAndroid Build Coastguard Worker     uint16_t buf[BUF_SIZE];
70*834a2baaSAndroid Build Coastguard Worker     size_t len;
71*834a2baaSAndroid Build Coastguard Worker 
72*834a2baaSAndroid Build Coastguard Worker     ParseUnicode(buf, BUF_SIZE, str, &len, NULL);
73*834a2baaSAndroid Build Coastguard Worker     const uint32_t localeListId = registerLocaleList(localeList);
74*834a2baaSAndroid Build Coastguard Worker     auto result = collection->itemize(U16StringPiece(buf, len), style, localeListId,
75*834a2baaSAndroid Build Coastguard Worker                                       FamilyVariant::DEFAULT);
76*834a2baaSAndroid Build Coastguard Worker 
77*834a2baaSAndroid Build Coastguard Worker     // Check the same result has returned by calling with maxRun.
78*834a2baaSAndroid Build Coastguard Worker     for (uint32_t runMax = 1; runMax <= result.size(); runMax++) {
79*834a2baaSAndroid Build Coastguard Worker         auto resultWithRunMax = collection->itemize(U16StringPiece(buf, len), style, localeListId,
80*834a2baaSAndroid Build Coastguard Worker                                                     FamilyVariant::DEFAULT, runMax);
81*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(runMax, resultWithRunMax.size());
82*834a2baaSAndroid Build Coastguard Worker         for (uint32_t i = 0; i < runMax; ++i) {
83*834a2baaSAndroid Build Coastguard Worker             EXPECT_EQ(result[i].start, resultWithRunMax[i].start);
84*834a2baaSAndroid Build Coastguard Worker             EXPECT_EQ(result[i].end, resultWithRunMax[i].end);
85*834a2baaSAndroid Build Coastguard Worker             EXPECT_EQ(result[i].familyMatch, resultWithRunMax[i].familyMatch);
86*834a2baaSAndroid Build Coastguard Worker         }
87*834a2baaSAndroid Build Coastguard Worker     }
88*834a2baaSAndroid Build Coastguard Worker     std::vector<Run> runs;
89*834a2baaSAndroid Build Coastguard Worker     for (const auto& r : result) {
90*834a2baaSAndroid Build Coastguard Worker         runs.push_back(
91*834a2baaSAndroid Build Coastguard Worker                 {collection->getBestFont(U16StringPiece(buf, len), r, style), r.start, r.end});
92*834a2baaSAndroid Build Coastguard Worker     }
93*834a2baaSAndroid Build Coastguard Worker     return runs;
94*834a2baaSAndroid Build Coastguard Worker }
95*834a2baaSAndroid Build Coastguard Worker 
96*834a2baaSAndroid Build Coastguard Worker // Overloaded version for default font style.
itemize(const std::shared_ptr<FontCollection> & collection,const char * str,const std::string & localeList)97*834a2baaSAndroid Build Coastguard Worker std::vector<Run> itemize(const std::shared_ptr<FontCollection>& collection, const char* str,
98*834a2baaSAndroid Build Coastguard Worker                          const std::string& localeList) {
99*834a2baaSAndroid Build Coastguard Worker     return itemize(collection, str, FontStyle(), localeList);
100*834a2baaSAndroid Build Coastguard Worker }
101*834a2baaSAndroid Build Coastguard Worker 
102*834a2baaSAndroid Build Coastguard Worker // Overloaded version for empty locale list id.
itemize(const std::shared_ptr<FontCollection> & collection,const char * str,FontStyle style)103*834a2baaSAndroid Build Coastguard Worker std::vector<Run> itemize(const std::shared_ptr<FontCollection>& collection, const char* str,
104*834a2baaSAndroid Build Coastguard Worker                          FontStyle style) {
105*834a2baaSAndroid Build Coastguard Worker     return itemize(collection, str, style, "");
106*834a2baaSAndroid Build Coastguard Worker }
107*834a2baaSAndroid Build Coastguard Worker 
108*834a2baaSAndroid Build Coastguard Worker // Overloaded version for default font style and empty locale list id.
itemize(const std::shared_ptr<FontCollection> & collection,const char * str)109*834a2baaSAndroid Build Coastguard Worker std::vector<Run> itemize(const std::shared_ptr<FontCollection>& collection, const char* str) {
110*834a2baaSAndroid Build Coastguard Worker     return itemize(collection, str, FontStyle(), "");
111*834a2baaSAndroid Build Coastguard Worker }
112*834a2baaSAndroid Build Coastguard Worker 
113*834a2baaSAndroid Build Coastguard Worker // Utility function to obtain font path associated with run.
getFontName(const Run & run)114*834a2baaSAndroid Build Coastguard Worker std::string getFontName(const Run& run) {
115*834a2baaSAndroid Build Coastguard Worker     EXPECT_NE(nullptr, run.fakedFont.font.get());
116*834a2baaSAndroid Build Coastguard Worker     return getBasename(run.fakedFont.typeface()->GetFontPath());
117*834a2baaSAndroid Build Coastguard Worker }
118*834a2baaSAndroid Build Coastguard Worker 
119*834a2baaSAndroid Build Coastguard Worker // Utility function to obtain LocaleList from string.
registerAndGetLocaleList(const std::string & locale_string)120*834a2baaSAndroid Build Coastguard Worker const LocaleList& registerAndGetLocaleList(const std::string& locale_string) {
121*834a2baaSAndroid Build Coastguard Worker     return LocaleListCache::getById(LocaleListCache::getId(locale_string));
122*834a2baaSAndroid Build Coastguard Worker }
123*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_latin)124*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_latin) {
125*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
126*834a2baaSAndroid Build Coastguard Worker 
127*834a2baaSAndroid Build Coastguard Worker     const FontStyle kRegularStyle = FontStyle();
128*834a2baaSAndroid Build Coastguard Worker     const FontStyle kItalicStyle = FontStyle(FontStyle::Slant::ITALIC);
129*834a2baaSAndroid Build Coastguard Worker     const FontStyle kBoldStyle = FontStyle(FontStyle::Weight::BOLD);
130*834a2baaSAndroid Build Coastguard Worker     const FontStyle kBoldItalicStyle = FontStyle(FontStyle::Weight::BOLD, FontStyle::Slant::ITALIC);
131*834a2baaSAndroid Build Coastguard Worker 
132*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a' 'b' 'c' 'd' 'e'", kRegularStyle);
133*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
134*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
135*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
136*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
137*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
138*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
139*834a2baaSAndroid Build Coastguard Worker 
140*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' 'b' 'c' 'd' 'e'", kItalicStyle);
141*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
142*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
143*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
144*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinItalicFont, getFontName(runs[0]));
145*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
146*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
147*834a2baaSAndroid Build Coastguard Worker 
148*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' 'b' 'c' 'd' 'e'", kBoldStyle);
149*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
150*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
151*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
152*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinBoldFont, getFontName(runs[0]));
153*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
154*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
155*834a2baaSAndroid Build Coastguard Worker 
156*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' 'b' 'c' 'd' 'e'", kBoldItalicStyle);
157*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
158*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
159*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
160*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinBoldItalicFont, getFontName(runs[0]));
161*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
162*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
163*834a2baaSAndroid Build Coastguard Worker 
164*834a2baaSAndroid Build Coastguard Worker     // Continue if the specific characters (e.g. hyphen, comma, etc.) is
165*834a2baaSAndroid Build Coastguard Worker     // followed.
166*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' ',' '-' 'd' '!'", kRegularStyle);
167*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
168*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
169*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
170*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
171*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
172*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
173*834a2baaSAndroid Build Coastguard Worker 
174*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' ',' '-' 'd' '!'", kRegularStyle);
175*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
176*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
177*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
178*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
179*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
180*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
181*834a2baaSAndroid Build Coastguard Worker 
182*834a2baaSAndroid Build Coastguard Worker     // U+0301 (COMBINING ACUTE ACCENT) must be in the same run with preceding
183*834a2baaSAndroid Build Coastguard Worker     // chars if the font supports it.
184*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+0301", kRegularStyle);
185*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
186*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
187*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
188*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
189*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
190*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
191*834a2baaSAndroid Build Coastguard Worker }
192*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_combining)193*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_combining) {
194*834a2baaSAndroid Build Coastguard Worker     // The regular font and the Cherokee font both support U+0301 (COMBINING ACUTE ACCENT). Since
195*834a2baaSAndroid Build Coastguard Worker     // it's a combining mark, it should come from whatever font the base character comes from.
196*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
197*834a2baaSAndroid Build Coastguard Worker 
198*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a' U+0301");
199*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
200*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
201*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
202*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
203*834a2baaSAndroid Build Coastguard Worker 
204*834a2baaSAndroid Build Coastguard Worker     // CHEROKEE LETTER A, COMBINING ACUTE ACCENT
205*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+13A0 U+0301");
206*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
207*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
208*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
209*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kCherokeeFont, getFontName(runs[0]));
210*834a2baaSAndroid Build Coastguard Worker 
211*834a2baaSAndroid Build Coastguard Worker     // CHEROKEE LETTER A, COMBINING ACUTE ACCENT, COMBINING ACUTE ACCENT
212*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+13A0 U+0301 U+0301");
213*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
214*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
215*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
216*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kCherokeeFont, getFontName(runs[0]));
217*834a2baaSAndroid Build Coastguard Worker 
218*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+0301");
219*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
220*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
221*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
222*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
223*834a2baaSAndroid Build Coastguard Worker 
224*834a2baaSAndroid Build Coastguard Worker     // COMBINING ACUTE ACCENT, CHEROKEE LETTER A, COMBINING ACUTE ACCENT
225*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+0301 U+13A0 U+0301");
226*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
227*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
228*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
229*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
230*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
231*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[1].end);
232*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kCherokeeFont, getFontName(runs[1]));
233*834a2baaSAndroid Build Coastguard Worker }
234*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_emoji)235*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_emoji) {
236*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
237*834a2baaSAndroid Build Coastguard Worker 
238*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+1F469 U+1F467");
239*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
240*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
241*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
242*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
243*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
244*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
245*834a2baaSAndroid Build Coastguard Worker 
246*834a2baaSAndroid Build Coastguard Worker     // U+20E3(COMBINING ENCLOSING KEYCAP) must be in the same run with preceding
247*834a2baaSAndroid Build Coastguard Worker     // character if the font supports.
248*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'0' U+20E3");
249*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
250*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
251*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
252*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
253*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
254*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
255*834a2baaSAndroid Build Coastguard Worker 
256*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+1F470 U+20E3");
257*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
258*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
259*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
260*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
261*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
262*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
263*834a2baaSAndroid Build Coastguard Worker 
264*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+1F470 U+20E3");
265*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
266*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
267*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
268*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
269*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
270*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
271*834a2baaSAndroid Build Coastguard Worker 
272*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
273*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[1].end);
274*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[1]));
275*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
276*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
277*834a2baaSAndroid Build Coastguard Worker 
278*834a2baaSAndroid Build Coastguard Worker     // Currently there is no fonts which has a glyph for 'a' + U+20E3, so they
279*834a2baaSAndroid Build Coastguard Worker     // are splitted into two.
280*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+20E3");
281*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
282*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
283*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
284*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
285*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
286*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
287*834a2baaSAndroid Build Coastguard Worker 
288*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
289*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].end);
290*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[1]));
291*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
292*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
293*834a2baaSAndroid Build Coastguard Worker }
294*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_non_latin)295*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_non_latin) {
296*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
297*834a2baaSAndroid Build Coastguard Worker 
298*834a2baaSAndroid Build Coastguard Worker     // All Japanese Hiragana characters.
299*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", "ja-JP");
300*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
301*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
302*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
303*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
304*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
305*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
306*834a2baaSAndroid Build Coastguard Worker 
307*834a2baaSAndroid Build Coastguard Worker     // All Korean Hangul characters.
308*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+B300 U+D55C U+BBFC U+AD6D", "en-US");
309*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
310*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
311*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
312*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kKOFont, getFontName(runs[0]));
313*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
314*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
315*834a2baaSAndroid Build Coastguard Worker 
316*834a2baaSAndroid Build Coastguard Worker     // All Han characters ja, zh-Hans font having.
317*834a2baaSAndroid Build Coastguard Worker     // Japanese font should be selected if the specified language is Japanese.
318*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+81ED U+82B1 U+5FCD", "ja-JP");
319*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
320*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
321*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
322*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
323*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
324*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
325*834a2baaSAndroid Build Coastguard Worker 
326*834a2baaSAndroid Build Coastguard Worker     // Simplified Chinese font should be selected if the specified language is Simplified
327*834a2baaSAndroid Build Coastguard Worker     // Chinese.
328*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+81ED U+82B1 U+5FCD", "zh-Hans");
329*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
330*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
331*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
332*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
333*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
334*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
335*834a2baaSAndroid Build Coastguard Worker 
336*834a2baaSAndroid Build Coastguard Worker     // Fallbacks to other fonts if there is no glyph in the specified language's
337*834a2baaSAndroid Build Coastguard Worker     // font. There is no character U+4F60 in Japanese.
338*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+81ED U+4F60 U+5FCD", "ja-JP");
339*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(3U, runs.size());
340*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
341*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
342*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
343*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
344*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
345*834a2baaSAndroid Build Coastguard Worker 
346*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
347*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].end);
348*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[1]));
349*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
350*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
351*834a2baaSAndroid Build Coastguard Worker 
352*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[2].start);
353*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[2].end);
354*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[2]));
355*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeBold());
356*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeItalic());
357*834a2baaSAndroid Build Coastguard Worker 
358*834a2baaSAndroid Build Coastguard Worker     // Tone mark.
359*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4444 U+302D", "");
360*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
361*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
362*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
363*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
364*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
365*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
366*834a2baaSAndroid Build Coastguard Worker 
367*834a2baaSAndroid Build Coastguard Worker     // Both zh-Hant and ja fonts support U+242EE, but zh-Hans doesn't.
368*834a2baaSAndroid Build Coastguard Worker     // Here, ja and zh-Hant font should have the same score but ja should be selected since it is
369*834a2baaSAndroid Build Coastguard Worker     // listed before zh-Hant.
370*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE", "zh-Hans");
371*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
372*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
373*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
374*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
375*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
376*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
377*834a2baaSAndroid Build Coastguard Worker }
378*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_mixed)379*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_mixed) {
380*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
381*834a2baaSAndroid Build Coastguard Worker 
382*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a' U+4F60 'b' U+4F60 'c'", "en-US");
383*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(5U, runs.size());
384*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
385*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
386*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
387*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
388*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
389*834a2baaSAndroid Build Coastguard Worker 
390*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
391*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].end);
392*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[1]));
393*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
394*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
395*834a2baaSAndroid Build Coastguard Worker 
396*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[2].start);
397*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[2].end);
398*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[2]));
399*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeBold());
400*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeItalic());
401*834a2baaSAndroid Build Coastguard Worker 
402*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[3].start);
403*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[3].end);
404*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[3]));
405*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[3].fakedFont.fakery.isFakeBold());
406*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[3].fakedFont.fakery.isFakeItalic());
407*834a2baaSAndroid Build Coastguard Worker 
408*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[4].start);
409*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[4].end);
410*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[4]));
411*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[4].fakedFont.fakery.isFakeBold());
412*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[4].fakedFont.fakery.isFakeItalic());
413*834a2baaSAndroid Build Coastguard Worker }
414*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_variationSelector)415*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_variationSelector) {
416*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
417*834a2baaSAndroid Build Coastguard Worker 
418*834a2baaSAndroid Build Coastguard Worker     // A glyph for U+4FAE is provided by both Japanese font and Simplified
419*834a2baaSAndroid Build Coastguard Worker     // Chinese font. Also a glyph for U+242EE is provided by both Japanese and
420*834a2baaSAndroid Build Coastguard Worker     // Traditional Chinese font.  To avoid effects of device default locale,
421*834a2baaSAndroid Build Coastguard Worker     // explicitly specify the locale.
422*834a2baaSAndroid Build Coastguard Worker 
423*834a2baaSAndroid Build Coastguard Worker     // U+4FAE is available in both zh_Hans and ja font, but U+4FAE,U+FE00 is
424*834a2baaSAndroid Build Coastguard Worker     // only available in ja font.
425*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+4FAE", "zh-Hans");
426*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
427*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
428*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
429*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
430*834a2baaSAndroid Build Coastguard Worker 
431*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4FAE U+FE00", "zh-Hans");
432*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
433*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
434*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
435*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
436*834a2baaSAndroid Build Coastguard Worker 
437*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4FAE U+4FAE U+FE00", "zh-Hans");
438*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
439*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
440*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
441*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
442*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
443*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[1].end);
444*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
445*834a2baaSAndroid Build Coastguard Worker 
446*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4FAE U+4FAE U+FE00 U+4FAE", "zh-Hans");
447*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(3U, runs.size());
448*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
449*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
450*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
451*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
452*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[1].end);
453*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
454*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[2].start);
455*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[2].end);
456*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[2]));
457*834a2baaSAndroid Build Coastguard Worker 
458*834a2baaSAndroid Build Coastguard Worker     // Validation selector after validation selector.
459*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4FAE U+FE00 U+FE00", "zh-Hans");
460*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
461*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
462*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
463*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
464*834a2baaSAndroid Build Coastguard Worker 
465*834a2baaSAndroid Build Coastguard Worker     // No font supports U+242EE U+FE0E.
466*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+4FAE U+FE0E", "zh-Hans");
467*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
468*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
469*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
470*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
471*834a2baaSAndroid Build Coastguard Worker 
472*834a2baaSAndroid Build Coastguard Worker     // Surrogate pairs handling.
473*834a2baaSAndroid Build Coastguard Worker     // U+242EE is available in ja font and zh_Hant font.
474*834a2baaSAndroid Build Coastguard Worker     // U+242EE U+FE00 is available only in ja font.
475*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE", "zh-Hant");
476*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
477*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
478*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
479*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
480*834a2baaSAndroid Build Coastguard Worker 
481*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+FE00", "zh-Hant");
482*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
483*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
484*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
485*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
486*834a2baaSAndroid Build Coastguard Worker 
487*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+242EE U+FE00", "zh-Hant");
488*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
489*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
490*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
491*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
492*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
493*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[1].end);
494*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
495*834a2baaSAndroid Build Coastguard Worker 
496*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+242EE U+FE00 U+242EE", "zh-Hant");
497*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(3U, runs.size());
498*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
499*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
500*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
501*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
502*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[1].end);
503*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
504*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[2].start);
505*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(7, runs[2].end);
506*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[2]));
507*834a2baaSAndroid Build Coastguard Worker 
508*834a2baaSAndroid Build Coastguard Worker     // Validation selector after validation selector.
509*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+FE00 U+FE00", "zh-Hans");
510*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
511*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
512*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
513*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
514*834a2baaSAndroid Build Coastguard Worker 
515*834a2baaSAndroid Build Coastguard Worker     // No font supports U+242EE U+FE0E
516*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+FE0E", "zh-Hant");
517*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
518*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
519*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
520*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
521*834a2baaSAndroid Build Coastguard Worker 
522*834a2baaSAndroid Build Coastguard Worker     // Isolated variation selector supplement.
523*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FE00", "");
524*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
525*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
526*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
527*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.font.get() == nullptr || kLatinFont == getFontName(runs[0]));
528*834a2baaSAndroid Build Coastguard Worker 
529*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FE00", "zh-Hant");
530*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
531*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
532*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
533*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.font.get() == nullptr || kLatinFont == getFontName(runs[0]));
534*834a2baaSAndroid Build Coastguard Worker 
535*834a2baaSAndroid Build Coastguard Worker     // First font family (Regular.ttf) supports U+203C but doesn't support U+203C U+FE0F.
536*834a2baaSAndroid Build Coastguard Worker     // Emoji.ttf font supports U+203C U+FE0F.  Emoji.ttf should be selected.
537*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C U+FE0F", "zh-Hant");
538*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
539*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
540*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
541*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
542*834a2baaSAndroid Build Coastguard Worker 
543*834a2baaSAndroid Build Coastguard Worker     // First font family (Regular.ttf) supports U+203C U+FE0E.
544*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C U+FE0E", "zh-Hant");
545*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
546*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
547*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
548*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
549*834a2baaSAndroid Build Coastguard Worker }
550*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_variationSelectorSupplement)551*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_variationSelectorSupplement) {
552*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
553*834a2baaSAndroid Build Coastguard Worker 
554*834a2baaSAndroid Build Coastguard Worker     // A glyph for U+845B is provided by both Japanese font and Simplified
555*834a2baaSAndroid Build Coastguard Worker     // Chinese font. Also a glyph for U+242EE is provided by both Japanese and
556*834a2baaSAndroid Build Coastguard Worker     // Traditional Chinese font.  To avoid effects of device default locale,
557*834a2baaSAndroid Build Coastguard Worker     // explicitly specify the locale.
558*834a2baaSAndroid Build Coastguard Worker 
559*834a2baaSAndroid Build Coastguard Worker     // U+845B is available in both zh_Hans and ja font, but U+845B,U+E0100 is
560*834a2baaSAndroid Build Coastguard Worker     // only available in ja font.
561*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+845B", "zh-Hans");
562*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
563*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
564*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
565*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
566*834a2baaSAndroid Build Coastguard Worker 
567*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+845B U+E0100", "zh-Hans");
568*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
569*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
570*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
571*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
572*834a2baaSAndroid Build Coastguard Worker 
573*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+845B U+845B U+E0100", "zh-Hans");
574*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
575*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
576*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
577*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
578*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
579*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[1].end);
580*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
581*834a2baaSAndroid Build Coastguard Worker 
582*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+845B U+845B U+E0100 U+845B", "zh-Hans");
583*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(3U, runs.size());
584*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
585*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
586*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
587*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[1].start);
588*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[1].end);
589*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
590*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[2].start);
591*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[2].end);
592*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[2]));
593*834a2baaSAndroid Build Coastguard Worker 
594*834a2baaSAndroid Build Coastguard Worker     // Validation selector after validation selector.
595*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+845B U+E0100 U+E0100", "zh-Hans");
596*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
597*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
598*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
599*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
600*834a2baaSAndroid Build Coastguard Worker 
601*834a2baaSAndroid Build Coastguard Worker     // No font supports U+845B U+E01E0.
602*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+845B U+E01E0", "zh-Hans");
603*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
604*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
605*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
606*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
607*834a2baaSAndroid Build Coastguard Worker 
608*834a2baaSAndroid Build Coastguard Worker     // Isolated variation selector supplement
609*834a2baaSAndroid Build Coastguard Worker     // Surrogate pairs handling.
610*834a2baaSAndroid Build Coastguard Worker     // U+242EE is available in ja font and zh_Hant font.
611*834a2baaSAndroid Build Coastguard Worker     // U+242EE U+E0100 is available only in ja font.
612*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE", "zh-Hant");
613*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
614*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
615*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
616*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
617*834a2baaSAndroid Build Coastguard Worker 
618*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+E0101", "zh-Hant");
619*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
620*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
621*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
622*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
623*834a2baaSAndroid Build Coastguard Worker 
624*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+242EE U+E0101", "zh-Hant");
625*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
626*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
627*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
628*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
629*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
630*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(6, runs[1].end);
631*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
632*834a2baaSAndroid Build Coastguard Worker 
633*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+242EE U+E0101 U+242EE", "zh-Hant");
634*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(3U, runs.size());
635*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
636*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
637*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
638*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
639*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(6, runs[1].end);
640*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[1]));
641*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(6, runs[2].start);
642*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, runs[2].end);
643*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[2]));
644*834a2baaSAndroid Build Coastguard Worker 
645*834a2baaSAndroid Build Coastguard Worker     // Validation selector after validation selector.
646*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+E0100 U+E0100", "zh-Hant");
647*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
648*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
649*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(6, runs[0].end);
650*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
651*834a2baaSAndroid Build Coastguard Worker 
652*834a2baaSAndroid Build Coastguard Worker     // No font supports U+242EE U+E01E0.
653*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+242EE U+E01E0", "zh-Hant");
654*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
655*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
656*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
657*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
658*834a2baaSAndroid Build Coastguard Worker 
659*834a2baaSAndroid Build Coastguard Worker     // Isolated variation selector supplement.
660*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+E0100", "");
661*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
662*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
663*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
664*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.font.get() == nullptr || kLatinFont == getFontName(runs[0]));
665*834a2baaSAndroid Build Coastguard Worker 
666*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+E0100", "zh-Hant");
667*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
668*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
669*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
670*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.font.get() == nullptr || kLatinFont == getFontName(runs[0]));
671*834a2baaSAndroid Build Coastguard Worker }
672*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_no_crash)673*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_no_crash) {
674*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
675*834a2baaSAndroid Build Coastguard Worker 
676*834a2baaSAndroid Build Coastguard Worker     // Broken Surrogate pairs. Check only not crashing.
677*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a' U+D83D 'a'");
678*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+DC69 'a'");
679*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+D83D U+D83D 'a'");
680*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+DC69 U+DC69 'a'");
681*834a2baaSAndroid Build Coastguard Worker 
682*834a2baaSAndroid Build Coastguard Worker     // Isolated variation selector. Check only not crashing.
683*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FE00 U+FE00");
684*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+E0100 U+E0100");
685*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FE00 U+E0100");
686*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+E0100 U+FE00");
687*834a2baaSAndroid Build Coastguard Worker 
688*834a2baaSAndroid Build Coastguard Worker     // Tone mark only. Check only not crashing.
689*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+302D");
690*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+302D U+302D");
691*834a2baaSAndroid Build Coastguard Worker 
692*834a2baaSAndroid Build Coastguard Worker     // Tone mark and variation selector mixed. Check only not crashing.
693*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FE00 U+302D U+E0100");
694*834a2baaSAndroid Build Coastguard Worker }
695*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_fakery)696*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_fakery) {
697*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
698*834a2baaSAndroid Build Coastguard Worker 
699*834a2baaSAndroid Build Coastguard Worker     FontStyle kBoldStyle(FontStyle::Weight::BOLD);
700*834a2baaSAndroid Build Coastguard Worker     FontStyle kItalicStyle(FontStyle::Slant::ITALIC);
701*834a2baaSAndroid Build Coastguard Worker     FontStyle kBoldItalicStyle(FontStyle::Weight::BOLD, FontStyle::Slant::ITALIC);
702*834a2baaSAndroid Build Coastguard Worker 
703*834a2baaSAndroid Build Coastguard Worker     // Currently there is no italic or bold font for Japanese. FontFakery has
704*834a2baaSAndroid Build Coastguard Worker     // the differences between desired and actual font style.
705*834a2baaSAndroid Build Coastguard Worker 
706*834a2baaSAndroid Build Coastguard Worker     // All Japanese Hiragana characters.
707*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kBoldStyle, "ja-JP");
708*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
709*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
710*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
711*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
712*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeBold());
713*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
714*834a2baaSAndroid Build Coastguard Worker 
715*834a2baaSAndroid Build Coastguard Worker     // All Japanese Hiragana characters.
716*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kItalicStyle, "ja-JP");
717*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
718*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
719*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
720*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
721*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
722*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeItalic());
723*834a2baaSAndroid Build Coastguard Worker 
724*834a2baaSAndroid Build Coastguard Worker     // All Japanese Hiragana characters.
725*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kBoldItalicStyle, "ja-JP");
726*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
727*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
728*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
729*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
730*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeBold());
731*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeItalic());
732*834a2baaSAndroid Build Coastguard Worker }
733*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_vs_sequence_but_no_base_char)734*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_vs_sequence_but_no_base_char) {
735*834a2baaSAndroid Build Coastguard Worker     // kVSTestFont supports U+717D U+FE02 but doesn't support U+717D.
736*834a2baaSAndroid Build Coastguard Worker     // kVSTestFont should be selected for U+717D U+FE02 even if it does not support the base code
737*834a2baaSAndroid Build Coastguard Worker     // point.
738*834a2baaSAndroid Build Coastguard Worker     const std::string kVSTestFont = "VariationSelectorTest-Regular.ttf";
739*834a2baaSAndroid Build Coastguard Worker 
740*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families;
741*834a2baaSAndroid Build Coastguard Worker     families.push_back(buildFontFamily(kLatinFont));
742*834a2baaSAndroid Build Coastguard Worker     families.push_back(buildFontFamily(kVSTestFont));
743*834a2baaSAndroid Build Coastguard Worker 
744*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontCollection> collection(FontCollection::create(families));
745*834a2baaSAndroid Build Coastguard Worker 
746*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+717D U+FE02");
747*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
748*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
749*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
750*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kVSTestFont, getFontName(runs[0]));
751*834a2baaSAndroid Build Coastguard Worker }
752*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_format_chars)753*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_format_chars) {
754*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
755*834a2baaSAndroid Build Coastguard Worker 
756*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a' U+061C 'b'");
757*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
758*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
759*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
760*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
761*834a2baaSAndroid Build Coastguard Worker 
762*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a' U+200D 'b'");
763*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
764*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
765*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
766*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
767*834a2baaSAndroid Build Coastguard Worker 
768*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+3042 U+061C U+3042");
769*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
770*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
771*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
772*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
773*834a2baaSAndroid Build Coastguard Worker 
774*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+061C 'b'");
775*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
776*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
777*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
778*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
779*834a2baaSAndroid Build Coastguard Worker 
780*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+061C U+3042");
781*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
782*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
783*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
784*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kJAFont, getFontName(runs[0]));
785*834a2baaSAndroid Build Coastguard Worker 
786*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+061C");
787*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
788*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
789*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
790*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
791*834a2baaSAndroid Build Coastguard Worker 
792*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+061C U+061C U+061C");
793*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
794*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
795*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
796*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
797*834a2baaSAndroid Build Coastguard Worker 
798*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+200D U+20E3");
799*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
800*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
801*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
802*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
803*834a2baaSAndroid Build Coastguard Worker 
804*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+200D");
805*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
806*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
807*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
808*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kLatinFont, getFontName(runs[0]));
809*834a2baaSAndroid Build Coastguard Worker 
810*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+20E3");
811*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
812*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
813*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
814*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
815*834a2baaSAndroid Build Coastguard Worker }
816*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_LocaleScore)817*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_LocaleScore) {
818*834a2baaSAndroid Build Coastguard Worker     struct TestCase {
819*834a2baaSAndroid Build Coastguard Worker         std::string userPreferredLocale;
820*834a2baaSAndroid Build Coastguard Worker         std::vector<std::string> fontLocales;
821*834a2baaSAndroid Build Coastguard Worker         int selectedFontIndex;
822*834a2baaSAndroid Build Coastguard Worker     } testCases[] = {
823*834a2baaSAndroid Build Coastguard Worker             // Font can specify empty locale.
824*834a2baaSAndroid Build Coastguard Worker             {"und", {"", ""}, 0},
825*834a2baaSAndroid Build Coastguard Worker             {"und", {"", "en-Latn"}, 0},
826*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"", ""}, 0},
827*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"", "en-Latn"}, 1},
828*834a2baaSAndroid Build Coastguard Worker 
829*834a2baaSAndroid Build Coastguard Worker             // Single user preferred locale.
830*834a2baaSAndroid Build Coastguard Worker             // Exact match case
831*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"en-Latn", "ja-Jpan"}, 0},
832*834a2baaSAndroid Build Coastguard Worker             {"ja-Jpan", {"en-Latn", "ja-Jpan"}, 1},
833*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 0},
834*834a2baaSAndroid Build Coastguard Worker             {"nl-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 1},
835*834a2baaSAndroid Build Coastguard Worker             {"es-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 2},
836*834a2baaSAndroid Build Coastguard Worker             {"es-Latn", {"en-Latn", "en-Latn", "nl-Latn"}, 0},
837*834a2baaSAndroid Build Coastguard Worker 
838*834a2baaSAndroid Build Coastguard Worker             // Exact script match case
839*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"nl-Latn", "e-Latn"}, 0},
840*834a2baaSAndroid Build Coastguard Worker             {"en-Arab", {"nl-Latn", "ar-Arab"}, 1},
841*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"be-Latn", "ar-Arab", "d-Beng"}, 0},
842*834a2baaSAndroid Build Coastguard Worker             {"en-Arab", {"be-Latn", "ar-Arab", "d-Beng"}, 1},
843*834a2baaSAndroid Build Coastguard Worker             {"en-Beng", {"be-Latn", "ar-Arab", "d-Beng"}, 2},
844*834a2baaSAndroid Build Coastguard Worker             {"en-Beng", {"be-Latn", "ar-Beng", "d-Beng"}, 1},
845*834a2baaSAndroid Build Coastguard Worker             {"zh-Hant", {"zh-Hant", "zh-Hans"}, 0},
846*834a2baaSAndroid Build Coastguard Worker             {"zh-Hans", {"zh-Hant", "zh-Hans"}, 1},
847*834a2baaSAndroid Build Coastguard Worker 
848*834a2baaSAndroid Build Coastguard Worker             // Subscript match case, e.g. Jpan supports Hira.
849*834a2baaSAndroid Build Coastguard Worker             {"en-Hira", {"ja-Jpan"}, 0},
850*834a2baaSAndroid Build Coastguard Worker             {"zh-Hani", {"zh-Hans", "zh-Hant"}, 0},
851*834a2baaSAndroid Build Coastguard Worker             {"zh-Hani", {"zh-Hant", "zh-Hans"}, 0},
852*834a2baaSAndroid Build Coastguard Worker             {"en-Hira", {"zh-Hant", "ja-Jpan", "ja-Jpan"}, 1},
853*834a2baaSAndroid Build Coastguard Worker 
854*834a2baaSAndroid Build Coastguard Worker             // Language match case
855*834a2baaSAndroid Build Coastguard Worker             {"ja-Latn", {"zh-Latn", "ja-Latn"}, 1},
856*834a2baaSAndroid Build Coastguard Worker             {"zh-Latn", {"zh-Latn", "ja-Latn"}, 0},
857*834a2baaSAndroid Build Coastguard Worker             {"ja-Latn", {"zh-Latn", "ja-Latn"}, 1},
858*834a2baaSAndroid Build Coastguard Worker             {"ja-Latn", {"zh-Latn", "ja-Latn", "ja-Latn"}, 1},
859*834a2baaSAndroid Build Coastguard Worker 
860*834a2baaSAndroid Build Coastguard Worker             // Mixed case
861*834a2baaSAndroid Build Coastguard Worker             // Script/subscript match is strongest.
862*834a2baaSAndroid Build Coastguard Worker             {"ja-Jpan", {"en-Latn", "ja-Latn", "en-Jpan"}, 2},
863*834a2baaSAndroid Build Coastguard Worker             {"ja-Hira", {"en-Latn", "ja-Latn", "en-Jpan"}, 2},
864*834a2baaSAndroid Build Coastguard Worker             {"ja-Hira", {"en-Latn", "ja-Latn", "en-Jpan", "en-Jpan"}, 2},
865*834a2baaSAndroid Build Coastguard Worker 
866*834a2baaSAndroid Build Coastguard Worker             // Language match only happens if the script matches.
867*834a2baaSAndroid Build Coastguard Worker             {"ja-Hira", {"en-Latn", "ja-Latn"}, 0},
868*834a2baaSAndroid Build Coastguard Worker             {"ja-Hira", {"en-Jpan", "ja-Jpan"}, 1},
869*834a2baaSAndroid Build Coastguard Worker 
870*834a2baaSAndroid Build Coastguard Worker             // Multiple locales.
871*834a2baaSAndroid Build Coastguard Worker             // Even if all fonts have the same score, use the 2nd locale for better selection.
872*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Jpan", {"zh-Hant", "zh-Hans", "ja-Jpan"}, 2},
873*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn"}, 2},
874*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,br-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn"}, 2},
875*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,br-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn", "nl-Latn"}, 2},
876*834a2baaSAndroid Build Coastguard Worker 
877*834a2baaSAndroid Build Coastguard Worker             // Script score.
878*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Jpan", {"en-Arab", "en-Jpan"}, 1},
879*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Jpan", {"en-Arab", "en-Jpan", "en-Jpan"}, 1},
880*834a2baaSAndroid Build Coastguard Worker 
881*834a2baaSAndroid Build Coastguard Worker             // Language match case
882*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Latn", {"bd-Latn", "ja-Latn"}, 1},
883*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Latn", {"bd-Latn", "ja-Latn", "ja-Latn"}, 1},
884*834a2baaSAndroid Build Coastguard Worker 
885*834a2baaSAndroid Build Coastguard Worker             // Language match only happens if the script matches.
886*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ar-Arab", {"en-Beng", "ar-Arab"}, 1},
887*834a2baaSAndroid Build Coastguard Worker 
888*834a2baaSAndroid Build Coastguard Worker             // Multiple locales in the font settings.
889*834a2baaSAndroid Build Coastguard Worker             {"ko-Jamo", {"ja-Jpan", "ko-Kore", "ko-Kore,ko-Jamo"}, 2},
890*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"ja-Jpan", "en-Latn,ja-Jpan"}, 1},
891*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"ja-Jpan", "ja-Jpan,en-Latn"}, 1},
892*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"ja-Jpan,zh-Hant", "en-Latn,ja-Jpan", "en-Latn"}, 1},
893*834a2baaSAndroid Build Coastguard Worker             {"en-Latn", {"zh-Hant,ja-Jpan", "ja-Jpan,en-Latn", "en-Latn"}, 1},
894*834a2baaSAndroid Build Coastguard Worker 
895*834a2baaSAndroid Build Coastguard Worker             // Kore = Hang + Hani, etc.
896*834a2baaSAndroid Build Coastguard Worker             {"ko-Kore", {"ko-Hang", "ko-Jamo,ko-Hani", "ko-Hang,ko-Hani"}, 2},
897*834a2baaSAndroid Build Coastguard Worker             {"ja-Hrkt", {"ja-Hira", "ja-Kana", "ja-Hira,ja-Kana"}, 2},
898*834a2baaSAndroid Build Coastguard Worker             {"ja-Jpan", {"ja-Hira", "ja-Kana", "ja-Hani", "ja-Hira,ja-Kana,ja-Hani"}, 3},
899*834a2baaSAndroid Build Coastguard Worker             {"zh-Hanb", {"zh-Hant", "zh-Bopo", "zh-Hant,zh-Bopo"}, 2},
900*834a2baaSAndroid Build Coastguard Worker             {"zh-Hanb", {"ja-Hanb", "zh-Hant,zh-Bopo"}, 1},
901*834a2baaSAndroid Build Coastguard Worker 
902*834a2baaSAndroid Build Coastguard Worker             // Language match with unified subscript bits.
903*834a2baaSAndroid Build Coastguard Worker             {"zh-Hanb", {"zh-Hant", "zh-Bopo", "ja-Hant,ja-Bopo", "zh-Hant,zh-Bopo"}, 3},
904*834a2baaSAndroid Build Coastguard Worker             {"zh-Hanb", {"zh-Hant", "zh-Bopo", "ja-Hant,zh-Bopo", "zh-Hant,zh-Bopo"}, 3},
905*834a2baaSAndroid Build Coastguard Worker 
906*834a2baaSAndroid Build Coastguard Worker             // Two elements subtag matching: language and subtag or language or script.
907*834a2baaSAndroid Build Coastguard Worker             {"ja-Kana-u-em-emoji", {"zh-Hant", "ja-Kana"}, 1},
908*834a2baaSAndroid Build Coastguard Worker             {"ja-Kana-u-em-emoji", {"zh-Hant", "ja-Kana", "ja-Zsye"}, 2},
909*834a2baaSAndroid Build Coastguard Worker             {"ja-Zsym-u-em-emoji", {"ja-Kana", "ja-Zsym", "ja-Zsye"}, 2},
910*834a2baaSAndroid Build Coastguard Worker 
911*834a2baaSAndroid Build Coastguard Worker             // One element subtag matching: subtag only or script only.
912*834a2baaSAndroid Build Coastguard Worker             {"en-Latn-u-em-emoji", {"ja-Latn", "ja-Zsye"}, 1},
913*834a2baaSAndroid Build Coastguard Worker             {"en-Zsym-u-em-emoji", {"ja-Zsym", "ja-Zsye"}, 1},
914*834a2baaSAndroid Build Coastguard Worker             {"en-Zsye-u-em-text", {"ja-Zsym", "ja-Zsye"}, 0},
915*834a2baaSAndroid Build Coastguard Worker 
916*834a2baaSAndroid Build Coastguard Worker             // Multiple locale list with subtags.
917*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,ja-Jpan-u-em-text", {"en-Latn", "en-Zsye", "en-Zsym"}, 0},
918*834a2baaSAndroid Build Coastguard Worker             {"en-Latn,en-Zsye,ja-Jpan-u-em-text", {"zh", "en-Zsye", "en-Zsym"}, 1},
919*834a2baaSAndroid Build Coastguard Worker     };
920*834a2baaSAndroid Build Coastguard Worker 
921*834a2baaSAndroid Build Coastguard Worker     for (auto testCase : testCases) {
922*834a2baaSAndroid Build Coastguard Worker         std::string fontLocaleStr = "{";
923*834a2baaSAndroid Build Coastguard Worker         for (size_t i = 0; i < testCase.fontLocales.size(); ++i) {
924*834a2baaSAndroid Build Coastguard Worker             if (i != 0) {
925*834a2baaSAndroid Build Coastguard Worker                 fontLocaleStr += ", ";
926*834a2baaSAndroid Build Coastguard Worker             }
927*834a2baaSAndroid Build Coastguard Worker             fontLocaleStr += "\"" + testCase.fontLocales[i] + "\"";
928*834a2baaSAndroid Build Coastguard Worker         }
929*834a2baaSAndroid Build Coastguard Worker         fontLocaleStr += "}";
930*834a2baaSAndroid Build Coastguard Worker         SCOPED_TRACE("Test of user preferred locale: \"" + testCase.userPreferredLocale +
931*834a2baaSAndroid Build Coastguard Worker                      "\" with font locale: " + fontLocaleStr);
932*834a2baaSAndroid Build Coastguard Worker 
933*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families;
934*834a2baaSAndroid Build Coastguard Worker 
935*834a2baaSAndroid Build Coastguard Worker         // Prepare first font which doesn't supports U+9AA8
936*834a2baaSAndroid Build Coastguard Worker         auto firstFamilyMinikinFont =
937*834a2baaSAndroid Build Coastguard Worker                 std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath(kNoGlyphFont));
938*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<Font>> fonts;
939*834a2baaSAndroid Build Coastguard Worker         fonts.push_back(Font::Builder(firstFamilyMinikinFont).build());
940*834a2baaSAndroid Build Coastguard Worker         auto firstFamily =
941*834a2baaSAndroid Build Coastguard Worker                 FontFamily::create(registerLocaleList("und"), FamilyVariant::DEFAULT,
942*834a2baaSAndroid Build Coastguard Worker                                    std::move(fonts), false /* isCustomFallback */,
943*834a2baaSAndroid Build Coastguard Worker                                    false /* isDefaultFallback */, VariationFamilyType::None);
944*834a2baaSAndroid Build Coastguard Worker         families.push_back(firstFamily);
945*834a2baaSAndroid Build Coastguard Worker 
946*834a2baaSAndroid Build Coastguard Worker         // Prepare font families
947*834a2baaSAndroid Build Coastguard Worker         // Each font family is associated with a specified locale. All font families except for
948*834a2baaSAndroid Build Coastguard Worker         // the first font support U+9AA8.
949*834a2baaSAndroid Build Coastguard Worker         std::unordered_map<MinikinFont*, int> fontLocaleIdxMap;
950*834a2baaSAndroid Build Coastguard Worker 
951*834a2baaSAndroid Build Coastguard Worker         for (size_t i = 0; i < testCase.fontLocales.size(); ++i) {
952*834a2baaSAndroid Build Coastguard Worker             auto minikinFont =
953*834a2baaSAndroid Build Coastguard Worker                     std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath(kJAFont));
954*834a2baaSAndroid Build Coastguard Worker             std::vector<std::shared_ptr<Font>> fonts;
955*834a2baaSAndroid Build Coastguard Worker             fonts.push_back(Font::Builder(minikinFont).build());
956*834a2baaSAndroid Build Coastguard Worker             auto family = FontFamily::create(
957*834a2baaSAndroid Build Coastguard Worker                     registerLocaleList(testCase.fontLocales[i]), FamilyVariant::DEFAULT,
958*834a2baaSAndroid Build Coastguard Worker                     std::move(fonts), false /* isCustomFallback */, false /* isDefaultFallback */,
959*834a2baaSAndroid Build Coastguard Worker                     VariationFamilyType::None);
960*834a2baaSAndroid Build Coastguard Worker             families.push_back(family);
961*834a2baaSAndroid Build Coastguard Worker             fontLocaleIdxMap.insert(std::make_pair(minikinFont.get(), i));
962*834a2baaSAndroid Build Coastguard Worker         }
963*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<FontCollection> collection(FontCollection::create(families));
964*834a2baaSAndroid Build Coastguard Worker         // Do itemize
965*834a2baaSAndroid Build Coastguard Worker         auto runs = itemize(collection, "U+9AA8", testCase.userPreferredLocale);
966*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1U, runs.size());
967*834a2baaSAndroid Build Coastguard Worker         ASSERT_NE(nullptr, runs[0].fakedFont.font.get());
968*834a2baaSAndroid Build Coastguard Worker 
969*834a2baaSAndroid Build Coastguard Worker         // First family doesn't support U+9AA8 and others support it, so the first font should not
970*834a2baaSAndroid Build Coastguard Worker         // be selected.
971*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(firstFamilyMinikinFont.get(), runs[0].fakedFont.typeface().get());
972*834a2baaSAndroid Build Coastguard Worker 
973*834a2baaSAndroid Build Coastguard Worker         // Lookup used font family by MinikinFont*.
974*834a2baaSAndroid Build Coastguard Worker         const int usedLocaleIndex = fontLocaleIdxMap[runs[0].fakedFont.typeface().get()];
975*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(testCase.selectedFontIndex, usedLocaleIndex);
976*834a2baaSAndroid Build Coastguard Worker     }
977*834a2baaSAndroid Build Coastguard Worker }
978*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_LocaleAndCoverage)979*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_LocaleAndCoverage) {
980*834a2baaSAndroid Build Coastguard Worker     struct TestCase {
981*834a2baaSAndroid Build Coastguard Worker         std::string testString;
982*834a2baaSAndroid Build Coastguard Worker         std::string requestedLocales;
983*834a2baaSAndroid Build Coastguard Worker         std::string expectedFont;
984*834a2baaSAndroid Build Coastguard Worker     } testCases[] = {
985*834a2baaSAndroid Build Coastguard Worker             // Following test cases verify that following rules in font fallback chain.
986*834a2baaSAndroid Build Coastguard Worker             // - If the first font in the collection supports the given character or variation
987*834a2baaSAndroid Build Coastguard Worker             // sequence,
988*834a2baaSAndroid Build Coastguard Worker             //   it should be selected.
989*834a2baaSAndroid Build Coastguard Worker             // - If the font doesn't support the given character, variation sequence or its base
990*834a2baaSAndroid Build Coastguard Worker             //   character, it should not be selected.
991*834a2baaSAndroid Build Coastguard Worker             // - If two or more fonts match the requested locales, the font matches with the highest
992*834a2baaSAndroid Build Coastguard Worker             //   priority locale should be selected.
993*834a2baaSAndroid Build Coastguard Worker             // - If two or more fonts get the same score, the font listed earlier in the XML file
994*834a2baaSAndroid Build Coastguard Worker             //   (here, kItemizeFontXml) should be selected.
995*834a2baaSAndroid Build Coastguard Worker 
996*834a2baaSAndroid Build Coastguard Worker             // Regardless of locale, the first font is always selected if it covers the code point.
997*834a2baaSAndroid Build Coastguard Worker             {"'a'", "", kLatinFont},
998*834a2baaSAndroid Build Coastguard Worker             {"'a'", "en-Latn", kLatinFont},
999*834a2baaSAndroid Build Coastguard Worker             {"'a'", "ja-Jpan", kLatinFont},
1000*834a2baaSAndroid Build Coastguard Worker             {"'a'", "ja-Jpan,en-Latn", kLatinFont},
1001*834a2baaSAndroid Build Coastguard Worker             {"'a'", "zh-Hans,zh-Hant,en-Latn,ja-Jpan,fr-Latn", kLatinFont},
1002*834a2baaSAndroid Build Coastguard Worker 
1003*834a2baaSAndroid Build Coastguard Worker             // U+81ED is supported by both the ja font and zh-Hans font.
1004*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "", kZH_HansFont},         // zh-Hans font is listed before ja font.
1005*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn", kZH_HansFont},  // zh-Hans font is listed before ja font.
1006*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "ja-Jpan", kJAFont},
1007*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "zh-Hans", kZH_HansFont},
1008*834a2baaSAndroid Build Coastguard Worker 
1009*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "ja-Jpan,en-Latn", kJAFont},
1010*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn,ja-Jpan", kJAFont},
1011*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn,zh-Hans", kZH_HansFont},
1012*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "zh-Hans,en-Latn", kZH_HansFont},
1013*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "ja-Jpan,zh-Hans", kJAFont},
1014*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "zh-Hans,ja-Jpan", kZH_HansFont},
1015*834a2baaSAndroid Build Coastguard Worker 
1016*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn,zh-Hans,ja-Jpan", kZH_HansFont},
1017*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn,ja-Jpan,zh-Hans", kJAFont},
1018*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "en-Latn,zh-Hans,ja-Jpan", kZH_HansFont},
1019*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "ja-Jpan,en-Latn,zh-Hans", kJAFont},
1020*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "ja-Jpan,zh-Hans,en-Latn", kJAFont},
1021*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "zh-Hans,en-Latn,ja-Jpan", kZH_HansFont},
1022*834a2baaSAndroid Build Coastguard Worker             {"U+81ED", "zh-Hans,ja-Jpan,en-Latn", kZH_HansFont},
1023*834a2baaSAndroid Build Coastguard Worker 
1024*834a2baaSAndroid Build Coastguard Worker             // U+304A is only supported by ja font.
1025*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "", kJAFont},
1026*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "ja-Jpan", kJAFont},
1027*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hant", kJAFont},
1028*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hans", kJAFont},
1029*834a2baaSAndroid Build Coastguard Worker 
1030*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "ja-Jpan,zh-Hant", kJAFont},
1031*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hant,ja-Jpan", kJAFont},
1032*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hans,zh-Hant", kJAFont},
1033*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hant,zh-Hans", kJAFont},
1034*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hans,ja-Jpan", kJAFont},
1035*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "ja-Jpan,zh-Hans", kJAFont},
1036*834a2baaSAndroid Build Coastguard Worker 
1037*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
1038*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
1039*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1040*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1041*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
1042*834a2baaSAndroid Build Coastguard Worker             {"U+304A", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
1043*834a2baaSAndroid Build Coastguard Worker 
1044*834a2baaSAndroid Build Coastguard Worker             // U+242EE is supported by both ja font and zh-Hant fonts but not by zh-Hans font.
1045*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "", kJAFont},  // ja font is listed before zh-Hant font.
1046*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "ja-Jpan", kJAFont},
1047*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hans", kJAFont},
1048*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hant", kZH_HantFont},
1049*834a2baaSAndroid Build Coastguard Worker 
1050*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "ja-Jpan,zh-Hant", kJAFont},
1051*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hant,ja-Jpan", kZH_HantFont},
1052*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hans,zh-Hant", kZH_HantFont},
1053*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hant,zh-Hans", kZH_HantFont},
1054*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hans,ja-Jpan", kJAFont},
1055*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "ja-Jpan,zh-Hans", kJAFont},
1056*834a2baaSAndroid Build Coastguard Worker 
1057*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
1058*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hans,zh-Hant,ja-Jpan", kZH_HantFont},
1059*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1060*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1061*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1062*834a2baaSAndroid Build Coastguard Worker             {"U+242EE", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1063*834a2baaSAndroid Build Coastguard Worker 
1064*834a2baaSAndroid Build Coastguard Worker             // U+9AA8 is supported by all ja-Jpan, zh-Hans, zh-Hant fonts.
1065*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "", kZH_HansFont},  // zh-Hans font is listed before ja and zh-Hant fonts.
1066*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "ja-Jpan", kJAFont},
1067*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hans", kZH_HansFont},
1068*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hant", kZH_HantFont},
1069*834a2baaSAndroid Build Coastguard Worker 
1070*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "ja-Jpan,zh-Hant", kJAFont},
1071*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hant,ja-Jpan", kZH_HantFont},
1072*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hans,zh-Hant", kZH_HansFont},
1073*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hant,zh-Hans", kZH_HantFont},
1074*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hans,ja-Jpan", kZH_HansFont},
1075*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "ja-Jpan,zh-Hans", kJAFont},
1076*834a2baaSAndroid Build Coastguard Worker 
1077*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1078*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1079*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1080*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1081*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1082*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1083*834a2baaSAndroid Build Coastguard Worker 
1084*834a2baaSAndroid Build Coastguard Worker             // U+242EE U+FE00 is supported by ja font but not by zh-Hans or zh-Hant fonts.
1085*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "", kJAFont},
1086*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "ja-Jpan", kJAFont},
1087*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hant", kJAFont},
1088*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hans", kJAFont},
1089*834a2baaSAndroid Build Coastguard Worker 
1090*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "ja-Jpan,zh-Hant", kJAFont},
1091*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hant,ja-Jpan", kJAFont},
1092*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hans,zh-Hant", kJAFont},
1093*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hant,zh-Hans", kJAFont},
1094*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hans,ja-Jpan", kJAFont},
1095*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "ja-Jpan,zh-Hans", kJAFont},
1096*834a2baaSAndroid Build Coastguard Worker 
1097*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
1098*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
1099*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1100*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1101*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
1102*834a2baaSAndroid Build Coastguard Worker             {"U+242EE U+FE00", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
1103*834a2baaSAndroid Build Coastguard Worker 
1104*834a2baaSAndroid Build Coastguard Worker             // U+3402 U+E0100 is supported by both zh-Hans and zh-Hant but not by ja font.
1105*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "", kZH_HansFont},  // zh-Hans font is listed before zh-Hant font.
1106*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "ja-Jpan",
1107*834a2baaSAndroid Build Coastguard Worker              kZH_HansFont},  // zh-Hans font is listed before zh-Hant font.
1108*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hant", kZH_HantFont},
1109*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hans", kZH_HansFont},
1110*834a2baaSAndroid Build Coastguard Worker 
1111*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "ja-Jpan,zh-Hant", kZH_HantFont},
1112*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hant,ja-Jpan", kZH_HantFont},
1113*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
1114*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hant,zh-Hans", kZH_HantFont},
1115*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
1116*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "ja-Jpan,zh-Hans", kZH_HansFont},
1117*834a2baaSAndroid Build Coastguard Worker 
1118*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1119*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1120*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kZH_HansFont},
1121*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kZH_HantFont},
1122*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1123*834a2baaSAndroid Build Coastguard Worker             {"U+3402 U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1124*834a2baaSAndroid Build Coastguard Worker 
1125*834a2baaSAndroid Build Coastguard Worker             // No font supports U+4444 U+FE00 but only zh-Hans supports its base character U+4444.
1126*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "", kZH_HansFont},
1127*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "ja-Jpan", kZH_HansFont},
1128*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hant", kZH_HansFont},
1129*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hans", kZH_HansFont},
1130*834a2baaSAndroid Build Coastguard Worker 
1131*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "ja-Jpan,zh-Hant", kZH_HansFont},
1132*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hant,ja-Jpan", kZH_HansFont},
1133*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hans,zh-Hant", kZH_HansFont},
1134*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hant,zh-Hans", kZH_HansFont},
1135*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hans,ja-Jpan", kZH_HansFont},
1136*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "ja-Jpan,zh-Hans", kZH_HansFont},
1137*834a2baaSAndroid Build Coastguard Worker 
1138*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1139*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1140*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "ja-Jpan,zh-Hans,zh-Hant", kZH_HansFont},
1141*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "ja-Jpan,zh-Hant,zh-Hans", kZH_HansFont},
1142*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hant,zh-Hans,ja-Jpan", kZH_HansFont},
1143*834a2baaSAndroid Build Coastguard Worker             {"U+4444 U+FE00", "zh-Hant,ja-Jpan,zh-Hans", kZH_HansFont},
1144*834a2baaSAndroid Build Coastguard Worker 
1145*834a2baaSAndroid Build Coastguard Worker             // No font supports U+81ED U+E0100 but ja and zh-Hans support its base character U+81ED.
1146*834a2baaSAndroid Build Coastguard Worker             // zh-Hans font is listed before ja font.
1147*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "", kZH_HansFont},
1148*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "ja-Jpan", kJAFont},
1149*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hant", kZH_HansFont},
1150*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hans", kZH_HansFont},
1151*834a2baaSAndroid Build Coastguard Worker 
1152*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "ja-Jpan,zh-Hant", kJAFont},
1153*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hant,ja-Jpan", kJAFont},
1154*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
1155*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hant,zh-Hans", kZH_HansFont},
1156*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
1157*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "ja-Jpan,zh-Hans", kJAFont},
1158*834a2baaSAndroid Build Coastguard Worker 
1159*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1160*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1161*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1162*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1163*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HansFont},
1164*834a2baaSAndroid Build Coastguard Worker             {"U+81ED U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
1165*834a2baaSAndroid Build Coastguard Worker 
1166*834a2baaSAndroid Build Coastguard Worker             // No font supports U+9AA8 U+E0100 but all zh-Hans zh-hant ja fonts support its base
1167*834a2baaSAndroid Build Coastguard Worker             // character U+9AA8.
1168*834a2baaSAndroid Build Coastguard Worker             // zh-Hans font is listed before ja and zh-Hant fonts.
1169*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "", kZH_HansFont},
1170*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "ja-Jpan", kJAFont},
1171*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hans", kZH_HansFont},
1172*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hant", kZH_HantFont},
1173*834a2baaSAndroid Build Coastguard Worker 
1174*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "ja-Jpan,zh-Hant", kJAFont},
1175*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hant,ja-Jpan", kZH_HantFont},
1176*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
1177*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hant,zh-Hans", kZH_HantFont},
1178*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
1179*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "ja-Jpan,zh-Hans", kJAFont},
1180*834a2baaSAndroid Build Coastguard Worker 
1181*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1182*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1183*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1184*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1185*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1186*834a2baaSAndroid Build Coastguard Worker             {"U+9AA8 U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1187*834a2baaSAndroid Build Coastguard Worker 
1188*834a2baaSAndroid Build Coastguard Worker             // All zh-Hans,zh-Hant,ja fonts support U+35A8 U+E0100 and its base character U+35A8.
1189*834a2baaSAndroid Build Coastguard Worker             // zh-Hans font is listed before ja and zh-Hant fonts.
1190*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "", kZH_HansFont},
1191*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "ja-Jpan", kJAFont},
1192*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hans", kZH_HansFont},
1193*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hant", kZH_HantFont},
1194*834a2baaSAndroid Build Coastguard Worker 
1195*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "ja-Jpan,zh-Hant", kJAFont},
1196*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hant,ja-Jpan", kZH_HantFont},
1197*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hans,zh-Hant", kZH_HansFont},
1198*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hant,zh-Hans", kZH_HantFont},
1199*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hans,ja-Jpan", kZH_HansFont},
1200*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "ja-Jpan,zh-Hans", kJAFont},
1201*834a2baaSAndroid Build Coastguard Worker 
1202*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
1203*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
1204*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1205*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1206*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1207*834a2baaSAndroid Build Coastguard Worker             {"U+35A8", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1208*834a2baaSAndroid Build Coastguard Worker 
1209*834a2baaSAndroid Build Coastguard Worker             // All zh-Hans,zh-Hant,ja fonts support U+35B6 U+E0100, but zh-Hant and ja fonts support
1210*834a2baaSAndroid Build Coastguard Worker             // its
1211*834a2baaSAndroid Build Coastguard Worker             // base character U+35B6.
1212*834a2baaSAndroid Build Coastguard Worker             // ja font is listed before zh-Hant font.
1213*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "", kJAFont},
1214*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "ja-Jpan", kJAFont},
1215*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hant", kZH_HantFont},
1216*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hans", kJAFont},
1217*834a2baaSAndroid Build Coastguard Worker 
1218*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "ja-Jpan,zh-Hant", kJAFont},
1219*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hant,ja-Jpan", kZH_HantFont},
1220*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hans,zh-Hant", kZH_HantFont},
1221*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hant,zh-Hans", kZH_HantFont},
1222*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hans,ja-Jpan", kJAFont},
1223*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "ja-Jpan,zh-Hans", kJAFont},
1224*834a2baaSAndroid Build Coastguard Worker 
1225*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
1226*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hans,zh-Hant,ja-Jpan", kZH_HantFont},
1227*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1228*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1229*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
1230*834a2baaSAndroid Build Coastguard Worker             {"U+35B6", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
1231*834a2baaSAndroid Build Coastguard Worker 
1232*834a2baaSAndroid Build Coastguard Worker             // All zh-Hans,zh-Hant,ja fonts support U+35C5 U+E0100, but only ja font supports its
1233*834a2baaSAndroid Build Coastguard Worker             // base
1234*834a2baaSAndroid Build Coastguard Worker             // character U+35C5.
1235*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "", kJAFont},
1236*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "ja-Jpan", kJAFont},
1237*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hant", kJAFont},
1238*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hans", kJAFont},
1239*834a2baaSAndroid Build Coastguard Worker 
1240*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "ja-Jpan,zh-Hant", kJAFont},
1241*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hant,ja-Jpan", kJAFont},
1242*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hans,zh-Hant", kJAFont},
1243*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hant,zh-Hans", kJAFont},
1244*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hans,ja-Jpan", kJAFont},
1245*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "ja-Jpan,zh-Hans", kJAFont},
1246*834a2baaSAndroid Build Coastguard Worker 
1247*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
1248*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
1249*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
1250*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
1251*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
1252*834a2baaSAndroid Build Coastguard Worker             {"U+35C5", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
1253*834a2baaSAndroid Build Coastguard Worker 
1254*834a2baaSAndroid Build Coastguard Worker             // None of ja-Jpan, zh-Hant, zh-Hans font supports U+1F469. Emoji font supports it.
1255*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "", kEmojiFont},
1256*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "ja-Jpan", kEmojiFont},
1257*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hant", kEmojiFont},
1258*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hans", kEmojiFont},
1259*834a2baaSAndroid Build Coastguard Worker 
1260*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "ja-Jpan,zh-Hant", kEmojiFont},
1261*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hant,ja-Jpan", kEmojiFont},
1262*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hans,zh-Hant", kEmojiFont},
1263*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hant,zh-Hans", kEmojiFont},
1264*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hans,ja-Jpan", kEmojiFont},
1265*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "ja-Jpan,zh-Hans", kEmojiFont},
1266*834a2baaSAndroid Build Coastguard Worker 
1267*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hans,ja-Jpan,zh-Hant", kEmojiFont},
1268*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hans,zh-Hant,ja-Jpan", kEmojiFont},
1269*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "ja-Jpan,zh-Hans,zh-Hant", kEmojiFont},
1270*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "ja-Jpan,zh-Hant,zh-Hans", kEmojiFont},
1271*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hant,zh-Hans,ja-Jpan", kEmojiFont},
1272*834a2baaSAndroid Build Coastguard Worker             {"U+1F469", "zh-Hant,ja-Jpan,zh-Hans", kEmojiFont},
1273*834a2baaSAndroid Build Coastguard Worker     };
1274*834a2baaSAndroid Build Coastguard Worker 
1275*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kItemizeFontXml);
1276*834a2baaSAndroid Build Coastguard Worker 
1277*834a2baaSAndroid Build Coastguard Worker     for (const auto& testCase : testCases) {
1278*834a2baaSAndroid Build Coastguard Worker         SCOPED_TRACE("Test for \"" + testCase.testString + "\" with locales " +
1279*834a2baaSAndroid Build Coastguard Worker                      testCase.requestedLocales);
1280*834a2baaSAndroid Build Coastguard Worker 
1281*834a2baaSAndroid Build Coastguard Worker         auto runs = itemize(collection, testCase.testString.c_str(), testCase.requestedLocales);
1282*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1U, runs.size());
1283*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(testCase.expectedFont, getFontName(runs[0]));
1284*834a2baaSAndroid Build Coastguard Worker     }
1285*834a2baaSAndroid Build Coastguard Worker }
1286*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_emojiSelection_withFE0E)1287*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_emojiSelection_withFE0E) {
1288*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1289*834a2baaSAndroid Build Coastguard Worker 
1290*834a2baaSAndroid Build Coastguard Worker     // U+00A9 is a text default emoji which is only available in TextEmojiFont.ttf.
1291*834a2baaSAndroid Build Coastguard Worker     // TextEmojiFont.ttf should be selected.
1292*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+00A9 U+FE0E");
1293*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1294*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1295*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1296*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1297*834a2baaSAndroid Build Coastguard Worker 
1298*834a2baaSAndroid Build Coastguard Worker     // U+00A9 is a text default emoji which is only available in ColorEmojiFont.ttf.
1299*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf should be selected.
1300*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+00AE U+FE0E");
1301*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1302*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1303*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1304*834a2baaSAndroid Build Coastguard Worker     // Text emoji is specified but it is not available. Use color emoji instead.
1305*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1306*834a2baaSAndroid Build Coastguard Worker 
1307*834a2baaSAndroid Build Coastguard Worker     // U+203C is a text default emoji which is available in both TextEmojiFont.ttf and
1308*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. TextEmojiFont.ttf should be selected.
1309*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C U+FE0E");
1310*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1311*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1312*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1313*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1314*834a2baaSAndroid Build Coastguard Worker 
1315*834a2baaSAndroid Build Coastguard Worker     // U+2049 is a text default emoji which is not available either TextEmojiFont.ttf or
1316*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. No font should be selected.
1317*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+2049 U+FE0E");
1318*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1319*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1320*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1321*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1322*834a2baaSAndroid Build Coastguard Worker 
1323*834a2baaSAndroid Build Coastguard Worker     // U+231A is a emoji default emoji which is available only in TextEmojifFont.
1324*834a2baaSAndroid Build Coastguard Worker     // TextEmojiFont.ttf sohuld be selected.
1325*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+231A U+FE0E");
1326*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1327*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1328*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1329*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1330*834a2baaSAndroid Build Coastguard Worker 
1331*834a2baaSAndroid Build Coastguard Worker     // U+231B is a emoji default emoji which is available only in ColorEmojiFont.ttf.
1332*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf should be selected.
1333*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+231B U+FE0E");
1334*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1335*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1336*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1337*834a2baaSAndroid Build Coastguard Worker     // Text emoji is specified but it is not available. Use color emoji instead.
1338*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1339*834a2baaSAndroid Build Coastguard Worker 
1340*834a2baaSAndroid Build Coastguard Worker     // U+23E9 is a emoji default emoji which is available in both TextEmojiFont.ttf and
1341*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. TextEmojiFont.ttf should be selected even if U+23E9 is emoji default
1342*834a2baaSAndroid Build Coastguard Worker     // emoji since U+FE0E is appended.
1343*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9 U+FE0E");
1344*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1345*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1346*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1347*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1348*834a2baaSAndroid Build Coastguard Worker 
1349*834a2baaSAndroid Build Coastguard Worker     // U+23EA is a emoji default emoji but which is not available in either TextEmojiFont.ttf or
1350*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. No font should be selected.
1351*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23EA U+FE0E");
1352*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1353*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1354*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1355*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1356*834a2baaSAndroid Build Coastguard Worker 
1357*834a2baaSAndroid Build Coastguard Worker     // U+26FA U+FE0E is specified but ColorTextMixedEmojiFont has a variation sequence U+26F9 U+FE0F
1358*834a2baaSAndroid Build Coastguard Worker     // in its cmap, so ColorTextMixedEmojiFont should be selected instaed of ColorEmojiFont.
1359*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+26FA U+FE0E");
1360*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1361*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1362*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1363*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kMixedEmojiFont, getFontName(runs[0]));
1364*834a2baaSAndroid Build Coastguard Worker }
1365*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_emojiSelection_withFE0F)1366*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_emojiSelection_withFE0F) {
1367*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1368*834a2baaSAndroid Build Coastguard Worker 
1369*834a2baaSAndroid Build Coastguard Worker     // U+00A9 is a text default emoji which is available only in TextEmojiFont.ttf.
1370*834a2baaSAndroid Build Coastguard Worker     // TextEmojiFont.ttf shoudl be selected.
1371*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+00A9 U+FE0F");
1372*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1373*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1374*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1375*834a2baaSAndroid Build Coastguard Worker     // Color emoji is specified but it is not available. Use text representaion instead.
1376*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1377*834a2baaSAndroid Build Coastguard Worker 
1378*834a2baaSAndroid Build Coastguard Worker     // U+00AE is a text default emoji which is available only in ColorEmojiFont.ttf.
1379*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf should be selected.
1380*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+00AE U+FE0F");
1381*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1382*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1383*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1384*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1385*834a2baaSAndroid Build Coastguard Worker 
1386*834a2baaSAndroid Build Coastguard Worker     // U+203C is a text default emoji which is available in both TextEmojiFont.ttf and
1387*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. ColorEmojiFont.ttf should be selected even if U+203C is a text default
1388*834a2baaSAndroid Build Coastguard Worker     // emoji since U+FF0F is appended.
1389*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C U+FE0F");
1390*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1391*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1392*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1393*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1394*834a2baaSAndroid Build Coastguard Worker 
1395*834a2baaSAndroid Build Coastguard Worker     // U+2049 is a text default emoji which is not available in either TextEmojiFont.ttf or
1396*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. No font should be selected.
1397*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+2049 U+FE0F");
1398*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1399*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1400*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1401*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1402*834a2baaSAndroid Build Coastguard Worker 
1403*834a2baaSAndroid Build Coastguard Worker     // U+231A is a emoji default emoji which is available only in TextEmojiFont.ttf.
1404*834a2baaSAndroid Build Coastguard Worker     // TextEmojiFont.ttf should be selected.
1405*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+231A U+FE0F");
1406*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1407*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1408*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1409*834a2baaSAndroid Build Coastguard Worker     // Color emoji is specified but it is not available. Use text representation instead.
1410*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1411*834a2baaSAndroid Build Coastguard Worker 
1412*834a2baaSAndroid Build Coastguard Worker     // U+231B is a emoji default emoji which is available only in ColorEmojiFont.ttf.
1413*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf should be selected.
1414*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+231B U+FE0F");
1415*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1416*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1417*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1418*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1419*834a2baaSAndroid Build Coastguard Worker 
1420*834a2baaSAndroid Build Coastguard Worker     // U+23E9 is a emoji default emoji which is available in both TextEmojiFont.ttf and
1421*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. ColorEmojiFont.ttf should be selected.
1422*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9 U+FE0F");
1423*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1424*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1425*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1426*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1427*834a2baaSAndroid Build Coastguard Worker 
1428*834a2baaSAndroid Build Coastguard Worker     // U+23EA is a emoji default emoji which is not available in either TextEmojiFont.ttf or
1429*834a2baaSAndroid Build Coastguard Worker     // ColorEmojiFont.ttf. No font should be selected.
1430*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23EA U+FE0F");
1431*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1432*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1433*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1434*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1435*834a2baaSAndroid Build Coastguard Worker 
1436*834a2baaSAndroid Build Coastguard Worker     // U+26F9 U+FE0F is specified but ColorTextMixedEmojiFont has a variation sequence U+26F9 U+FE0F
1437*834a2baaSAndroid Build Coastguard Worker     // in its cmap, so ColorTextMixedEmojiFont should be selected instaed of ColorEmojiFont.
1438*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+26F9 U+FE0F");
1439*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1440*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1441*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1442*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kMixedEmojiFont, getFontName(runs[0]));
1443*834a2baaSAndroid Build Coastguard Worker }
1444*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_emojiSelection_with_skinTone)1445*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_emojiSelection_with_skinTone) {
1446*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1447*834a2baaSAndroid Build Coastguard Worker 
1448*834a2baaSAndroid Build Coastguard Worker     // TextEmoji font is selected since it is listed before ColorEmoji font.
1449*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+261D");
1450*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1451*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1452*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, runs[0].end);
1453*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1454*834a2baaSAndroid Build Coastguard Worker 
1455*834a2baaSAndroid Build Coastguard Worker     // If skin tone is specified, it should be colored.
1456*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+261D U+1F3FD");
1457*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1458*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1459*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(3, runs[0].end);
1460*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1461*834a2baaSAndroid Build Coastguard Worker 
1462*834a2baaSAndroid Build Coastguard Worker     // Still color font is selected if an emoji variation selector is specified.
1463*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+261D U+FE0F U+1F3FD");
1464*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1465*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1466*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
1467*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1468*834a2baaSAndroid Build Coastguard Worker 
1469*834a2baaSAndroid Build Coastguard Worker     // Text font should be selected if a text variation selector is specified and skin tone is
1470*834a2baaSAndroid Build Coastguard Worker     // rendered by itself.
1471*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+261D U+FE0E U+1F3FD");
1472*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2U, runs.size());
1473*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1474*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1475*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1476*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[1].start);
1477*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[1].end);
1478*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[1]));
1479*834a2baaSAndroid Build Coastguard Worker }
1480*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_PrivateUseArea)1481*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_PrivateUseArea) {
1482*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1483*834a2baaSAndroid Build Coastguard Worker 
1484*834a2baaSAndroid Build Coastguard Worker     // Should not set nullptr to the result run. (Issue 26808815)
1485*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+FEE10");
1486*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1487*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1488*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, runs[0].end);
1489*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1490*834a2baaSAndroid Build Coastguard Worker 
1491*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+FEE40 U+FE4C5");
1492*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1493*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1494*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
1495*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1496*834a2baaSAndroid Build Coastguard Worker }
1497*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,itemize_genderBalancedEmoji)1498*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemize_genderBalancedEmoji) {
1499*834a2baaSAndroid Build Coastguard Worker     auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1500*834a2baaSAndroid Build Coastguard Worker 
1501*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+1F469 U+200D U+1F373");
1502*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1503*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1504*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
1505*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1506*834a2baaSAndroid Build Coastguard Worker 
1507*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+1F469 U+200D U+2695 U+FE0F");
1508*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1509*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1510*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(5, runs[0].end);
1511*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1512*834a2baaSAndroid Build Coastguard Worker 
1513*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+1F469 U+200D U+2695");
1514*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1U, runs.size());
1515*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, runs[0].start);
1516*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, runs[0].end);
1517*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1518*834a2baaSAndroid Build Coastguard Worker }
1519*834a2baaSAndroid Build Coastguard Worker 
1520*834a2baaSAndroid Build Coastguard Worker // For b/29585939
TEST(FontCollectionItemizeTest,itemizeShouldKeepOrderForVS)1521*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemizeShouldKeepOrderForVS) {
1522*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> dummyFamily = buildFontFamily(kNoGlyphFont);
1523*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> familyA = buildFontFamily(kZH_HansFont);
1524*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> familyB = buildFontFamily(kZH_HansFont);
1525*834a2baaSAndroid Build Coastguard Worker 
1526*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, familyA, familyB};
1527*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> reversedFamilies = {dummyFamily, familyB, familyA};
1528*834a2baaSAndroid Build Coastguard Worker 
1529*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontCollection> collection(FontCollection::create(families));
1530*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontCollection> reversedCollection(FontCollection::create(reversedFamilies));
1531*834a2baaSAndroid Build Coastguard Worker 
1532*834a2baaSAndroid Build Coastguard Worker     // Both fontA/fontB support U+35A8 but don't support U+35A8 U+E0100. The first font should be
1533*834a2baaSAndroid Build Coastguard Worker     // selected.
1534*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+35A8 U+E0100");
1535*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(familyA->getFont(0), runs[0].fakedFont.font.get());
1536*834a2baaSAndroid Build Coastguard Worker 
1537*834a2baaSAndroid Build Coastguard Worker     runs = itemize(reversedCollection, "U+35A8 U+E0100");
1538*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(familyB->getFont(0), runs[0].fakedFont.font.get());
1539*834a2baaSAndroid Build Coastguard Worker }
1540*834a2baaSAndroid Build Coastguard Worker 
1541*834a2baaSAndroid Build Coastguard Worker // For b/29585939
TEST(FontCollectionItemizeTest,itemizeShouldKeepOrderForVS2)1542*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, itemizeShouldKeepOrderForVS2) {
1543*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> dummyFamily = buildFontFamily(kNoGlyphFont);
1544*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> hasCmapFormat14Family = buildFontFamily(kHasCmapFormat14Font);
1545*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontFamily> noCmapFormat14Family = buildFontFamily(kNoCmapFormat14Font);
1546*834a2baaSAndroid Build Coastguard Worker 
1547*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, hasCmapFormat14Family,
1548*834a2baaSAndroid Build Coastguard Worker                                                          noCmapFormat14Family};
1549*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> reversedFamilies = {dummyFamily, noCmapFormat14Family,
1550*834a2baaSAndroid Build Coastguard Worker                                                                  hasCmapFormat14Family};
1551*834a2baaSAndroid Build Coastguard Worker 
1552*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontCollection> collection(FontCollection::create(families));
1553*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<FontCollection> reversedCollection(FontCollection::create(reversedFamilies));
1554*834a2baaSAndroid Build Coastguard Worker 
1555*834a2baaSAndroid Build Coastguard Worker     // Both hasCmapFormat14Font/noCmapFormat14Font support U+5380 but don't support U+5380 U+E0100.
1556*834a2baaSAndroid Build Coastguard Worker     // The first font should be selected.
1557*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+5380 U+E0100");
1558*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(hasCmapFormat14Family->getFont(0), runs[0].fakedFont.font.get());
1559*834a2baaSAndroid Build Coastguard Worker 
1560*834a2baaSAndroid Build Coastguard Worker     runs = itemize(reversedCollection, "U+5380 U+E0100");
1561*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(noCmapFormat14Family->getFont(0), runs[0].fakedFont.font.get());
1562*834a2baaSAndroid Build Coastguard Worker }
1563*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,colorEmojiSelectionTest)1564*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, colorEmojiSelectionTest) {
1565*834a2baaSAndroid Build Coastguard Worker     auto dummyFamily = buildFontFamily(kNoGlyphFont);
1566*834a2baaSAndroid Build Coastguard Worker     auto textEmojiFamily = buildFontFamily(kTextEmojiFont, "ja-JP");
1567*834a2baaSAndroid Build Coastguard Worker     auto colorEmojiFamily = buildFontFamily(kColorEmojiFont, "und-Zsye");
1568*834a2baaSAndroid Build Coastguard Worker 
1569*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, textEmojiFamily,
1570*834a2baaSAndroid Build Coastguard Worker                                                          colorEmojiFamily};
1571*834a2baaSAndroid Build Coastguard Worker     auto collection = FontCollection::create(families);
1572*834a2baaSAndroid Build Coastguard Worker     // Both textEmojiFamily and colorEmojiFamily supports U+203C and U+23E9.
1573*834a2baaSAndroid Build Coastguard Worker     // U+203C is text default emoji, and U+23E9 is color default emoji.
1574*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "U+203C", "en-US,en-Zsym");
1575*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1576*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "en-US,en-Zsym");
1577*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1578*834a2baaSAndroid Build Coastguard Worker 
1579*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "en-US,en-Zsye");
1580*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1581*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "en-US,en-Zsye");
1582*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1583*834a2baaSAndroid Build Coastguard Worker 
1584*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-Zsym-JP");
1585*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1586*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-Zsym-JP");
1587*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1588*834a2baaSAndroid Build Coastguard Worker 
1589*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-Zsye-JP");
1590*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1591*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-Zsye-JP");
1592*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1593*834a2baaSAndroid Build Coastguard Worker 
1594*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-JP-u-em-text");
1595*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1596*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-JP-u-em-text");
1597*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1598*834a2baaSAndroid Build Coastguard Worker 
1599*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-JP-u-em-emoji");
1600*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1601*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-JP-u-em-emoji");
1602*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1603*834a2baaSAndroid Build Coastguard Worker 
1604*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-JP,und-Zsym");
1605*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1606*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-JP,und-Zsym");
1607*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1608*834a2baaSAndroid Build Coastguard Worker 
1609*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+203C", "ja-JP,und-Zsye");
1610*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1611*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "U+23E9", "ja-JP,und-Zsye");
1612*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font.get());
1613*834a2baaSAndroid Build Coastguard Worker }
1614*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,customFallbackTest)1615*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, customFallbackTest) {
1616*834a2baaSAndroid Build Coastguard Worker     auto firstFamily = buildFontFamily(kNoGlyphFont);
1617*834a2baaSAndroid Build Coastguard Worker     auto customFallbackFamily = buildFontFamily(kAsciiFont, "", true /* isCustomFallback */);
1618*834a2baaSAndroid Build Coastguard Worker     auto languageFamily = buildFontFamily(kAsciiFont, "ja-JP");
1619*834a2baaSAndroid Build Coastguard Worker 
1620*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {firstFamily, customFallbackFamily,
1621*834a2baaSAndroid Build Coastguard Worker                                                          languageFamily};
1622*834a2baaSAndroid Build Coastguard Worker 
1623*834a2baaSAndroid Build Coastguard Worker     auto collection = FontCollection::create(families);
1624*834a2baaSAndroid Build Coastguard Worker 
1625*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, "'a'", "");
1626*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(customFallbackFamily->getFont(0), runs[0].fakedFont.font.get());
1627*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a'", "en-US");
1628*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(customFallbackFamily->getFont(0), runs[0].fakedFont.font.get());
1629*834a2baaSAndroid Build Coastguard Worker     runs = itemize(collection, "'a'", "ja-JP");
1630*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(customFallbackFamily->getFont(0), runs[0].fakedFont.font.get());
1631*834a2baaSAndroid Build Coastguard Worker }
1632*834a2baaSAndroid Build Coastguard Worker 
1633*834a2baaSAndroid Build Coastguard Worker struct ItemizeResult {
1634*834a2baaSAndroid Build Coastguard Worker     int start;
1635*834a2baaSAndroid Build Coastguard Worker     int end;
1636*834a2baaSAndroid Build Coastguard Worker     std::string psName;
1637*834a2baaSAndroid Build Coastguard Worker };
1638*834a2baaSAndroid Build Coastguard Worker 
itemizeEmojiAndFontPostScriptNames(const std::string & txt)1639*834a2baaSAndroid Build Coastguard Worker std::vector<ItemizeResult> itemizeEmojiAndFontPostScriptNames(const std::string& txt) {
1640*834a2baaSAndroid Build Coastguard Worker     auto firstFamily = buildFontFamily(kAsciiFont);
1641*834a2baaSAndroid Build Coastguard Worker     auto OverrideEmojiFamily = buildFontFamily("OverrideEmoji.ttf", "und-Zsye");
1642*834a2baaSAndroid Build Coastguard Worker     auto emojiBaseFamily = buildFontFamily("EmojiBase.ttf", "und-Zsye");
1643*834a2baaSAndroid Build Coastguard Worker 
1644*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {firstFamily, OverrideEmojiFamily,
1645*834a2baaSAndroid Build Coastguard Worker                                                          emojiBaseFamily};
1646*834a2baaSAndroid Build Coastguard Worker 
1647*834a2baaSAndroid Build Coastguard Worker     auto collection = FontCollection::create(families);
1648*834a2baaSAndroid Build Coastguard Worker     auto runs = itemize(collection, txt.c_str());
1649*834a2baaSAndroid Build Coastguard Worker 
1650*834a2baaSAndroid Build Coastguard Worker     std::vector<ItemizeResult> out;
1651*834a2baaSAndroid Build Coastguard Worker     for (const auto& run : runs) {
1652*834a2baaSAndroid Build Coastguard Worker         auto psName = FontFileParser(run.fakedFont.hbFont()).getPostScriptName().value();
1653*834a2baaSAndroid Build Coastguard Worker         out.push_back({run.start, run.end, psName});
1654*834a2baaSAndroid Build Coastguard Worker     }
1655*834a2baaSAndroid Build Coastguard Worker     return out;
1656*834a2baaSAndroid Build Coastguard Worker }
1657*834a2baaSAndroid Build Coastguard Worker 
itemizeEmojiAndFontPostScriptName(const std::string & txt)1658*834a2baaSAndroid Build Coastguard Worker std::string itemizeEmojiAndFontPostScriptName(const std::string& txt) {
1659*834a2baaSAndroid Build Coastguard Worker     auto results = itemizeEmojiAndFontPostScriptNames(txt);
1660*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, results.size());
1661*834a2baaSAndroid Build Coastguard Worker     return results[0].psName;
1662*834a2baaSAndroid Build Coastguard Worker }
1663*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,emojiFallback)1664*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, emojiFallback) {
1665*834a2baaSAndroid Build Coastguard Worker     // OverrideEmojiFont supports U+1F9B0, U+1F3FB and U+1F9B0 U+1F3FB sequence.
1666*834a2baaSAndroid Build Coastguard Worker     // Use Override font.
1667*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F9B0"));
1668*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F9B0 U+1F3FB"));
1669*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F9B0 U+FE0F U+1F3FB"));
1670*834a2baaSAndroid Build Coastguard Worker 
1671*834a2baaSAndroid Build Coastguard Worker     // OverrideEmojiFont doesn't suppot U+1F9B6 and U+1F3FC.
1672*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", itemizeEmojiAndFontPostScriptName("U+1F9B6"));
1673*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", itemizeEmojiAndFontPostScriptName("U+1F9B6 U+1F3FC"));
1674*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", itemizeEmojiAndFontPostScriptName("U+1F9B6 U+FE0F U+1F3FC"));
1675*834a2baaSAndroid Build Coastguard Worker 
1676*834a2baaSAndroid Build Coastguard Worker     // OverrideEmojiFont support U+1F9B1, U+1F3FB but doesn't support the sequence U+1F9B1 U+1F3FB.
1677*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F9B1"));
1678*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F3FB"));
1679*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", itemizeEmojiAndFontPostScriptName("U+1F9B1 U+1F3FB"));
1680*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", itemizeEmojiAndFontPostScriptName("U+1F9B1 U+FE0F U+1F3FB"));
1681*834a2baaSAndroid Build Coastguard Worker 
1682*834a2baaSAndroid Build Coastguard Worker     // Find the longest sequence if two sequences are supported.
1683*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F9B2 U+200D U+1F9B3"));
1684*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont",
1685*834a2baaSAndroid Build Coastguard Worker               itemizeEmojiAndFontPostScriptName("U+1F9B2 U+200D U+1F9B3 U+200D U+1F9B4"));
1686*834a2baaSAndroid Build Coastguard Worker }
1687*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,customEmojiFallback)1688*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, customEmojiFallback) {
1689*834a2baaSAndroid Build Coastguard Worker     auto results = itemizeEmojiAndFontPostScriptNames("U+1F9B6 U+1F9B0");
1690*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1691*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, results[0].end);
1692*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[0].psName);
1693*834a2baaSAndroid Build Coastguard Worker 
1694*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, results[1].start);
1695*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[1].end);
1696*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[1].psName);
1697*834a2baaSAndroid Build Coastguard Worker 
1698*834a2baaSAndroid Build Coastguard Worker     results = itemizeEmojiAndFontPostScriptNames("U+1F9B0 U+1F9B6");
1699*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1700*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, results[0].end);
1701*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[0].psName);
1702*834a2baaSAndroid Build Coastguard Worker 
1703*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2, results[1].start);
1704*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[1].end);
1705*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[1].psName);
1706*834a2baaSAndroid Build Coastguard Worker }
1707*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,customEmojiFallback_modifier)1708*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, customEmojiFallback_modifier) {
1709*834a2baaSAndroid Build Coastguard Worker     auto results = itemizeEmojiAndFontPostScriptNames("U+1F9B0 U+1F3FC U+1F9B0 U+1F3FB");
1710*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1711*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[0].end);
1712*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[0].psName);
1713*834a2baaSAndroid Build Coastguard Worker 
1714*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[1].start);
1715*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].end);
1716*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[1].psName);
1717*834a2baaSAndroid Build Coastguard Worker 
1718*834a2baaSAndroid Build Coastguard Worker     results = itemizeEmojiAndFontPostScriptNames("U+1F9B0 U+1F3FB U+1F9B0 U+1F3FC");
1719*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1720*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[0].end);
1721*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[0].psName);
1722*834a2baaSAndroid Build Coastguard Worker 
1723*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(4, results[1].start);
1724*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].end);
1725*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[1].psName);
1726*834a2baaSAndroid Build Coastguard Worker }
1727*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,customEmojiFallback_zwj)1728*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, customEmojiFallback_zwj) {
1729*834a2baaSAndroid Build Coastguard Worker     auto results = itemizeEmojiAndFontPostScriptNames(
1730*834a2baaSAndroid Build Coastguard Worker             "U+1F9B4 U+200D U+1F9B3 U+200D U+1F9B4 "
1731*834a2baaSAndroid Build Coastguard Worker             "U+1F9B3 U+200D U+1F9B3 U+200D U+1F9B4 ");
1732*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1733*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[0].end);
1734*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[0].psName);
1735*834a2baaSAndroid Build Coastguard Worker 
1736*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].start);
1737*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(16, results[1].end);
1738*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[1].psName);
1739*834a2baaSAndroid Build Coastguard Worker 
1740*834a2baaSAndroid Build Coastguard Worker     results = itemizeEmojiAndFontPostScriptNames(
1741*834a2baaSAndroid Build Coastguard Worker             "U+1F9B3 U+200D U+1F9B3 U+200D U+1F9B4 "
1742*834a2baaSAndroid Build Coastguard Worker             "U+1F9B4 U+200D U+1F9B3 U+200D U+1F9B4 ");
1743*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1744*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[0].end);
1745*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[0].psName);
1746*834a2baaSAndroid Build Coastguard Worker 
1747*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].start);
1748*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(16, results[1].end);
1749*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[1].psName);
1750*834a2baaSAndroid Build Coastguard Worker }
1751*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,customEmojiFallback_tagSequence)1752*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, customEmojiFallback_tagSequence) {
1753*834a2baaSAndroid Build Coastguard Worker     auto results = itemizeEmojiAndFontPostScriptNames(
1754*834a2baaSAndroid Build Coastguard Worker             "U+1F9BA U+E0003 U+E0004 U+E007F "
1755*834a2baaSAndroid Build Coastguard Worker             "U+1F9BA U+E0001 U+E0002 U+E007F");
1756*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1757*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[0].end);
1758*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[0].psName);
1759*834a2baaSAndroid Build Coastguard Worker 
1760*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].start);
1761*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(16, results[1].end);
1762*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[1].psName);
1763*834a2baaSAndroid Build Coastguard Worker 
1764*834a2baaSAndroid Build Coastguard Worker     results = itemizeEmojiAndFontPostScriptNames(
1765*834a2baaSAndroid Build Coastguard Worker             "U+1F9BA U+E0001 U+E0002 U+E007F "
1766*834a2baaSAndroid Build Coastguard Worker             "U+1F9BA U+E0003 U+E0004 U+E007F");
1767*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, results[0].start);
1768*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[0].end);
1769*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", results[0].psName);
1770*834a2baaSAndroid Build Coastguard Worker 
1771*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(8, results[1].start);
1772*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(16, results[1].end);
1773*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("EmojiBaseFont", results[1].psName);
1774*834a2baaSAndroid Build Coastguard Worker }
1775*834a2baaSAndroid Build Coastguard Worker 
TEST(FontCollectionItemizeTest,emojiFlagFallback)1776*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionItemizeTest, emojiFlagFallback) {
1777*834a2baaSAndroid Build Coastguard Worker     // If the OverrideEmojiFont supports U+1F1E6 U+1F1E6, use that font.
1778*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F1E6 U+1F1E6"));
1779*834a2baaSAndroid Build Coastguard Worker 
1780*834a2baaSAndroid Build Coastguard Worker     // Even if the OverrideEmojiFont directs to .notdef (i.e. Tofu glyph) for the sequence, use it.
1781*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ("OverrideEmojiFont", itemizeEmojiAndFontPostScriptName("U+1F1E6 U+1F1E7"));
1782*834a2baaSAndroid Build Coastguard Worker }
1783*834a2baaSAndroid Build Coastguard Worker 
1784*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
1785