xref: /aosp_15_r20/external/pdfium/fxjs/gc/container_trace_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 "fxjs/gc/container_trace.h"
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <list>
10*3ac0a46fSAndroid Build Coastguard Worker #include <map>
11*3ac0a46fSAndroid Build Coastguard Worker #include <set>
12*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
13*3ac0a46fSAndroid Build Coastguard Worker 
14*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h"
16*3ac0a46fSAndroid Build Coastguard Worker 
17*3ac0a46fSAndroid Build Coastguard Worker namespace {
18*3ac0a46fSAndroid Build Coastguard Worker 
19*3ac0a46fSAndroid Build Coastguard Worker class Thing : public cppgc::GarbageCollected<Thing> {
20*3ac0a46fSAndroid Build Coastguard Worker  public:
Trace(cppgc::Visitor * visitor) const21*3ac0a46fSAndroid Build Coastguard Worker   void Trace(cppgc::Visitor* visitor) const {}
22*3ac0a46fSAndroid Build Coastguard Worker };
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker class CountingVisitor {
25*3ac0a46fSAndroid Build Coastguard Worker  public:
26*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor() = default;
27*3ac0a46fSAndroid Build Coastguard Worker 
Trace(const void * that)28*3ac0a46fSAndroid Build Coastguard Worker   void Trace(const void* that) { ++call_count_; }
call_count() const29*3ac0a46fSAndroid Build Coastguard Worker   int call_count() const { return call_count_; }
30*3ac0a46fSAndroid Build Coastguard Worker 
31*3ac0a46fSAndroid Build Coastguard Worker  private:
32*3ac0a46fSAndroid Build Coastguard Worker   int call_count_ = 0;
33*3ac0a46fSAndroid Build Coastguard Worker };
34*3ac0a46fSAndroid Build Coastguard Worker 
35*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
36*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualListTrace)37*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualListTrace) {
38*3ac0a46fSAndroid Build Coastguard Worker   std::list<cppgc::Member<Thing>> thing;
39*3ac0a46fSAndroid Build Coastguard Worker   thing.emplace_back(nullptr);
40*3ac0a46fSAndroid Build Coastguard Worker 
41*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
42*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
43*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, cv.call_count());
44*3ac0a46fSAndroid Build Coastguard Worker }
45*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualMapTraceFirst)46*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualMapTraceFirst) {
47*3ac0a46fSAndroid Build Coastguard Worker   std::map<cppgc::Member<Thing>, int> thing;
48*3ac0a46fSAndroid Build Coastguard Worker   thing[nullptr] = 42;
49*3ac0a46fSAndroid Build Coastguard Worker 
50*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
51*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
52*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, cv.call_count());
53*3ac0a46fSAndroid Build Coastguard Worker }
54*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualMapTraceSecond)55*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualMapTraceSecond) {
56*3ac0a46fSAndroid Build Coastguard Worker   std::map<int, cppgc::Member<Thing>> thing;
57*3ac0a46fSAndroid Build Coastguard Worker   thing[42] = nullptr;
58*3ac0a46fSAndroid Build Coastguard Worker 
59*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
60*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
61*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, cv.call_count());
62*3ac0a46fSAndroid Build Coastguard Worker }
63*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualMapTraceBoth)64*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualMapTraceBoth) {
65*3ac0a46fSAndroid Build Coastguard Worker   std::map<cppgc::Member<Thing>, cppgc::Member<Thing>> thing;
66*3ac0a46fSAndroid Build Coastguard Worker   thing[nullptr] = nullptr;
67*3ac0a46fSAndroid Build Coastguard Worker 
68*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
69*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
70*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(2, cv.call_count());
71*3ac0a46fSAndroid Build Coastguard Worker }
72*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualSetTrace)73*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualSetTrace) {
74*3ac0a46fSAndroid Build Coastguard Worker   std::set<cppgc::Member<Thing>> thing;
75*3ac0a46fSAndroid Build Coastguard Worker   thing.insert(nullptr);
76*3ac0a46fSAndroid Build Coastguard Worker 
77*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
78*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
79*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, cv.call_count());
80*3ac0a46fSAndroid Build Coastguard Worker }
81*3ac0a46fSAndroid Build Coastguard Worker 
TEST(ContainerTrace,ActualVectorTrace)82*3ac0a46fSAndroid Build Coastguard Worker TEST(ContainerTrace, ActualVectorTrace) {
83*3ac0a46fSAndroid Build Coastguard Worker   std::vector<cppgc::Member<Thing>> thing;
84*3ac0a46fSAndroid Build Coastguard Worker   thing.emplace_back(nullptr);
85*3ac0a46fSAndroid Build Coastguard Worker 
86*3ac0a46fSAndroid Build Coastguard Worker   CountingVisitor cv;
87*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(&cv, thing);
88*3ac0a46fSAndroid Build Coastguard Worker   EXPECT_EQ(1, cv.call_count());
89*3ac0a46fSAndroid Build Coastguard Worker }
90