// 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/connectivity/overnet/lib/vocabulary/slice.h"
#include "gtest/gtest.h"

namespace overnet {

TEST(Slice, Empty) {
  Slice slice;
  EXPECT_EQ(slice.begin(), slice.end());
  EXPECT_EQ(0u, slice.length());
}

TEST(Slice, Static) {
  auto slice = Slice::FromStaticString("Hello World!");
  EXPECT_EQ("Hello World!", slice.AsStdString());
  auto slice2 = slice;
  EXPECT_EQ("Hello World!", slice.AsStdString());
  EXPECT_EQ("Hello World!", slice2.AsStdString());
  slice2 = Slice::FromStaticString("Goodbye");
  EXPECT_EQ("Goodbye", slice2.AsStdString());
  slice = slice2;
  EXPECT_EQ("Goodbye", slice2.AsStdString());
  EXPECT_EQ("Goodbye", slice.AsStdString());
  slice.TrimBegin(4);
  EXPECT_EQ("bye", slice.AsStdString());
  slice2.TrimEnd(3);
  EXPECT_EQ("Good", slice2.AsStdString());
}

TEST(Slice, ShortCopied) {
  uint8_t data[] = {1, 2, 3};
  auto slice = Slice::FromCopiedBuffer(data, sizeof(data));
  EXPECT_EQ(slice.length(), 3u);
  EXPECT_EQ(slice.begin()[0], 1);
  EXPECT_EQ(slice.begin()[1], 2);
  EXPECT_EQ(slice.begin()[2], 3);
  auto slice2 = slice;
  EXPECT_EQ(slice2.length(), 3u);
}

TEST(Slice, BigCopied) {
  static const size_t kLength = 1024 * 1024;
  auto data = std::unique_ptr<uint8_t[]>(new uint8_t[kLength]);
  for (size_t i = 0; i < kLength; i++) {
    data[i] = i & 0xff;
  }
  auto slice = Slice::FromCopiedBuffer(data.get(), kLength);
  EXPECT_EQ(kLength, slice.length());
  for (size_t i = 0; i < kLength; i++) {
    EXPECT_EQ(i & 0xff, slice.begin()[i]);
  }
  auto slice2 = slice;
  EXPECT_EQ(kLength, slice2.length());
  EXPECT_EQ(kLength, slice.length());
  auto slice3 = std::move(slice);
  EXPECT_NE(kLength, slice.length());
  EXPECT_EQ(kLength, slice2.length());
  EXPECT_EQ(kLength, slice3.length());
}

TEST(Slice, Join) {
  auto a = Slice::FromStaticString("ABC");
  uint8_t data[] = {1, 2, 3};
  auto b = Slice::FromCopiedBuffer(data, sizeof(data));
  static const size_t kLength = 1024 * 1024;
  auto data2 = std::unique_ptr<uint8_t[]>(new uint8_t[kLength]);
  for (size_t i = 0; i < kLength; i++) {
    data2[i] = i & 0xff;
  }
  auto c = Slice::FromCopiedBuffer(data2.get(), kLength);

  auto joined = Slice::Join({a, b, c});
  EXPECT_EQ(joined.length(), kLength + 6);
  EXPECT_EQ(joined.begin()[0], 'A');
  EXPECT_EQ(joined.begin()[1], 'B');
  EXPECT_EQ(joined.begin()[2], 'C');
  EXPECT_EQ(joined.begin()[3], 1);
  EXPECT_EQ(joined.begin()[4], 2);
  EXPECT_EQ(joined.begin()[5], 3);
  EXPECT_EQ(joined.begin()[6], 0);
}

TEST(Slice, Static_WithPrefix) {
  auto slice = Slice::FromStaticString("ABC");
  auto slice2 =
      slice.WithPrefix(3, [](uint8_t* bytes) { memcpy(bytes, "123", 3); });
  EXPECT_EQ(slice.AsStdString(), "ABC");
  EXPECT_EQ(slice2.AsStdString(), "123ABC");
}

TEST(Slice, Short_WithPrefix) {
  uint8_t data[] = {1, 2, 3};
  auto slice = Slice::FromCopiedBuffer(data, sizeof(data));
  auto slice2 = slice.WithPrefix(3, [](uint8_t* bytes) {
    bytes[0] = 7;
    bytes[1] = 8;
    bytes[2] = 9;
  });
  EXPECT_EQ(slice.length(), 3u);
  EXPECT_EQ(slice.begin()[0], 1);
  EXPECT_EQ(slice.begin()[1], 2);
  EXPECT_EQ(slice.begin()[2], 3);
  EXPECT_EQ(slice2.length(), 6u);
  EXPECT_EQ(slice2.begin()[0], 7);
  EXPECT_EQ(slice2.begin()[1], 8);
  EXPECT_EQ(slice2.begin()[2], 9);
  EXPECT_EQ(slice2.begin()[3], 1);
  EXPECT_EQ(slice2.begin()[4], 2);
  EXPECT_EQ(slice2.begin()[5], 3);
}

TEST(Slice, Big_WithPrefix) {
  static const size_t kLength = 1024 * 1024;
  auto data = std::unique_ptr<uint8_t[]>(new uint8_t[kLength]);
  for (size_t i = 0; i < kLength; i++) {
    data[i] = i & 0xff;
  }
  auto slice = Slice::FromCopiedBuffer(data.get(), kLength);
  auto slice2 = slice.WithPrefix(3, [](uint8_t* bytes) {
    bytes[0] = 7;
    bytes[1] = 8;
    bytes[2] = 9;
  });
  EXPECT_EQ(kLength, slice.length());
  EXPECT_EQ(kLength + 3, slice2.length());
  EXPECT_EQ(7, slice2.begin()[0]);
  EXPECT_EQ(8, slice2.begin()[1]);
  EXPECT_EQ(9, slice2.begin()[2]);
  for (size_t i = 0; i < kLength; i++) {
    EXPECT_EQ(i & 0xff, slice.begin()[i]);
    EXPECT_EQ(i & 0xff, slice2.begin()[i + 3]);
  }
}

TEST(Slice, Ostream) {
  std::ostringstream out;
  out << Slice::FromStaticString("ABC") << 100;
  EXPECT_EQ(out.str(), "[41 42 43 \"ABC\"]100");
}

}  // namespace overnet
