// 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 #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 { public: CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; void Trace(cppgc::Visitor* visitor) const { visitor->Trace(frick_); visitor->Trace(frack_); } cppgc::Member frick_; cppgc::Member frack_; private: HeapObject() = default; }; class CppObject { public: CppObject() = default; cppgc::Persistent click_; cppgc::Persistent clack_; }; } // namespace class MoveUnitTest : public FXGCUnitTest {}; TEST_F(MoveUnitTest, Member) { // Moving a Member<> leaves the moved-from object as null. auto* obj = cppgc::MakeGarbageCollected(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(heap()->GetAllocationHandle()); CppObject outsider; outsider.click_ = obj; outsider.clack_ = std::move(outsider.click_); EXPECT_FALSE(outsider.click_); EXPECT_EQ(obj, outsider.clack_); }