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 12 using ui::TableColumn; 13 using ui::TableModel; 14 15 namespace views { 16 17 namespace { 18 19 std::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 29 ui::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. 38 TEST(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. 61 TEST(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. 76 TEST(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