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