11c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka/*
21c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * Copyright (C) 2015 The Android Open Source Project
31c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka *
41c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
51c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * you may not use this file except in compliance with the License.
61c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * You may obtain a copy of the License at
71c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka *
81c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
91c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka *
101c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * Unless required by applicable law or agreed to in writing, software
111c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
121c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * See the License for the specific language governing permissions and
141c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka * limitations under the License.
151c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka */
161c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
171d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "minikin/FontCollection.h"
181c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
19dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka#include <memory>
20dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
211d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <gtest/gtest.h>
221d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka
231d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "minikin/FontFamily.h"
24b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka#include "minikin/LocaleList.h"
256c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
261c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka#include "FontTestUtils.h"
27e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka#include "FreeTypeMinikinFontForTest.h"
281d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "Locale.h"
291d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "LocaleListCache.h"
302342e5310f9701f9bfa364f2d308da35f66b24e8Seigo Nonaka#include "MinikinInternal.h"
311c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka#include "UnicodeUtils.h"
321c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3314e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonakanamespace minikin {
341c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kItemizeFontXml[] = "itemize.xml";
3654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kCherokeeFont[] = "Cherokee.ttf";
3754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kEmojiFont[] = "Emoji.ttf";
3854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kJAFont[] = "Ja.ttf";
3954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kKOFont[] = "Ko.ttf";
4054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kLatinBoldFont[] = "Bold.ttf";
4154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kLatinBoldItalicFont[] = "BoldItalic.ttf";
4254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kLatinFont[] = "Regular.ttf";
4354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kLatinItalicFont[] = "Italic.ttf";
4454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kZH_HansFont[] = "ZhHans.ttf";
4554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kZH_HantFont[] = "ZhHant.ttf";
4654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka
4754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kEmojiXmlFile[] = "emoji.xml";
4854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kNoGlyphFont[] = "NoGlyphFont.ttf";
4954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kColorEmojiFont[] = "ColorEmojiFont.ttf";
5054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kTextEmojiFont[] = "TextEmojiFont.ttf";
5154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kMixedEmojiFont[] = "ColorTextMixedEmojiFont.ttf";
5254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka
5354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kHasCmapFormat14Font[] = "NoCmapFormat14.ttf";
5454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakaconst char kNoCmapFormat14Font[] = "VariationSelectorTest-Regular.ttf";
554a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
56b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka// Utility functions for calling itemize function.
57dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonakavoid itemize(const std::shared_ptr<FontCollection>& collection, const char* str, FontStyle style,
58b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka             const std::string& localeList, std::vector<FontCollection::Run>* result) {
591c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    const size_t BUF_SIZE = 256;
601c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    uint16_t buf[BUF_SIZE];
611c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    size_t len;
621c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
631c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    result->clear();
641c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ParseUnicode(buf, BUF_SIZE, str, &len, NULL);
65b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    const uint32_t localeListId = registerLocaleList(localeList);
6637dd6e7493f372fd04dadf94351ca522b56b4119Seigo Nonaka    MinikinPaint paint(collection);
67538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    paint.fontStyle = style;
68538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    paint.localeListId = localeListId;
69538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    collection->itemize(buf, len, paint, result);
70b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka}
71b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka
72b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka// Overloaded version for default font style.
73b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonakavoid itemize(const std::shared_ptr<FontCollection>& collection, const char* str,
74b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka             const std::string& localeList, std::vector<FontCollection::Run>* result) {
75b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, str, FontStyle(), localeList, result);
76b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka}
77b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka
78b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka// Overloaded version for empty locale list id.
796c8722e217ff5238f0b849152d7936959a728103Seigo Nonakavoid itemize(const std::shared_ptr<FontCollection>& collection, const char* str, FontStyle style,
806c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka             std::vector<FontCollection::Run>* result) {
81b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, str, style, "", result);
82b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka}
83b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka
84b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka// Overloaded version for default font style and empty locale list id.
85b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonakavoid itemize(const std::shared_ptr<FontCollection>& collection, const char* str,
86b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka             std::vector<FontCollection::Run>* result) {
87b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, str, FontStyle(), "", result);
881c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
891c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
901c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka// Utility function to obtain font path associated with run.
9154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonakastd::string getFontName(const FontCollection::Run& run) {
92369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_NE(nullptr, run.fakedFont.font);
9354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    return getBasename(
9454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka            ((FreeTypeMinikinFontForTest*)run.fakedFont.font->typeface().get())->fontPath());
951c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
961c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
971d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka// Utility function to obtain LocaleList from string.
981d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonakaconst LocaleList& registerAndGetLocaleList(const std::string& locale_string) {
991d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka    return LocaleListCache::getById(LocaleListCache::getId(locale_string));
1006f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka}
1016f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
1021be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_latin) {
10354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
1041c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
1051c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
1061c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    const FontStyle kRegularStyle = FontStyle();
107538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    const FontStyle kItalicStyle = FontStyle(FontStyle::Slant::ITALIC);
108538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    const FontStyle kBoldStyle = FontStyle(FontStyle::Weight::BOLD);
109538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    const FontStyle kBoldItalicStyle = FontStyle(FontStyle::Weight::BOLD, FontStyle::Slant::ITALIC);
1101c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
111dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' 'b' 'c' 'd' 'e'", kRegularStyle, &runs);
1121c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1131c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1141c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
11554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
1161c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1171c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1181c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
119dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' 'b' 'c' 'd' 'e'", kItalicStyle, &runs);
1201c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1211c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1221c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
12354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinItalicFont, getFontName(runs[0]));
1241c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1251c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1261c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
127dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' 'b' 'c' 'd' 'e'", kBoldStyle, &runs);
1281c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1291c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1301c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
13154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinBoldFont, getFontName(runs[0]));
1321c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1331c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1341c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
135dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' 'b' 'c' 'd' 'e'", kBoldItalicStyle, &runs);
1361c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1371c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1381c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
13954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinBoldItalicFont, getFontName(runs[0]));
1401c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1411c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1421c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
1431c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Continue if the specific characters (e.g. hyphen, comma, etc.) is
1441c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // followed.
145dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' ',' '-' 'd' '!'", kRegularStyle, &runs);
1461c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1471c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1481c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
14954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
1501c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1511c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1521c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
153dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' ',' '-' 'd' '!'", kRegularStyle, &runs);
1541c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1551c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1561c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
15754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
1581c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1591c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1601c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
161f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // U+0301 (COMBINING ACUTE ACCENT) must be in the same run with preceding
1621c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // chars if the font supports it.
163dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    itemize(collection, "'a' U+0301", kRegularStyle, &runs);
1641c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1651c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1661c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
16754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
1681c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
1691c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
1701c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
1711c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
1721be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_combining) {
173f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // The regular font and the Cherokee font both support U+0301 (COMBINING ACUTE ACCENT). Since
174f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // it's a combining mark, it should come from whatever font the base character comes from.
17554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
176f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    std::vector<FontCollection::Run> runs;
177f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
178b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+0301", &runs);
179f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
180f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
181f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(2, runs[0].end);
18254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
183f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
184f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // CHEROKEE LETTER A, COMBINING ACUTE ACCENT
185b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+13A0 U+0301", &runs);
186f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
187f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
188f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(2, runs[0].end);
18954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kCherokeeFont, getFontName(runs[0]));
190f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
191f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // CHEROKEE LETTER A, COMBINING ACUTE ACCENT, COMBINING ACUTE ACCENT
192b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+13A0 U+0301 U+0301", &runs);
193f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
194f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
195f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(3, runs[0].end);
19654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kCherokeeFont, getFontName(runs[0]));
197f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
198b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+0301", &runs);
199f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
200f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
201f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(1, runs[0].end);
20254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
203f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
204f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    // COMBINING ACUTE ACCENT, CHEROKEE LETTER A, COMBINING ACUTE ACCENT
205b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+0301 U+13A0 U+0301", &runs);
206f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    ASSERT_EQ(2U, runs.size());
207f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
208f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(1, runs[0].end);
20954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
210f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(1, runs[1].start);
211f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader    EXPECT_EQ(3, runs[1].end);
21254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kCherokeeFont, getFontName(runs[1]));
213f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader}
214f3285d4ecf7567e1bd73ffcbb5ad6901bbc03df5Roozbeh Pournader
2151be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_emoji) {
21654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
2171c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
2181c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
219b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+1F469 U+1F467", &runs);
2201c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
2211c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
2221c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
22354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
2241c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2251c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2261c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2271c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // U+20E3(COMBINING ENCLOSING KEYCAP) must be in the same run with preceding
2281c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // character if the font supports.
229b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'0' U+20E3", &runs);
2301c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
2311c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
2321c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
23354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
2341c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2351c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2361c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
237b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+1F470 U+20E3", &runs);
2383dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    ASSERT_EQ(1U, runs.size());
2393dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
2403dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(3, runs[0].end);
24154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
2423dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2433dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2443dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka
245b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+1F470 U+20E3", &runs);
2463dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    ASSERT_EQ(2U, runs.size());
2473dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
2483dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
24954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
2503dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2513dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2523dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka
2533dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(2, runs[1].start);
2543dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_EQ(5, runs[1].end);
25554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[1]));
2563dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
2573dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
2583dd8757fcf48976295bac566277b6da1046e8362Seigo Nonaka
2591c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Currently there is no fonts which has a glyph for 'a' + U+20E3, so they
2601c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // are splitted into two.
261b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+20E3", &runs);
2621c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(2U, runs.size());
2631c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
2641c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
26554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
2661c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2671c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2681c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2691c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
2701c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[1].end);
27154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[1]));
2721c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
2731c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
2741c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
2751c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2761be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_non_latin) {
27754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
2781c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
2791c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2801c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Japanese Hiragana characters.
281b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", "ja-JP", &runs);
2821c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
2831c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
2841c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
28554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
2861c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2871c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2881c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2891c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Korean Hangul characters.
290b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+B300 U+D55C U+BBFC U+AD6D", "en-US", &runs);
2911c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
2921c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
2931c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
29454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kKOFont, getFontName(runs[0]));
2951c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
2961c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
2971c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
2981c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Han characters ja, zh-Hans font having.
2991c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Japanese font should be selected if the specified language is Japanese.
300b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+81ED U+82B1 U+5FCD", "ja-JP", &runs);
3011c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
3021c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
3031c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
30454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
3051c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
3061c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
3071c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3081c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Simplified Chinese font should be selected if the specified language is Simplified
3091c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Chinese.
310b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+81ED U+82B1 U+5FCD", "zh-Hans", &runs);
3111c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
3121c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
3131c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
31454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
3151c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
3161c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
3171c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3181c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Fallbacks to other fonts if there is no glyph in the specified language's
3191c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // font. There is no character U+4F60 in Japanese.
320b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+81ED U+4F60 U+5FCD", "ja-JP", &runs);
3211c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(3U, runs.size());
3221c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
3231c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
32454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
3251c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
3261c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
3271c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3281c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
3291c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[1].end);
33054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[1]));
3311c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
3321c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
3331c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3341c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[2].start);
3351c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(3, runs[2].end);
33654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[2]));
3371c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeBold());
3381c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeItalic());
3391c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3401c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Tone mark.
341b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4444 U+302D", "", &runs);
3421c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
3431c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
3441c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
34554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
3461c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
3471c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
34843bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka
34943bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    // Both zh-Hant and ja fonts support U+242EE, but zh-Hans doesn't.
35043bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    // Here, ja and zh-Hant font should have the same score but ja should be selected since it is
35143bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    // listed before zh-Hant.
352b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE", "zh-Hans", &runs);
35343bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    ASSERT_EQ(1U, runs.size());
35443bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
35543bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
35654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
35743bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
35843bb9743ca91a761b9723674ac862660dd2be834Seigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
3591c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
3601c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3611be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_mixed) {
36254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
3631c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
3641c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
365b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+4F60 'b' U+4F60 'c'", "en-US", &runs);
3661c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(5U, runs.size());
3671c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
3681c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
36954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
3701c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
3711c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
3721c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3731c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
3741c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[1].end);
37554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[1]));
3761c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeBold());
3771c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[1].fakedFont.fakery.isFakeItalic());
3781c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3791c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(2, runs[2].start);
3801c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(3, runs[2].end);
38154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[2]));
3821c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeBold());
3831c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[2].fakedFont.fakery.isFakeItalic());
3841c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3851c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(3, runs[3].start);
3861c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(4, runs[3].end);
38754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[3]));
3881c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[3].fakedFont.fakery.isFakeBold());
3891c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[3].fakedFont.fakery.isFakeItalic());
3901c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3911c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(4, runs[4].start);
3921c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[4].end);
39354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[4]));
3941c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[4].fakedFont.fakery.isFakeBold());
3951c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[4].fakedFont.fakery.isFakeItalic());
3961c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
3971c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
3981be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_variationSelector) {
39954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
400bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    std::vector<FontCollection::Run> runs;
401bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
402bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // A glyph for U+4FAE is provided by both Japanese font and Simplified
403bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Chinese font. Also a glyph for U+242EE is provided by both Japanese and
404bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Traditional Chinese font.  To avoid effects of device default locale,
405bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // explicitly specify the locale.
406bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
407bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+4FAE is available in both zh_Hans and ja font, but U+4FAE,U+FE00 is
408bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // only available in ja font.
409b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE", "zh-Hans", &runs);
410bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
411bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
412bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
41354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
414bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
415b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE U+FE00", "zh-Hans", &runs);
416bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
417bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
418bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
41954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
420bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
421b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE U+4FAE U+FE00", "zh-Hans", &runs);
422bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(2U, runs.size());
423bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
424bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
42554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
426bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
427bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[1].end);
42854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
429bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
430b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE U+4FAE U+FE00 U+4FAE", "zh-Hans", &runs);
431bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(3U, runs.size());
432bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
433bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
43454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
435bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
436bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[1].end);
43754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
438bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[2].start);
439bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[2].end);
44054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[2]));
441bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
442bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Validation selector after validation selector.
443b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE U+FE00 U+FE00", "zh-Hans", &runs);
444bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
445bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
446bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
44754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
448bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
449bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // No font supports U+242EE U+FE0E.
450b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+4FAE U+FE0E", "zh-Hans", &runs);
451bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
452bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
453bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
45454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
455bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
456bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Surrogate pairs handling.
457bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+242EE is available in ja font and zh_Hant font.
458bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+242EE U+FE00 is available only in ja font.
459b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE", "zh-Hant", &runs);
460bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
461bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
462bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
46354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
464bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
465b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+FE00", "zh-Hant", &runs);
466bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
467bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
468bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
46954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
470bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
471b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+242EE U+FE00", "zh-Hant", &runs);
472bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(2U, runs.size());
473bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
474bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
47554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
476bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[1].start);
477bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(5, runs[1].end);
47854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
479bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
480b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+242EE U+FE00 U+242EE", "zh-Hant", &runs);
481bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(3U, runs.size());
482bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
483bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
48454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
485bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[1].start);
486bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(5, runs[1].end);
48754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
488bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(5, runs[2].start);
489bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(7, runs[2].end);
49054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[2]));
491bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
492bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Validation selector after validation selector.
493b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+FE00 U+FE00", "zh-Hans", &runs);
494bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
495bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
496bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
49754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
498bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
499bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // No font supports U+242EE U+FE0E
500b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+FE0E", "zh-Hant", &runs);
501bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
502bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
503bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
50454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
505bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
506bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Isolated variation selector supplement.
507b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FE00", "", &runs);
508bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
509bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
510bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
51154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.font == nullptr || kLatinFont == getFontName(runs[0]));
512bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
513b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FE00", "zh-Hant", &runs);
514bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
515bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
516bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
51754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.font == nullptr || kLatinFont == getFontName(runs[0]));
518369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
519369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // First font family (Regular.ttf) supports U+203C but doesn't support U+203C U+FE0F.
5206f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    // Emoji.ttf font supports U+203C U+FE0F.  Emoji.ttf should be selected.
521b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+203C U+FE0F", "zh-Hant", &runs);
522369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
523369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
524369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
52554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
526369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
527369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // First font family (Regular.ttf) supports U+203C U+FE0E.
528b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+203C U+FE0E", "zh-Hant", &runs);
529369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
530369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
531369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
53254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
533bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka}
534bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
5351be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_variationSelectorSupplement) {
53654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
537bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    std::vector<FontCollection::Run> runs;
538bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
539bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // A glyph for U+845B is provided by both Japanese font and Simplified
540bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Chinese font. Also a glyph for U+242EE is provided by both Japanese and
541bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Traditional Chinese font.  To avoid effects of device default locale,
542bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // explicitly specify the locale.
543bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
544bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+845B is available in both zh_Hans and ja font, but U+845B,U+E0100 is
545bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // only available in ja font.
546b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B", "zh-Hans", &runs);
547bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
548bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
549bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
55054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
551bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
552b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B U+E0100", "zh-Hans", &runs);
553bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
554bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
555bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
55654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
557bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
558b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B U+845B U+E0100", "zh-Hans", &runs);
559bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(2U, runs.size());
560bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
561bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
56254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
563bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
564bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[1].end);
56554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
566bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
567b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B U+845B U+E0100 U+845B", "zh-Hans", &runs);
568bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(3U, runs.size());
569bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
570bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
57154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
572bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(1, runs[1].start);
573bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[1].end);
57454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
575bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[2].start);
576bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(5, runs[2].end);
57754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[2]));
578bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
579bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Validation selector after validation selector.
580b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B U+E0100 U+E0100", "zh-Hans", &runs);
581bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
582bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
583bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
58454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
585bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
586bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // No font supports U+845B U+E01E0.
587b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+845B U+E01E0", "zh-Hans", &runs);
588bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
589bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
590bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
59154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HansFont, getFontName(runs[0]));
592bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
593bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Isolated variation selector supplement
594bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Surrogate pairs handling.
595bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+242EE is available in ja font and zh_Hant font.
596bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // U+242EE U+E0100 is available only in ja font.
597b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE", "zh-Hant", &runs);
598bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
599bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
600bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
60154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
602bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
603b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+E0101", "zh-Hant", &runs);
604bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
605bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
606bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
60754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
608bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
609b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+242EE U+E0101", "zh-Hant", &runs);
610bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(2U, runs.size());
611bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
612bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
61354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
614bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[1].start);
615bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(6, runs[1].end);
61654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
617bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
618b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+242EE U+E0101 U+242EE", "zh-Hant", &runs);
619bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(3U, runs.size());
620bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
621bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
62254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
623bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[1].start);
624bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(6, runs[1].end);
62554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[1]));
626bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(6, runs[2].start);
627bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(8, runs[2].end);
62854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[2]));
629bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
630bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Validation selector after validation selector.
631b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+E0100 U+E0100", "zh-Hant", &runs);
632bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
633bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
634bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(6, runs[0].end);
63554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
636bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
637bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // No font supports U+242EE U+E01E0.
638b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+242EE U+E01E0", "zh-Hant", &runs);
639bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
640bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
641bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
64254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kZH_HantFont, getFontName(runs[0]));
643bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
644bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    // Isolated variation selector supplement.
645b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+E0100", "", &runs);
646bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
647bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
648bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
64954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.font == nullptr || kLatinFont == getFontName(runs[0]));
650bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
651b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+E0100", "zh-Hant", &runs);
652bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    ASSERT_EQ(1U, runs.size());
653bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
654bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
65554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.font == nullptr || kLatinFont == getFontName(runs[0]));
656bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka}
657bbdd73ec077a1bb6801b25a639834be16dfd78cbSeigo Nonaka
6581be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_no_crash) {
65954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
6601c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
6611c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6621c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Broken Surrogate pairs. Check only not crashing.
663b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+D83D 'a'", &runs);
664b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+DC69 'a'", &runs);
665b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+D83D U+D83D 'a'", &runs);
666b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+DC69 U+DC69 'a'", &runs);
6671c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6681c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Isolated variation selector. Check only not crashing.
669b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FE00 U+FE00", &runs);
670b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+E0100 U+E0100", &runs);
671b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FE00 U+E0100", &runs);
672b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+E0100 U+FE00", &runs);
6731c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6741c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Tone mark only. Check only not crashing.
675b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+302D", &runs);
676b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+302D U+302D", &runs);
6771c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6781c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Tone mark and variation selector mixed. Check only not crashing.
679b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FE00 U+302D U+E0100", &runs);
6801c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
6811c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6821be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_fakery) {
68354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
6841c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    std::vector<FontCollection::Run> runs;
6851c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
686538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    FontStyle kBoldStyle(FontStyle::Weight::BOLD);
687538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    FontStyle kItalicStyle(FontStyle::Slant::ITALIC);
688538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    FontStyle kBoldItalicStyle(FontStyle::Weight::BOLD, FontStyle::Slant::ITALIC);
6891c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6901c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // Currently there is no italic or bold font for Japanese. FontFakery has
6911c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // the differences between desired and actual font style.
6921c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
6931c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Japanese Hiragana characters.
694b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kBoldStyle, "ja-JP", &runs);
6951c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
6961c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
6971c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
69854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
6991c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeBold());
7001c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeItalic());
7011c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
7021c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Japanese Hiragana characters.
703b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kItalicStyle, "ja-JP", &runs);
7041c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
7051c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
7061c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
70754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
7081c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_FALSE(runs[0].fakedFont.fakery.isFakeBold());
7091c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeItalic());
7101c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
7111c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    // All Japanese Hiragana characters.
712b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+3042 U+3044 U+3046 U+3048 U+304A", kBoldItalicStyle, "ja-JP", &runs);
7131c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    ASSERT_EQ(1U, runs.size());
7141c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
7151c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
71654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
7171c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeBold());
7181c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka    EXPECT_TRUE(runs[0].fakedFont.fakery.isFakeItalic());
7191c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka}
7201c2bd209d11e59ea3a31d49ec4e97725fd711beaSeigo Nonaka
7211be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_vs_sequence_but_no_base_char) {
722fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    // kVSTestFont supports U+717D U+FE02 but doesn't support U+717D.
723fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    // kVSTestFont should be selected for U+717D U+FE02 even if it does not support the base code
724fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    // point.
72554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    const std::string kVSTestFont = "VariationSelectorTest-Regular.ttf";
726fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka
727dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::vector<std::shared_ptr<FontFamily>> families;
728e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    families.push_back(buildFontFamily(kLatinFont));
729e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    families.push_back(buildFontFamily(kVSTestFont));
730fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka
731dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> collection(new FontCollection(families));
732fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka
733fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    std::vector<FontCollection::Run> runs;
734fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka
735b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+717D U+FE02", &runs);
736fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    ASSERT_EQ(1U, runs.size());
737fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
738fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
73954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kVSTestFont, getFontName(runs[0]));
740fc119c68f5def1e44e65ae4cdd147c01d62c9ad2Seigo Nonaka}
741369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
7421be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_format_chars) {
74354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
744946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    std::vector<FontCollection::Run> runs;
745946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
746b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+061C 'b'", &runs);
747946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
748946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
749946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(3, runs[0].end);
75054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
751946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
752b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "'a' U+200D 'b'", &runs);
753946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
754946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
755946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(3, runs[0].end);
75654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
757946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
758b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+3042 U+061C U+3042", &runs);
759946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
760946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
761946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(3, runs[0].end);
76254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
763946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
764b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+061C 'b'", &runs);
765946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
766946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
767946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(2, runs[0].end);
76854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
769946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
770b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+061C U+3042", &runs);
771946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
772946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
773946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(2, runs[0].end);
77454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kJAFont, getFontName(runs[0]));
775946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
776b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+061C", &runs);
777946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
778946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
779946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(1, runs[0].end);
78054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
781946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
782b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+061C U+061C U+061C", &runs);
783946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
784946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
785946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(3, runs[0].end);
78654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
787946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
788b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+200D U+20E3", &runs);
789946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
790946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
791946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(2, runs[0].end);
79254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
793946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
794b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+200D", &runs);
795946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
796946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
797946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(1, runs[0].end);
79854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kLatinFont, getFontName(runs[0]));
799946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
800b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+20E3", &runs);
801946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    ASSERT_EQ(1U, runs.size());
802946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(0, runs[0].start);
803946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader    EXPECT_EQ(1, runs[0].end);
80454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kEmojiFont, getFontName(runs[0]));
805946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader}
806946e8893faf74aa3a7655cab3134fd3f28fe0d80Roozbeh Pournader
8071be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_LocaleScore) {
8086f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    struct TestCase {
8091d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        std::string userPreferredLocale;
8101d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        std::vector<std::string> fontLocales;
8116f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        int selectedFontIndex;
8126f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    } testCases[] = {
8136c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Font can specify empty locale.
8146c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"und", {"", ""}, 0},
8156c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"und", {"", "en-Latn"}, 0},
8166c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"", ""}, 0},
8176c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"", "en-Latn"}, 1},
8186c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8196c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Single user preferred locale.
8206c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Exact match case
8216c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"en-Latn", "ja-Jpan"}, 0},
8226c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Jpan", {"en-Latn", "ja-Jpan"}, 1},
8236c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 0},
8246c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"nl-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 1},
8256c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"es-Latn", {"en-Latn", "nl-Latn", "es-Latn"}, 2},
8266c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"es-Latn", {"en-Latn", "en-Latn", "nl-Latn"}, 0},
8276c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8286c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Exact script match case
8296c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"nl-Latn", "e-Latn"}, 0},
8306c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Arab", {"nl-Latn", "ar-Arab"}, 1},
8316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"be-Latn", "ar-Arab", "d-Beng"}, 0},
8326c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Arab", {"be-Latn", "ar-Arab", "d-Beng"}, 1},
8336c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Beng", {"be-Latn", "ar-Arab", "d-Beng"}, 2},
8346c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Beng", {"be-Latn", "ar-Beng", "d-Beng"}, 1},
8356c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hant", {"zh-Hant", "zh-Hans"}, 0},
8366c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hans", {"zh-Hant", "zh-Hans"}, 1},
8376c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8386c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Subscript match case, e.g. Jpan supports Hira.
8396c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Hira", {"ja-Jpan"}, 0},
8406c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hani", {"zh-Hans", "zh-Hant"}, 0},
8416c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hani", {"zh-Hant", "zh-Hans"}, 0},
8426c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Hira", {"zh-Hant", "ja-Jpan", "ja-Jpan"}, 1},
8436c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8446c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Language match case
8456c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Latn", {"zh-Latn", "ja-Latn"}, 1},
8466c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Latn", {"zh-Latn", "ja-Latn"}, 0},
8476c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Latn", {"zh-Latn", "ja-Latn"}, 1},
8486c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Latn", {"zh-Latn", "ja-Latn", "ja-Latn"}, 1},
8496c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8506c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Mixed case
8516c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Script/subscript match is strongest.
8526c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Jpan", {"en-Latn", "ja-Latn", "en-Jpan"}, 2},
8536c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Hira", {"en-Latn", "ja-Latn", "en-Jpan"}, 2},
8546c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Hira", {"en-Latn", "ja-Latn", "en-Jpan", "en-Jpan"}, 2},
8556c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8566c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Language match only happens if the script matches.
8576c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Hira", {"en-Latn", "ja-Latn"}, 0},
8586c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Hira", {"en-Jpan", "ja-Jpan"}, 1},
8596c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8606c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Multiple locales.
8616c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Even if all fonts have the same score, use the 2nd locale for better selection.
8626c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Jpan", {"zh-Hant", "zh-Hans", "ja-Jpan"}, 2},
8636c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn"}, 2},
8646c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,br-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn"}, 2},
8656c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,br-Latn,nl-Latn", {"es-Latn", "be-Latn", "nl-Latn", "nl-Latn"}, 2},
8666c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8676c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Script score.
8686c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Jpan", {"en-Arab", "en-Jpan"}, 1},
8696c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Jpan", {"en-Arab", "en-Jpan", "en-Jpan"}, 1},
8706c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8716c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Language match case
8726c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Latn", {"bd-Latn", "ja-Latn"}, 1},
8736c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Latn", {"bd-Latn", "ja-Latn", "ja-Latn"}, 1},
8746c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8756c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Language match only happens if the script matches.
8766c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ar-Arab", {"en-Beng", "ar-Arab"}, 1},
8776c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8786c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Multiple locales in the font settings.
8796c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ko-Jamo", {"ja-Jpan", "ko-Kore", "ko-Kore,ko-Jamo"}, 2},
8806c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"ja-Jpan", "en-Latn,ja-Jpan"}, 1},
8816c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"ja-Jpan", "ja-Jpan,en-Latn"}, 1},
8826c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"ja-Jpan,zh-Hant", "en-Latn,ja-Jpan", "en-Latn"}, 1},
8836c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn", {"zh-Hant,ja-Jpan", "ja-Jpan,en-Latn", "en-Latn"}, 1},
8846c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8856c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Kore = Hang + Hani, etc.
8866c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ko-Kore", {"ko-Hang", "ko-Jamo,ko-Hani", "ko-Hang,ko-Hani"}, 2},
8876c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Hrkt", {"ja-Hira", "ja-Kana", "ja-Hira,ja-Kana"}, 2},
8886c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Jpan", {"ja-Hira", "ja-Kana", "ja-Hani", "ja-Hira,ja-Kana,ja-Hani"}, 3},
8896c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hanb", {"zh-Hant", "zh-Bopo", "zh-Hant,zh-Bopo"}, 2},
8906c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hanb", {"ja-Hanb", "zh-Hant,zh-Bopo"}, 1},
8916c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8926c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Language match with unified subscript bits.
8936c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hanb", {"zh-Hant", "zh-Bopo", "ja-Hant,ja-Bopo", "zh-Hant,zh-Bopo"}, 3},
8946c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"zh-Hanb", {"zh-Hant", "zh-Bopo", "ja-Hant,zh-Bopo", "zh-Hant,zh-Bopo"}, 3},
8956c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
8966c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Two elements subtag matching: language and subtag or language or script.
8976c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Kana-u-em-emoji", {"zh-Hant", "ja-Kana"}, 1},
8986c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Kana-u-em-emoji", {"zh-Hant", "ja-Kana", "ja-Zsye"}, 2},
8996c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"ja-Zsym-u-em-emoji", {"ja-Kana", "ja-Zsym", "ja-Zsye"}, 2},
9006c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
9016c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // One element subtag matching: subtag only or script only.
9026c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn-u-em-emoji", {"ja-Latn", "ja-Zsye"}, 1},
9036c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Zsym-u-em-emoji", {"ja-Zsym", "ja-Zsye"}, 1},
9046c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Zsye-u-em-text", {"ja-Zsym", "ja-Zsye"}, 0},
9056c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
9066c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Multiple locale list with subtags.
9076c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,ja-Jpan-u-em-text", {"en-Latn", "en-Zsye", "en-Zsym"}, 0},
9086c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"en-Latn,en-Zsye,ja-Jpan-u-em-text", {"zh", "en-Zsye", "en-Zsym"}, 1},
9096f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    };
9106f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9116f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    for (auto testCase : testCases) {
9121d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        std::string fontLocaleStr = "{";
9131d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        for (size_t i = 0; i < testCase.fontLocales.size(); ++i) {
914f3afe92def0fff022889fd036d68451223aac146Seigo Nonaka            if (i != 0) {
9151d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka                fontLocaleStr += ", ";
916f3afe92def0fff022889fd036d68451223aac146Seigo Nonaka            }
9171d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka            fontLocaleStr += "\"" + testCase.fontLocales[i] + "\"";
918f3afe92def0fff022889fd036d68451223aac146Seigo Nonaka        }
9191d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        fontLocaleStr += "}";
9201d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        SCOPED_TRACE("Test of user preferred locale: \"" + testCase.userPreferredLocale +
9211d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka                     "\" with font locale: " + fontLocaleStr);
9226f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
923dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka        std::vector<std::shared_ptr<FontFamily>> families;
9246f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9256f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // Prepare first font which doesn't supports U+9AA8
92654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka        auto firstFamilyMinikinFont =
92754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka                std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath(kNoGlyphFont));
928e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka        std::vector<Font> fonts;
929a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka        fonts.push_back(Font::Builder(firstFamilyMinikinFont).build());
930e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka        auto firstFamily = std::make_shared<FontFamily>(
931e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka                registerLocaleList("und"), FontFamily::Variant::DEFAULT, std::move(fonts));
9326f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        families.push_back(firstFamily);
9336f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9346f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // Prepare font families
9351d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        // Each font family is associated with a specified locale. All font families except for
9366f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // the first font support U+9AA8.
9371d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        std::unordered_map<MinikinFont*, int> fontLocaleIdxMap;
9386f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9391d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        for (size_t i = 0; i < testCase.fontLocales.size(); ++i) {
94054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka            auto minikinFont =
94154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka                    std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath(kJAFont));
942e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka            std::vector<Font> fonts;
943a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka            fonts.push_back(Font::Builder(minikinFont).build());
944e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka            auto family =
945e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka                    std::make_shared<FontFamily>(registerLocaleList(testCase.fontLocales[i]),
946e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka                                                 FontFamily::Variant::DEFAULT, std::move(fonts));
9476f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka            families.push_back(family);
948e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka            fontLocaleIdxMap.insert(std::make_pair(minikinFont.get(), i));
9496f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        }
950dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka        std::shared_ptr<FontCollection> collection(new FontCollection(families));
9516f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // Do itemize
9526f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        std::vector<FontCollection::Run> runs;
953b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka        itemize(collection, "U+9AA8", testCase.userPreferredLocale, &runs);
9546f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        ASSERT_EQ(1U, runs.size());
9556f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        ASSERT_NE(nullptr, runs[0].fakedFont.font);
9566f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9576f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // First family doesn't support U+9AA8 and others support it, so the first font should not
9586f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // be selected.
959a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka        EXPECT_NE(firstFamilyMinikinFont.get(), runs[0].fakedFont.font->typeface().get());
9606f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9616f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        // Lookup used font family by MinikinFont*.
962a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka        const int usedLocaleIndex = fontLocaleIdxMap[runs[0].fakedFont.font->typeface().get()];
9631d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        EXPECT_EQ(testCase.selectedFontIndex, usedLocaleIndex);
9646f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    }
9656f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka}
9666f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
9671be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_LocaleAndCoverage) {
9686f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    struct TestCase {
9696f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        std::string testString;
9701d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        std::string requestedLocales;
9716f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        std::string expectedFont;
9726f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    } testCases[] = {
9736c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Following test cases verify that following rules in font fallback chain.
9746c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // - If the first font in the collection supports the given character or variation
9756c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // sequence,
9766c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            //   it should be selected.
9776c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // - If the font doesn't support the given character, variation sequence or its base
9786c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            //   character, it should not be selected.
9796c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // - If two or more fonts match the requested locales, the font matches with the highest
9806c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            //   priority locale should be selected.
9816c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // - If two or more fonts get the same score, the font listed earlier in the XML file
9826c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            //   (here, kItemizeFontXml) should be selected.
9836c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
9846c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // Regardless of locale, the first font is always selected if it covers the code point.
9856c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"'a'", "", kLatinFont},
9866c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"'a'", "en-Latn", kLatinFont},
9876c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"'a'", "ja-Jpan", kLatinFont},
9886c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"'a'", "ja-Jpan,en-Latn", kLatinFont},
9896c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"'a'", "zh-Hans,zh-Hant,en-Latn,ja-Jpan,fr-Latn", kLatinFont},
9906c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
9916c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+81ED is supported by both the ja font and zh-Hans font.
9926c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "", kZH_HansFont},         // zh-Hans font is listed before ja font.
9936c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn", kZH_HansFont},  // zh-Hans font is listed before ja font.
9946c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "ja-Jpan", kJAFont},
9956c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "zh-Hans", kZH_HansFont},
9966c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
9976c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "ja-Jpan,en-Latn", kJAFont},
9986c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn,ja-Jpan", kJAFont},
9996c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn,zh-Hans", kZH_HansFont},
10006c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "zh-Hans,en-Latn", kZH_HansFont},
10016c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "ja-Jpan,zh-Hans", kJAFont},
10026c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "zh-Hans,ja-Jpan", kZH_HansFont},
10036c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10046c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn,zh-Hans,ja-Jpan", kZH_HansFont},
10056c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn,ja-Jpan,zh-Hans", kJAFont},
10066c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "en-Latn,zh-Hans,ja-Jpan", kZH_HansFont},
10076c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "ja-Jpan,en-Latn,zh-Hans", kJAFont},
10086c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "ja-Jpan,zh-Hans,en-Latn", kJAFont},
10096c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "zh-Hans,en-Latn,ja-Jpan", kZH_HansFont},
10106c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED", "zh-Hans,ja-Jpan,en-Latn", kZH_HansFont},
10116c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10126c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+304A is only supported by ja font.
10136c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "", kJAFont},
10146c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "ja-Jpan", kJAFont},
10156c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hant", kJAFont},
10166c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hans", kJAFont},
10176c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10186c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "ja-Jpan,zh-Hant", kJAFont},
10196c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hant,ja-Jpan", kJAFont},
10206c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hans,zh-Hant", kJAFont},
10216c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hant,zh-Hans", kJAFont},
10226c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hans,ja-Jpan", kJAFont},
10236c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "ja-Jpan,zh-Hans", kJAFont},
10246c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10256c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
10266c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
10276c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
10286c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
10296c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
10306c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+304A", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
10316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10326c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+242EE is supported by both ja font and zh-Hant fonts but not by zh-Hans font.
10336c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "", kJAFont},  // ja font is listed before zh-Hant font.
10346c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "ja-Jpan", kJAFont},
10356c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hans", kJAFont},
10366c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hant", kZH_HantFont},
10376c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10386c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "ja-Jpan,zh-Hant", kJAFont},
10396c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hant,ja-Jpan", kZH_HantFont},
10406c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hans,zh-Hant", kZH_HantFont},
10416c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hant,zh-Hans", kZH_HantFont},
10426c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hans,ja-Jpan", kJAFont},
10436c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "ja-Jpan,zh-Hans", kJAFont},
10446c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10456c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
10466c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hans,zh-Hant,ja-Jpan", kZH_HantFont},
10476c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
10486c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
10496c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
10506c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
10516c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10526c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+9AA8 is supported by all ja-Jpan, zh-Hans, zh-Hant fonts.
10536c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "", kZH_HansFont},  // zh-Hans font is listed before ja and zh-Hant fonts.
10546c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "ja-Jpan", kJAFont},
10556c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hans", kZH_HansFont},
10566c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hant", kZH_HantFont},
10576c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10586c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "ja-Jpan,zh-Hant", kJAFont},
10596c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hant,ja-Jpan", kZH_HantFont},
10606c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hans,zh-Hant", kZH_HansFont},
10616c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hant,zh-Hans", kZH_HantFont},
10626c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hans,ja-Jpan", kZH_HansFont},
10636c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "ja-Jpan,zh-Hans", kJAFont},
10646c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10656c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
10666c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
10676c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
10686c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
10696c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
10706c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
10716c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10726c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+242EE U+FE00 is supported by ja font but not by zh-Hans or zh-Hant fonts.
10736c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "", kJAFont},
10746c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "ja-Jpan", kJAFont},
10756c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hant", kJAFont},
10766c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hans", kJAFont},
10776c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10786c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "ja-Jpan,zh-Hant", kJAFont},
10796c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hant,ja-Jpan", kJAFont},
10806c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hans,zh-Hant", kJAFont},
10816c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hant,zh-Hans", kJAFont},
10826c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hans,ja-Jpan", kJAFont},
10836c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "ja-Jpan,zh-Hans", kJAFont},
10846c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10856c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
10866c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
10876c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
10886c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
10896c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
10906c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+242EE U+FE00", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
10916c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10926c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // U+3402 U+E0100 is supported by both zh-Hans and zh-Hant but not by ja font.
10936c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "", kZH_HansFont},  // zh-Hans font is listed before zh-Hant font.
10946c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "ja-Jpan",
10956c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka             kZH_HansFont},  // zh-Hans font is listed before zh-Hant font.
10966c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hant", kZH_HantFont},
10976c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hans", kZH_HansFont},
10986c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
10996c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "ja-Jpan,zh-Hant", kZH_HantFont},
11006c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hant,ja-Jpan", kZH_HantFont},
11016c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
11026c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hant,zh-Hans", kZH_HantFont},
11036c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
11046c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "ja-Jpan,zh-Hans", kZH_HansFont},
11056c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11066c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
11076c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
11086c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kZH_HansFont},
11096c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kZH_HantFont},
11106c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
11116c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+3402 U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
11126c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11136c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // No font supports U+4444 U+FE00 but only zh-Hans supports its base character U+4444.
11146c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "", kZH_HansFont},
11156c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "ja-Jpan", kZH_HansFont},
11166c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hant", kZH_HansFont},
11176c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hans", kZH_HansFont},
11186c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11196c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "ja-Jpan,zh-Hant", kZH_HansFont},
11206c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hant,ja-Jpan", kZH_HansFont},
11216c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hans,zh-Hant", kZH_HansFont},
11226c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hant,zh-Hans", kZH_HansFont},
11236c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hans,ja-Jpan", kZH_HansFont},
11246c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "ja-Jpan,zh-Hans", kZH_HansFont},
11256c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11266c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
11276c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
11286c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "ja-Jpan,zh-Hans,zh-Hant", kZH_HansFont},
11296c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "ja-Jpan,zh-Hant,zh-Hans", kZH_HansFont},
11306c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hant,zh-Hans,ja-Jpan", kZH_HansFont},
11316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+4444 U+FE00", "zh-Hant,ja-Jpan,zh-Hans", kZH_HansFont},
11326c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11336c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // No font supports U+81ED U+E0100 but ja and zh-Hans support its base character U+81ED.
11346c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // zh-Hans font is listed before ja font.
11356c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "", kZH_HansFont},
11366c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "ja-Jpan", kJAFont},
11376c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hant", kZH_HansFont},
11386c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hans", kZH_HansFont},
11396c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11406c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "ja-Jpan,zh-Hant", kJAFont},
11416c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hant,ja-Jpan", kJAFont},
11426c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
11436c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hant,zh-Hans", kZH_HansFont},
11446c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
11456c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "ja-Jpan,zh-Hans", kJAFont},
11466c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11476c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
11486c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
11496c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
11506c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
11516c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HansFont},
11526c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+81ED U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
11536c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11546c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // No font supports U+9AA8 U+E0100 but all zh-Hans zh-hant ja fonts support its base
11556c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // character U+9AA8.
11566c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // zh-Hans font is listed before ja and zh-Hant fonts.
11576c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "", kZH_HansFont},
11586c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "ja-Jpan", kJAFont},
11596c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hans", kZH_HansFont},
11606c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hant", kZH_HantFont},
11616c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11626c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "ja-Jpan,zh-Hant", kJAFont},
11636c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hant,ja-Jpan", kZH_HantFont},
11646c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hans,zh-Hant", kZH_HansFont},
11656c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hant,zh-Hans", kZH_HantFont},
11666c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hans,ja-Jpan", kZH_HansFont},
11676c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "ja-Jpan,zh-Hans", kJAFont},
11686c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11696c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
11706c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
11716c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
11726c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
11736c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
11746c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+9AA8 U+E0100", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
11756c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11766c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // All zh-Hans,zh-Hant,ja fonts support U+35A8 U+E0100 and its base character U+35A8.
11776c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // zh-Hans font is listed before ja and zh-Hant fonts.
11786c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "", kZH_HansFont},
11796c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "ja-Jpan", kJAFont},
11806c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hans", kZH_HansFont},
11816c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hant", kZH_HantFont},
11826c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11836c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "ja-Jpan,zh-Hant", kJAFont},
11846c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hant,ja-Jpan", kZH_HantFont},
11856c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hans,zh-Hant", kZH_HansFont},
11866c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hant,zh-Hans", kZH_HantFont},
11876c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hans,ja-Jpan", kZH_HansFont},
11886c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "ja-Jpan,zh-Hans", kJAFont},
11896c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11906c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hans,ja-Jpan,zh-Hant", kZH_HansFont},
11916c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hans,zh-Hant,ja-Jpan", kZH_HansFont},
11926c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
11936c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
11946c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
11956c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35A8", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
11966c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
11976c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // All zh-Hans,zh-Hant,ja fonts support U+35B6 U+E0100, but zh-Hant and ja fonts support
11986c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // its
11996c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // base character U+35B6.
12006c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // ja font is listed before zh-Hant font.
12016c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "", kJAFont},
12026c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "ja-Jpan", kJAFont},
12036c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hant", kZH_HantFont},
12046c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hans", kJAFont},
12056c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12066c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "ja-Jpan,zh-Hant", kJAFont},
12076c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hant,ja-Jpan", kZH_HantFont},
12086c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hans,zh-Hant", kZH_HantFont},
12096c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hant,zh-Hans", kZH_HantFont},
12106c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hans,ja-Jpan", kJAFont},
12116c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "ja-Jpan,zh-Hans", kJAFont},
12126c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12136c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
12146c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hans,zh-Hant,ja-Jpan", kZH_HantFont},
12156c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
12166c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
12176c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hant,zh-Hans,ja-Jpan", kZH_HantFont},
12186c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35B6", "zh-Hant,ja-Jpan,zh-Hans", kZH_HantFont},
12196c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12206c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // All zh-Hans,zh-Hant,ja fonts support U+35C5 U+E0100, but only ja font supports its
12216c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // base
12226c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // character U+35C5.
12236c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "", kJAFont},
12246c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "ja-Jpan", kJAFont},
12256c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hant", kJAFont},
12266c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hans", kJAFont},
12276c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12286c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "ja-Jpan,zh-Hant", kJAFont},
12296c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hant,ja-Jpan", kJAFont},
12306c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hans,zh-Hant", kJAFont},
12316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hant,zh-Hans", kJAFont},
12326c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hans,ja-Jpan", kJAFont},
12336c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "ja-Jpan,zh-Hans", kJAFont},
12346c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12356c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hans,ja-Jpan,zh-Hant", kJAFont},
12366c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hans,zh-Hant,ja-Jpan", kJAFont},
12376c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "ja-Jpan,zh-Hans,zh-Hant", kJAFont},
12386c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "ja-Jpan,zh-Hant,zh-Hans", kJAFont},
12396c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hant,zh-Hans,ja-Jpan", kJAFont},
12406c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+35C5", "zh-Hant,ja-Jpan,zh-Hans", kJAFont},
12416c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12426c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            // None of ja-Jpan, zh-Hant, zh-Hans font supports U+1F469. Emoji font supports it.
12436c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "", kEmojiFont},
12446c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "ja-Jpan", kEmojiFont},
12456c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hant", kEmojiFont},
12466c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hans", kEmojiFont},
12476c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12486c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "ja-Jpan,zh-Hant", kEmojiFont},
12496c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hant,ja-Jpan", kEmojiFont},
12506c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hans,zh-Hant", kEmojiFont},
12516c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hant,zh-Hans", kEmojiFont},
12526c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hans,ja-Jpan", kEmojiFont},
12536c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "ja-Jpan,zh-Hans", kEmojiFont},
12546c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
12556c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hans,ja-Jpan,zh-Hant", kEmojiFont},
12566c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hans,zh-Hant,ja-Jpan", kEmojiFont},
12576c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "ja-Jpan,zh-Hans,zh-Hant", kEmojiFont},
12586c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "ja-Jpan,zh-Hant,zh-Hans", kEmojiFont},
12596c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hant,zh-Hans,ja-Jpan", kEmojiFont},
12606c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka            {"U+1F469", "zh-Hant,ja-Jpan,zh-Hans", kEmojiFont},
12616f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    };
12626f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
126354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kItemizeFontXml);
12646f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
12656f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    for (auto testCase : testCases) {
12661d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka        SCOPED_TRACE("Test for \"" + testCase.testString + "\" with locales " +
12671d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka                     testCase.requestedLocales);
12686f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
12696f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        std::vector<FontCollection::Run> runs;
1270b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka        itemize(collection, testCase.testString.c_str(), testCase.requestedLocales, &runs);
12716f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka        ASSERT_EQ(1U, runs.size());
127254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka        EXPECT_EQ(testCase.expectedFont, getFontName(runs[0]));
12736f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka    }
12746f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka}
12756f9966ea7c1910fd780cf7779cc59701c9b98a2bSeigo Nonaka
12761be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_emojiSelection_withFE0E) {
127754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1278369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    std::vector<FontCollection::Run> runs;
1279369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1280369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+00A9 is a text default emoji which is only available in TextEmojiFont.ttf.
1281369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // TextEmojiFont.ttf should be selected.
1282b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+00A9 U+FE0E", &runs);
1283369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1284369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1285369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
128654e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1287369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1288369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+00A9 is a text default emoji which is only available in ColorEmojiFont.ttf.
1289369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf should be selected.
1290b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+00AE U+FE0E", &runs);
1291369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1292369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1293369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
1294369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // Text emoji is specified but it is not available. Use color emoji instead.
129554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1296369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1297369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+203C is a text default emoji which is available in both TextEmojiFont.ttf and
1298369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. TextEmojiFont.ttf should be selected.
1299b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+203C U+FE0E", &runs);
1300369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1301369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1302369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
130354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1304369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1305369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+2049 is a text default emoji which is not available either TextEmojiFont.ttf or
1306369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. No font should be selected.
1307b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+2049 U+FE0E", &runs);
1308369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1309369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1310369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
131154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1312369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1313369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+231A is a emoji default emoji which is available only in TextEmojifFont.
1314369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // TextEmojiFont.ttf sohuld be selected.
1315b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+231A U+FE0E", &runs);
1316369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1317369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1318369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
131954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1320369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1321369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+231B is a emoji default emoji which is available only in ColorEmojiFont.ttf.
1322369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf should be selected.
1323b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+231B U+FE0E", &runs);
1324369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1325369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1326369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
1327369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // Text emoji is specified but it is not available. Use color emoji instead.
132854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1329369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1330369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+23E9 is a emoji default emoji which is available in both TextEmojiFont.ttf and
1331369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. TextEmojiFont.ttf should be selected even if U+23E9 is emoji default
1332369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // emoji since U+FE0E is appended.
1333b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+23E9 U+FE0E", &runs);
1334369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1335369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1336369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
133754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1338369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1339369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+23EA is a emoji default emoji but which is not available in either TextEmojiFont.ttf or
1340369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. No font should be selected.
1341b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+23EA U+FE0E", &runs);
1342369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1343369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1344369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
134554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1346369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
13471aa0c40db9d3d308758fc836ac117a9b4e3723a5Roozbeh Pournader    // U+26FA U+FE0E is specified but ColorTextMixedEmojiFont has a variation sequence U+26F9 U+FE0F
1348369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // in its cmap, so ColorTextMixedEmojiFont should be selected instaed of ColorEmojiFont.
1349b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+26FA U+FE0E", &runs);
1350369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1351369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1352369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
135354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kMixedEmojiFont, getFontName(runs[0]));
1354369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka}
1355369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
13561be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_emojiSelection_withFE0F) {
135754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1358369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    std::vector<FontCollection::Run> runs;
1359369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1360369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+00A9 is a text default emoji which is available only in TextEmojiFont.ttf.
1361369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // TextEmojiFont.ttf shoudl be selected.
1362b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+00A9 U+FE0F", &runs);
1363369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1364369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1365369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
1366369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // Color emoji is specified but it is not available. Use text representaion instead.
136754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1368369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1369369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+00AE is a text default emoji which is available only in ColorEmojiFont.ttf.
1370369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf should be selected.
1371b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+00AE U+FE0F", &runs);
1372369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1373369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1374369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
137554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1376369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1377369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+203C is a text default emoji which is available in both TextEmojiFont.ttf and
1378369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. ColorEmojiFont.ttf should be selected even if U+203C is a text default
1379369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // emoji since U+FF0F is appended.
1380b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+203C U+FE0F", &runs);
1381369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1382369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1383369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
138454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1385369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1386369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+2049 is a text default emoji which is not available in either TextEmojiFont.ttf or
1387369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. No font should be selected.
1388b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+2049 U+FE0F", &runs);
1389369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1390369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1391369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
139254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1393369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1394369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+231A is a emoji default emoji which is available only in TextEmojiFont.ttf.
1395369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // TextEmojiFont.ttf should be selected.
1396b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+231A U+FE0F", &runs);
1397369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1398369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1399369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
1400369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // Color emoji is specified but it is not available. Use text representation instead.
140154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
1402369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1403369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+231B is a emoji default emoji which is available only in ColorEmojiFont.ttf.
1404369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf should be selected.
1405b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+231B U+FE0F", &runs);
1406369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1407369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1408369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
140954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1410369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1411369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+23E9 is a emoji default emoji which is available in both TextEmojiFont.ttf and
1412369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. ColorEmojiFont.ttf should be selected.
1413b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+23E9 U+FE0F", &runs);
1414369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1415369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1416369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
141754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1418369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
1419369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // U+23EA is a emoji default emoji which is not available in either TextEmojiFont.ttf or
1420369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // ColorEmojiFont.ttf. No font should be selected.
1421b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+23EA U+FE0F", &runs);
1422369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1423369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1424369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
142554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1426369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
14271aa0c40db9d3d308758fc836ac117a9b4e3723a5Roozbeh Pournader    // U+26F9 U+FE0F is specified but ColorTextMixedEmojiFont has a variation sequence U+26F9 U+FE0F
1428369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    // in its cmap, so ColorTextMixedEmojiFont should be selected instaed of ColorEmojiFont.
1429b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+26F9 U+FE0F", &runs);
1430369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1431369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1432369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
143354e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kMixedEmojiFont, getFontName(runs[0]));
1434369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka}
1435369d2d44cb09ac4346cdd9e3b131bb173d764f88Seigo Nonaka
14361be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_emojiSelection_with_skinTone) {
143754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
14380036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    std::vector<FontCollection::Run> runs;
14390036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
14400036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    // TextEmoji font is selected since it is listed before ColorEmoji font.
1441b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+261D", &runs);
14420036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    ASSERT_EQ(1U, runs.size());
14430036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
14440036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(1, runs[0].end);
144554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
14460036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
14470036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    // If skin tone is specified, it should be colored.
1448b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+261D U+1F3FD", &runs);
14490036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    ASSERT_EQ(1U, runs.size());
14500036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
14510036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(3, runs[0].end);
145254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
14530036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
14540036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    // Still color font is selected if an emoji variation selector is specified.
1455b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+261D U+FE0F U+1F3FD", &runs);
14560036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    ASSERT_EQ(1U, runs.size());
14570036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
14580036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
145954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
14600036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
14610036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    // Text font should be selected if a text variation selector is specified and skin tone is
14620036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    // rendered by itself.
1463b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+261D U+FE0E U+1F3FD", &runs);
14640036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    ASSERT_EQ(2U, runs.size());
14650036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
14660036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(2, runs[0].end);
146754e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kTextEmojiFont, getFontName(runs[0]));
14680036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(2, runs[1].start);
14690036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    EXPECT_EQ(4, runs[1].end);
147054e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[1]));
14710036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka}
1472cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka
14731be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_PrivateUseArea) {
147454e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1475cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    std::vector<FontCollection::Run> runs;
1476cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka
1477cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    // Should not set nullptr to the result run. (Issue 26808815)
1478b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FEE10", &runs);
1479cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1480cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1481cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    EXPECT_EQ(2, runs[0].end);
148254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1483cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka
1484b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+FEE40 U+FE4C5", &runs);
1485cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    ASSERT_EQ(1U, runs.size());
1486cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    EXPECT_EQ(0, runs[0].start);
1487cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka    EXPECT_EQ(4, runs[0].end);
148854e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kNoGlyphFont, getFontName(runs[0]));
1489cee83d40324b1f3b8e113eb8c9eda8e12ef36923Seigo Nonaka}
149014e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka
14911be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemize_genderBalancedEmoji) {
149254e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
1493435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    std::vector<FontCollection::Run> runs;
1494435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka
1495b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+1F469 U+200D U+1F373", &runs);
1496435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1497435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1498435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
149954e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1500435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka
1501b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+1F469 U+200D U+2695 U+FE0F", &runs);
1502435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1503435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1504435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(5, runs[0].end);
150554e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1506435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka
1507b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+1F469 U+200D U+2695", &runs);
1508435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    ASSERT_EQ(1U, runs.size());
1509435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(0, runs[0].start);
1510435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka    EXPECT_EQ(4, runs[0].end);
151154e248ac7fa00d430092a8e993c83fccd4f72df5Seigo Nonaka    EXPECT_EQ(kColorEmojiFont, getFontName(runs[0]));
1512435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka}
1513435076ff2e3cae9e06f4d6069b0352a030787bdeSeigo Nonaka
15144a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka// For b/29585939
15151be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemizeShouldKeepOrderForVS) {
1516e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> dummyFamily = buildFontFamily(kNoGlyphFont);
1517e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> familyA = buildFontFamily(kZH_HansFont);
1518e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> familyB = buildFontFamily(kZH_HansFont);
15194a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
15206c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, familyA, familyB};
15216c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    std::vector<std::shared_ptr<FontFamily>> reversedFamilies = {dummyFamily, familyB, familyA};
15224a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
1523dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> collection(new FontCollection(families));
1524dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> reversedCollection(new FontCollection(reversedFamilies));
15254a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
15264a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    // Both fontA/fontB support U+35A8 but don't support U+35A8 U+E0100. The first font should be
15274a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    // selected.
15284a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    std::vector<FontCollection::Run> runs;
1529b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+35A8 U+E0100", &runs);
1530a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka    EXPECT_EQ(familyA->getFont(0), runs[0].fakedFont.font);
15314a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
1532b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(reversedCollection, "U+35A8 U+E0100", &runs);
1533a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka    EXPECT_EQ(familyB->getFont(0), runs[0].fakedFont.font);
15344a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka}
15354a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
15364a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka// For b/29585939
15371be4ac71900ca2258491a4d0b72a4bebce19da71Seigo NonakaTEST(FontCollectionItemizeTest, itemizeShouldKeepOrderForVS2) {
1538e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> dummyFamily = buildFontFamily(kNoGlyphFont);
1539e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> hasCmapFormat14Family = buildFontFamily(kHasCmapFormat14Font);
1540e1cfa7d7a17f9e24a27132032ec2f77a63e99913Seigo Nonaka    std::shared_ptr<FontFamily> noCmapFormat14Family = buildFontFamily(kNoCmapFormat14Font);
15416c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka
15426c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, hasCmapFormat14Family,
15436c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka                                                         noCmapFormat14Family};
15446c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka    std::vector<std::shared_ptr<FontFamily>> reversedFamilies = {dummyFamily, noCmapFormat14Family,
15456c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka                                                                 hasCmapFormat14Family};
15464a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
1547dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> collection(new FontCollection(families));
1548dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> reversedCollection(new FontCollection(reversedFamilies));
15494a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
15504a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    // Both hasCmapFormat14Font/noCmapFormat14Font support U+5380 but don't support U+5380 U+E0100.
15514a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    // The first font should be selected.
15524a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka    std::vector<FontCollection::Run> runs;
1553b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(collection, "U+5380 U+E0100", &runs);
1554a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka    EXPECT_EQ(hasCmapFormat14Family->getFont(0), runs[0].fakedFont.font);
15554a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
1556b47e9b21077d2a0847a64fa713aa9892196b5d2aSeigo Nonaka    itemize(reversedCollection, "U+5380 U+E0100", &runs);
1557a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka    EXPECT_EQ(noCmapFormat14Family->getFont(0), runs[0].fakedFont.font);
15584a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka}
15594a4e6574c02774c758974c1fadf161f829baaaa3Seigo Nonaka
15607fbdd83e92a76c955c67a1c761088b36daf7158cSeigo NonakaTEST(FontCollectionItemizeTest, colorEmojiSelectionTest) {
15617fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    auto dummyFamily = buildFontFamily(kNoGlyphFont);
15627fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    auto textEmojiFamily = buildFontFamily(kTextEmojiFont, "ja-JP");
15637fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    auto colorEmojiFamily = buildFontFamily(kColorEmojiFont, "und-Zsye");
15647fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15657fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    std::vector<std::shared_ptr<FontFamily>> families = {dummyFamily, textEmojiFamily,
15667fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka                                                         colorEmojiFamily};
15677fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    auto collection = std::make_shared<FontCollection>(families);
15687fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    std::vector<FontCollection::Run> runs;
15697fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    // Both textEmojiFamily and colorEmojiFamily supports U+203C and U+23E9.
15707fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    // U+203C is text default emoji, and U+23E9 is color default emoji.
15717fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "en-US,en-Zsym", &runs);
15727fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15737fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "en-US,en-Zsym", &runs);
15747fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15757fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15767fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "en-US,en-Zsye", &runs);
15777fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
15787fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "en-US,en-Zsye", &runs);
15797fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
15807fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15817fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-Zsym-JP", &runs);
15827fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15837fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-Zsym-JP", &runs);
15847fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15857fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15867fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-Zsye-JP", &runs);
15877fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
15887fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-Zsye-JP", &runs);
15897fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
15907fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15917fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-JP-u-em-text", &runs);
15927fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15937fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-JP-u-em-text", &runs);
15947fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
15957fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
15967fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-JP-u-em-emoji", &runs);
15977fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
15987fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-JP-u-em-emoji", &runs);
15997fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
16007fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
16017fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-JP,und-Zsym", &runs);
16027fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
16037fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-JP,und-Zsym", &runs);
16047fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(textEmojiFamily->getFont(0), runs[0].fakedFont.font);
16057fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
16067fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+203C", "ja-JP,und-Zsye", &runs);
16077fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
16087fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    itemize(collection, "U+23E9", "ja-JP,und-Zsye", &runs);
16097fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka    EXPECT_EQ(colorEmojiFamily->getFont(0), runs[0].fakedFont.font);
16107fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka}
16117fbdd83e92a76c955c67a1c761088b36daf7158cSeigo Nonaka
161214e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka}  // namespace minikin
1613