| OLD | NEW |
| (Empty) |
| 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. | |
| 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 if (style & gfx::Font::UNDERLINE) | |
| 28 font_string += "|underline"; | |
| 29 return font_string; | |
| 30 } | |
| 31 | |
| 32 } // namespace | |
| 33 | |
| 34 namespace gfx { | |
| 35 | |
| 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()); | |
| 41 } | |
| 42 | |
| 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; | |
| 49 int font_size = 11; | |
| 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()); | |
| 54 } | |
| 55 | |
| 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()); | |
| 61 } | |
| 62 | |
| 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.Derive(2, Font::BOLD)); | |
| 67 EXPECT_EQ("Arial,Bold 10px", font_list.GetFontDescriptionString()); | |
| 68 | |
| 69 font_list = FontList(font.Derive(-2, Font::ITALIC)); | |
| 70 EXPECT_EQ("Arial,Italic 6px", font_list.GetFontDescriptionString()); | |
| 71 | |
| 72 // "Underline" doesn't appear in the font description string. | |
| 73 font_list = FontList(font.Derive(-4, Font::UNDERLINE)); | |
| 74 EXPECT_EQ("Arial,4px", font_list.GetFontDescriptionString()); | |
| 75 } | |
| 76 | |
| 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.Derive(0, Font::BOLD)); | |
| 83 fonts.push_back(font_1.Derive(-2, Font::BOLD)); | |
| 84 FontList font_list = FontList(fonts); | |
| 85 EXPECT_EQ("Arial,Sans serif,Bold 8px", font_list.GetFontDescriptionString()); | |
| 86 } | |
| 87 | |
| 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])); | |
| 95 } | |
| 96 | |
| 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])); | |
| 104 } | |
| 105 | |
| 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 " | |
| 109 " Italic 13px"); | |
| 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])); | |
| 114 } | |
| 115 | |
| 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])); | |
| 123 } | |
| 124 | |
| 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.Derive(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])); | |
| 132 | |
| 133 font_list = FontList(font.Derive(-2, Font::ITALIC)); | |
| 134 fonts = font_list.GetFonts(); | |
| 135 EXPECT_EQ(1U, fonts.size()); | |
| 136 EXPECT_EQ("Arial|6|italic", FontToString(fonts[0])); | |
| 137 } | |
| 138 | |
| 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.Derive(0, Font::BOLD)); | |
| 145 input_fonts.push_back(font_1.Derive(-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])); | |
| 151 } | |
| 152 | |
| 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 " | |
| 157 " Italic 13px"); | |
| 158 | |
| 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(); | |
| 162 | |
| 163 EXPECT_EQ("serif,Sans serif,Bold Italic 13px", desc_str); | |
| 164 } | |
| 165 | |
| 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.Derive(0, Font::BOLD)); | |
| 172 input_fonts.push_back(font_1.Derive(-2, Font::BOLD)); | |
| 173 FontList font_list = FontList(input_fonts); | |
| 174 | |
| 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(); | |
| 178 | |
| 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])); | |
| 182 } | |
| 183 | |
| 184 TEST(FontListTest, FontDescString_GetStyle) { | |
| 185 FontList font_list = FontList("Arial,Sans serif, 8px"); | |
| 186 EXPECT_EQ(Font::NORMAL, font_list.GetFontStyle()); | |
| 187 | |
| 188 font_list = FontList("Arial,Sans serif,Bold 8px"); | |
| 189 EXPECT_EQ(Font::BOLD, font_list.GetFontStyle()); | |
| 190 | |
| 191 font_list = FontList("Arial,Sans serif,Italic 8px"); | |
| 192 EXPECT_EQ(Font::ITALIC, font_list.GetFontStyle()); | |
| 193 | |
| 194 font_list = FontList("Arial,Italic Bold 8px"); | |
| 195 EXPECT_EQ(Font::BOLD | Font::ITALIC, font_list.GetFontStyle()); | |
| 196 } | |
| 197 | |
| 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].Derive(0, Font::ITALIC | Font::BOLD); | |
| 205 fonts[1] = fonts[1].Derive(0, Font::ITALIC | Font::BOLD); | |
| 206 font_list = FontList(fonts); | |
| 207 EXPECT_EQ(Font::ITALIC | Font::BOLD, font_list.GetFontStyle()); | |
| 208 } | |
| 209 | |
| 210 TEST(FontListTest, FontDescString_Derive) { | |
| 211 FontList font_list = FontList("Arial,Sans serif,Bold Italic 8px"); | |
| 212 | |
| 213 FontList derived = font_list.Derive(10, Font::ITALIC | Font::UNDERLINE); | |
| 214 EXPECT_EQ("Arial,Sans serif,Italic 18px", derived.GetFontDescriptionString()); | |
| 215 EXPECT_EQ(Font::ITALIC | Font::UNDERLINE, derived.GetFontStyle()); | |
| 216 | |
| 217 // FontList has a special case for Font::UNDERLINE. See if the handling of | |
| 218 // Font::UNDERLINE in GetFonts() is okay or not. | |
| 219 derived.GetFonts(); | |
| 220 EXPECT_EQ(Font::ITALIC | Font::UNDERLINE, derived.GetFontStyle()); | |
| 221 } | |
| 222 | |
| 223 TEST(FontListTest, Fonts_Derive) { | |
| 224 std::vector<Font> fonts; | |
| 225 fonts.push_back(gfx::Font("Arial", 8)); | |
| 226 fonts.push_back(gfx::Font("Sans serif", 8)); | |
| 227 FontList font_list = FontList(fonts); | |
| 228 | |
| 229 FontList derived = font_list.Derive(5, Font::BOLD | Font::UNDERLINE); | |
| 230 const std::vector<Font>& derived_fonts = derived.GetFonts(); | |
| 231 | |
| 232 EXPECT_EQ(2U, derived_fonts.size()); | |
| 233 EXPECT_EQ("Arial|13|bold|underline", FontToString(derived_fonts[0])); | |
| 234 EXPECT_EQ("Sans serif|13|bold|underline", FontToString(derived_fonts[1])); | |
| 235 } | |
| 236 | |
| 237 TEST(FontListTest, FontDescString_DeriveWithSizeDelta) { | |
| 238 FontList font_list = FontList("Arial,Sans serif,Bold 18px"); | |
| 239 | |
| 240 FontList derived = font_list.DeriveWithSizeDelta(-8); | |
| 241 EXPECT_EQ("Arial,Sans serif,Bold 10px", | |
| 242 derived.GetFontDescriptionString()); | |
| 243 } | |
| 244 | |
| 245 TEST(FontListTest, Fonts_DeriveWithSizeDelta) { | |
| 246 std::vector<Font> fonts; | |
| 247 fonts.push_back(gfx::Font("Arial", 18).Derive(0, Font::ITALIC)); | |
| 248 fonts.push_back(gfx::Font("Sans serif", 18).Derive(0, Font::ITALIC)); | |
| 249 FontList font_list = FontList(fonts); | |
| 250 | |
| 251 FontList derived = font_list.DeriveWithSizeDelta(-5); | |
| 252 const std::vector<Font>& derived_fonts = derived.GetFonts(); | |
| 253 | |
| 254 EXPECT_EQ(2U, derived_fonts.size()); | |
| 255 EXPECT_EQ("Arial|13|italic", FontToString(derived_fonts[0])); | |
| 256 EXPECT_EQ("Sans serif|13|italic", FontToString(derived_fonts[1])); | |
| 257 } | |
| 258 | |
| 259 TEST(FontListTest, Fonts_GetHeight_GetBaseline) { | |
| 260 // If a font list has only one font, the height and baseline must be the same. | |
| 261 Font font1("Arial", 16); | |
| 262 ASSERT_EQ("arial", | |
| 263 base::StringToLowerASCII(font1.GetActualFontNameForTesting())); | |
| 264 FontList font_list1("Arial, 16px"); | |
| 265 EXPECT_EQ(font1.GetHeight(), font_list1.GetHeight()); | |
| 266 EXPECT_EQ(font1.GetBaseline(), font_list1.GetBaseline()); | |
| 267 | |
| 268 // If there are two different fonts, the font list returns the max value | |
| 269 // for ascent and descent. | |
| 270 Font font2("Symbol", 16); | |
| 271 ASSERT_EQ("symbol", | |
| 272 base::StringToLowerASCII(font2.GetActualFontNameForTesting())); | |
| 273 EXPECT_NE(font1.GetBaseline(), font2.GetBaseline()); | |
| 274 EXPECT_NE(font1.GetHeight() - font1.GetBaseline(), | |
| 275 font2.GetHeight() - font2.GetBaseline()); | |
| 276 std::vector<Font> fonts; | |
| 277 fonts.push_back(font1); | |
| 278 fonts.push_back(font2); | |
| 279 FontList font_list_mix(fonts); | |
| 280 // ascent of FontList == max(ascent of Fonts) | |
| 281 EXPECT_EQ(std::max(font1.GetHeight() - font1.GetBaseline(), | |
| 282 font2.GetHeight() - font2.GetBaseline()), | |
| 283 font_list_mix.GetHeight() - font_list_mix.GetBaseline()); | |
| 284 // descent of FontList == max(descent of Fonts) | |
| 285 EXPECT_EQ(std::max(font1.GetBaseline(), font2.GetBaseline()), | |
| 286 font_list_mix.GetBaseline()); | |
| 287 } | |
| 288 | |
| 289 TEST(FontListTest, Fonts_DeriveWithHeightUpperBound) { | |
| 290 std::vector<Font> fonts; | |
| 291 | |
| 292 fonts.push_back(gfx::Font("Arial", 18)); | |
| 293 fonts.push_back(gfx::Font("Sans serif", 18)); | |
| 294 fonts.push_back(gfx::Font("Symbol", 18)); | |
| 295 FontList font_list = FontList(fonts); | |
| 296 | |
| 297 // A smaller upper bound should derive a font list with a smaller height. | |
| 298 const int height_1 = font_list.GetHeight() - 5; | |
| 299 FontList derived_1 = font_list.DeriveWithHeightUpperBound(height_1); | |
| 300 EXPECT_LE(derived_1.GetHeight(), height_1); | |
| 301 EXPECT_LT(derived_1.GetHeight(), font_list.GetHeight()); | |
| 302 EXPECT_LT(derived_1.GetFontSize(), font_list.GetFontSize()); | |
| 303 | |
| 304 // A larger upper bound should not change the height of the font list. | |
| 305 const int height_2 = font_list.GetHeight() + 5; | |
| 306 FontList derived_2 = font_list.DeriveWithHeightUpperBound(height_2); | |
| 307 EXPECT_LE(derived_2.GetHeight(), height_2); | |
| 308 EXPECT_EQ(font_list.GetHeight(), derived_2.GetHeight()); | |
| 309 EXPECT_EQ(font_list.GetFontSize(), derived_2.GetFontSize()); | |
| 310 } | |
| 311 | |
| 312 } // namespace gfx | |
| OLD | NEW |