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