// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef HEAP_HEAP_TESTER_H_
#define HEAP_HEAP_TESTER_H_

#include "src/heap/spaces.h"
#include "src/objects/fixed-array.h"

// Tests that should have access to private methods of {v8::internal::Heap}.
// Those tests need to be defined using HEAP_TEST(Name) { ... }.
#define HEAP_TEST_METHODS(V)                                \
  V(CodeLargeObjectSpace)                                   \
  V(CodeLargeObjectSpace64k)                                \
  V(CompactionFullAbortedPage)                              \
  V(CompactionPartiallyAbortedPage)                         \
  V(CompactionPartiallyAbortedPageIntraAbortedPointers)     \
  V(CompactionPartiallyAbortedPageWithInvalidatedSlots)     \
  V(CompactionPartiallyAbortedPageWithRememberedSetEntries) \
  V(CompactionSpaceDivideMultiplePages)                     \
  V(CompactionSpaceDivideSinglePage)                        \
  V(InvalidatedSlotsAfterTrimming)                          \
  V(InvalidatedSlotsAllInvalidatedRanges)                   \
  V(InvalidatedSlotsCleanupEachObject)                      \
  V(InvalidatedSlotsCleanupFull)                            \
  V(InvalidatedSlotsCleanupRightTrim)                       \
  V(InvalidatedSlotsCleanupOverlapRight)                    \
  V(InvalidatedSlotsEvacuationCandidate)                    \
  V(InvalidatedSlotsNoInvalidatedRanges)                    \
  V(InvalidatedSlotsResetObjectRegression)                  \
  V(InvalidatedSlotsRightTrimFixedArray)                    \
  V(InvalidatedSlotsRightTrimLargeFixedArray)               \
  V(InvalidatedSlotsLeftTrimFixedArray)                     \
  V(InvalidatedSlotsFastToSlow)                             \
  V(InvalidatedSlotsSomeInvalidatedRanges)                  \
  V(TestNewSpaceRefsInCopiedCode)                           \
  V(GCFlags)                                                \
  V(MarkCompactCollector)                                   \
  V(MarkCompactEpochCounter)                                \
  V(MemoryReducerActivationForSmallHeaps)                   \
  V(NoPromotion)                                            \
  V(NumberStringCacheSize)                                  \
  V(ObjectGroups)                                           \
  V(Promotion)                                              \
  V(Regression39128)                                        \
  V(ResetWeakHandle)                                        \
  V(StressHandles)                                          \
  V(TestMemoryReducerSampleJsCalls)                         \
  V(TestSizeOfObjects)                                      \
  V(Regress10560)                                           \
  V(Regress538257)                                          \
  V(Regress587004)                                          \
  V(Regress589413)                                          \
  V(Regress658718)                                          \
  V(Regress670675)                                          \
  V(Regress777177)                                          \
  V(Regress779503)                                          \
  V(Regress791582)                                          \
  V(Regress845060)                                          \
  V(RegressMissingWriteBarrierInAllocate)                   \
  V(WriteBarrier_Marking)                                   \
  V(WriteBarrier_MarkingExtension)                          \
  V(WriteBarriersInCopyJSObject)                            \
  V(DoNotEvacuatePinnedPages)                               \
  V(ObjectStartBitmap)

#define HEAP_TEST(Name)                                                   \
  CcTest register_test_##Name(v8::internal::heap::HeapTester::Test##Name, \
                              __FILE__, #Name, true, true);               \
  void v8::internal::heap::HeapTester::Test##Name()

#define UNINITIALIZED_HEAP_TEST(Name)                                     \
  CcTest register_test_##Name(v8::internal::heap::HeapTester::Test##Name, \
                              __FILE__, #Name, true, false);              \
  void v8::internal::heap::HeapTester::Test##Name()

#define THREADED_HEAP_TEST(Name)                          \
  RegisterThreadedTest register_##Name(                   \
      v8::internal::heap::HeapTester::Test##Name, #Name); \
  /* */ HEAP_TEST(Name)

namespace v8 {
namespace internal {

template <typename T>
class Handle;

namespace heap {

class HeapTester {
 public:
#define DECLARE_STATIC(Name) static void Test##Name();

  HEAP_TEST_METHODS(DECLARE_STATIC)
#undef HEAP_TEST_METHODS

  // test-alloc.cc
  static AllocationResult AllocateAfterFailures();
  static Handle<Object> TestAllocateAfterFailures();

  // test-invalidated-slots.cc
  static Page* AllocateByteArraysOnPage(Heap* heap,
                                        std::vector<ByteArray>* byte_arrays);

  // test-api.cc
  static void ResetWeakHandle(bool global_gc);

  // test-heap.cc
  static AllocationResult AllocateByteArrayForTest(Heap* heap, int length,
                                                   AllocationType allocation);
  static bool CodeEnsureLinearAllocationArea(Heap* heap, int size_in_bytes);

  // test-mark-compact.cc
  static AllocationResult AllocateMapForTest(v8::internal::Isolate* isolate);
  static AllocationResult AllocateFixedArrayForTest(Heap* heap, int length,
                                                    AllocationType allocation);

  static void UncommitFromSpace(Heap* heap);
};

}  // namespace heap
}  // namespace internal
}  // namespace v8

#endif  // HEAP_HEAP_TESTER_H_
