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.h" | |
6 | |
7 #include "base/strings/string16.h" | |
8 #include "base/strings/string_util.h" | |
9 #include "base/strings/utf_string_conversions.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 #if defined(OS_LINUX) && !defined(USE_OZONE) | |
13 #include <pango/pango.h> | |
14 #elif defined(OS_WIN) | |
15 #include "ui/gfx/platform_font_win.h" | |
16 #endif | |
17 | |
18 namespace gfx { | |
19 namespace { | |
20 | |
21 class FontTest : public testing::Test { | |
22 public: | |
23 // Fulfills the memory management contract as outlined by the comment at | |
24 // gfx::Font::GetNativeFont(). | |
25 void FreeIfNecessary(NativeFont font) { | |
26 #if defined(OS_LINUX) && !defined(USE_OZONE) | |
27 pango_font_description_free(font); | |
28 #endif | |
29 } | |
30 }; | |
31 | |
32 #if defined(OS_WIN) | |
33 class ScopedMinimumFontSizeCallback { | |
34 public: | |
35 explicit ScopedMinimumFontSizeCallback(int minimum_size) { | |
36 minimum_size_ = minimum_size; | |
37 old_callback_ = PlatformFontWin::get_minimum_font_size_callback; | |
38 PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize; | |
39 } | |
40 | |
41 ~ScopedMinimumFontSizeCallback() { | |
42 PlatformFontWin::get_minimum_font_size_callback = old_callback_; | |
43 } | |
44 | |
45 private: | |
46 static int GetMinimumFontSize() { | |
47 return minimum_size_; | |
48 } | |
49 | |
50 PlatformFontWin::GetMinimumFontSizeCallback old_callback_; | |
51 static int minimum_size_; | |
52 | |
53 DISALLOW_COPY_AND_ASSIGN(ScopedMinimumFontSizeCallback); | |
54 }; | |
55 | |
56 int ScopedMinimumFontSizeCallback::minimum_size_ = 0; | |
57 #endif // defined(OS_WIN) | |
58 | |
59 | |
60 TEST_F(FontTest, LoadArial) { | |
61 Font cf("Arial", 16); | |
62 NativeFont native = cf.GetNativeFont(); | |
63 EXPECT_TRUE(native); | |
64 EXPECT_EQ(cf.GetStyle(), Font::NORMAL); | |
65 EXPECT_EQ(cf.GetFontSize(), 16); | |
66 EXPECT_EQ(cf.GetFontName(), "Arial"); | |
67 EXPECT_EQ("arial", | |
68 base::StringToLowerASCII(cf.GetActualFontNameForTesting())); | |
69 FreeIfNecessary(native); | |
70 } | |
71 | |
72 TEST_F(FontTest, LoadArialBold) { | |
73 Font cf("Arial", 16); | |
74 Font bold(cf.Derive(0, Font::BOLD)); | |
75 NativeFont native = bold.GetNativeFont(); | |
76 EXPECT_TRUE(native); | |
77 EXPECT_EQ(bold.GetStyle(), Font::BOLD); | |
78 EXPECT_EQ("arial", | |
79 base::StringToLowerASCII(cf.GetActualFontNameForTesting())); | |
80 FreeIfNecessary(native); | |
81 } | |
82 | |
83 TEST_F(FontTest, Ascent) { | |
84 Font cf("Arial", 16); | |
85 EXPECT_GT(cf.GetBaseline(), 2); | |
86 EXPECT_LE(cf.GetBaseline(), 22); | |
87 } | |
88 | |
89 TEST_F(FontTest, Height) { | |
90 Font cf("Arial", 16); | |
91 EXPECT_GE(cf.GetHeight(), 16); | |
92 // TODO(akalin): Figure out why height is so large on Linux. | |
93 EXPECT_LE(cf.GetHeight(), 26); | |
94 } | |
95 | |
96 TEST_F(FontTest, CapHeight) { | |
97 Font cf("Arial", 16); | |
98 EXPECT_GT(cf.GetCapHeight(), 0); | |
99 EXPECT_GT(cf.GetCapHeight(), cf.GetHeight() / 2); | |
100 EXPECT_LT(cf.GetCapHeight(), cf.GetBaseline()); | |
101 } | |
102 | |
103 TEST_F(FontTest, AvgWidths) { | |
104 Font cf("Arial", 16); | |
105 EXPECT_EQ(cf.GetExpectedTextWidth(0), 0); | |
106 EXPECT_GT(cf.GetExpectedTextWidth(1), cf.GetExpectedTextWidth(0)); | |
107 EXPECT_GT(cf.GetExpectedTextWidth(2), cf.GetExpectedTextWidth(1)); | |
108 EXPECT_GT(cf.GetExpectedTextWidth(3), cf.GetExpectedTextWidth(2)); | |
109 } | |
110 | |
111 #if !defined(OS_WIN) | |
112 // On Windows, Font::GetActualFontNameForTesting() doesn't work well for now. | |
113 // http://crbug.com/327287 | |
114 // | |
115 // Check that fonts used for testing are installed and enabled. On Mac | |
116 // fonts may be installed but still need enabling in Font Book.app. | |
117 // http://crbug.com/347429 | |
118 TEST_F(FontTest, GetActualFontNameForTesting) { | |
119 Font arial("Arial", 16); | |
120 EXPECT_EQ("arial", | |
121 base::StringToLowerASCII(arial.GetActualFontNameForTesting())) | |
122 << "********\n" | |
123 << "Your test environment seems to be missing Arial font, which is " | |
124 << "needed for unittests. Check if Arial font is installed.\n" | |
125 << "********"; | |
126 Font symbol("Symbol", 16); | |
127 EXPECT_EQ("symbol", | |
128 base::StringToLowerASCII(symbol.GetActualFontNameForTesting())) | |
129 << "********\n" | |
130 << "Your test environment seems to be missing Symbol font, which is " | |
131 << "needed for unittests. Check if Symbol font is installed.\n" | |
132 << "********"; | |
133 | |
134 const char* const invalid_font_name = "no_such_font_name"; | |
135 Font fallback_font(invalid_font_name, 16); | |
136 EXPECT_NE(invalid_font_name, | |
137 base::StringToLowerASCII( | |
138 fallback_font.GetActualFontNameForTesting())); | |
139 } | |
140 #endif | |
141 | |
142 #if defined(OS_WIN) | |
143 TEST_F(FontTest, DeriveResizesIfSizeTooSmall) { | |
144 Font cf("Arial", 8); | |
145 // The minimum font size is set to 5 in browser_main.cc. | |
146 ScopedMinimumFontSizeCallback minimum_size(5); | |
147 | |
148 Font derived_font = cf.Derive(-4, cf.GetStyle()); | |
149 EXPECT_EQ(5, derived_font.GetFontSize()); | |
150 } | |
151 | |
152 TEST_F(FontTest, DeriveKeepsOriginalSizeIfHeightOk) { | |
153 Font cf("Arial", 8); | |
154 // The minimum font size is set to 5 in browser_main.cc. | |
155 ScopedMinimumFontSizeCallback minimum_size(5); | |
156 | |
157 Font derived_font = cf.Derive(-2, cf.GetStyle()); | |
158 EXPECT_EQ(6, derived_font.GetFontSize()); | |
159 } | |
160 #endif // defined(OS_WIN) | |
161 | |
162 } // namespace | |
163 } // namespace gfx | |
OLD | NEW |