// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/assert.h"
#include "vm/freelist.h"
#include "vm/unit_test.h"

namespace dart {

TEST_CASE(FreeList) {
  FreeList* free_list = new FreeList();
  intptr_t kBlobSize = 1 * MB;
  intptr_t kSmallObjectSize = 4 * kWordSize;
  intptr_t kMediumObjectSize = 16 * kWordSize;
  intptr_t kLargeObjectSize = 8 * KB;
  uword blob = reinterpret_cast<uword>(malloc(kBlobSize));
  // Enqueue the large blob as one free block.
  free_list->Free(blob, kBlobSize);
  // Allocate a small object. Expect it to be positioned as the first element.
  uword small_object = free_list->TryAllocate(kSmallObjectSize, false);
  EXPECT_EQ(blob, small_object);
  // Freeing and allocating should give us the same memory back.
  free_list->Free(small_object, kSmallObjectSize);
  small_object = free_list->TryAllocate(kSmallObjectSize, false);
  EXPECT_EQ(blob, small_object);
  // Splitting the remainder further with small and medium objects.
  uword small_object2 = free_list->TryAllocate(kSmallObjectSize, false);
  EXPECT_EQ(blob + kSmallObjectSize, small_object2);
  uword med_object = free_list->TryAllocate(kMediumObjectSize, false);
  EXPECT_EQ(small_object2 + kSmallObjectSize, med_object);
  // Allocate a large object.
  uword large_object = free_list->TryAllocate(kLargeObjectSize, false);
  EXPECT_EQ(med_object + kMediumObjectSize, large_object);
  // Make sure that small objects can still split the remainder.
  uword small_object3 = free_list->TryAllocate(kSmallObjectSize, false);
  EXPECT_EQ(large_object + kLargeObjectSize, small_object3);
  // Split the large object.
  free_list->Free(large_object, kLargeObjectSize);
  uword small_object4 = free_list->TryAllocate(kSmallObjectSize, false);
  EXPECT_EQ(large_object, small_object4);
  // Get the full remainder of the large object.
  large_object =
      free_list->TryAllocate(kLargeObjectSize - kSmallObjectSize, false);
  EXPECT_EQ(small_object4 + kSmallObjectSize, large_object);
  // Get another large object from the large unallocated remainder.
  uword large_object2 = free_list->TryAllocate(kLargeObjectSize, false);
  EXPECT_EQ(small_object3 + kSmallObjectSize, large_object2);
  // Delete the memory associated with the test.
  free(reinterpret_cast<void*>(blob));
  delete free_list;
}

}  // namespace dart
