// Copyright 2019 The Chromium Authors. All rights reserved. // 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