// 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 "common/simple_buffer_allocator.h"

#include "common/platform/api/quiche_test.h"

namespace quiche {
namespace {

TEST(SimpleBufferAllocatorTest, NewDelete) {
  SimpleBufferAllocator alloc;
  char* buf = alloc.New(4);
  EXPECT_NE(nullptr, buf);
  alloc.Delete(buf);
}

TEST(SimpleBufferAllocatorTest, DeleteNull) {
  SimpleBufferAllocator alloc;
  alloc.Delete(nullptr);
}

TEST(SimpleBufferAllocatorTest, MoveBuffersConstructor) {
  SimpleBufferAllocator alloc;
  QuicheBuffer buffer1(&alloc, 16);

  EXPECT_NE(buffer1.data(), nullptr);
  EXPECT_EQ(buffer1.size(), 16u);

  QuicheBuffer buffer2(std::move(buffer1));
  EXPECT_EQ(buffer1.data(), nullptr);  // NOLINT(bugprone-use-after-move)
  EXPECT_EQ(buffer1.size(), 0u);
  EXPECT_NE(buffer2.data(), nullptr);
  EXPECT_EQ(buffer2.size(), 16u);
}

TEST(SimpleBufferAllocatorTest, MoveBuffersAssignment) {
  SimpleBufferAllocator alloc;
  QuicheBuffer buffer1(&alloc, 16);
  QuicheBuffer buffer2;

  EXPECT_NE(buffer1.data(), nullptr);
  EXPECT_EQ(buffer1.size(), 16u);
  EXPECT_EQ(buffer2.data(), nullptr);
  EXPECT_EQ(buffer2.size(), 0u);

  buffer2 = std::move(buffer1);
  EXPECT_EQ(buffer1.data(), nullptr);  // NOLINT(bugprone-use-after-move)
  EXPECT_EQ(buffer1.size(), 0u);
  EXPECT_NE(buffer2.data(), nullptr);
  EXPECT_EQ(buffer2.size(), 16u);
}

TEST(SimpleBufferAllocatorTest, CopyBuffer) {
  SimpleBufferAllocator alloc;
  const absl::string_view original = "Test string";
  QuicheBuffer copy = QuicheBuffer::Copy(&alloc, original);
  EXPECT_EQ(copy.AsStringView(), original);
}

}  // namespace
}  // namespace quiche
