// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/controls/table/table_utils.h"

#include "base/strings/string_number_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/font_list.h"
#include "ui/views/controls/table/test_table_model.h"

using ui::TableColumn;
using ui::TableModel;

namespace views {

namespace {

std::string IntVectorToString(const std::vector<int>& values) {
  std::string result;
  for (size_t i = 0; i < values.size(); ++i) {
    if (i != 0)
      result += ",";
    result += base::IntToString(values[i]);
  }
  return result;
}

ui::TableColumn CreateTableColumnWithWidth(int width) {
  ui::TableColumn column;
  column.width = width;
  return column;
}

}  // namespace

// Verifies columns with a specified width is honored.
TEST(TableUtilsTest, SetWidthHonored) {
  TestTableModel model(4);
  std::vector<TableColumn> columns;
  columns.push_back(CreateTableColumnWithWidth(20));
  columns.push_back(CreateTableColumnWithWidth(30));
  gfx::FontList font_list;
  std::vector<int> result(CalculateTableColumnSizes(
      100, 0, font_list, font_list, 0, 0, columns, &model));
  EXPECT_EQ("20,30", IntVectorToString(result));

  // Same with some padding, it should be ignored.
  result = CalculateTableColumnSizes(
      100, 0, font_list, font_list, 2, 0, columns, &model);
  EXPECT_EQ("20,30", IntVectorToString(result));

  // Same with not enough space, it shouldn't matter.
  result = CalculateTableColumnSizes(
      10, 0, font_list, font_list, 2, 0, columns, &model);
  EXPECT_EQ("20,30", IntVectorToString(result));
}

// Verifies if no size is specified the last column gets all the available
// space.
TEST(TableUtilsTest, LastColumnGetsAllSpace) {
  TestTableModel model(4);
  std::vector<TableColumn> columns;
  columns.push_back(ui::TableColumn());
  columns.push_back(ui::TableColumn());
  gfx::FontList font_list;
  std::vector<int> result(CalculateTableColumnSizes(
      500, 0, font_list, font_list, 0, 0, columns, &model));
  EXPECT_NE(0, result[0]);
  EXPECT_GE(result[1],
            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
  EXPECT_EQ(500, result[0] + result[1]);
}

// Verifies a single column with a percent=1 is resized correctly.
TEST(TableUtilsTest, SingleResizableColumn) {
  TestTableModel model(4);
  std::vector<TableColumn> columns;
  columns.push_back(ui::TableColumn());
  columns.push_back(ui::TableColumn());
  columns.push_back(ui::TableColumn());
  columns[2].percent = 1.0f;
  gfx::FontList font_list;
  std::vector<int> result(CalculateTableColumnSizes(
      500, 0, font_list, font_list, 0, 0, columns, &model));
  EXPECT_EQ(result[0],
            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
  EXPECT_EQ(result[1],
            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
  EXPECT_EQ(500 - result[0] - result[1], result[2]);

  // The same with a slightly larger width passed in.
  result = CalculateTableColumnSizes(
      1000, 0, font_list, font_list, 0, 0, columns, &model);
  EXPECT_EQ(result[0],
            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
  EXPECT_EQ(result[1],
            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
  EXPECT_EQ(1000 - result[0] - result[1], result[2]);

  // Verify padding for the first column is honored.
  result = CalculateTableColumnSizes(
      1000, 10, font_list, font_list, 0, 0, columns, &model);
  EXPECT_EQ(result[0],
            WidthForContent(font_list, font_list, 0, 0, columns[0], &model)
                + 10);
  EXPECT_EQ(result[1],
            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
  EXPECT_EQ(1000 - result[0] - result[1], result[2]);

  // Just enough space to show the first two columns. Should force last column
  // to min size.
  result = CalculateTableColumnSizes(
      1000, 0, font_list, font_list, 0, 0, columns, &model);
  result = CalculateTableColumnSizes(
      result[0] + result[1], 0, font_list, font_list, 0, 0, columns, &model);
  EXPECT_EQ(result[0],
            WidthForContent(font_list, font_list, 0, 0, columns[0], &model));
  EXPECT_EQ(result[1],
            WidthForContent(font_list, font_list, 0, 0, columns[1], &model));
  EXPECT_EQ(kUnspecifiedColumnWidth, result[2]);
}

}  // namespace views
