font_fallback_skia_unittest.cc 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/gfx/font_fallback.h"
  5. #include "base/logging.h"
  6. #include "base/strings/string_piece.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "build/build_config.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace gfx {
  11. namespace {
  12. const wchar_t* kFallbackFontTests[] = {
  13. L"\u0540\u0541", // Armenian,
  14. L"\u0631\u0632", // Arabic
  15. L"\u0915\u093f", // Devanagari
  16. L"\u5203\u5204", // CJK Unified Ideograph
  17. };
  18. const char kDefaultApplicationLocale[] = "us-en";
  19. } // namespace
  20. TEST(FontFallbackSkiaTest, EmptyStringFallback) {
  21. Font base_font;
  22. Font fallback_font;
  23. bool result = GetFallbackFont(base_font, kDefaultApplicationLocale,
  24. base::StringPiece16(), &fallback_font);
  25. EXPECT_FALSE(result);
  26. }
  27. TEST(FontFallbackSkiaTest, FontFallback) {
  28. for (const auto* test : kFallbackFontTests) {
  29. Font base_font;
  30. Font fallback_font;
  31. std::u16string text = base::WideToUTF16(test);
  32. if (!GetFallbackFont(base_font, kDefaultApplicationLocale, text,
  33. &fallback_font)) {
  34. ADD_FAILURE() << "Font fallback failed: '" << text << "'";
  35. }
  36. }
  37. }
  38. #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA)
  39. // TODO(sergeyu): Fuchsia doesn't not support locale for font fallbacks.
  40. // TODO(etienneb): Android doesn't allow locale override, unless the language
  41. // is added in the system UI.
  42. TEST(FontFallbackSkiaTest, CJKLocaleFallback) {
  43. // Han unification is an effort to map multiple character sets of the CJK
  44. // languages into a single set of unified characters. Han characters are a
  45. // common feature of written Chinese (hanzi), Japanese (kanji), and Korean
  46. // (hanja). The same text will be rendered using a different font based on
  47. // locale.
  48. const std::u16string kCJKTest = u"\u8AA4\u904E\u9AA8";
  49. Font base_font;
  50. Font fallback_font_zh_cn;
  51. Font fallback_font_zh_tw;
  52. Font fallback_font_zh_hk;
  53. EXPECT_TRUE(
  54. GetFallbackFont(base_font, "zh-CN", kCJKTest, &fallback_font_zh_cn));
  55. EXPECT_TRUE(
  56. GetFallbackFont(base_font, "zh-TW", kCJKTest, &fallback_font_zh_tw));
  57. EXPECT_TRUE(
  58. GetFallbackFont(base_font, "zh-HK", kCJKTest, &fallback_font_zh_hk));
  59. EXPECT_EQ(fallback_font_zh_cn.GetFontName(),
  60. fallback_font_zh_tw.GetFontName());
  61. EXPECT_EQ(fallback_font_zh_cn.GetFontName(),
  62. fallback_font_zh_hk.GetFontName());
  63. Font fallback_font_ja;
  64. Font fallback_font_ja_jp;
  65. EXPECT_TRUE(GetFallbackFont(base_font, "ja", kCJKTest, &fallback_font_ja));
  66. EXPECT_TRUE(
  67. GetFallbackFont(base_font, "ja-JP", kCJKTest, &fallback_font_ja_jp));
  68. EXPECT_EQ(fallback_font_ja.GetFontName(), fallback_font_ja_jp.GetFontName());
  69. Font fallback_font_ko;
  70. Font fallback_font_ko_kr;
  71. EXPECT_TRUE(GetFallbackFont(base_font, "ko", kCJKTest, &fallback_font_ko));
  72. EXPECT_TRUE(
  73. GetFallbackFont(base_font, "ko-KR", kCJKTest, &fallback_font_ko_kr));
  74. EXPECT_EQ(fallback_font_ko.GetFontName(), fallback_font_ko_kr.GetFontName());
  75. // The three fonts must not be the same.
  76. EXPECT_NE(fallback_font_zh_cn.GetFontName(), fallback_font_ja.GetFontName());
  77. EXPECT_NE(fallback_font_zh_cn.GetFontName(), fallback_font_ko.GetFontName());
  78. EXPECT_NE(fallback_font_ja.GetFontName(), fallback_font_ko.GetFontName());
  79. }
  80. #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA)
  81. } // namespace gfx