// Copyright 2020 PDFium 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 "fxjs/gc/heap.h"

#include "testing/fxgc_unittest.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "v8/include/cppgc/member.h"
#include "v8/include/cppgc/persistent.h"

namespace {

class HeapObject : public cppgc::GarbageCollected<HeapObject> {
 public:
  CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;

  void Trace(cppgc::Visitor* visitor) const {
    visitor->Trace(frick_);
    visitor->Trace(frack_);
  }

  cppgc::Member<HeapObject> frick_;
  cppgc::Member<HeapObject> frack_;

 private:
  HeapObject() = default;
};

class CppObject {
 public:
  CppObject() = default;

  cppgc::Persistent<HeapObject> click_;
  cppgc::Persistent<HeapObject> clack_;
};

}  // namespace

class MoveUnitTest : public FXGCUnitTest {};

TEST_F(MoveUnitTest, Member) {
  // Moving a Member<> leaves the moved-from object as null.
  auto* obj =
      cppgc::MakeGarbageCollected<HeapObject>(heap()->GetAllocationHandle());
  obj->frick_ = obj;
  obj->frack_ = std::move(obj->frick_);
  EXPECT_EQ(nullptr, obj->frick_);
  EXPECT_EQ(obj, obj->frack_);
}

TEST_F(MoveUnitTest, Persistent) {
  // Moving a Persistent<> leaves the moved-from object as null.
  auto* obj =
      cppgc::MakeGarbageCollected<HeapObject>(heap()->GetAllocationHandle());
  CppObject outsider;
  outsider.click_ = obj;
  outsider.clack_ = std::move(outsider.click_);
  EXPECT_EQ(nullptr, outsider.click_);
  EXPECT_EQ(obj, outsider.clack_);
}
