// 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 <gtest/gtest.h>

#include "garnet/bin/zxdb/console/string_formatters.h"

namespace zxdb {

std::vector<uint8_t> CreateData(size_t length) {
  std::vector<uint8_t> data;
  data.reserve(length);
  // So that we get the number backwards (0x0102...).
  uint8_t base = length;
  for (size_t i = 0; i < length; i++) {
    data.emplace_back(base - i);
  }
  return data;
}

TEST(GetLittleEndianHexOutput, Lenghts) {
  Err err;
  std::string out;
  std::vector<uint8_t> data;

  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_TRUE(err.has_error());
  EXPECT_EQ(err.msg(), "Invalid size for hex printing: 0");

  data = CreateData(1);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000001");

  data = CreateData(2);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000102");

  data = CreateData(3);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00010203");

  data = CreateData(4);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "01020304");

  data = CreateData(5);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000001 02030405");

  data = CreateData(6);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000102 03040506");

  data = CreateData(8);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "01020304 05060708");

  data = CreateData(10);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000102 03040506 0708090a");

  data = CreateData(12);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "01020304 05060708 090a0b0c");

  data = CreateData(17);
  err = GetLittleEndianHexOutput(data, &out);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "00000001 02030405 06070809 0a0b0c0d 0e0f1011");
}

TEST(GetLittleEndianHexOutput, LimitOutput) {
  Err err;
  std::string out;
  std::vector<uint8_t> data = CreateData(17);

  err = GetLittleEndianHexOutput(data, &out, 4);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "0e0f1011");

  err = GetLittleEndianHexOutput(data, &out, 6);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "0a0b0c0d 0e0f1011");

  err = GetLittleEndianHexOutput(data, &out, 8);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "0a0b0c0d 0e0f1011");

  err = GetLittleEndianHexOutput(data, &out, 12);
  EXPECT_FALSE(err.has_error()) << err.msg();
  EXPECT_EQ(out, "06070809 0a0b0c0d 0e0f1011");
}

}  // namespace zxdb
