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