// Copyright 2022 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 <lib/trivial-allocator/basic-owning-allocator.h>

#include <cstdint>
#include <memory>
#include <new>

#include <gtest/gtest.h>

namespace {

std::unique_ptr<std::byte[]> StdAllocator(size_t& size, size_t alignment) {
  return std::unique_ptr<std::byte[]>(new std::byte[size]);
}

TEST(TrivialAllocatorTests, BasicOwningAllocator) {
  auto allocator = trivial_allocator::BasicOwningAllocator(StdAllocator);

  std::array<int*, 100> held_allocations;
  std::array<int*, 100> aligned_allocations;
  std::array<int*, 100> released_allocations;

  for (int*& iptr : held_allocations) {
    void* ptr = allocator.allocate(sizeof(int), alignof(int));
    EXPECT_TRUE(ptr);
    iptr = reinterpret_cast<int*>(ptr);
    *iptr = 17;
  }

  constexpr size_t kBigAlignment = 128;
  for (int*& iptr : aligned_allocations) {
    void* ptr = allocator.allocate(sizeof(int), kBigAlignment);
    EXPECT_TRUE(ptr);
    EXPECT_EQ(reinterpret_cast<uintptr_t>(ptr) & (kBigAlignment - 1), 0u);
    iptr = reinterpret_cast<int*>(ptr);
    *iptr = 42;
  }

  for (int*& iptr : released_allocations) {
    void* ptr = allocator.allocate(sizeof(int), alignof(int));
    EXPECT_TRUE(ptr);
    iptr = reinterpret_cast<int*>(ptr);
    *iptr = 23;
    allocator.deallocate(ptr);
  }

  for (volatile int* vptr : held_allocations) {
    EXPECT_EQ(17, *vptr);
  }

  for (volatile int* vptr : aligned_allocations) {
    EXPECT_EQ(42, *vptr);
  }

  for (volatile int* vptr : released_allocations) {
    EXPECT_EQ(23, *vptr);
  }

  // There should be no leaks found by sanitizers since the allocator owns all.
}

}  // namespace
