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