font_fallback_win_unittest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright (c) 2012 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_win.h"
  5. #include "base/strings/string_piece.h"
  6. #include "base/test/task_environment.h"
  7. #include "base/win/windows_version.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. namespace gfx {
  10. namespace {
  11. const char kDefaultApplicationLocale[] = "us-en";
  12. class FontFallbackWinTest : public testing::Test {
  13. public:
  14. FontFallbackWinTest() = default;
  15. FontFallbackWinTest(const FontFallbackWinTest&) = delete;
  16. FontFallbackWinTest& operator=(const FontFallbackWinTest&) = delete;
  17. private:
  18. // Needed to bypass DCHECK in GetFallbackFont.
  19. base::test::TaskEnvironment task_environment_{
  20. base::test::TaskEnvironment::MainThreadType::UI};
  21. };
  22. } // namespace
  23. TEST_F(FontFallbackWinTest, ParseFontLinkEntry) {
  24. std::string file;
  25. std::string font;
  26. internal::ParseFontLinkEntry("TAHOMA.TTF", &file, &font);
  27. EXPECT_EQ("TAHOMA.TTF", file);
  28. EXPECT_EQ("", font);
  29. internal::ParseFontLinkEntry("MSGOTHIC.TTC,MS UI Gothic", &file, &font);
  30. EXPECT_EQ("MSGOTHIC.TTC", file);
  31. EXPECT_EQ("MS UI Gothic", font);
  32. internal::ParseFontLinkEntry("MALGUN.TTF,128,96", &file, &font);
  33. EXPECT_EQ("MALGUN.TTF", file);
  34. EXPECT_EQ("", font);
  35. internal::ParseFontLinkEntry("MEIRYO.TTC,Meiryo,128,85", &file, &font);
  36. EXPECT_EQ("MEIRYO.TTC", file);
  37. EXPECT_EQ("Meiryo", font);
  38. }
  39. TEST_F(FontFallbackWinTest, ParseFontFamilyString) {
  40. std::vector<std::string> font_names;
  41. internal::ParseFontFamilyString("Times New Roman (TrueType)", &font_names);
  42. ASSERT_EQ(1U, font_names.size());
  43. EXPECT_EQ("Times New Roman", font_names[0]);
  44. font_names.clear();
  45. internal::ParseFontFamilyString("Cambria & Cambria Math (TrueType)",
  46. &font_names);
  47. ASSERT_EQ(2U, font_names.size());
  48. EXPECT_EQ("Cambria", font_names[0]);
  49. EXPECT_EQ("Cambria Math", font_names[1]);
  50. font_names.clear();
  51. internal::ParseFontFamilyString(
  52. "Meiryo & Meiryo Italic & Meiryo UI & Meiryo UI Italic (TrueType)",
  53. &font_names);
  54. ASSERT_EQ(4U, font_names.size());
  55. EXPECT_EQ("Meiryo", font_names[0]);
  56. EXPECT_EQ("Meiryo Italic", font_names[1]);
  57. EXPECT_EQ("Meiryo UI", font_names[2]);
  58. EXPECT_EQ("Meiryo UI Italic", font_names[3]);
  59. }
  60. TEST_F(FontFallbackWinTest, EmptyStringFallback) {
  61. Font base_font;
  62. Font fallback_font;
  63. bool result = GetFallbackFont(base_font, kDefaultApplicationLocale,
  64. base::StringPiece16(), &fallback_font);
  65. EXPECT_FALSE(result);
  66. }
  67. TEST_F(FontFallbackWinTest, NulTerminatedStringPiece) {
  68. Font base_font;
  69. Font fallback_font;
  70. // Multiple ending NUL characters.
  71. const char16_t kTest1[] = {0x0540, 0x0541, 0, 0, 0};
  72. EXPECT_FALSE(GetFallbackFont(base_font, kDefaultApplicationLocale,
  73. base::StringPiece16(kTest1, std::size(kTest1)),
  74. &fallback_font));
  75. // No ending NUL character.
  76. const char16_t kTest2[] = {0x0540, 0x0541};
  77. EXPECT_TRUE(GetFallbackFont(base_font, kDefaultApplicationLocale,
  78. base::StringPiece16(kTest2, std::size(kTest2)),
  79. &fallback_font));
  80. // NUL only characters.
  81. const char16_t kTest3[] = {0, 0, 0};
  82. EXPECT_FALSE(GetFallbackFont(base_font, kDefaultApplicationLocale,
  83. base::StringPiece16(kTest3, std::size(kTest3)),
  84. &fallback_font));
  85. }
  86. TEST_F(FontFallbackWinTest, CJKLocaleFallback) {
  87. // The uniscribe fallback used by win7 does not support locale.
  88. if (base::win::GetVersion() < base::win::Version::WIN10)
  89. return;
  90. // Han unification is an effort to map multiple character sets of the CJK
  91. // languages into a single set of unified characters. Han characters are a
  92. // common feature of written Chinese (hanzi), Japanese (kanji), and Korean
  93. // (hanja). The same text will be rendered using a different font based on
  94. // locale.
  95. const char16_t kCJKTest[] = u"\u8AA4\u904E\u9AA8";
  96. Font base_font;
  97. Font fallback_font;
  98. EXPECT_TRUE(GetFallbackFont(base_font, "zh-CN", kCJKTest, &fallback_font));
  99. EXPECT_EQ(fallback_font.GetFontName(), "Microsoft YaHei UI");
  100. EXPECT_TRUE(GetFallbackFont(base_font, "zh-TW", kCJKTest, &fallback_font));
  101. EXPECT_EQ(fallback_font.GetFontName(), "Microsoft JhengHei UI");
  102. EXPECT_TRUE(GetFallbackFont(base_font, "zh-HK", kCJKTest, &fallback_font));
  103. EXPECT_EQ(fallback_font.GetFontName(), "Microsoft JhengHei UI");
  104. EXPECT_TRUE(GetFallbackFont(base_font, "ja", kCJKTest, &fallback_font));
  105. EXPECT_EQ(fallback_font.GetFontName(), "Yu Gothic UI");
  106. EXPECT_TRUE(GetFallbackFont(base_font, "ja-JP", kCJKTest, &fallback_font));
  107. EXPECT_EQ(fallback_font.GetFontName(), "Yu Gothic UI");
  108. EXPECT_TRUE(GetFallbackFont(base_font, "ko", kCJKTest, &fallback_font));
  109. EXPECT_EQ(fallback_font.GetFontName(), "Malgun Gothic");
  110. EXPECT_TRUE(GetFallbackFont(base_font, "ko-KR", kCJKTest, &fallback_font));
  111. EXPECT_EQ(fallback_font.GetFontName(), "Malgun Gothic");
  112. }
  113. } // namespace gfx