font_unittest.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pango/pango.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/platform_font_win.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FontTest : public testing::Test {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fulfills the memory management contract as outlined by the comment at
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gfx::Font::GetNativeFont().
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FreeIfNecessary(NativeFont font) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pango_font_description_free(font);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedMinimumFontSizeCallback {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedMinimumFontSizeCallback(int minimum_size) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    minimum_size_ = minimum_size;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_callback_ = PlatformFontWin::get_minimum_font_size_callback;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedMinimumFontSizeCallback() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformFontWin::get_minimum_font_size_callback = old_callback_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetMinimumFontSize() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return minimum_size_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlatformFontWin::GetMinimumFontSizeCallback old_callback_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int minimum_size_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedMinimumFontSizeCallback);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ScopedMinimumFontSizeCallback::minimum_size_ = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, LoadArial) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeFont native = cf.GetNativeFont();
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(native);
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetStyle(), Font::NORMAL);
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetFontSize(), 16);
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetFontName(), "Arial");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FreeIfNecessary(native);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, LoadArialBold) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font bold(cf.DeriveFont(0, Font::BOLD));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NativeFont native = bold.GetNativeFont();
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(native);
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(bold.GetStyle(), Font::BOLD);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FreeIfNecessary(native);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, Ascent) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetBaseline(), 2);
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_LE(cf.GetBaseline(), 22);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, Height) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GE(cf.GetHeight(), 16);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): Figure out why height is so large on Linux.
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_LE(cf.GetHeight(), 26);
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(FontTest, CapHeight) {
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Font cf("Arial", 16);
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetCapHeight(), 0);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetCapHeight(), cf.GetHeight() / 2);
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_LINUX)
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetCapHeight(), cf.GetHeight());
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_LT(cf.GetCapHeight(), cf.GetHeight());
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, AvgWidths) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetExpectedTextWidth(0), 0);
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetExpectedTextWidth(1), cf.GetExpectedTextWidth(0));
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetExpectedTextWidth(2), cf.GetExpectedTextWidth(1));
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetExpectedTextWidth(3), cf.GetExpectedTextWidth(2));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, AvgCharWidth) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetAverageCharacterWidth(), 0);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, Widths) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 16);
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cf.GetStringWidth(base::string16()), 0);
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetStringWidth(ASCIIToUTF16("a")),
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            cf.GetStringWidth(base::string16()));
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetStringWidth(ASCIIToUTF16("ab")),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cf.GetStringWidth(ASCIIToUTF16("a")));
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_GT(cf.GetStringWidth(ASCIIToUTF16("abc")),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cf.GetStringWidth(ASCIIToUTF16("ab")));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, DeriveFontResizesIfSizeTooSmall) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 8);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The minimum font size is set to 5 in browser_main.cc.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedMinimumFontSizeCallback minimum_size(5);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font derived_font = cf.DeriveFont(-4);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, derived_font.GetFontSize());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FontTest, DeriveFontKeepsOriginalSizeIfHeightOk) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font cf("Arial", 8);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The minimum font size is set to 5 in browser_main.cc.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedMinimumFontSizeCallback minimum_size(5);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Font derived_font = cf.DeriveFont(-2);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6, derived_font.GetFontSize());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
148