// Copyright 2015 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 "courgette/memory_allocator.h"

#include <stddef.h>

#include <algorithm>

#include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h"

TEST(MemoryAllocatorTest, NoThrowBuffer) {
  const size_t size_list[] = {0U, 1U, 2U, 11U, 15U, 16U};

  // Repeat test for different sizes.
  for (size_t idx = 0; idx < arraysize(size_list); ++idx) {
    size_t size = size_list[idx];

    courgette::NoThrowBuffer<size_t> buf1;
    EXPECT_EQ(0U, buf1.size());
    EXPECT_TRUE(buf1.empty());

    // Ensure reserve() should not affect size.
    EXPECT_TRUE(buf1.reserve(size / 2));
    EXPECT_EQ(0U, buf1.size());
    EXPECT_TRUE(buf1.empty());

    // Populate with integers from |size| - 1 to 0.
    for (size_t i = 0; i < size; ++i) {
      size_t new_value = size - 1 - i;
      EXPECT_TRUE(buf1.push_back(new_value));
      EXPECT_EQ(new_value, buf1.back());
      EXPECT_EQ(i + 1, buf1.size());
      EXPECT_FALSE(buf1.empty());
    }

    // Sort, and verify that list is indeed sorted.
    std::sort(buf1.begin(), buf1.end());
    for (size_t i = 0; i < size; ++i)
      EXPECT_EQ(i, buf1[i]);

    // Test operator[] for read and write.
    for (size_t i = 0; i < size; ++i)
      buf1[i] = buf1[i] * 2;

    // Test append().
    courgette::NoThrowBuffer<size_t> buf2;

    if (size > 0) {
      EXPECT_TRUE(buf2.append(&buf1[0], size));
      EXPECT_EQ(size, buf2.size());
      for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(buf1[i], buf2[i]);
    }

    // Test shrinking by resize().
    const size_t kNewValue = 137;
    size_t new_size = size / 2;
    EXPECT_TRUE(buf2.resize(new_size, kNewValue));
    EXPECT_EQ(new_size, buf2.size());
    for (size_t i = 0; i < new_size; ++i)
      EXPECT_EQ(buf1[i], buf2[i]);

    // Test expanding by resize().
    EXPECT_TRUE(buf2.resize(size, kNewValue));
    EXPECT_EQ(size, buf2.size());
    for (size_t i = 0; i < new_size; ++i)
      EXPECT_EQ(buf1[i], buf2[i]);
    for (size_t i = new_size; i < size; ++i)
      EXPECT_EQ(kNewValue, buf2[i]);

    // Test clear().
    buf2.clear();
    EXPECT_EQ(0U, buf2.size());
    EXPECT_TRUE(buf2.empty());
  }
}
