15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font_list.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/string_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for comparing fonts for equality.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FontToString(const gfx::Font& font) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string font_string = font.GetFontName();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_string += "|";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_string += base::IntToString(font.GetFontSize());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int style = font.GetStyle();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (style & gfx::Font::BOLD)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    font_string += "|bold";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (style & gfx::Font::ITALIC)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    font_string += "|italic";
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (style & gfx::Font::UNDERLINE)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    font_string += "|underline";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font_string;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, FontDescString_FromDescString) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from font name style size string.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("Droid Sans serif, Sans serif, 10px");
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Droid Sans serif, Sans serif, 10px",
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            font_list.GetFontDescriptionString());
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(FontListTest, FontDescString_FromFontNamesStyleAndSize) {
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Test init from font names, style and size.
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> font_names;
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  font_names.push_back("Arial");
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  font_names.push_back("Droid Sans serif");
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int font_style = Font::BOLD | Font::ITALIC | Font::UNDERLINE;
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int font_size = 11;
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FontList font_list = FontList(font_names, font_style, font_size);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "Underline" doesn't appear in the font description string.
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Arial,Droid Sans serif,Bold Italic 11px",
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            font_list.GetFontDescriptionString());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, FontDescString_FromFont) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(font);
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Arial,8px", font_list.GetFontDescriptionString());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, FontDescString_FromFontWithNonNormalStyle) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font with non-normal style.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList font_list = FontList(font.Derive(2, Font::BOLD));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial,Bold 10px", font_list.GetFontDescriptionString());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  font_list = FontList(font.Derive(-2, Font::ITALIC));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial,Italic 6px", font_list.GetFontDescriptionString());
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "Underline" doesn't appear in the font description string.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  font_list = FontList(font.Derive(-4, Font::UNDERLINE));
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("Arial,4px", font_list.GetFontDescriptionString());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, FontDescString_FromFontVector) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font vector.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font_1("Sans serif", 10);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> fonts;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts.push_back(font.Derive(0, Font::BOLD));
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts.push_back(font_1.Derive(-2, Font::BOLD));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(fonts);
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Arial,Sans serif,Bold 8px", font_list.GetFontDescriptionString());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromDescString) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from font name size string.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("serif,Sans serif, 13px");
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, fonts.size());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("serif|13", FontToString(fonts[0]));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromDescStringInFlexibleFormat) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from font name size string with flexible format.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("  serif   ,   Sans serif ,   13px");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, fonts.size());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("serif|13", FontToString(fonts[0]));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromDescStringWithStyleInFlexibleFormat) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from font name style size string with flexible format.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("  serif  ,  Sans serif ,  Bold   "
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "  Italic   13px");
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, fonts.size());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("serif|13|bold|italic", FontToString(fonts[0]));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Sans serif|13|bold|italic", FontToString(fonts[1]));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromFont) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(font);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, fonts.size());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial|8", FontToString(fonts[0]));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromFontWithNonNormalStyle) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font with non-normal style.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList font_list = FontList(font.Derive(2, Font::BOLD));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> fonts = font_list.GetFonts();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, fonts.size());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial|10|bold", FontToString(fonts[0]));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  font_list = FontList(font.Derive(-2, Font::ITALIC));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fonts = font_list.GetFonts();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, fonts.size());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial|6|italic", FontToString(fonts[0]));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FromFontVector) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test init from Font vector.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font_1("Sans serif", 10);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> input_fonts;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_fonts.push_back(font.Derive(0, Font::BOLD));
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_fonts.push_back(font_1.Derive(-2, Font::BOLD));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(input_fonts);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, fonts.size());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial|8|bold", FontToString(fonts[0]));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Sans serif|8|bold", FontToString(fonts[1]));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_DescStringWithStyleInFlexibleFormat_RoundTrip) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test round trip from font description string to font vector to
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // font description string.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("  serif  ,  Sans serif ,  Bold   "
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "  Italic   13px");
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& fonts = font_list.GetFonts();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list_1 = FontList(fonts);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& desc_str = font_list_1.GetFontDescriptionString();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("serif,Sans serif,Bold Italic 13px", desc_str);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_FontVector_RoundTrip) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test round trip from font vector to font description string to font vector.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font("Arial", 8);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font font_1("Sans serif", 10);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> input_fonts;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_fonts.push_back(font.Derive(0, Font::BOLD));
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_fonts.push_back(font_1.Derive(-2, Font::BOLD));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(input_fonts);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& desc_string = font_list.GetFontDescriptionString();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list_1 = FontList(desc_string);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& round_trip_fonts = font_list_1.GetFonts();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, round_trip_fonts.size());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Arial|8|bold", FontToString(round_trip_fonts[0]));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Sans serif|8|bold", FontToString(round_trip_fonts[1]));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, FontDescString_GetStyle) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList("Arial,Sans serif, 8px");
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_list = FontList("Arial,Sans serif,Bold 8px");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::BOLD, font_list.GetFontStyle());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_list = FontList("Arial,Sans serif,Italic 8px");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::ITALIC, font_list.GetFontStyle());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_list = FontList("Arial,Italic Bold 8px");
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::BOLD | Font::ITALIC, font_list.GetFontStyle());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FontListTest, Fonts_GetStyle) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> fonts;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fonts.push_back(gfx::Font("Arial", 8));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fonts.push_back(gfx::Font("Sans serif", 8));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(fonts);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts[0] = fonts[0].Derive(0, Font::ITALIC | Font::BOLD);
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts[1] = fonts[1].Derive(0, Font::ITALIC | Font::BOLD);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  font_list = FontList(fonts);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Font::ITALIC | Font::BOLD, font_list.GetFontStyle());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(FontListTest, FontDescString_Derive) {
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList font_list = FontList("Arial,Sans serif,Bold Italic 8px");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList derived = font_list.Derive(10, Font::ITALIC | Font::UNDERLINE);
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("Arial,Sans serif,Italic 18px", derived.GetFontDescriptionString());
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(Font::ITALIC | Font::UNDERLINE, derived.GetFontStyle());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FontList has a special case for Font::UNDERLINE.  See if the handling of
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Font::UNDERLINE in GetFonts() is okay or not.
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  derived.GetFonts();
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(Font::ITALIC | Font::UNDERLINE, derived.GetFontStyle());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(FontListTest, Fonts_Derive) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Font> fonts;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fonts.push_back(gfx::Font("Arial", 8));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fonts.push_back(gfx::Font("Sans serif", 8));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontList font_list = FontList(fonts);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList derived = font_list.Derive(5, Font::BOLD | Font::UNDERLINE);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<Font>& derived_fonts = derived.GetFonts();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, derived_fonts.size());
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("Arial|13|bold|underline", FontToString(derived_fonts[0]));
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("Sans serif|13|bold|underline", FontToString(derived_fonts[1]));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(FontListTest, FontDescString_DeriveWithSizeDelta) {
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FontList font_list = FontList("Arial,Sans serif,Bold 18px");
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList derived = font_list.DeriveWithSizeDelta(-8);
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Arial,Sans serif,Bold 10px",
242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            derived.GetFontDescriptionString());
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(FontListTest, Fonts_DeriveWithSizeDelta) {
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<Font> fonts;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts.push_back(gfx::Font("Arial", 18).Derive(0, Font::ITALIC));
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fonts.push_back(gfx::Font("Sans serif", 18).Derive(0, Font::ITALIC));
249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FontList font_list = FontList(fonts);
250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList derived = font_list.DeriveWithSizeDelta(-5);
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::vector<Font>& derived_fonts = derived.GetFonts();
253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(2U, derived_fonts.size());
255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Arial|13|italic", FontToString(derived_fonts[0]));
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("Sans serif|13|italic", FontToString(derived_fonts[1]));
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(FontListTest, Fonts_GetHeight_GetBaseline) {
260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // If a font list has only one font, the height and baseline must be the same.
261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Font font1("Arial", 16);
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ("arial",
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            base::StringToLowerASCII(font1.GetActualFontNameForTesting()));
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FontList font_list1("Arial, 16px");
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(font1.GetHeight(), font_list1.GetHeight());
266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(font1.GetBaseline(), font_list1.GetBaseline());
267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // If there are two different fonts, the font list returns the max value
269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // for ascent and descent.
270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Font font2("Symbol", 16);
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ("symbol",
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            base::StringToLowerASCII(font2.GetActualFontNameForTesting()));
273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_NE(font1.GetBaseline(), font2.GetBaseline());
274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_NE(font1.GetHeight() - font1.GetBaseline(),
275ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            font2.GetHeight() - font2.GetBaseline());
276ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<Font> fonts;
277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  fonts.push_back(font1);
278ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  fonts.push_back(font2);
279ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FontList font_list_mix(fonts);
280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // ascent of FontList == max(ascent of Fonts)
281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(std::max(font1.GetHeight() - font1.GetBaseline(),
282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     font2.GetHeight() - font2.GetBaseline()),
283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            font_list_mix.GetHeight() - font_list_mix.GetBaseline());
284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // descent of FontList == max(descent of Fonts)
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(std::max(font1.GetBaseline(), font2.GetBaseline()),
286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            font_list_mix.GetBaseline());
287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FontListTest, Fonts_DeriveWithHeightUpperBound) {
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<Font> fonts;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fonts.push_back(gfx::Font("Arial", 18));
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fonts.push_back(gfx::Font("Sans serif", 18));
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fonts.push_back(gfx::Font("Symbol", 18));
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FontList font_list = FontList(fonts);
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A smaller upper bound should derive a font list with a smaller height.
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int height_1 = font_list.GetHeight() - 5;
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FontList derived_1 = font_list.DeriveWithHeightUpperBound(height_1);
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LE(derived_1.GetHeight(), height_1);
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LT(derived_1.GetHeight(), font_list.GetHeight());
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LT(derived_1.GetFontSize(), font_list.GetFontSize());
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A larger upper bound should not change the height of the font list.
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int height_2 = font_list.GetHeight() + 5;
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FontList derived_2 = font_list.DeriveWithHeightUpperBound(height_2);
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_LE(derived_2.GetHeight(), height_2);
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(font_list.GetHeight(), derived_2.GetHeight());
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(font_list.GetFontSize(), derived_2.GetFontSize());
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
313