/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <minikin/FontFamily.h>

#include <gtest/gtest.h>
#include <log/log.h>

#include "ICUTestBase.h"
#include "MinikinFontForTest.h"
#include "minikin/FontLanguageListCache.h"
#include "minikin/MinikinInternal.h"

namespace minikin {

typedef ICUTestBase FontLanguagesTest;
typedef ICUTestBase FontLanguageTest;

static const FontLanguages& createFontLanguages(const std::string& input) {
  std::lock_guard<std::mutex> _l(gMinikinLock);
  uint32_t langId = FontLanguageListCache::getId(input);
  return FontLanguageListCache::getById(langId);
}

static FontLanguage createFontLanguage(const std::string& input) {
  std::lock_guard<std::mutex> _l(gMinikinLock);
  uint32_t langId = FontLanguageListCache::getId(input);
  return FontLanguageListCache::getById(langId)[0];
}

static FontLanguage createFontLanguageWithoutICUSanitization(
    const std::string& input) {
  return FontLanguage(input.c_str(), input.size());
}

std::shared_ptr<FontFamily> makeFamily(const std::string& fontPath) {
  std::shared_ptr<MinikinFont> font(new MinikinFontForTest(fontPath));
  return std::make_shared<FontFamily>(
      std::vector<Font>({Font(font, FontStyle())}));
}

TEST_F(FontLanguageTest, basicTests) {
  FontLanguage defaultLang;
  FontLanguage emptyLang("", 0);
  FontLanguage english = createFontLanguage("en");
  FontLanguage french = createFontLanguage("fr");
  FontLanguage und = createFontLanguage("und");
  FontLanguage undZsye = createFontLanguage("und-Zsye");

  EXPECT_EQ(english, english);
  EXPECT_EQ(french, french);

  EXPECT_TRUE(defaultLang != defaultLang);
  EXPECT_TRUE(emptyLang != emptyLang);
  EXPECT_TRUE(defaultLang != emptyLang);
  EXPECT_TRUE(defaultLang != und);
  EXPECT_TRUE(emptyLang != und);
  EXPECT_TRUE(english != defaultLang);
  EXPECT_TRUE(english != emptyLang);
  EXPECT_TRUE(english != french);
  EXPECT_TRUE(english != undZsye);
  EXPECT_TRUE(und != undZsye);
  EXPECT_TRUE(english != und);

  EXPECT_TRUE(defaultLang.isUnsupported());
  EXPECT_TRUE(emptyLang.isUnsupported());

  EXPECT_FALSE(english.isUnsupported());
  EXPECT_FALSE(french.isUnsupported());
  EXPECT_FALSE(und.isUnsupported());
  EXPECT_FALSE(undZsye.isUnsupported());
}

TEST_F(FontLanguageTest, getStringTest) {
  EXPECT_EQ("en-Latn-US", createFontLanguage("en").getString());
  EXPECT_EQ("en-Latn-US", createFontLanguage("en-Latn").getString());

  // Capitalized language code or lowercased script should be normalized.
  EXPECT_EQ("en-Latn-US", createFontLanguage("EN-LATN").getString());
  EXPECT_EQ("en-Latn-US", createFontLanguage("EN-latn").getString());
  EXPECT_EQ("en-Latn-US", createFontLanguage("en-latn").getString());

  // Invalid script should be kept.
  EXPECT_EQ("en-Xyzt-US", createFontLanguage("en-xyzt").getString());

  EXPECT_EQ("en-Latn-US", createFontLanguage("en-Latn-US").getString());
  EXPECT_EQ("ja-Jpan-JP", createFontLanguage("ja").getString());
  EXPECT_EQ("zh-Hant-TW", createFontLanguage("zh-TW").getString());
  EXPECT_EQ("zh-Hant-HK", createFontLanguage("zh-HK").getString());
  EXPECT_EQ("zh-Hant-MO", createFontLanguage("zh-MO").getString());
  EXPECT_EQ("zh-Hans-CN", createFontLanguage("zh").getString());
  EXPECT_EQ("zh-Hans-CN", createFontLanguage("zh-CN").getString());
  EXPECT_EQ("zh-Hans-SG", createFontLanguage("zh-SG").getString());
  EXPECT_EQ("und", createFontLanguage("und").getString());
  EXPECT_EQ("und", createFontLanguage("UND").getString());
  EXPECT_EQ("und", createFontLanguage("Und").getString());
  EXPECT_EQ("und-Zsye", createFontLanguage("und-Zsye").getString());
  EXPECT_EQ("und-Zsye", createFontLanguage("Und-ZSYE").getString());
  EXPECT_EQ("und-Zsye", createFontLanguage("Und-zsye").getString());

  EXPECT_EQ("de-Latn-DE", createFontLanguage("de-1901").getString());

  EXPECT_EQ("es-Latn-419", createFontLanguage("es-Latn-419").getString());

  // Emoji subtag is dropped from getString().
  EXPECT_EQ("es-Latn-419", createFontLanguage("es-419-u-em-emoji").getString());
  EXPECT_EQ("es-Latn-419",
            createFontLanguage("es-Latn-419-u-em-emoji").getString());

  // This is not a necessary desired behavior, just known behavior.
  EXPECT_EQ("en-Latn-US", createFontLanguage("und-Abcdefgh").getString());
}

TEST_F(FontLanguageTest, testReconstruction) {
  EXPECT_EQ("en", createFontLanguageWithoutICUSanitization("en").getString());
  EXPECT_EQ("fil", createFontLanguageWithoutICUSanitization("fil").getString());
  EXPECT_EQ("und", createFontLanguageWithoutICUSanitization("und").getString());

  EXPECT_EQ("en-Latn",
            createFontLanguageWithoutICUSanitization("en-Latn").getString());
  EXPECT_EQ("fil-Taga",
            createFontLanguageWithoutICUSanitization("fil-Taga").getString());
  EXPECT_EQ("und-Zsye",
            createFontLanguageWithoutICUSanitization("und-Zsye").getString());

  EXPECT_EQ("en-US",
            createFontLanguageWithoutICUSanitization("en-US").getString());
  EXPECT_EQ("fil-PH",
            createFontLanguageWithoutICUSanitization("fil-PH").getString());
  EXPECT_EQ("es-419",
            createFontLanguageWithoutICUSanitization("es-419").getString());

  EXPECT_EQ("en-Latn-US",
            createFontLanguageWithoutICUSanitization("en-Latn-US").getString());
  EXPECT_EQ(
      "fil-Taga-PH",
      createFontLanguageWithoutICUSanitization("fil-Taga-PH").getString());
  EXPECT_EQ(
      "es-Latn-419",
      createFontLanguageWithoutICUSanitization("es-Latn-419").getString());

  // Possible minimum/maximum values.
  EXPECT_EQ("aa", createFontLanguageWithoutICUSanitization("aa").getString());
  EXPECT_EQ("zz", createFontLanguageWithoutICUSanitization("zz").getString());
  EXPECT_EQ("aa-Aaaa",
            createFontLanguageWithoutICUSanitization("aa-Aaaa").getString());
  EXPECT_EQ("zz-Zzzz",
            createFontLanguageWithoutICUSanitization("zz-Zzzz").getString());
  EXPECT_EQ(
      "aaa-Aaaa-AA",
      createFontLanguageWithoutICUSanitization("aaa-Aaaa-AA").getString());
  EXPECT_EQ(
      "zzz-Zzzz-ZZ",
      createFontLanguageWithoutICUSanitization("zzz-Zzzz-ZZ").getString());
  EXPECT_EQ(
      "aaa-Aaaa-000",
      createFontLanguageWithoutICUSanitization("aaa-Aaaa-000").getString());
  EXPECT_EQ(
      "zzz-Zzzz-999",
      createFontLanguageWithoutICUSanitization("zzz-Zzzz-999").getString());
}

TEST_F(FontLanguageTest, ScriptEqualTest) {
  EXPECT_TRUE(createFontLanguage("en").isEqualScript(createFontLanguage("en")));
  EXPECT_TRUE(
      createFontLanguage("en-Latn").isEqualScript(createFontLanguage("en")));
  EXPECT_TRUE(createFontLanguage("jp-Latn").isEqualScript(
      createFontLanguage("en-Latn")));
  EXPECT_TRUE(createFontLanguage("en-Jpan").isEqualScript(
      createFontLanguage("en-Jpan")));

  EXPECT_FALSE(createFontLanguage("en-Jpan").isEqualScript(
      createFontLanguage("en-Hira")));
  EXPECT_FALSE(createFontLanguage("en-Jpan").isEqualScript(
      createFontLanguage("en-Hani")));
}

TEST_F(FontLanguageTest, ScriptMatchTest) {
  const bool SUPPORTED = true;
  const bool NOT_SUPPORTED = false;

  struct TestCase {
    const std::string baseScript;
    const std::string requestedScript;
    bool isSupported;
  } testCases[] = {
      // Same scripts
      {"en-Latn", "Latn", SUPPORTED},
      {"ja-Jpan", "Jpan", SUPPORTED},
      {"ja-Hira", "Hira", SUPPORTED},
      {"ja-Kana", "Kana", SUPPORTED},
      {"ja-Hrkt", "Hrkt", SUPPORTED},
      {"zh-Hans", "Hans", SUPPORTED},
      {"zh-Hant", "Hant", SUPPORTED},
      {"zh-Hani", "Hani", SUPPORTED},
      {"ko-Kore", "Kore", SUPPORTED},
      {"ko-Hang", "Hang", SUPPORTED},
      {"zh-Hanb", "Hanb", SUPPORTED},

      // Japanese supports Hiragana, Katakanara, etc.
      {"ja-Jpan", "Hira", SUPPORTED},
      {"ja-Jpan", "Kana", SUPPORTED},
      {"ja-Jpan", "Hrkt", SUPPORTED},
      {"ja-Hrkt", "Hira", SUPPORTED},
      {"ja-Hrkt", "Kana", SUPPORTED},

      // Chinese supports Han.
      {"zh-Hans", "Hani", SUPPORTED},
      {"zh-Hant", "Hani", SUPPORTED},
      {"zh-Hanb", "Hani", SUPPORTED},

      // Hanb supports Bopomofo.
      {"zh-Hanb", "Bopo", SUPPORTED},

      // Korean supports Hangul.
      {"ko-Kore", "Hang", SUPPORTED},

      // Different scripts
      {"ja-Jpan", "Latn", NOT_SUPPORTED},
      {"en-Latn", "Jpan", NOT_SUPPORTED},
      {"ja-Jpan", "Hant", NOT_SUPPORTED},
      {"zh-Hant", "Jpan", NOT_SUPPORTED},
      {"ja-Jpan", "Hans", NOT_SUPPORTED},
      {"zh-Hans", "Jpan", NOT_SUPPORTED},
      {"ja-Jpan", "Kore", NOT_SUPPORTED},
      {"ko-Kore", "Jpan", NOT_SUPPORTED},
      {"zh-Hans", "Hant", NOT_SUPPORTED},
      {"zh-Hant", "Hans", NOT_SUPPORTED},
      {"zh-Hans", "Kore", NOT_SUPPORTED},
      {"ko-Kore", "Hans", NOT_SUPPORTED},
      {"zh-Hant", "Kore", NOT_SUPPORTED},
      {"ko-Kore", "Hant", NOT_SUPPORTED},

      // Hiragana doesn't support Japanese, etc.
      {"ja-Hira", "Jpan", NOT_SUPPORTED},
      {"ja-Kana", "Jpan", NOT_SUPPORTED},
      {"ja-Hrkt", "Jpan", NOT_SUPPORTED},
      {"ja-Hani", "Jpan", NOT_SUPPORTED},
      {"ja-Hira", "Hrkt", NOT_SUPPORTED},
      {"ja-Kana", "Hrkt", NOT_SUPPORTED},
      {"ja-Hani", "Hrkt", NOT_SUPPORTED},
      {"ja-Hani", "Hira", NOT_SUPPORTED},
      {"ja-Hani", "Kana", NOT_SUPPORTED},

      // Kanji doesn't support Chinese, etc.
      {"zh-Hani", "Hant", NOT_SUPPORTED},
      {"zh-Hani", "Hans", NOT_SUPPORTED},
      {"zh-Hani", "Hanb", NOT_SUPPORTED},

      // Hangul doesn't support Korean, etc.
      {"ko-Hang", "Kore", NOT_SUPPORTED},
      {"ko-Hani", "Kore", NOT_SUPPORTED},
      {"ko-Hani", "Hang", NOT_SUPPORTED},
      {"ko-Hang", "Hani", NOT_SUPPORTED},

      // Han with botomofo doesn't support simplified Chinese, etc.
      {"zh-Hanb", "Hant", NOT_SUPPORTED},
      {"zh-Hanb", "Hans", NOT_SUPPORTED},
      {"zh-Hanb", "Jpan", NOT_SUPPORTED},
      {"zh-Hanb", "Kore", NOT_SUPPORTED},
  };

  for (auto testCase : testCases) {
    hb_script_t script = hb_script_from_iso15924_tag(
        HB_TAG(testCase.requestedScript[0], testCase.requestedScript[1],
               testCase.requestedScript[2], testCase.requestedScript[3]));
    if (testCase.isSupported) {
      EXPECT_TRUE(
          createFontLanguage(testCase.baseScript).supportsHbScript(script))
          << testCase.baseScript << " should support "
          << testCase.requestedScript;
    } else {
      EXPECT_FALSE(
          createFontLanguage(testCase.baseScript).supportsHbScript(script))
          << testCase.baseScript << " shouldn't support "
          << testCase.requestedScript;
    }
  }
}

TEST_F(FontLanguagesTest, basicTests) {
  FontLanguages emptyLangs;
  EXPECT_EQ(0u, emptyLangs.size());

  FontLanguage english = createFontLanguage("en");
  const FontLanguages& singletonLangs = createFontLanguages("en");
  EXPECT_EQ(1u, singletonLangs.size());
  EXPECT_EQ(english, singletonLangs[0]);

  FontLanguage french = createFontLanguage("fr");
  const FontLanguages& twoLangs = createFontLanguages("en,fr");
  EXPECT_EQ(2u, twoLangs.size());
  EXPECT_EQ(english, twoLangs[0]);
  EXPECT_EQ(french, twoLangs[1]);
}

TEST_F(FontLanguagesTest, unsupportedLanguageTests) {
  const FontLanguages& oneUnsupported = createFontLanguages("abcd-example");
  EXPECT_TRUE(oneUnsupported.empty());

  const FontLanguages& twoUnsupporteds =
      createFontLanguages("abcd-example,abcd-example");
  EXPECT_TRUE(twoUnsupporteds.empty());

  FontLanguage english = createFontLanguage("en");
  const FontLanguages& firstUnsupported =
      createFontLanguages("abcd-example,en");
  EXPECT_EQ(1u, firstUnsupported.size());
  EXPECT_EQ(english, firstUnsupported[0]);

  const FontLanguages& lastUnsupported = createFontLanguages("en,abcd-example");
  EXPECT_EQ(1u, lastUnsupported.size());
  EXPECT_EQ(english, lastUnsupported[0]);
}

TEST_F(FontLanguagesTest, repeatedLanguageTests) {
  FontLanguage english = createFontLanguage("en");
  FontLanguage french = createFontLanguage("fr");
  FontLanguage canadianFrench = createFontLanguage("fr-CA");
  FontLanguage englishInLatn = createFontLanguage("en-Latn");
  ASSERT_TRUE(english == englishInLatn);

  const FontLanguages& langs = createFontLanguages("en,en-Latn");
  EXPECT_EQ(1u, langs.size());
  EXPECT_EQ(english, langs[0]);

  const FontLanguages& fr = createFontLanguages("fr,fr-FR,fr-Latn-FR");
  EXPECT_EQ(1u, fr.size());
  EXPECT_EQ(french, fr[0]);

  // ICU appends FR to fr. The third language is dropped which is same as the
  // first language.
  const FontLanguages& fr2 = createFontLanguages("fr,fr-CA,fr-FR");
  EXPECT_EQ(2u, fr2.size());
  EXPECT_EQ(french, fr2[0]);
  EXPECT_EQ(canadianFrench, fr2[1]);

  // The order should be kept.
  const FontLanguages& langs2 = createFontLanguages("en,fr,en-Latn");
  EXPECT_EQ(2u, langs2.size());
  EXPECT_EQ(english, langs2[0]);
  EXPECT_EQ(french, langs2[1]);
}

TEST_F(FontLanguagesTest, identifierTest) {
  EXPECT_EQ(createFontLanguage("en-Latn-US"), createFontLanguage("en-Latn-US"));
  EXPECT_EQ(createFontLanguage("zh-Hans-CN"), createFontLanguage("zh-Hans-CN"));
  EXPECT_EQ(createFontLanguage("en-Zsye-US"), createFontLanguage("en-Zsye-US"));

  EXPECT_NE(createFontLanguage("en-Latn-US"), createFontLanguage("en-Latn-GB"));
  EXPECT_NE(createFontLanguage("en-Latn-US"), createFontLanguage("en-Zsye-US"));
  EXPECT_NE(createFontLanguage("es-Latn-US"), createFontLanguage("en-Latn-US"));
  EXPECT_NE(createFontLanguage("zh-Hant-HK"), createFontLanguage("zh-Hant-TW"));
}

TEST_F(FontLanguagesTest, undEmojiTests) {
  FontLanguage emoji = createFontLanguage("und-Zsye");
  EXPECT_EQ(FontLanguage::EMSTYLE_EMOJI, emoji.getEmojiStyle());

  FontLanguage und = createFontLanguage("und");
  EXPECT_EQ(FontLanguage::EMSTYLE_EMPTY, und.getEmojiStyle());
  EXPECT_FALSE(emoji == und);

  FontLanguage undExample = createFontLanguage("und-example");
  EXPECT_EQ(FontLanguage::EMSTYLE_EMPTY, undExample.getEmojiStyle());
  EXPECT_FALSE(emoji == undExample);
}

TEST_F(FontLanguagesTest, subtagEmojiTest) {
  std::string subtagEmojiStrings[] = {
      // Duplicate subtag case.
      "und-Latn-u-em-emoji-u-em-text",

      // Strings that contain language.
      "und-u-em-emoji",
      "en-u-em-emoji",

      // Strings that contain the script.
      "und-Jpan-u-em-emoji",
      "en-Latn-u-em-emoji",
      "und-Zsym-u-em-emoji",
      "und-Zsye-u-em-emoji",
      "en-Zsym-u-em-emoji",
      "en-Zsye-u-em-emoji",

      // Strings that contain the county.
      "und-US-u-em-emoji",
      "en-US-u-em-emoji",
      "es-419-u-em-emoji",
      "und-Latn-US-u-em-emoji",
      "en-Zsym-US-u-em-emoji",
      "en-Zsye-US-u-em-emoji",
      "es-Zsye-419-u-em-emoji",
  };

  for (auto subtagEmojiString : subtagEmojiStrings) {
    SCOPED_TRACE("Test for \"" + subtagEmojiString + "\"");
    FontLanguage subtagEmoji = createFontLanguage(subtagEmojiString);
    EXPECT_EQ(FontLanguage::EMSTYLE_EMOJI, subtagEmoji.getEmojiStyle());
  }
}

TEST_F(FontLanguagesTest, subtagTextTest) {
  std::string subtagTextStrings[] = {
      // Duplicate subtag case.
      "und-Latn-u-em-text-u-em-emoji",

      // Strings that contain language.
      "und-u-em-text",
      "en-u-em-text",

      // Strings that contain the script.
      "und-Latn-u-em-text",
      "en-Jpan-u-em-text",
      "und-Zsym-u-em-text",
      "und-Zsye-u-em-text",
      "en-Zsym-u-em-text",
      "en-Zsye-u-em-text",

      // Strings that contain the county.
      "und-US-u-em-text",
      "en-US-u-em-text",
      "es-419-u-em-text",
      "und-Latn-US-u-em-text",
      "en-Zsym-US-u-em-text",
      "en-Zsye-US-u-em-text",
      "es-Zsye-419-u-em-text",
  };

  for (auto subtagTextString : subtagTextStrings) {
    SCOPED_TRACE("Test for \"" + subtagTextString + "\"");
    FontLanguage subtagText = createFontLanguage(subtagTextString);
    EXPECT_EQ(FontLanguage::EMSTYLE_TEXT, subtagText.getEmojiStyle());
  }
}

// TODO: add more "und" language cases whose language and script are
//       unexpectedly translated to en-Latn by ICU.
TEST_F(FontLanguagesTest, subtagDefaultTest) {
  std::string subtagDefaultStrings[] = {
      // Duplicate subtag case.
      "en-Latn-u-em-default-u-em-emoji",
      "en-Latn-u-em-default-u-em-text",

      // Strings that contain language.
      "und-u-em-default",
      "en-u-em-default",

      // Strings that contain the script.
      "en-Latn-u-em-default",
      "en-Zsym-u-em-default",
      "en-Zsye-u-em-default",

      // Strings that contain the county.
      "en-US-u-em-default",
      "en-Latn-US-u-em-default",
      "es-Latn-419-u-em-default",
      "en-Zsym-US-u-em-default",
      "en-Zsye-US-u-em-default",
      "es-Zsye-419-u-em-default",
  };

  for (auto subtagDefaultString : subtagDefaultStrings) {
    SCOPED_TRACE("Test for \"" + subtagDefaultString + "\"");
    FontLanguage subtagDefault = createFontLanguage(subtagDefaultString);
    EXPECT_EQ(FontLanguage::EMSTYLE_DEFAULT, subtagDefault.getEmojiStyle());
  }
}

TEST_F(FontLanguagesTest, subtagEmptyTest) {
  std::string subtagEmptyStrings[] = {
      "und",
      "jp",
      "en-US",
      "en-Latn",
      "en-Latn-US",
      "en-Latn-US-u-em",
      "en-Latn-US-u-em-defaultemoji",
  };

  for (auto subtagEmptyString : subtagEmptyStrings) {
    SCOPED_TRACE("Test for \"" + subtagEmptyString + "\"");
    FontLanguage subtagEmpty = createFontLanguage(subtagEmptyString);
    EXPECT_EQ(FontLanguage::EMSTYLE_EMPTY, subtagEmpty.getEmojiStyle());
  }
}

TEST_F(FontLanguagesTest, registerLanguageListTest) {
  EXPECT_EQ(0UL, FontStyle::registerLanguageList(""));
  EXPECT_NE(0UL, FontStyle::registerLanguageList("en"));
  EXPECT_NE(0UL, FontStyle::registerLanguageList("jp"));
  EXPECT_NE(0UL, FontStyle::registerLanguageList("en,zh-Hans"));

  EXPECT_EQ(FontStyle::registerLanguageList("en"),
            FontStyle::registerLanguageList("en"));
  EXPECT_NE(FontStyle::registerLanguageList("en"),
            FontStyle::registerLanguageList("jp"));

  EXPECT_EQ(FontStyle::registerLanguageList("en,zh-Hans"),
            FontStyle::registerLanguageList("en,zh-Hans"));
  EXPECT_NE(FontStyle::registerLanguageList("en,zh-Hans"),
            FontStyle::registerLanguageList("zh-Hans,en"));
  EXPECT_NE(FontStyle::registerLanguageList("en,zh-Hans"),
            FontStyle::registerLanguageList("jp"));
  EXPECT_NE(FontStyle::registerLanguageList("en,zh-Hans"),
            FontStyle::registerLanguageList("en"));
  EXPECT_NE(FontStyle::registerLanguageList("en,zh-Hans"),
            FontStyle::registerLanguageList("en,zh-Hant"));
}

// The test font has following glyphs.
// U+82A6
// U+82A6 U+FE00 (VS1)
// U+82A6 U+E0100 (VS17)
// U+82A6 U+E0101 (VS18)
// U+82A6 U+E0102 (VS19)
// U+845B
// U+845B U+FE00 (VS2)
// U+845B U+E0101 (VS18)
// U+845B U+E0102 (VS19)
// U+845B U+E0103 (VS20)
// U+537F
// U+717D U+FE02 (VS3)
// U+717D U+E0102 (VS19)
// U+717D U+E0103 (VS20)
const char kVsTestFont[] = kTestFontDir "VariationSelectorTest-Regular.ttf";

class FontFamilyTest : public ICUTestBase {
 public:
  virtual void SetUp() override {
    ICUTestBase::SetUp();
    if (access(kVsTestFont, R_OK) != 0) {
      FAIL() << "Unable to read " << kVsTestFont << ". "
             << "Please prepare the test data directory. "
             << "For more details, please see how_to_run.txt.";
    }
  }
};

// Asserts that the font family has glyphs for and only for specified codepoint
// and variationSelector pairs.
void expectVSGlyphs(FontFamily* family,
                    uint32_t codepoint,
                    const std::set<uint32_t>& vs) {
  for (uint32_t i = 0xFE00; i <= 0xE01EF; ++i) {
    // Move to variation selectors supplements after variation selectors.
    if (i == 0xFF00) {
      i = 0xE0100;
    }
    if (vs.find(i) == vs.end()) {
      EXPECT_FALSE(family->hasGlyph(codepoint, i))
          << "Glyph for U+" << std::hex << codepoint << " U+" << i;
    } else {
      EXPECT_TRUE(family->hasGlyph(codepoint, i))
          << "Glyph for U+" << std::hex << codepoint << " U+" << i;
    }
  }
}

TEST_F(FontFamilyTest, hasVariationSelectorTest) {
  std::shared_ptr<MinikinFont> minikinFont(new MinikinFontForTest(kVsTestFont));
  std::shared_ptr<FontFamily> family(
      new FontFamily(std::vector<Font>{Font(minikinFont, FontStyle())}));

  std::lock_guard<std::mutex> _l(gMinikinLock);

  const uint32_t kVS1 = 0xFE00;
  const uint32_t kVS2 = 0xFE01;
  const uint32_t kVS3 = 0xFE02;
  const uint32_t kVS17 = 0xE0100;
  const uint32_t kVS18 = 0xE0101;
  const uint32_t kVS19 = 0xE0102;
  const uint32_t kVS20 = 0xE0103;

  const uint32_t kSupportedChar1 = 0x82A6;
  EXPECT_TRUE(family->getCoverage().get(kSupportedChar1));
  expectVSGlyphs(family.get(), kSupportedChar1,
                 std::set<uint32_t>({kVS1, kVS17, kVS18, kVS19}));

  const uint32_t kSupportedChar2 = 0x845B;
  EXPECT_TRUE(family->getCoverage().get(kSupportedChar2));
  expectVSGlyphs(family.get(), kSupportedChar2,
                 std::set<uint32_t>({kVS2, kVS18, kVS19, kVS20}));

  const uint32_t kNoVsSupportedChar = 0x537F;
  EXPECT_TRUE(family->getCoverage().get(kNoVsSupportedChar));
  expectVSGlyphs(family.get(), kNoVsSupportedChar, std::set<uint32_t>());

  const uint32_t kVsOnlySupportedChar = 0x717D;
  EXPECT_FALSE(family->getCoverage().get(kVsOnlySupportedChar));
  expectVSGlyphs(family.get(), kVsOnlySupportedChar,
                 std::set<uint32_t>({kVS3, kVS19, kVS20}));

  const uint32_t kNotSupportedChar = 0x845C;
  EXPECT_FALSE(family->getCoverage().get(kNotSupportedChar));
  expectVSGlyphs(family.get(), kNotSupportedChar, std::set<uint32_t>());
}

TEST_F(FontFamilyTest, hasVSTableTest) {
  struct TestCase {
    const std::string fontPath;
    bool hasVSTable;
  } testCases[] = {
      {kTestFontDir "Ja.ttf", true},     {kTestFontDir "ZhHant.ttf", true},
      {kTestFontDir "ZhHans.ttf", true}, {kTestFontDir "Italic.ttf", false},
      {kTestFontDir "Bold.ttf", false},  {kTestFontDir "BoldItalic.ttf", false},
  };

  for (auto testCase : testCases) {
    SCOPED_TRACE(testCase.hasVSTable
                     ? "Font " + testCase.fontPath +
                           " should have a variation sequence table."
                     : "Font " + testCase.fontPath +
                           " shouldn't have a variation sequence table.");

    std::shared_ptr<MinikinFont> minikinFont(
        new MinikinFontForTest(testCase.fontPath));
    std::shared_ptr<FontFamily> family(
        new FontFamily(std::vector<Font>{Font(minikinFont, FontStyle())}));
    std::lock_guard<std::mutex> _l(gMinikinLock);
    EXPECT_EQ(testCase.hasVSTable, family->hasVSTable());
  }
}

TEST_F(FontFamilyTest, createFamilyWithVariationTest) {
  // This font has 'wdth' and 'wght' axes.
  const char kMultiAxisFont[] = kTestFontDir "/MultiAxis.ttf";
  const char kNoAxisFont[] = kTestFontDir "/Regular.ttf";

  std::shared_ptr<FontFamily> multiAxisFamily = makeFamily(kMultiAxisFont);
  std::shared_ptr<FontFamily> noAxisFamily = makeFamily(kNoAxisFont);

  {
    // Do not ceate new instance if none of variations are specified.
    EXPECT_EQ(nullptr, multiAxisFamily->createFamilyWithVariation(
                           std::vector<FontVariation>()));
    EXPECT_EQ(nullptr, noAxisFamily->createFamilyWithVariation(
                           std::vector<FontVariation>()));
  }
  {
    // New instance should be used for supported variation.
    std::vector<FontVariation> variations = {
        {MinikinFont::MakeTag('w', 'd', 't', 'h'), 1.0f}};
    std::shared_ptr<FontFamily> newFamily(
        multiAxisFamily->createFamilyWithVariation(variations));
    EXPECT_NE(nullptr, newFamily.get());
    EXPECT_NE(multiAxisFamily.get(), newFamily.get());
    EXPECT_EQ(nullptr, noAxisFamily->createFamilyWithVariation(variations));
  }
  {
    // New instance should be used for supported variation. (multiple variations
    // case)
    std::vector<FontVariation> variations = {
        {MinikinFont::MakeTag('w', 'd', 't', 'h'), 1.0f},
        {MinikinFont::MakeTag('w', 'g', 'h', 't'), 1.0f}};
    std::shared_ptr<FontFamily> newFamily(
        multiAxisFamily->createFamilyWithVariation(variations));
    EXPECT_NE(nullptr, newFamily.get());
    EXPECT_NE(multiAxisFamily.get(), newFamily.get());
    EXPECT_EQ(nullptr, noAxisFamily->createFamilyWithVariation(variations));
  }
  {
    // Do not ceate new instance if none of variations are supported.
    std::vector<FontVariation> variations = {
        {MinikinFont::MakeTag('Z', 'Z', 'Z', 'Z'), 1.0f}};
    EXPECT_EQ(nullptr, multiAxisFamily->createFamilyWithVariation(variations));
    EXPECT_EQ(nullptr, noAxisFamily->createFamilyWithVariation(variations));
  }
  {
    // At least one axis is supported, should create new instance.
    std::vector<FontVariation> variations = {
        {MinikinFont::MakeTag('w', 'd', 't', 'h'), 1.0f},
        {MinikinFont::MakeTag('Z', 'Z', 'Z', 'Z'), 1.0f}};
    std::shared_ptr<FontFamily> newFamily(
        multiAxisFamily->createFamilyWithVariation(variations));
    EXPECT_NE(nullptr, newFamily.get());
    EXPECT_NE(multiAxisFamily.get(), newFamily.get());
    EXPECT_EQ(nullptr, noAxisFamily->createFamilyWithVariation(variations));
  }
}

TEST_F(FontFamilyTest, coverageTableSelectionTest) {
  // This font supports U+0061. The cmap subtable is format 4 and its platform
  // ID is 0 and encoding ID is 1.
  const char kUnicodeEncoding1Font[] = kTestFontDir "UnicodeBMPOnly.ttf";

  // This font supports U+0061. The cmap subtable is format 4 and its platform
  // ID is 0 and encoding ID is 3.
  const char kUnicodeEncoding3Font[] = kTestFontDir "UnicodeBMPOnly2.ttf";

  // This font has both cmap format 4 subtable which platform ID is 0 and
  // encoding ID is 1 and cmap format 14 subtable which platform ID is 0 and
  // encoding ID is 10. U+0061 is listed in both subtable but U+1F926 is only
  // listed in latter.
  const char kUnicodeEncoding4Font[] = kTestFontDir "UnicodeUCS4.ttf";

  std::shared_ptr<FontFamily> unicodeEnc1Font =
      makeFamily(kUnicodeEncoding1Font);
  std::shared_ptr<FontFamily> unicodeEnc3Font =
      makeFamily(kUnicodeEncoding3Font);
  std::shared_ptr<FontFamily> unicodeEnc4Font =
      makeFamily(kUnicodeEncoding4Font);

  std::lock_guard<std::mutex> _l(gMinikinLock);

  EXPECT_TRUE(unicodeEnc1Font->hasGlyph(0x0061, 0));
  EXPECT_TRUE(unicodeEnc3Font->hasGlyph(0x0061, 0));
  EXPECT_TRUE(unicodeEnc4Font->hasGlyph(0x0061, 0));

  EXPECT_TRUE(unicodeEnc4Font->hasGlyph(0x1F926, 0));
}

}  // namespace minikin
