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/platform_font_win.h" 6 7#include "base/logging.h" 8#include "base/memory/ref_counted.h" 9#include "testing/gtest/include/gtest/gtest.h" 10#include "ui/gfx/font.h" 11 12namespace gfx { 13 14namespace { 15 16// Returns a font based on |base_font| with height at most |target_height| and 17// font size maximized. Returns |base_font| if height is already equal. 18gfx::Font AdjustFontSizeForHeight(const gfx::Font& base_font, 19 int target_height) { 20 Font expected_font = base_font; 21 if (base_font.GetHeight() < target_height) { 22 // Increase size while height is <= |target_height|. 23 Font larger_font = base_font.DeriveFont(1, 0); 24 while (larger_font.GetHeight() <= target_height) { 25 expected_font = larger_font; 26 larger_font = larger_font.DeriveFont(1, 0); 27 } 28 } else if (expected_font.GetHeight() > target_height) { 29 // Decrease size until height is <= |target_height|. 30 do { 31 expected_font = expected_font.DeriveFont(-1, 0); 32 } while (expected_font.GetHeight() > target_height); 33 } 34 return expected_font; 35} 36 37} // namespace 38 39TEST(PlatformFontWinTest, DeriveFontWithHeight) { 40 const Font base_font; 41 PlatformFontWin* platform_font = 42 static_cast<PlatformFontWin*>(base_font.platform_font()); 43 44 for (int i = -10; i < 10; i++) { 45 const int target_height = base_font.GetHeight() + i; 46 Font expected_font = AdjustFontSizeForHeight(base_font, target_height); 47 ASSERT_LE(expected_font.GetHeight(), target_height); 48 49 Font derived_font = platform_font->DeriveFontWithHeight(target_height, 0); 50 EXPECT_EQ(expected_font.GetFontName(), derived_font.GetFontName()); 51 EXPECT_EQ(expected_font.GetFontSize(), derived_font.GetFontSize()); 52 EXPECT_LE(expected_font.GetHeight(), target_height); 53 EXPECT_EQ(0, derived_font.GetStyle()); 54 55 derived_font = platform_font->DeriveFontWithHeight(target_height, 56 Font::BOLD); 57 EXPECT_EQ(expected_font.GetFontName(), derived_font.GetFontName()); 58 EXPECT_EQ(expected_font.GetFontSize(), derived_font.GetFontSize()); 59 EXPECT_LE(expected_font.GetHeight(), target_height); 60 EXPECT_EQ(Font::BOLD, derived_font.GetStyle()); 61 62 // Test that deriving from the new font has the expected result. 63 Font rederived_font = derived_font.DeriveFont(1, 0); 64 expected_font = Font(derived_font.GetFontName(), 65 derived_font.GetFontSize() + 1); 66 EXPECT_EQ(expected_font.GetFontName(), rederived_font.GetFontName()); 67 EXPECT_EQ(expected_font.GetFontSize(), rederived_font.GetFontSize()); 68 EXPECT_EQ(expected_font.GetHeight(), rederived_font.GetHeight()); 69 } 70} 71 72// Callback function used by DeriveFontWithHeight_MinSize() below. 73static int GetMinFontSize() { 74 return 10; 75} 76 77TEST(PlatformFontWinTest, DeriveFontWithHeight_MinSize) { 78 PlatformFontWin::GetMinimumFontSizeCallback old_callback = 79 PlatformFontWin::get_minimum_font_size_callback; 80 PlatformFontWin::get_minimum_font_size_callback = &GetMinFontSize; 81 82 const Font base_font; 83 const Font min_font(base_font.GetFontName(), GetMinFontSize()); 84 PlatformFontWin* platform_font = 85 static_cast<PlatformFontWin*>(base_font.platform_font()); 86 87 const Font derived_font = 88 platform_font->DeriveFontWithHeight(min_font.GetHeight() - 1, 0); 89 EXPECT_EQ(min_font.GetFontSize(), derived_font.GetFontSize()); 90 EXPECT_EQ(min_font.GetHeight(), derived_font.GetHeight()); 91 92 PlatformFontWin::get_minimum_font_size_callback = old_callback; 93} 94 95TEST(PlatformFontWinTest, DeriveFontWithHeight_TooSmall) { 96 const Font base_font; 97 PlatformFontWin* platform_font = 98 static_cast<PlatformFontWin*>(base_font.platform_font()); 99 100 const Font derived_font = platform_font->DeriveFontWithHeight(1, 0); 101 EXPECT_GT(derived_font.GetHeight(), 1); 102} 103 104} // namespace gfx 105