tooltip_aura_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1// Copyright 2013 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/views/corewm/tooltip_aura.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "ui/aura/test/aura_test_base.h"
9#include "ui/base/resource/resource_bundle.h"
10#include "ui/gfx/font_list.h"
11#include "ui/gfx/text_elider.h"
12#include "ui/gfx/text_utils.h"
13
14using base::ASCIIToUTF16;
15using base::UTF8ToUTF16;
16
17namespace views {
18namespace corewm {
19
20typedef aura::test::AuraTestBase TooltipAuraTest;
21
22TEST_F(TooltipAuraTest, TrimTooltipToFitTests) {
23  const gfx::FontList font_list;
24  const int max_width = 4000;
25  base::string16 tooltip;
26  int width, line_count, expect_lines;
27  int max_pixel_width = 400;  // copied from constants in tooltip_controller.cc
28  int max_lines = 10;  // copied from constants in tooltip_controller.cc
29  size_t tooltip_len;
30
31  // Error in computed size vs. expected size should not be greater than the
32  // size of the longest word.
33  int error_in_pixel_width = gfx::GetStringWidth(ASCIIToUTF16("tooltip"),
34                                                 font_list);
35
36  // Long tooltips should wrap to next line
37  tooltip.clear();
38  width = line_count = -1;
39  expect_lines = 3;
40  for (; gfx::GetStringWidth(tooltip, font_list) <=
41           (expect_lines - 1) * max_pixel_width;)
42    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
43  tooltip_len = tooltip.length();
44  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
45                                &line_count);
46  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
47  EXPECT_EQ(expect_lines, line_count);
48  EXPECT_EQ(tooltip_len + expect_lines - 1, tooltip.length());
49
50  // More than |max_lines| lines should get truncated at 10 lines.
51  tooltip.clear();
52  width = line_count = -1;
53  expect_lines = 13;
54  for (; gfx::GetStringWidth(tooltip, font_list) <=
55           (expect_lines - 1) * max_pixel_width;)
56    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
57  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
58                                &line_count);
59  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
60  EXPECT_EQ(max_lines, line_count);
61
62  // Long multi line tooltips should wrap individual lines.
63  tooltip.clear();
64  width = line_count = -1;
65  expect_lines = 4;
66  for (; gfx::GetStringWidth(tooltip, font_list) <=
67           (expect_lines - 2) * max_pixel_width;)
68    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
69  tooltip.insert(tooltip.length() / 2, ASCIIToUTF16("\n"));
70  tooltip_len = tooltip.length();
71  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
72                                &line_count);
73  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
74  EXPECT_EQ(expect_lines, line_count);
75  // We may have inserted the line break above near a space which will get
76  // trimmed. Hence we may be off by 1 in the final tooltip length calculation.
77  EXPECT_NEAR(tooltip_len + expect_lines - 2, tooltip.length(), 1);
78
79#if !defined(OS_WIN)
80  // Tooltip with really long word gets elided.
81  tooltip.clear();
82  width = line_count = -1;
83  tooltip = UTF8ToUTF16(std::string('a', max_pixel_width));
84  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
85                                &line_count);
86  EXPECT_NEAR(max_pixel_width, width, 5);
87  EXPECT_EQ(1, line_count);
88  EXPECT_EQ(gfx::ElideText(UTF8ToUTF16(std::string('a', max_pixel_width)),
89                           font_list, max_pixel_width, gfx::ELIDE_TAIL),
90            tooltip);
91#endif
92
93  // Normal small tooltip should stay as is.
94  tooltip.clear();
95  width = line_count = -1;
96  tooltip = ASCIIToUTF16("Small Tooltip");
97  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
98                                &line_count);
99  EXPECT_EQ(gfx::GetStringWidth(ASCIIToUTF16("Small Tooltip"), font_list),
100            width);
101  EXPECT_EQ(1, line_count);
102  EXPECT_EQ(ASCIIToUTF16("Small Tooltip"), tooltip);
103
104  // Normal small multi-line tooltip should stay as is.
105  tooltip.clear();
106  width = line_count = -1;
107  tooltip = ASCIIToUTF16("Multi line\nTooltip");
108  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
109                                &line_count);
110  int expected_width = gfx::GetStringWidth(ASCIIToUTF16("Multi line"),
111                                           font_list);
112  expected_width = std::max(expected_width,
113                            gfx::GetStringWidth(ASCIIToUTF16("Tooltip"),
114                                                font_list));
115  EXPECT_EQ(expected_width, width);
116  EXPECT_EQ(2, line_count);
117  EXPECT_EQ(ASCIIToUTF16("Multi line\nTooltip"), tooltip);
118
119  // Whitespaces in tooltips are preserved.
120  tooltip.clear();
121  width = line_count = -1;
122  tooltip = ASCIIToUTF16("Small  Tool  t\tip");
123  TooltipAura::TrimTooltipToFit(font_list, max_width, &tooltip, &width,
124                                &line_count);
125  EXPECT_EQ(gfx::GetStringWidth(ASCIIToUTF16("Small  Tool  t\tip"), font_list),
126            width);
127  EXPECT_EQ(1, line_count);
128  EXPECT_EQ(ASCIIToUTF16("Small  Tool  t\tip"), tooltip);
129}
130
131}  // namespace corewm
132}  // namespace views
133