xref: /aosp_15_r20/external/pdfium/fxjs/gc/move_unittest.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2020 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fxgc_unittest.h"
9*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/persistent.h"
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker namespace {
14*3ac0a46fSAndroid Build Coastguard Worker 
15*3ac0a46fSAndroid Build Coastguard Worker class HeapObject : public cppgc::GarbageCollected<HeapObject> {
16*3ac0a46fSAndroid Build Coastguard Worker  public:
17*3ac0a46fSAndroid Build Coastguard Worker   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
18*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const19*3ac0a46fSAndroid Build Coastguard Worker   void Trace(cppgc::Visitor* visitor) const {
20*3ac0a46fSAndroid Build Coastguard Worker     visitor->Trace(frick_);
21*3ac0a46fSAndroid Build Coastguard Worker     visitor->Trace(frack_);
22*3ac0a46fSAndroid Build Coastguard Worker   }
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<HeapObject> frick_;
25*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<HeapObject> frack_;
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker  private:
28*3ac0a46fSAndroid Build Coastguard Worker   HeapObject() = default;
29*3ac0a46fSAndroid Build Coastguard Worker };
30*3ac0a46fSAndroid Build Coastguard Worker 
31*3ac0a46fSAndroid Build Coastguard Worker class CppObject {
32*3ac0a46fSAndroid Build Coastguard Worker  public:
33*3ac0a46fSAndroid Build Coastguard Worker   CppObject() = default;
34*3ac0a46fSAndroid Build Coastguard Worker 
35*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Persistent<HeapObject> click_;
36*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Persistent<HeapObject> clack_;
37*3ac0a46fSAndroid Build Coastguard Worker };
38*3ac0a46fSAndroid Build Coastguard Worker 
39*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
40*3ac0a46fSAndroid Build Coastguard Worker 
41*3ac0a46fSAndroid Build Coastguard Worker class MoveUnitTest : public FXGCUnitTest {};
42*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(MoveUnitTest,Member)43*3ac0a46fSAndroid Build Coastguard Worker TEST_F(MoveUnitTest, Member) {
44*3ac0a46fSAndroid Build Coastguard Worker   // Moving a Member<> leaves the moved-from object as null.
45*3ac0a46fSAndroid Build Coastguard Worker   auto* obj =
46*3ac0a46fSAndroid Build Coastguard Worker       cppgc::MakeGarbageCollected<HeapObject>(heap()->GetAllocationHandle());
47*3ac0a46fSAndroid Build Coastguard Worker   obj->frick_ = obj;
48*3ac0a46fSAndroid Build Coastguard Worker   obj->frack_ = std::move(obj->frick_);
49*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(obj->frick_);
50*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(obj, obj->frack_);
51*3ac0a46fSAndroid Build Coastguard Worker }
52*3ac0a46fSAndroid Build Coastguard Worker 
TEST_F(MoveUnitTest,Persistent)53*3ac0a46fSAndroid Build Coastguard Worker TEST_F(MoveUnitTest, Persistent) {
54*3ac0a46fSAndroid Build Coastguard Worker   // Moving a Persistent<> leaves the moved-from object as null.
55*3ac0a46fSAndroid Build Coastguard Worker   auto* obj =
56*3ac0a46fSAndroid Build Coastguard Worker       cppgc::MakeGarbageCollected<HeapObject>(heap()->GetAllocationHandle());
57*3ac0a46fSAndroid Build Coastguard Worker   CppObject outsider;
58*3ac0a46fSAndroid Build Coastguard Worker   outsider.click_ = obj;
59*3ac0a46fSAndroid Build Coastguard Worker   outsider.clack_ = std::move(outsider.click_);
60*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_FALSE(outsider.click_);
61*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(obj, outsider.clack_);
62*3ac0a46fSAndroid Build Coastguard Worker }
63