|  | // Copyright 2019 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "ui/gfx/font_fallback.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/string_piece.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "build/build_config.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace gfx { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | const wchar_t* kFallbackFontTests[] = { | 
|  | L"\u0540\u0541",  // Armenian, | 
|  | L"\u0631\u0632",  // Arabic | 
|  | L"\u0915\u093f",  // Devanagari | 
|  | L"\u5203\u5204",  // CJK Unified Ideograph | 
|  | }; | 
|  |  | 
|  | const char kDefaultApplicationLocale[] = "us-en"; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | TEST(FontFallbackSkiaTest, EmptyStringFallback) { | 
|  | Font base_font; | 
|  | Font fallback_font; | 
|  | bool result = GetFallbackFont(base_font, kDefaultApplicationLocale, | 
|  | base::StringPiece16(), &fallback_font); | 
|  | EXPECT_FALSE(result); | 
|  | } | 
|  |  | 
|  | TEST(FontFallbackSkiaTest, FontFallback) { | 
|  | for (const auto* test : kFallbackFontTests) { | 
|  | Font base_font; | 
|  | Font fallback_font; | 
|  | std::u16string text = base::WideToUTF16(test); | 
|  |  | 
|  | if (!GetFallbackFont(base_font, kDefaultApplicationLocale, text, | 
|  | &fallback_font)) { | 
|  | ADD_FAILURE() << "Font fallback failed: '" << text << "'"; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA) | 
|  | // TODO(sergeyu): Fuchsia doesn't not support locale for font fallbacks. | 
|  | // TODO(etienneb): Android doesn't allow locale override, unless the language | 
|  | //                 is added in the system UI. | 
|  | TEST(FontFallbackSkiaTest, CJKLocaleFallback) { | 
|  | // Han unification is an effort to map multiple character sets of the CJK | 
|  | // languages into a single set of unified characters. Han characters are a | 
|  | // common feature of written Chinese (hanzi), Japanese (kanji), and Korean | 
|  | // (hanja). The same text will be rendered using a different font based on | 
|  | // locale. | 
|  | const std::u16string kCJKTest = u"\u8AA4\u904E\u9AA8"; | 
|  | Font base_font; | 
|  |  | 
|  | Font fallback_font_zh_cn; | 
|  | Font fallback_font_zh_tw; | 
|  | Font fallback_font_zh_hk; | 
|  | EXPECT_TRUE( | 
|  | GetFallbackFont(base_font, "zh-CN", kCJKTest, &fallback_font_zh_cn)); | 
|  | EXPECT_TRUE( | 
|  | GetFallbackFont(base_font, "zh-TW", kCJKTest, &fallback_font_zh_tw)); | 
|  | EXPECT_TRUE( | 
|  | GetFallbackFont(base_font, "zh-HK", kCJKTest, &fallback_font_zh_hk)); | 
|  | EXPECT_EQ(fallback_font_zh_cn.GetFontName(), | 
|  | fallback_font_zh_tw.GetFontName()); | 
|  | EXPECT_EQ(fallback_font_zh_cn.GetFontName(), | 
|  | fallback_font_zh_hk.GetFontName()); | 
|  |  | 
|  | Font fallback_font_ja; | 
|  | Font fallback_font_ja_jp; | 
|  | EXPECT_TRUE(GetFallbackFont(base_font, "ja", kCJKTest, &fallback_font_ja)); | 
|  | EXPECT_TRUE( | 
|  | GetFallbackFont(base_font, "ja-JP", kCJKTest, &fallback_font_ja_jp)); | 
|  | EXPECT_EQ(fallback_font_ja.GetFontName(), fallback_font_ja_jp.GetFontName()); | 
|  |  | 
|  | Font fallback_font_ko; | 
|  | Font fallback_font_ko_kr; | 
|  | EXPECT_TRUE(GetFallbackFont(base_font, "ko", kCJKTest, &fallback_font_ko)); | 
|  | EXPECT_TRUE( | 
|  | GetFallbackFont(base_font, "ko-KR", kCJKTest, &fallback_font_ko_kr)); | 
|  | EXPECT_EQ(fallback_font_ko.GetFontName(), fallback_font_ko_kr.GetFontName()); | 
|  |  | 
|  | // The three fonts must not be the same. | 
|  | EXPECT_NE(fallback_font_zh_cn.GetFontName(), fallback_font_ja.GetFontName()); | 
|  | EXPECT_NE(fallback_font_zh_cn.GetFontName(), fallback_font_ko.GetFontName()); | 
|  | EXPECT_NE(fallback_font_ja.GetFontName(), fallback_font_ko.GetFontName()); | 
|  | } | 
|  | #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA) | 
|  |  | 
|  | }  // namespace gfx |