• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }