// Copyright 2011 Google Inc. All Rights Reserved.

#include "space.h"

#include "gtest/gtest.h"

#include "globals.h"
#include "UniquePtr.h"

namespace art {

TEST(SpaceTest, Init) {
  {
    // Less than
    UniquePtr<Space> space(Space::Create(16 * MB, 32 * MB, NULL));
    EXPECT_TRUE(space.get() != NULL);
  }
  {
    // Equal to
    UniquePtr<Space> space(Space::Create(16 * MB, 16 * MB, NULL));
    EXPECT_TRUE(space.get() != NULL);
  }
  {
    // Greater than
    UniquePtr<Space> space(Space::Create(32 * MB, 16 * MB, NULL));
    EXPECT_TRUE(space.get() == NULL);
  }
}

TEST(SpaceTest, AllocAndFree) {
  UniquePtr<Space> space(Space::Create(4 * MB, 16 * MB, NULL));
  ASSERT_TRUE(space.get() != NULL);

  // Succeeds, fits without adjusting the max allowed footprint.
  void* ptr1 = space->AllocWithoutGrowth(1 * MB);
  EXPECT_TRUE(ptr1 != NULL);

  // Fails, requires a higher allowed footprint.
  void* ptr2 = space->AllocWithoutGrowth(8 * MB);
  EXPECT_TRUE(ptr2 == NULL);

  // Succeeds, adjusts the footprint.
  void* ptr3 = space->AllocWithGrowth(8 * MB);
  EXPECT_TRUE(ptr3 != NULL);

  // Fails, requires a higher allowed footprint.
  void* ptr4 = space->AllocWithoutGrowth(8 * MB);
  EXPECT_FALSE(ptr4 != NULL);

  // Also fails, requires a higher allowed footprint.
  void* ptr5 = space->AllocWithGrowth(8 * MB);
  EXPECT_FALSE(ptr5 != NULL);

  // Release some memory.
  size_t free3 = space->Free(ptr3);
  EXPECT_LE(8U * MB, free3);

  // Succeeds, now that memory has been freed.
  void* ptr6 = space->AllocWithGrowth(9 * MB);
  EXPECT_TRUE(ptr6 != NULL);

  // Final clean up.
  size_t free1 = space->Free(ptr1);
  EXPECT_LE(1U * MB, free1);
}

}  // namespace art
