• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "ui/gfx/font_list.h"
6 
7 #include <algorithm>
8 #include <string>
9 #include <vector>
10 
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace {
16 
17 // Helper function for comparing fonts for equality.
FontToString(const gfx::Font & font)18 std::string FontToString(const gfx::Font& font) {
19   std::string font_string = font.GetFontName();
20   font_string += "|";
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   return font_string;
28 }
29 
30 }  // namespace
31 
32 namespace gfx {
33 
TEST(FontListTest,FontDescString_FromDescString)34 TEST(FontListTest, FontDescString_FromDescString) {
35   // Test init from font name style size string.
36   FontList font_list = FontList("Droid Sans serif, Sans serif, 10px");
37   EXPECT_EQ("Droid Sans serif, Sans serif, 10px",
38             font_list.GetFontDescriptionString());
39 }
40 
TEST(FontListTest,FontDescString_FromFontNamesStyleAndSize)41 TEST(FontListTest, FontDescString_FromFontNamesStyleAndSize) {
42   // Test init from font names, style and size.
43   std::vector<std::string> font_names;
44   font_names.push_back("Arial");
45   font_names.push_back("Droid Sans serif");
46   int font_style = Font::BOLD | Font::ITALIC;
47   int font_size = 11;
48   FontList font_list = FontList(font_names, font_style, font_size);
49   EXPECT_EQ("Arial,Droid Sans serif,Bold Italic 11px",
50             font_list.GetFontDescriptionString());
51 }
52 
TEST(FontListTest,FontDescString_FromFont)53 TEST(FontListTest, FontDescString_FromFont) {
54   // Test init from Font.
55   Font font("Arial", 8);
56   FontList font_list = FontList(font);
57   EXPECT_EQ("Arial,8px", font_list.GetFontDescriptionString());
58 }
59 
TEST(FontListTest,FontDescString_FromFontWithNonNormalStyle)60 TEST(FontListTest, FontDescString_FromFontWithNonNormalStyle) {
61   // Test init from Font with non-normal style.
62   Font font("Arial", 8);
63   FontList font_list = FontList(font.DeriveFont(2, Font::BOLD));
64   EXPECT_EQ("Arial,Bold 10px", font_list.GetFontDescriptionString());
65 
66   font_list = FontList(font.DeriveFont(-2, Font::ITALIC));
67   EXPECT_EQ("Arial,Italic 6px", font_list.GetFontDescriptionString());
68 }
69 
TEST(FontListTest,FontDescString_FromFontVector)70 TEST(FontListTest, FontDescString_FromFontVector) {
71   // Test init from Font vector.
72   Font font("Arial", 8);
73   Font font_1("Sans serif", 10);
74   std::vector<Font> fonts;
75   fonts.push_back(font.DeriveFont(0, Font::BOLD));
76   fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
77   FontList font_list = FontList(fonts);
78   EXPECT_EQ("Arial,Sans serif,Bold 8px", font_list.GetFontDescriptionString());
79 }
80 
TEST(FontListTest,Fonts_FromDescString)81 TEST(FontListTest, Fonts_FromDescString) {
82   // Test init from font name size string.
83   FontList font_list = FontList("serif,Sans serif, 13px");
84   const std::vector<Font>& fonts = font_list.GetFonts();
85   EXPECT_EQ(2U, fonts.size());
86   EXPECT_EQ("serif|13", FontToString(fonts[0]));
87   EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
88 }
89 
TEST(FontListTest,Fonts_FromDescStringInFlexibleFormat)90 TEST(FontListTest, Fonts_FromDescStringInFlexibleFormat) {
91   // Test init from font name size string with flexible format.
92   FontList font_list = FontList("  serif   ,   Sans serif ,   13px");
93   const std::vector<Font>& fonts = font_list.GetFonts();
94   EXPECT_EQ(2U, fonts.size());
95   EXPECT_EQ("serif|13", FontToString(fonts[0]));
96   EXPECT_EQ("Sans serif|13", FontToString(fonts[1]));
97 }
98 
TEST(FontListTest,Fonts_FromDescStringWithStyleInFlexibleFormat)99 TEST(FontListTest, Fonts_FromDescStringWithStyleInFlexibleFormat) {
100   // Test init from font name style size string with flexible format.
101   FontList font_list = FontList("  serif  ,  Sans serif ,  Bold   "
102                                 "  Italic   13px");
103   const std::vector<Font>& fonts = font_list.GetFonts();
104   EXPECT_EQ(2U, fonts.size());
105   EXPECT_EQ("serif|13|bold|italic", FontToString(fonts[0]));
106   EXPECT_EQ("Sans serif|13|bold|italic", FontToString(fonts[1]));
107 }
108 
TEST(FontListTest,Fonts_FromFont)109 TEST(FontListTest, Fonts_FromFont) {
110   // Test init from Font.
111   Font font("Arial", 8);
112   FontList font_list = FontList(font);
113   const std::vector<Font>& fonts = font_list.GetFonts();
114   EXPECT_EQ(1U, fonts.size());
115   EXPECT_EQ("Arial|8", FontToString(fonts[0]));
116 }
117 
TEST(FontListTest,Fonts_FromFontWithNonNormalStyle)118 TEST(FontListTest, Fonts_FromFontWithNonNormalStyle) {
119   // Test init from Font with non-normal style.
120   Font font("Arial", 8);
121   FontList font_list = FontList(font.DeriveFont(2, Font::BOLD));
122   std::vector<Font> fonts = font_list.GetFonts();
123   EXPECT_EQ(1U, fonts.size());
124   EXPECT_EQ("Arial|10|bold", FontToString(fonts[0]));
125 
126   font_list = FontList(font.DeriveFont(-2, Font::ITALIC));
127   fonts = font_list.GetFonts();
128   EXPECT_EQ(1U, fonts.size());
129   EXPECT_EQ("Arial|6|italic", FontToString(fonts[0]));
130 }
131 
TEST(FontListTest,Fonts_FromFontVector)132 TEST(FontListTest, Fonts_FromFontVector) {
133   // Test init from Font vector.
134   Font font("Arial", 8);
135   Font font_1("Sans serif", 10);
136   std::vector<Font> input_fonts;
137   input_fonts.push_back(font.DeriveFont(0, Font::BOLD));
138   input_fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
139   FontList font_list = FontList(input_fonts);
140   const std::vector<Font>& fonts = font_list.GetFonts();
141   EXPECT_EQ(2U, fonts.size());
142   EXPECT_EQ("Arial|8|bold", FontToString(fonts[0]));
143   EXPECT_EQ("Sans serif|8|bold", FontToString(fonts[1]));
144 }
145 
TEST(FontListTest,Fonts_DescStringWithStyleInFlexibleFormat_RoundTrip)146 TEST(FontListTest, Fonts_DescStringWithStyleInFlexibleFormat_RoundTrip) {
147   // Test round trip from font description string to font vector to
148   // font description string.
149   FontList font_list = FontList("  serif  ,  Sans serif ,  Bold   "
150                                 "  Italic   13px");
151 
152   const std::vector<Font>& fonts = font_list.GetFonts();
153   FontList font_list_1 = FontList(fonts);
154   const std::string& desc_str = font_list_1.GetFontDescriptionString();
155 
156   EXPECT_EQ("serif,Sans serif,Bold Italic 13px", desc_str);
157 }
158 
TEST(FontListTest,Fonts_FontVector_RoundTrip)159 TEST(FontListTest, Fonts_FontVector_RoundTrip) {
160   // Test round trip from font vector to font description string to font vector.
161   Font font("Arial", 8);
162   Font font_1("Sans serif", 10);
163   std::vector<Font> input_fonts;
164   input_fonts.push_back(font.DeriveFont(0, Font::BOLD));
165   input_fonts.push_back(font_1.DeriveFont(-2, Font::BOLD));
166   FontList font_list = FontList(input_fonts);
167 
168   const std::string& desc_string = font_list.GetFontDescriptionString();
169   FontList font_list_1 = FontList(desc_string);
170   const std::vector<Font>& round_trip_fonts = font_list_1.GetFonts();
171 
172   EXPECT_EQ(2U, round_trip_fonts.size());
173   EXPECT_EQ("Arial|8|bold", FontToString(round_trip_fonts[0]));
174   EXPECT_EQ("Sans serif|8|bold", FontToString(round_trip_fonts[1]));
175 }
176 
TEST(FontListTest,FontDescString_GetStyle)177 TEST(FontListTest, FontDescString_GetStyle) {
178   FontList font_list = FontList("Arial,Sans serif, 8px");
179   EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
180 
181   font_list = FontList("Arial,Sans serif,Bold 8px");
182   EXPECT_EQ(Font::BOLD, font_list.GetFontStyle());
183 
184   font_list = FontList("Arial,Sans serif,Italic 8px");
185   EXPECT_EQ(Font::ITALIC, font_list.GetFontStyle());
186 
187   font_list = FontList("Arial,Italic Bold 8px");
188   EXPECT_EQ(Font::BOLD | Font::ITALIC, font_list.GetFontStyle());
189 }
190 
TEST(FontListTest,Fonts_GetStyle)191 TEST(FontListTest, Fonts_GetStyle) {
192   std::vector<Font> fonts;
193   fonts.push_back(gfx::Font("Arial", 8));
194   fonts.push_back(gfx::Font("Sans serif", 8));
195   FontList font_list = FontList(fonts);
196   EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle());
197   fonts[0] = fonts[0].DeriveFont(0, Font::ITALIC | Font::BOLD);
198   fonts[1] = fonts[1].DeriveFont(0, Font::ITALIC | Font::BOLD);
199   font_list = FontList(fonts);
200   EXPECT_EQ(Font::ITALIC | Font::BOLD, font_list.GetFontStyle());
201 }
202 
TEST(FontListTest,FontDescString_DeriveFontList)203 TEST(FontListTest, FontDescString_DeriveFontList) {
204   FontList font_list = FontList("Arial,Sans serif, 8px");
205 
206   FontList derived = font_list.DeriveFontList(Font::BOLD | Font::ITALIC);
207   EXPECT_EQ("Arial,Sans serif,Bold Italic 8px",
208             derived.GetFontDescriptionString());
209 }
210 
TEST(FontListTest,Fonts_DeriveFontList)211 TEST(FontListTest, Fonts_DeriveFontList) {
212   std::vector<Font> fonts;
213   fonts.push_back(gfx::Font("Arial", 8));
214   fonts.push_back(gfx::Font("Sans serif", 8));
215   FontList font_list = FontList(fonts);
216 
217   FontList derived = font_list.DeriveFontList(Font::BOLD | Font::ITALIC);
218   const std::vector<Font>& derived_fonts = derived.GetFonts();
219 
220   EXPECT_EQ(2U, derived_fonts.size());
221   EXPECT_EQ("Arial|8|bold|italic", FontToString(derived_fonts[0]));
222   EXPECT_EQ("Sans serif|8|bold|italic", FontToString(derived_fonts[1]));
223 }
224 
TEST(FontListTest,FontDescString_DeriveFontListWithSize)225 TEST(FontListTest, FontDescString_DeriveFontListWithSize) {
226   FontList font_list = FontList("Arial,Sans serif,Bold Italic  8px");
227 
228   FontList derived = font_list.DeriveFontListWithSize(10);
229   EXPECT_EQ("Arial,Sans serif,Bold Italic 10px",
230             derived.GetFontDescriptionString());
231 }
232 
TEST(FontListTest,Fonts_DeriveFontListWithSize)233 TEST(FontListTest, Fonts_DeriveFontListWithSize) {
234   std::vector<Font> fonts;
235   fonts.push_back(gfx::Font("Arial", 8));
236   fonts.push_back(gfx::Font("Sans serif", 8));
237   FontList font_list = FontList(fonts);
238 
239   FontList derived = font_list.DeriveFontListWithSize(5);
240   const std::vector<Font>& derived_fonts = derived.GetFonts();
241 
242   EXPECT_EQ(2U, derived_fonts.size());
243   EXPECT_EQ("Arial|5", FontToString(derived_fonts[0]));
244   EXPECT_EQ("Sans serif|5", FontToString(derived_fonts[1]));
245 }
246 
TEST(FontListTest,FontDescString_DeriveFontListWithSizeDelta)247 TEST(FontListTest, FontDescString_DeriveFontListWithSizeDelta) {
248   FontList font_list = FontList("Arial,Sans serif,Bold 18px");
249 
250   FontList derived = font_list.DeriveFontListWithSizeDelta(-8);
251   EXPECT_EQ("Arial,Sans serif,Bold 10px",
252             derived.GetFontDescriptionString());
253 }
254 
TEST(FontListTest,Fonts_DeriveFontListWithSizeDelta)255 TEST(FontListTest, Fonts_DeriveFontListWithSizeDelta) {
256   std::vector<Font> fonts;
257   fonts.push_back(gfx::Font("Arial", 18).DeriveFont(0, Font::ITALIC));
258   fonts.push_back(gfx::Font("Sans serif", 18).DeriveFont(0, Font::ITALIC));
259   FontList font_list = FontList(fonts);
260 
261   FontList derived = font_list.DeriveFontListWithSizeDelta(-5);
262   const std::vector<Font>& derived_fonts = derived.GetFonts();
263 
264   EXPECT_EQ(2U, derived_fonts.size());
265   EXPECT_EQ("Arial|13|italic", FontToString(derived_fonts[0]));
266   EXPECT_EQ("Sans serif|13|italic", FontToString(derived_fonts[1]));
267 }
268 
TEST(FontListTest,FontDescString_DeriveFontListWithSizeDeltaAndStyle)269 TEST(FontListTest, FontDescString_DeriveFontListWithSizeDeltaAndStyle) {
270   FontList font_list = FontList("Arial,Sans serif,Bold Italic  8px");
271 
272   FontList derived =
273       font_list.DeriveFontListWithSizeDeltaAndStyle(10, Font::ITALIC);
274   EXPECT_EQ("Arial,Sans serif,Italic 18px",
275             derived.GetFontDescriptionString());
276 }
277 
TEST(FontListTest,Fonts_DeriveFontListWithSizeDeltaAndStyle)278 TEST(FontListTest, Fonts_DeriveFontListWithSizeDeltaAndStyle) {
279   std::vector<Font> fonts;
280   fonts.push_back(gfx::Font("Arial", 8));
281   fonts.push_back(gfx::Font("Sans serif", 8));
282   FontList font_list = FontList(fonts);
283 
284   FontList derived =
285       font_list.DeriveFontListWithSizeDeltaAndStyle(5, Font::BOLD);
286   const std::vector<Font>& derived_fonts = derived.GetFonts();
287 
288   EXPECT_EQ(2U, derived_fonts.size());
289   EXPECT_EQ("Arial|13|bold", FontToString(derived_fonts[0]));
290   EXPECT_EQ("Sans serif|13|bold", FontToString(derived_fonts[1]));
291 }
292 
TEST(FontListTest,Fonts_GetHeight_GetBaseline)293 TEST(FontListTest, Fonts_GetHeight_GetBaseline) {
294   // If a font list has only one font, the height and baseline must be the same.
295   Font font1("Arial", 16);
296   ASSERT_EQ("arial", StringToLowerASCII(font1.GetActualFontNameForTesting()));
297   FontList font_list1("Arial, 16px");
298   EXPECT_EQ(font1.GetHeight(), font_list1.GetHeight());
299   EXPECT_EQ(font1.GetBaseline(), font_list1.GetBaseline());
300 
301   // If there are two different fonts, the font list returns the max value
302   // for ascent and descent.
303   Font font2("Symbol", 16);
304   ASSERT_EQ("symbol", StringToLowerASCII(font2.GetActualFontNameForTesting()));
305   EXPECT_NE(font1.GetBaseline(), font2.GetBaseline());
306   EXPECT_NE(font1.GetHeight() - font1.GetBaseline(),
307             font2.GetHeight() - font2.GetBaseline());
308   std::vector<Font> fonts;
309   fonts.push_back(font1);
310   fonts.push_back(font2);
311   FontList font_list_mix(fonts);
312   // ascent of FontList == max(ascent of Fonts)
313   EXPECT_EQ(std::max(font1.GetHeight() - font1.GetBaseline(),
314                      font2.GetHeight() - font2.GetBaseline()),
315             font_list_mix.GetHeight() - font_list_mix.GetBaseline());
316   // descent of FontList == max(descent of Fonts)
317   EXPECT_EQ(std::max(font1.GetBaseline(), font2.GetBaseline()),
318             font_list_mix.GetBaseline());
319 }
320 
321 }  // namespace gfx
322