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/views/controls/table/table_utils.h"
6
7#include "base/strings/string_number_conversions.h"
8#include "testing/gtest/include/gtest/gtest.h"
9#include "ui/gfx/font_list.h"
10#include "ui/views/controls/table/test_table_model.h"
11
12using ui::TableColumn;
13using ui::TableModel;
14
15namespace views {
16
17namespace {
18
19std::string IntVectorToString(const std::vector<int>& values) {
20  std::string result;
21  for (size_t i = 0; i < values.size(); ++i) {
22    if (i != 0)
23      result += ",";
24    result += base::IntToString(values[i]);
25  }
26  return result;
27}
28
29ui::TableColumn CreateTableColumnWithWidth(int width) {
30  ui::TableColumn column;
31  column.width = width;
32  return column;
33}
34
35}  // namespace
36
37// Verifies columns with a specified width is honored.
38TEST(TableUtilsTest, SetWidthHonored) {
39  TestTableModel model(4);
40  std::vector<TableColumn> columns;
41  columns.push_back(CreateTableColumnWithWidth(20));
42  columns.push_back(CreateTableColumnWithWidth(30));
43  gfx::FontList font_list;
44  std::vector<int> result(CalculateTableColumnSizes(
45      100, 0, font_list, font_list, 0, 0, columns, &model));
46  EXPECT_EQ("20,30", IntVectorToString(result));
47
48  // Same with some padding, it should be ignored.
49  result = CalculateTableColumnSizes(
50      100, 0, font_list, font_list, 2, 0, columns, &model);
51  EXPECT_EQ("20,30", IntVectorToString(result));
52
53  // Same with not enough space, it shouldn't matter.
54  result = CalculateTableColumnSizes(
55      10, 0, font_list, font_list, 2, 0, columns, &model);
56  EXPECT_EQ("20,30", IntVectorToString(result));
57}
58
59// Verifies if no size is specified the last column gets all the available
60// space.
61TEST(TableUtilsTest, LastColumnGetsAllSpace) {
62  TestTableModel model(4);
63  std::vector<TableColumn> columns;
64  columns.push_back(ui::TableColumn());
65  columns.push_back(ui::TableColumn());
66  gfx::FontList font_list;
67  std::vector<int> result(CalculateTableColumnSizes(
68      500, 0, font_list, font_list, 0, 0, columns, &model));
69  EXPECT_NE(0, result[0]);
70  EXPECT_GE(result[1],
71            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
72  EXPECT_EQ(500, result[0] + result[1]);
73}
74
75// Verifies a single column with a percent=1 is resized correctly.
76TEST(TableUtilsTest, SingleResizableColumn) {
77  TestTableModel model(4);
78  std::vector<TableColumn> columns;
79  columns.push_back(ui::TableColumn());
80  columns.push_back(ui::TableColumn());
81  columns.push_back(ui::TableColumn());
82  columns[2].percent = 1.0f;
83  gfx::FontList font_list;
84  std::vector<int> result(CalculateTableColumnSizes(
85      500, 0, font_list, font_list, 0, 0, columns, &model));
86  EXPECT_EQ(result[0],
87            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
88  EXPECT_EQ(result[1],
89            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
90  EXPECT_EQ(500 - result[0] - result[1], result[2]);
91
92  // The same with a slightly larger width passed in.
93  result = CalculateTableColumnSizes(
94      1000, 0, font_list, font_list, 0, 0, columns, &model);
95  EXPECT_EQ(result[0],
96            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
97  EXPECT_EQ(result[1],
98            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
99  EXPECT_EQ(1000 - result[0] - result[1], result[2]);
100
101  // Verify padding for the first column is honored.
102  result = CalculateTableColumnSizes(
103      1000, 10, font_list, font_list, 0, 0, columns, &model);
104  EXPECT_EQ(result[0],
105            WidthForContent(font_list, font_list, 0, 0, columns[0], &model)
106                + 10);
107  EXPECT_EQ(result[1],
108            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
109  EXPECT_EQ(1000 - result[0] - result[1], result[2]);
110
111  // Just enough space to show the first two columns. Should force last column
112  // to min size.
113  result = CalculateTableColumnSizes(
114      1000, 0, font_list, font_list, 0, 0, columns, &model);
115  result = CalculateTableColumnSizes(
116      result[0] + result[1], 0, font_list, font_list, 0, 0, columns, &model);
117  EXPECT_EQ(result[0],
118            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
119  EXPECT_EQ(result[1],
120            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
121  EXPECT_EQ(kUnspecifiedColumnWidth, result[2]);
122}
123
124}  // namespace views
125