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