1 // Copyright 2021 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "gn/pointer_set.h"
6 #include "util/test/test.h"
7
8 struct Foo {
9 int x;
10 };
11
12 static const Foo kFoo1[1] = {{1}};
13 static const Foo kFoo2[1] = {{2}};
14 static const Foo kFoo3[1] = {{3}};
15
16 static const std::initializer_list<const Foo*> kFullList = {kFoo1, kFoo2,
17 kFoo3};
18
19 using TestPointerSet = PointerSet<const Foo>;
20
TEST(PointerSet,DefaultConstruction)21 TEST(PointerSet, DefaultConstruction) {
22 TestPointerSet set;
23 EXPECT_TRUE(set.empty());
24 EXPECT_EQ(0u, set.size());
25 EXPECT_FALSE(set.contains(kFoo1));
26 }
27
TEST(PointerSet,RangeConstruction)28 TEST(PointerSet, RangeConstruction) {
29 TestPointerSet set(kFullList.begin(), kFullList.end());
30 EXPECT_FALSE(set.empty());
31 EXPECT_EQ(3u, set.size());
32 EXPECT_TRUE(set.contains(kFoo1));
33 EXPECT_TRUE(set.contains(kFoo2));
34 EXPECT_TRUE(set.contains(kFoo3));
35 }
36
TEST(PointerSet,CopyConstruction)37 TEST(PointerSet, CopyConstruction) {
38 TestPointerSet set1(kFullList.begin(), kFullList.end());
39 TestPointerSet set2(set1);
40 set1.clear();
41 EXPECT_TRUE(set1.empty());
42 EXPECT_FALSE(set2.empty());
43 EXPECT_EQ(3u, set2.size());
44 EXPECT_TRUE(set2.contains(kFoo1));
45 EXPECT_TRUE(set2.contains(kFoo2));
46 EXPECT_TRUE(set2.contains(kFoo3));
47 }
48
TEST(PointerSet,MoveConstruction)49 TEST(PointerSet, MoveConstruction) {
50 TestPointerSet set1(kFullList.begin(), kFullList.end());
51 TestPointerSet set2(std::move(set1));
52 EXPECT_TRUE(set1.empty());
53 EXPECT_FALSE(set2.empty());
54 EXPECT_EQ(3u, set2.size());
55 EXPECT_TRUE(set2.contains(kFoo1));
56 EXPECT_TRUE(set2.contains(kFoo2));
57 EXPECT_TRUE(set2.contains(kFoo3));
58 }
59
TEST(PointerSet,Add)60 TEST(PointerSet, Add) {
61 TestPointerSet set;
62 EXPECT_TRUE(set.add(kFoo1));
63 EXPECT_EQ(1u, set.size());
64 EXPECT_TRUE(set.contains(kFoo1));
65
66 EXPECT_FALSE(set.add(kFoo1));
67 EXPECT_EQ(1u, set.size());
68 EXPECT_TRUE(set.contains(kFoo1));
69
70 EXPECT_TRUE(set.add(kFoo2));
71 EXPECT_EQ(2u, set.size());
72 EXPECT_TRUE(set.contains(kFoo1));
73 EXPECT_TRUE(set.contains(kFoo2));
74
75 EXPECT_FALSE(set.add(kFoo1));
76 EXPECT_FALSE(set.add(kFoo2));
77
78 EXPECT_TRUE(set.add(kFoo3));
79 EXPECT_EQ(3u, set.size());
80 EXPECT_TRUE(set.contains(kFoo1));
81 EXPECT_TRUE(set.contains(kFoo2));
82 EXPECT_TRUE(set.contains(kFoo3));
83
84 EXPECT_FALSE(set.add(kFoo1));
85 EXPECT_FALSE(set.add(kFoo2));
86 EXPECT_FALSE(set.add(kFoo3));
87 }
88
TEST(PointerSet,Erase)89 TEST(PointerSet, Erase) {
90 TestPointerSet set(kFullList.begin(), kFullList.end());
91 EXPECT_EQ(3u, set.size());
92
93 EXPECT_TRUE(set.erase(kFoo1));
94 EXPECT_EQ(2u, set.size());
95 EXPECT_FALSE(set.contains(kFoo1));
96 EXPECT_FALSE(set.erase(kFoo1));
97 EXPECT_EQ(2u, set.size());
98
99 EXPECT_TRUE(set.erase(kFoo2));
100 EXPECT_EQ(1u, set.size());
101 EXPECT_FALSE(set.contains(kFoo2));
102 EXPECT_FALSE(set.erase(kFoo2));
103 EXPECT_EQ(1u, set.size());
104
105 EXPECT_TRUE(set.erase(kFoo3));
106 EXPECT_EQ(0u, set.size());
107 EXPECT_FALSE(set.contains(kFoo3));
108 EXPECT_FALSE(set.erase(kFoo3));
109 EXPECT_EQ(0u, set.size());
110 }
111
TEST(PointerSet,RangeInsert)112 TEST(PointerSet, RangeInsert) {
113 TestPointerSet set;
114 set.insert(kFullList.begin(), kFullList.end());
115 EXPECT_EQ(3u, set.size());
116 EXPECT_TRUE(set.contains(kFoo1));
117 EXPECT_TRUE(set.contains(kFoo2));
118 EXPECT_TRUE(set.contains(kFoo3));
119
120 set.insert(kFullList.begin(), kFullList.end());
121 EXPECT_EQ(3u, set.size());
122 }
123
TEST(PointerSet,InsertOther)124 TEST(PointerSet, InsertOther) {
125 TestPointerSet set1(kFullList.begin(), kFullList.end());
126 TestPointerSet set2;
127 set2.add(kFoo1);
128 set1.insert(set2);
129 EXPECT_EQ(3u, set1.size());
130 EXPECT_EQ(1u, set2.size());
131
132 set1.clear();
133 set1.add(kFoo1);
134 set2.clear();
135 set2.add(kFoo3);
136 set1.insert(set2);
137 EXPECT_EQ(2u, set1.size());
138 EXPECT_EQ(1u, set2.size());
139 EXPECT_TRUE(set1.contains(kFoo1));
140 EXPECT_TRUE(set1.contains(kFoo3));
141 }
142
TEST(PointerSet,IntersectionWith)143 TEST(PointerSet, IntersectionWith) {
144 TestPointerSet set1;
145 TestPointerSet set2;
146
147 set1.add(kFoo1);
148 set2.add(kFoo3);
149
150 TestPointerSet set = set1.intersection_with(set2);
151 EXPECT_TRUE(set.empty());
152
153 set1.add(kFoo2);
154 set2.add(kFoo2);
155
156 set = set1.intersection_with(set2);
157 EXPECT_FALSE(set.empty());
158 EXPECT_EQ(1u, set.size());
159 EXPECT_TRUE(set.contains(kFoo2));
160
161 set1.insert(kFullList.begin(), kFullList.end());
162 set2 = set1;
163 set = set1.intersection_with(set2);
164 EXPECT_EQ(3u, set.size());
165 EXPECT_EQ(set1, set);
166 EXPECT_EQ(set2, set);
167 }
168