// 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"

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,
                 FX_Charset 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::kSymbol,
                        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::kSymbol,
                        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::kSymbol,
                  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::kSymbol,
                        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::kSymbol,
                  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::kANSI,
                  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::kANSI,
                  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::kANSI,
                  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::kSymbol,
                  FXFONT_FF_ROMAN, kSymbol, /*bMatchName=*/false);
  ASSERT_TRUE(font);
  EXPECT_EQ(GetFaceName(font), kBookshelfSymbol7);
}
