// Copyright (c) 2012 The Chromium 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 "ui/gfx/font_fallback_win.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace gfx {

namespace {

// Subclass of LinkedFontsIterator for testing that allows mocking the linked
// fonts vector.
class TestLinkedFontsIterator : public LinkedFontsIterator {
 public:
  explicit TestLinkedFontsIterator(Font font) : LinkedFontsIterator(font) {
  }

  virtual ~TestLinkedFontsIterator() {
  }

  // Add a linked font to the mocked vector of linked fonts.
  void AddLinkedFontForTesting(Font font) {
    test_linked_fonts.push_back(font);
  }

  virtual const std::vector<Font>* GetLinkedFonts() const OVERRIDE {
    return &test_linked_fonts;
  }

 private:
  std::vector<Font> test_linked_fonts;

  DISALLOW_COPY_AND_ASSIGN(TestLinkedFontsIterator);
};

}  // namespace

TEST(FontFallbackWinTest, ParseFontLinkEntry) {
  std::string file;
  std::string font;

  internal::ParseFontLinkEntry("TAHOMA.TTF", &file, &font);
  EXPECT_EQ("TAHOMA.TTF", file);
  EXPECT_EQ("", font);

  internal::ParseFontLinkEntry("MSGOTHIC.TTC,MS UI Gothic", &file, &font);
  EXPECT_EQ("MSGOTHIC.TTC", file);
  EXPECT_EQ("MS UI Gothic", font);

  internal::ParseFontLinkEntry("MALGUN.TTF,128,96", &file, &font);
  EXPECT_EQ("MALGUN.TTF", file);
  EXPECT_EQ("", font);

  internal::ParseFontLinkEntry("MEIRYO.TTC,Meiryo,128,85", &file, &font);
  EXPECT_EQ("MEIRYO.TTC", file);
  EXPECT_EQ("Meiryo", font);
}

TEST(FontFallbackWinTest, ParseFontFamilyString) {
  std::vector<std::string> font_names;

  internal::ParseFontFamilyString("Times New Roman (TrueType)", &font_names);
  ASSERT_EQ(1U, font_names.size());
  EXPECT_EQ("Times New Roman", font_names[0]);
  font_names.clear();

  internal::ParseFontFamilyString("Cambria & Cambria Math (TrueType)",
                                  &font_names);
  ASSERT_EQ(2U, font_names.size());
  EXPECT_EQ("Cambria", font_names[0]);
  EXPECT_EQ("Cambria Math", font_names[1]);
  font_names.clear();

  internal::ParseFontFamilyString(
      "Meiryo & Meiryo Italic & Meiryo UI & Meiryo UI Italic (TrueType)",
      &font_names);
  ASSERT_EQ(4U, font_names.size());
  EXPECT_EQ("Meiryo", font_names[0]);
  EXPECT_EQ("Meiryo Italic", font_names[1]);
  EXPECT_EQ("Meiryo UI", font_names[2]);
  EXPECT_EQ("Meiryo UI Italic", font_names[3]);
}

TEST(FontFallbackWinTest, LinkedFontsIterator) {
  TestLinkedFontsIterator iterator(Font("Arial", 16));
  iterator.AddLinkedFontForTesting(Font("Times New Roman", 16));

  Font font;
  EXPECT_TRUE(iterator.NextFont(&font));
  ASSERT_EQ("Arial", font.GetFontName());

  EXPECT_TRUE(iterator.NextFont(&font));
  ASSERT_EQ("Times New Roman", font.GetFontName());

  EXPECT_FALSE(iterator.NextFont(&font));
}

TEST(FontFallbackWinTest, LinkedFontsIteratorSetNextFont) {
  TestLinkedFontsIterator iterator(Font("Arial", 16));
  iterator.AddLinkedFontForTesting(Font("Times New Roman", 16));

  Font font;
  EXPECT_TRUE(iterator.NextFont(&font));
  ASSERT_EQ("Arial", font.GetFontName());

  iterator.SetNextFont(Font("Tahoma", 16));
  EXPECT_TRUE(iterator.NextFont(&font));
  ASSERT_EQ("Tahoma", font.GetFontName());

  EXPECT_TRUE(iterator.NextFont(&font));
  ASSERT_EQ("Times New Roman", font.GetFontName());

  EXPECT_FALSE(iterator.NextFont(&font));
}

}  // namespace gfx
