// 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 <utility>

#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_);
}
