// Copyright 2019 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.

#include "src/heap/factory.h"
#include "test/unittests/test-utils.h"

namespace v8 {
namespace internal {

using WeakArrayListTest = TestWithIsolate;

TEST_F(WeakArrayListTest, Compact) {
  Handle<WeakArrayList> list = isolate()->factory()->NewWeakArrayList(10);
  EXPECT_EQ(list->length(), 0);
  EXPECT_EQ(list->capacity(), 10);

  MaybeObject some_object =
      MaybeObject::FromObject(*isolate()->factory()->empty_fixed_array());
  MaybeObject weak_ref = MaybeObject::MakeWeak(some_object);
  MaybeObject smi = MaybeObject::FromSmi(Smi::FromInt(0));
  MaybeObject cleared_ref = HeapObjectReference::ClearedValue(isolate());
  list->Set(0, weak_ref);
  list->Set(1, smi);
  list->Set(2, cleared_ref);
  list->Set(3, cleared_ref);
  list->set_length(5);

  list->Compact(isolate());
  EXPECT_EQ(list->length(), 3);
  EXPECT_EQ(list->capacity(), 10);
}

TEST_F(WeakArrayListTest, OutOfPlaceCompact) {
  Handle<WeakArrayList> list = isolate()->factory()->NewWeakArrayList(20);
  EXPECT_EQ(list->length(), 0);
  EXPECT_EQ(list->capacity(), 20);

  MaybeObject some_object =
      MaybeObject::FromObject(*isolate()->factory()->empty_fixed_array());
  MaybeObject weak_ref = MaybeObject::MakeWeak(some_object);
  MaybeObject smi = MaybeObject::FromSmi(Smi::FromInt(0));
  MaybeObject cleared_ref = HeapObjectReference::ClearedValue(isolate());
  list->Set(0, weak_ref);
  list->Set(1, smi);
  list->Set(2, cleared_ref);
  list->Set(3, smi);
  list->Set(4, cleared_ref);
  list->set_length(6);

  Handle<WeakArrayList> compacted =
      isolate()->factory()->CompactWeakArrayList(list, 4);
  EXPECT_EQ(list->length(), 6);
  EXPECT_EQ(compacted->length(), 4);
  EXPECT_EQ(compacted->capacity(), 4);
}

}  // namespace internal
}  // namespace v8
