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 #include <algorithm>
9
10 struct Foo {
11 int x;
12 };
13
14 static const Foo kFoo1[1] = {{1}};
15 static const Foo kFoo2[1] = {{2}};
16 static const Foo kFoo3[1] = {{3}};
17
18 static const std::initializer_list<const Foo*> kFullList = {kFoo1, kFoo2,
19 kFoo3};
20
21 using TestPointerSet = PointerSet<const Foo>;
22
TEST(PointerSet,DefaultConstruction)23 TEST(PointerSet, DefaultConstruction) {
24 TestPointerSet set;
25 EXPECT_TRUE(set.empty());
26 EXPECT_EQ(0u, set.size());
27 EXPECT_FALSE(set.contains(kFoo1));
28 }
29
TEST(PointerSet,RangeConstruction)30 TEST(PointerSet, RangeConstruction) {
31 TestPointerSet set(kFullList.begin(), kFullList.end());
32 EXPECT_FALSE(set.empty());
33 EXPECT_EQ(3u, set.size());
34 EXPECT_TRUE(set.contains(kFoo1));
35 EXPECT_TRUE(set.contains(kFoo2));
36 EXPECT_TRUE(set.contains(kFoo3));
37 }
38
TEST(PointerSet,CopyConstruction)39 TEST(PointerSet, CopyConstruction) {
40 TestPointerSet set1(kFullList.begin(), kFullList.end());
41 TestPointerSet set2(set1);
42 set1.clear();
43 EXPECT_TRUE(set1.empty());
44 EXPECT_FALSE(set2.empty());
45 EXPECT_EQ(3u, set2.size());
46 EXPECT_TRUE(set2.contains(kFoo1));
47 EXPECT_TRUE(set2.contains(kFoo2));
48 EXPECT_TRUE(set2.contains(kFoo3));
49 }
50
TEST(PointerSet,MoveConstruction)51 TEST(PointerSet, MoveConstruction) {
52 TestPointerSet set1(kFullList.begin(), kFullList.end());
53 TestPointerSet set2(std::move(set1));
54 EXPECT_TRUE(set1.empty());
55 EXPECT_FALSE(set2.empty());
56 EXPECT_EQ(3u, set2.size());
57 EXPECT_TRUE(set2.contains(kFoo1));
58 EXPECT_TRUE(set2.contains(kFoo2));
59 EXPECT_TRUE(set2.contains(kFoo3));
60 }
61
TEST(PointerSet,Add)62 TEST(PointerSet, Add) {
63 TestPointerSet set;
64 EXPECT_TRUE(set.add(kFoo1));
65 EXPECT_EQ(1u, set.size());
66 EXPECT_TRUE(set.contains(kFoo1));
67
68 EXPECT_FALSE(set.add(kFoo1));
69 EXPECT_EQ(1u, set.size());
70 EXPECT_TRUE(set.contains(kFoo1));
71
72 EXPECT_TRUE(set.add(kFoo2));
73 EXPECT_EQ(2u, set.size());
74 EXPECT_TRUE(set.contains(kFoo1));
75 EXPECT_TRUE(set.contains(kFoo2));
76
77 EXPECT_FALSE(set.add(kFoo1));
78 EXPECT_FALSE(set.add(kFoo2));
79
80 EXPECT_TRUE(set.add(kFoo3));
81 EXPECT_EQ(3u, set.size());
82 EXPECT_TRUE(set.contains(kFoo1));
83 EXPECT_TRUE(set.contains(kFoo2));
84 EXPECT_TRUE(set.contains(kFoo3));
85
86 EXPECT_FALSE(set.add(kFoo1));
87 EXPECT_FALSE(set.add(kFoo2));
88 EXPECT_FALSE(set.add(kFoo3));
89 }
90
TEST(PointerSet,Erase)91 TEST(PointerSet, Erase) {
92 TestPointerSet set(kFullList.begin(), kFullList.end());
93 EXPECT_EQ(3u, set.size());
94
95 EXPECT_TRUE(set.erase(kFoo1));
96 EXPECT_EQ(2u, set.size());
97 EXPECT_FALSE(set.contains(kFoo1));
98 EXPECT_FALSE(set.erase(kFoo1));
99 EXPECT_EQ(2u, set.size());
100
101 EXPECT_TRUE(set.erase(kFoo2));
102 EXPECT_EQ(1u, set.size());
103 EXPECT_FALSE(set.contains(kFoo2));
104 EXPECT_FALSE(set.erase(kFoo2));
105 EXPECT_EQ(1u, set.size());
106
107 EXPECT_TRUE(set.erase(kFoo3));
108 EXPECT_EQ(0u, set.size());
109 EXPECT_FALSE(set.contains(kFoo3));
110 EXPECT_FALSE(set.erase(kFoo3));
111 EXPECT_EQ(0u, set.size());
112 }
113
TEST(PointerSet,RangeInsert)114 TEST(PointerSet, RangeInsert) {
115 TestPointerSet set;
116 set.insert(kFullList.begin(), kFullList.end());
117 EXPECT_EQ(3u, set.size());
118 EXPECT_TRUE(set.contains(kFoo1));
119 EXPECT_TRUE(set.contains(kFoo2));
120 EXPECT_TRUE(set.contains(kFoo3));
121
122 set.insert(kFullList.begin(), kFullList.end());
123 EXPECT_EQ(3u, set.size());
124 }
125
TEST(PointerSet,InsertOther)126 TEST(PointerSet, InsertOther) {
127 TestPointerSet set1(kFullList.begin(), kFullList.end());
128 TestPointerSet set2;
129 set2.add(kFoo1);
130 set1.insert(set2);
131 EXPECT_EQ(3u, set1.size());
132 EXPECT_EQ(1u, set2.size());
133
134 set1.clear();
135 set1.add(kFoo1);
136 set2.clear();
137 set2.add(kFoo3);
138 set1.insert(set2);
139 EXPECT_EQ(2u, set1.size());
140 EXPECT_EQ(1u, set2.size());
141 EXPECT_TRUE(set1.contains(kFoo1));
142 EXPECT_TRUE(set1.contains(kFoo3));
143 }
144
TEST(PointerSet,IntersectionWith)145 TEST(PointerSet, IntersectionWith) {
146 TestPointerSet set1;
147 TestPointerSet set2;
148
149 set1.add(kFoo1);
150 set2.add(kFoo3);
151
152 TestPointerSet set = set1.intersection_with(set2);
153 EXPECT_TRUE(set.empty());
154
155 set1.add(kFoo2);
156 set2.add(kFoo2);
157
158 set = set1.intersection_with(set2);
159 EXPECT_FALSE(set.empty());
160 EXPECT_EQ(1u, set.size());
161 EXPECT_TRUE(set.contains(kFoo2));
162
163 set1.insert(kFullList.begin(), kFullList.end());
164 set2 = set1;
165 set = set1.intersection_with(set2);
166 EXPECT_EQ(3u, set.size());
167 EXPECT_EQ(set1, set);
168 EXPECT_EQ(set2, set);
169 }
170
TEST(PointerSet,ToVector)171 TEST(PointerSet, ToVector) {
172 TestPointerSet set(kFullList.begin(), kFullList.end());
173 auto vector = set.ToVector();
174 EXPECT_EQ(vector.size(), kFullList.size());
175
176 // NOTE: Order of items in the result is not guaranteed
177 // so just check whether items are available in it.
178 EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo1), vector.end());
179 EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo2), vector.end());
180 EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo3), vector.end());
181 }