/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 * All rights reserved.
 *
 * This source code is licensed under both the BSD-style license (found in the
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
 * in the COPYING file in the root directory of this source tree).
 */
#include "utils/Buffer.h"
#include "utils/Range.h"

#include <gtest/gtest.h>
#include <memory>

using namespace pzstd;

namespace {
void deleter(const unsigned char* buf) {
  delete[] buf;
}
}

TEST(Buffer, Constructors) {
  Buffer empty;
  EXPECT_TRUE(empty.empty());
  EXPECT_EQ(0, empty.size());

  Buffer sized(5);
  EXPECT_FALSE(sized.empty());
  EXPECT_EQ(5, sized.size());

  Buffer moved(std::move(sized));
  EXPECT_FALSE(sized.empty());
  EXPECT_EQ(5, sized.size());

  Buffer assigned;
  assigned = std::move(moved);
  EXPECT_FALSE(sized.empty());
  EXPECT_EQ(5, sized.size());
}

TEST(Buffer, BufferManagement) {
  std::shared_ptr<unsigned char> buf(new unsigned char[10], deleter);
  {
    Buffer acquired(buf, MutableByteRange(buf.get(), buf.get() + 10));
    EXPECT_EQ(2, buf.use_count());
    Buffer moved(std::move(acquired));
    EXPECT_EQ(2, buf.use_count());
    Buffer assigned;
    assigned = std::move(moved);
    EXPECT_EQ(2, buf.use_count());

    Buffer split = assigned.splitAt(5);
    EXPECT_EQ(3, buf.use_count());

    split.advance(1);
    assigned.subtract(1);
    EXPECT_EQ(3, buf.use_count());
  }
  EXPECT_EQ(1, buf.use_count());
}

TEST(Buffer, Modifiers) {
  Buffer buf(10);
  {
    unsigned char i = 0;
    for (auto& byte : buf.range()) {
      byte = i++;
    }
  }

  auto prefix = buf.splitAt(2);

  ASSERT_EQ(2, prefix.size());
  EXPECT_EQ(0, *prefix.data());

  ASSERT_EQ(8, buf.size());
  EXPECT_EQ(2, *buf.data());

  buf.advance(2);
  EXPECT_EQ(4, *buf.data());

  EXPECT_EQ(9, *(buf.range().end() - 1));

  buf.subtract(2);
  EXPECT_EQ(7, *(buf.range().end() - 1));

  EXPECT_EQ(4, buf.size());
}
