// Copyright 2018 The Fuchsia 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 "src/developer/debug/zxdb/console/format_table.h"

#include <gtest/gtest.h>

namespace zxdb {

TEST(FormatTable, Basic) {
  // Test with no data.
  OutputBuffer out;
  std::vector<std::vector<std::string>> rows;
  FormatTable({ColSpec(), ColSpec()}, rows, &out);
  EXPECT_EQ("", out.AsString());

  // Heading only.
  out = OutputBuffer();
  FormatTable({ColSpec(Align::kLeft, 0, "One"), ColSpec(Align::kLeft, 0, "Two")}, rows, &out);
  EXPECT_EQ("One Two\n", out.AsString());

  // Two rows for all tests below.
  rows.push_back(std::vector<std::string>{"0", "Hello, world"});
  rows.push_back(std::vector<std::string>{"12345", "Hello"});

  // Left align.
  out = OutputBuffer();
  FormatTable({ColSpec(), ColSpec()}, rows, &out);
  EXPECT_EQ("0     Hello, world\n12345 Hello\n", out.AsString());

  // Right align with padding.
  out = OutputBuffer();
  FormatTable({ColSpec(Align::kRight), ColSpec(Align::kRight, 0, std::string(), 2)}, rows, &out);
  EXPECT_EQ("    0   Hello, world\n12345          Hello\n", out.AsString());

  // Max width + heading.
  out = OutputBuffer();
  FormatTable({ColSpec(Align::kRight, 3, "One"), ColSpec(Align::kLeft, 3, "Two")}, rows, &out);
  EXPECT_EQ("One Two\n  0 Hello, world\n12345 Hello\n", out.AsString());

  // Overflowing cells shouldn't force the whole column to max width.
  out = OutputBuffer();
  FormatTable({ColSpec(Align::kRight, 1), ColSpec(Align::kLeft, 0)}, rows, &out);
  EXPECT_EQ("0 Hello, world\n12345 Hello\n", out.AsString());

  // The last item in a row expands to fill all remaining columns. Make the
  // last row have only one really long string.
  out = OutputBuffer();
  rows[1].resize(1);
  rows[1][0] = "This is a really long contents.";
  FormatTable({ColSpec(Align::kLeft, 1), ColSpec(Align::kLeft, 0)}, rows, &out);
  EXPECT_EQ("0 Hello, world\nThis is a really long contents.\n", out.AsString());
}

}  // namespace zxdb
