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