| // Copyright 2019 PDFium 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 "core/fxge/cfx_folderfontinfo.h" | |
| #include <utility> | |
| #include "core/fxcrt/fx_codepage.h" | |
| #include "core/fxge/fx_font.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| #include "third_party/base/stl_util.h" | |
| namespace { | |
| constexpr char kArial[] = "Arial"; | |
| constexpr char kTimesNewRoman[] = "TimesNewRoman"; | |
| constexpr char kSymbol[] = "Symbol"; | |
| constexpr char kBookshelfSymbol7[] = "Bookshelf Symbol 7"; | |
| constexpr char kCalibri[] = "Calibri"; | |
| constexpr char kBookshelf[] = "Bookshelf"; | |
| constexpr char kBook[] = "Book"; | |
| constexpr char kTofuBold[] = "Tofu, Bold Italic"; | |
| constexpr char kTofu[] = "Tofu"; | |
| constexpr char kLatoUltraBold[] = "Lato Ultra-Bold"; | |
| constexpr char kLato[] = "Lato"; | |
| constexpr char kOxygenSansSansBold[] = "Oxygen-Sans Sans-Bold"; | |
| constexpr char kOxygenSans[] = "Oxygen-Sans"; | |
| constexpr char kOxygen[] = "Oxygen"; | |
| } // namespace | |
| class CFX_FolderFontInfoTest : public ::testing::Test { | |
| public: | |
| CFX_FolderFontInfoTest() { | |
| AddDummyFont(kArial, CHARSET_FLAG_ANSI); | |
| AddDummyFont(kTimesNewRoman, 0); | |
| AddDummyFont(kBookshelfSymbol7, CHARSET_FLAG_SYMBOL); | |
| AddDummyFont(kSymbol, CHARSET_FLAG_SYMBOL); | |
| AddDummyFont(kTofuBold, CHARSET_FLAG_SYMBOL); | |
| AddDummyFont(kLatoUltraBold, CHARSET_FLAG_ANSI); | |
| AddDummyFont(kOxygenSansSansBold, CHARSET_FLAG_ANSI); | |
| } | |
| void* FindFont(int weight, | |
| bool bItalic, | |
| int charset, | |
| int pitch_family, | |
| const char* family, | |
| bool bMatchName) { | |
| return font_info_.FindFont(weight, bItalic, charset, pitch_family, family, | |
| bMatchName); | |
| } | |
| ByteString GetFaceName(void* font) { | |
| return static_cast<CFX_FolderFontInfo::FontFaceInfo*>(font)->m_FaceName; | |
| } | |
| private: | |
| void AddDummyFont(const char* font_name, uint32_t charsets) { | |
| auto info = std::make_unique<CFX_FolderFontInfo::FontFaceInfo>( | |
| /*filePath=*/"", font_name, /*fontTables=*/"", | |
| /*fontOffset=*/0, /*fileSize=*/0); | |
| info->m_Charsets = charsets; | |
| font_info_.m_FontList[font_name] = std::move(info); | |
| } | |
| CFX_FolderFontInfo font_info_; | |
| }; | |
| TEST_F(CFX_FolderFontInfoTest, TestFindFont) { | |
| // Find "Symbol" font | |
| void* font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kSymbol, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kSymbol); | |
| // Find "Calibri" font that is not present in the installed fonts | |
| EXPECT_FALSE(FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kCalibri, /*bMatchName=*/true)); | |
| // Find the closest matching font to "Bookshelf" font that is present in the | |
| // installed fonts | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kBookshelf, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kBookshelfSymbol7); | |
| // Find "Book" font is expected to fail, because none of the installed fonts | |
| // is in the same font family. | |
| EXPECT_FALSE(FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kBook, /*bMatchName=*/true)); | |
| // Find the closest matching font for "Tofu" in the installed fonts, which | |
| // has "," following the string "Tofu". | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kTofu, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kTofuBold); | |
| // Find the closest matching font for "Lato" in the installed fonts, which | |
| // has a space character following the string "Lato". | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_ANSI, | |
| FXFONT_FF_ROMAN, kLato, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kLatoUltraBold); | |
| // Find the closest matching font for "Oxygen" in the installed fonts, | |
| // which has "-" following the string "Oxygen". | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_ANSI, | |
| FXFONT_FF_ROMAN, kOxygen, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kOxygenSansSansBold); | |
| // Find the closest matching font for "Oxygen-Sans" in the installed fonts, | |
| // to test matching a family name with "-". | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_ANSI, | |
| FXFONT_FF_ROMAN, kOxygenSans, /*bMatchName=*/true); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kOxygenSansSansBold); | |
| // Find "Symbol" font when name matching is false | |
| font = FindFont(/*weight=*/0, /*bItalic=*/false, FX_CHARSET_Symbol, | |
| FXFONT_FF_ROMAN, kSymbol, /*bMatchName=*/false); | |
| ASSERT_TRUE(font); | |
| EXPECT_EQ(GetFaceName(font), kBookshelfSymbol7); | |
| } |