1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/gfx/font_list.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 // Helper function for comparing fonts for equality.
18 std::string FontToString(const gfx::Font& font) {
19 std::string font_string = font.GetFontName();
21 font_string += base::IntToString(font.GetFontSize());
22 int style = font.GetStyle();
23 if (style & gfx::Font::BOLD)
24 font_string += "|bold";
25 if (style & gfx::Font::ITALIC)
26 font_string += "|italic";
27 if (style & gfx::Font::UNDERLINE)
28 font_string += "|underline";
36 TEST(FontListTest, FontDescString_FromDescString) {
37 // Test init from font name style size string.
38 FontList font_list = FontList("Droid Sans serif, Sans serif, 10px");
39 EXPECT_EQ("Droid Sans serif, Sans serif, 10px",
40 font_list.GetFontDescriptionString());
43 TEST(FontListTest, FontDescString_FromFontNamesStyleAndSize) {
44 // Test init from font names, style and size.
45 std::vector<std::string> font_names;
46 font_names.push_back("Arial");
47 font_names.push_back("Droid Sans serif");
48 int font_style = Font::BOLD | Font::ITALIC | Font::UNDERLINE;
50 FontList font_list = FontList(font_names, font_style, font_size);
51 // "Underline" doesn't appear in the font description string.
52 EXPECT_EQ("Arial,Droid Sans serif,Bold Italic 11px",
53 font_list.GetFontDescriptionString());
56 TEST(FontListTest, FontDescString_FromFont) {
57 // Test init from Font.
58 Font font("Arial", 8);
59 FontList font_list = FontList(font);
60 EXPECT_EQ("Arial,8px", font_list.GetFontDescriptionString());
63 TEST(FontListTest, FontDescString_FromFontWithNonNormalStyle) {
64 // Test init from Font with non-normal style.
65 Font font("Arial", 8);
66 FontList font_list = FontList(font.DeriveFont(2, Font::BOLD));
67 EXPECT_EQ("Arial,Bold 10px", font_list.GetFontDescriptionString());
69 font_list = FontList(font.DeriveFont(-2, Font::ITALIC));
70 EXPECT_EQ("Arial,Italic 6px", font_list.GetFontDescriptionString());
72 // "Underline" doesn't appear in the font description string.
73 font_list = FontList(font.DeriveFont(-4, Font::UNDERLINE));
74 EXPECT_EQ("Arial,4px", font_list.GetFontDescriptionString());
77 TEST(FontListTest, FontDescString_FromFontVector) {
78 // Test init from Font vector.
79 Font font("Arial", 8);
80 Font font_1("Sans serif", 10);
81 std::vector<Font> fonts;
82 fonts.push_back(font.DeriveFont(0, Font::BOLD));
83 fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
84 FontList font_list = FontList(fonts);
85 EXPECT_EQ("Arial,Sans serif,Bold 8px", font_list.GetFontDescriptionString());
88 TEST(FontListTest, Fonts_FromDescString) {
89 // Test init from font name size string.
90 FontList font_list = FontList("serif,Sans serif, 13px");
91 const std::vector<Font>& fonts = font_list.GetFonts();
92 EXPECT_EQ(2U, fonts.size());
93 EXPECT_EQ("serif|13", FontToString(fonts[0]));
94 EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
97 TEST(FontListTest, Fonts_FromDescStringInFlexibleFormat) {
98 // Test init from font name size string with flexible format.
99 FontList font_list = FontList(" serif , Sans serif , 13px");
100 const std::vector<Font>& fonts = font_list.GetFonts();
101 EXPECT_EQ(2U, fonts.size());
102 EXPECT_EQ("serif|13", FontToString(fonts[0]));
103 EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
106 TEST(FontListTest, Fonts_FromDescStringWithStyleInFlexibleFormat) {
107 // Test init from font name style size string with flexible format.
108 FontList font_list = FontList(" serif , Sans serif , Bold "
110 const std::vector<Font>& fonts = font_list.GetFonts();
111 EXPECT_EQ(2U, fonts.size());
112 EXPECT_EQ("serif|13|bold|italic", FontToString(fonts[0]));
113 EXPECT_EQ("Sans serif|13|bold|italic", FontToString(fonts[1]));
116 TEST(FontListTest, Fonts_FromFont) {
117 // Test init from Font.
118 Font font("Arial", 8);
119 FontList font_list = FontList(font);
120 const std::vector<Font>& fonts = font_list.GetFonts();
121 EXPECT_EQ(1U, fonts.size());
122 EXPECT_EQ("Arial|8", FontToString(fonts[0]));
125 TEST(FontListTest, Fonts_FromFontWithNonNormalStyle) {
126 // Test init from Font with non-normal style.
127 Font font("Arial", 8);
128 FontList font_list = FontList(font.DeriveFont(2, Font::BOLD));
129 std::vector<Font> fonts = font_list.GetFonts();
130 EXPECT_EQ(1U, fonts.size());
131 EXPECT_EQ("Arial|10|bold", FontToString(fonts[0]));
133 font_list = FontList(font.DeriveFont(-2, Font::ITALIC));
134 fonts = font_list.GetFonts();
135 EXPECT_EQ(1U, fonts.size());
136 EXPECT_EQ("Arial|6|italic", FontToString(fonts[0]));
139 TEST(FontListTest, Fonts_FromFontVector) {
140 // Test init from Font vector.
141 Font font("Arial", 8);
142 Font font_1("Sans serif", 10);
143 std::vector<Font> input_fonts;
144 input_fonts.push_back(font.DeriveFont(0, Font::BOLD));
145 input_fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
146 FontList font_list = FontList(input_fonts);
147 const std::vector<Font>& fonts = font_list.GetFonts();
148 EXPECT_EQ(2U, fonts.size());
149 EXPECT_EQ("Arial|8|bold", FontToString(fonts[0]));
150 EXPECT_EQ("Sans serif|8|bold", FontToString(fonts[1]));
153 TEST(FontListTest, Fonts_DescStringWithStyleInFlexibleFormat_RoundTrip) {
154 // Test round trip from font description string to font vector to
155 // font description string.
156 FontList font_list = FontList(" serif , Sans serif , Bold "
159 const std::vector<Font>& fonts = font_list.GetFonts();
160 FontList font_list_1 = FontList(fonts);
161 const std::string& desc_str = font_list_1.GetFontDescriptionString();
163 EXPECT_EQ("serif,Sans serif,Bold Italic 13px", desc_str);
166 TEST(FontListTest, Fonts_FontVector_RoundTrip) {
167 // Test round trip from font vector to font description string to font vector.
168 Font font("Arial", 8);
169 Font font_1("Sans serif", 10);
170 std::vector<Font> input_fonts;
171 input_fonts.push_back(font.DeriveFont(0, Font::BOLD));
172 input_fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
173 FontList font_list = FontList(input_fonts);
175 const std::string& desc_string = font_list.GetFontDescriptionString();
176 FontList font_list_1 = FontList(desc_string);
177 const std::vector<Font>& round_trip_fonts = font_list_1.GetFonts();
179 EXPECT_EQ(2U, round_trip_fonts.size());
180 EXPECT_EQ("Arial|8|bold", FontToString(round_trip_fonts[0]));
181 EXPECT_EQ("Sans serif|8|bold", FontToString(round_trip_fonts[1]));
184 TEST(FontListTest, FontDescString_GetStyle) {
185 FontList font_list = FontList("Arial,Sans serif, 8px");
186 EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
188 font_list = FontList("Arial,Sans serif,Bold 8px");
189 EXPECT_EQ(Font::BOLD, font_list.GetFontStyle());
191 font_list = FontList("Arial,Sans serif,Italic 8px");
192 EXPECT_EQ(Font::ITALIC, font_list.GetFontStyle());
194 font_list = FontList("Arial,Italic Bold 8px");
195 EXPECT_EQ(Font::BOLD | Font::ITALIC, font_list.GetFontStyle());
198 TEST(FontListTest, Fonts_GetStyle) {
199 std::vector<Font> fonts;
200 fonts.push_back(gfx::Font("Arial", 8));
201 fonts.push_back(gfx::Font("Sans serif", 8));
202 FontList font_list = FontList(fonts);
203 EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
204 fonts[0] = fonts[0].DeriveFont(0, Font::ITALIC | Font::BOLD);
205 fonts[1] = fonts[1].DeriveFont(0, Font::ITALIC | Font::BOLD);
206 font_list = FontList(fonts);
207 EXPECT_EQ(Font::ITALIC | Font::BOLD, font_list.GetFontStyle());
210 TEST(FontListTest, FontDescString_DeriveFontList) {
211 FontList font_list = FontList("Arial,Sans serif, 8px");
213 FontList derived = font_list.DeriveFontList(Font::BOLD | Font::ITALIC);
214 EXPECT_EQ("Arial,Sans serif,Bold Italic 8px",
215 derived.GetFontDescriptionString());
218 TEST(FontListTest, Fonts_DeriveFontList) {
219 std::vector<Font> fonts;
220 fonts.push_back(gfx::Font("Arial", 8));
221 fonts.push_back(gfx::Font("Sans serif", 8));
222 FontList font_list = FontList(fonts);
224 FontList derived = font_list.DeriveFontList(Font::BOLD | Font::ITALIC);
225 const std::vector<Font>& derived_fonts = derived.GetFonts();
227 EXPECT_EQ(2U, derived_fonts.size());
228 EXPECT_EQ("Arial|8|bold|italic", FontToString(derived_fonts[0]));
229 EXPECT_EQ("Sans serif|8|bold|italic", FontToString(derived_fonts[1]));
232 TEST(FontListTest, FontDescString_DeriveFontListWithSize) {
233 FontList font_list = FontList("Arial,Sans serif,Bold Italic 8px");
235 FontList derived = font_list.DeriveFontListWithSize(10);
236 EXPECT_EQ("Arial,Sans serif,Bold Italic 10px",
237 derived.GetFontDescriptionString());
240 TEST(FontListTest, Fonts_DeriveFontListWithSize) {
241 std::vector<Font> fonts;
242 fonts.push_back(gfx::Font("Arial", 8));
243 fonts.push_back(gfx::Font("Sans serif", 8));
244 FontList font_list = FontList(fonts);
246 FontList derived = font_list.DeriveFontListWithSize(5);
247 const std::vector<Font>& derived_fonts = derived.GetFonts();
249 EXPECT_EQ(2U, derived_fonts.size());
250 EXPECT_EQ("Arial|5", FontToString(derived_fonts[0]));
251 EXPECT_EQ("Sans serif|5", FontToString(derived_fonts[1]));
254 TEST(FontListTest, FontDescString_DeriveFontListWithSizeDelta) {
255 FontList font_list = FontList("Arial,Sans serif,Bold 18px");
257 FontList derived = font_list.DeriveFontListWithSizeDelta(-8);
258 EXPECT_EQ("Arial,Sans serif,Bold 10px",
259 derived.GetFontDescriptionString());
262 TEST(FontListTest, Fonts_DeriveFontListWithSizeDelta) {
263 std::vector<Font> fonts;
264 fonts.push_back(gfx::Font("Arial", 18).DeriveFont(0, Font::ITALIC));
265 fonts.push_back(gfx::Font("Sans serif", 18).DeriveFont(0, Font::ITALIC));
266 FontList font_list = FontList(fonts);
268 FontList derived = font_list.DeriveFontListWithSizeDelta(-5);
269 const std::vector<Font>& derived_fonts = derived.GetFonts();
271 EXPECT_EQ(2U, derived_fonts.size());
272 EXPECT_EQ("Arial|13|italic", FontToString(derived_fonts[0]));
273 EXPECT_EQ("Sans serif|13|italic", FontToString(derived_fonts[1]));
276 TEST(FontListTest, FontDescString_DeriveFontListWithSizeDeltaAndStyle) {
277 FontList font_list = FontList("Arial,Sans serif,Bold Italic 8px");
279 FontList derived = font_list.DeriveFontListWithSizeDeltaAndStyle(
280 10, Font::ITALIC | Font::UNDERLINE);
281 EXPECT_EQ("Arial,Sans serif,Italic 18px",
282 derived.GetFontDescriptionString());
283 EXPECT_EQ(Font::ITALIC | Font::UNDERLINE,
284 derived.GetFontStyle());
286 // FontList has a special care for Font::UNDERLINE. See if the handling of
287 // Font::UNDERLINE in GetFonts() is okay or not.
289 EXPECT_EQ(Font::ITALIC | Font::UNDERLINE,
290 derived.GetFontStyle());
293 TEST(FontListTest, Fonts_DeriveFontListWithSizeDeltaAndStyle) {
294 std::vector<Font> fonts;
295 fonts.push_back(gfx::Font("Arial", 8));
296 fonts.push_back(gfx::Font("Sans serif", 8));
297 FontList font_list = FontList(fonts);
299 FontList derived = font_list.DeriveFontListWithSizeDeltaAndStyle(
300 5, Font::BOLD | Font::UNDERLINE);
301 const std::vector<Font>& derived_fonts = derived.GetFonts();
303 EXPECT_EQ(2U, derived_fonts.size());
304 EXPECT_EQ("Arial|13|bold|underline", FontToString(derived_fonts[0]));
305 EXPECT_EQ("Sans serif|13|bold|underline", FontToString(derived_fonts[1]));
308 TEST(FontListTest, Fonts_GetHeight_GetBaseline) {
309 // If a font list has only one font, the height and baseline must be the same.
310 Font font1("Arial", 16);
311 ASSERT_EQ("arial", StringToLowerASCII(font1.GetActualFontNameForTesting()));
312 FontList font_list1("Arial, 16px");
313 EXPECT_EQ(font1.GetHeight(), font_list1.GetHeight());
314 EXPECT_EQ(font1.GetBaseline(), font_list1.GetBaseline());
316 // If there are two different fonts, the font list returns the max value
317 // for ascent and descent.
318 Font font2("Symbol", 16);
319 ASSERT_EQ("symbol", StringToLowerASCII(font2.GetActualFontNameForTesting()));
320 EXPECT_NE(font1.GetBaseline(), font2.GetBaseline());
321 EXPECT_NE(font1.GetHeight() - font1.GetBaseline(),
322 font2.GetHeight() - font2.GetBaseline());
323 std::vector<Font> fonts;
324 fonts.push_back(font1);
325 fonts.push_back(font2);
326 FontList font_list_mix(fonts);
327 // ascent of FontList == max(ascent of Fonts)
328 EXPECT_EQ(std::max(font1.GetHeight() - font1.GetBaseline(),
329 font2.GetHeight() - font2.GetBaseline()),
330 font_list_mix.GetHeight() - font_list_mix.GetBaseline());
331 // descent of FontList == max(descent of Fonts)
332 EXPECT_EQ(std::max(font1.GetBaseline(), font2.GetBaseline()),
333 font_list_mix.GetBaseline());