|  | // Copyright 2020 The PDFium Authors | 
|  | // 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_FALSE(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_FALSE(outsider.click_); | 
|  | EXPECT_EQ(obj, outsider.clack_); | 
|  | } |