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