Blender  V3.3
BLI_vector_set_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0 */
2 
4 #include "BLI_strict_flags.h"
5 #include "BLI_vector_set.hh"
6 #include "testing/testing.h"
7 
8 namespace blender::tests {
9 
10 TEST(vector_set, DefaultConstructor)
11 {
12  VectorSet<int> set;
13  EXPECT_EQ(set.size(), 0);
14  EXPECT_TRUE(set.is_empty());
15 }
16 
17 TEST(vector_set, InitializerListConstructor_WithoutDuplicates)
18 {
19  VectorSet<int> set = {1, 4, 5};
20  EXPECT_EQ(set.size(), 3);
21  EXPECT_EQ(set[0], 1);
22  EXPECT_EQ(set[1], 4);
23  EXPECT_EQ(set[2], 5);
24 }
25 
26 TEST(vector_set, InitializerListConstructor_WithDuplicates)
27 {
28  VectorSet<int> set = {1, 3, 3, 2, 1, 5};
29  EXPECT_EQ(set.size(), 4);
30  EXPECT_EQ(set[0], 1);
31  EXPECT_EQ(set[1], 3);
32  EXPECT_EQ(set[2], 2);
33  EXPECT_EQ(set[3], 5);
34 }
35 
36 TEST(vector_set, Copy)
37 {
38  VectorSet<int> set1 = {1, 2, 3};
39  VectorSet<int> set2 = set1;
40  EXPECT_EQ(set1.size(), 3);
41  EXPECT_EQ(set2.size(), 3);
42  EXPECT_EQ(set1.index_of(2), 1);
43  EXPECT_EQ(set2.index_of(2), 1);
44 }
45 
46 TEST(vector_set, CopyAssignment)
47 {
48  VectorSet<int> set1 = {1, 2, 3};
49  VectorSet<int> set2 = {};
50  set2 = set1;
51  EXPECT_EQ(set1.size(), 3);
52  EXPECT_EQ(set2.size(), 3);
53  EXPECT_EQ(set1.index_of(2), 1);
54  EXPECT_EQ(set2.index_of(2), 1);
55 }
56 
57 TEST(vector_set, Move)
58 {
59  VectorSet<int> set1 = {1, 2, 3};
60  VectorSet<int> set2 = std::move(set1);
61  EXPECT_EQ(set1.size(), 0); /* NOLINT: bugprone-use-after-move */
62  EXPECT_EQ(set2.size(), 3);
63 }
64 
65 TEST(vector_set, MoveAssignment)
66 {
67  VectorSet<int> set1 = {1, 2, 3};
68  VectorSet<int> set2 = {};
69  set2 = std::move(set1);
70  EXPECT_EQ(set1.size(), 0); /* NOLINT: bugprone-use-after-move */
71  EXPECT_EQ(set2.size(), 3);
72 }
73 
74 TEST(vector_set, AddNewIncreasesSize)
75 {
76  VectorSet<int> set;
77  EXPECT_TRUE(set.is_empty());
78  EXPECT_EQ(set.size(), 0);
79  set.add(5);
80  EXPECT_FALSE(set.is_empty());
81  EXPECT_EQ(set.size(), 1);
82 }
83 
84 TEST(vector_set, AddExistingDoesNotIncreaseSize)
85 {
86  VectorSet<int> set;
87  EXPECT_EQ(set.size(), 0);
88  EXPECT_TRUE(set.add(5));
89  EXPECT_EQ(set.size(), 1);
90  EXPECT_FALSE(set.add(5));
91  EXPECT_EQ(set.size(), 1);
92 }
93 
94 TEST(vector_set, Index)
95 {
96  VectorSet<int> set = {3, 6, 4};
97  EXPECT_EQ(set.index_of(6), 1);
98  EXPECT_EQ(set.index_of(3), 0);
99  EXPECT_EQ(set.index_of(4), 2);
100 }
101 
102 TEST(vector_set, IndexTry)
103 {
104  VectorSet<int> set = {3, 6, 4};
105  EXPECT_EQ(set.index_of_try(5), -1);
106  EXPECT_EQ(set.index_of_try(3), 0);
107  EXPECT_EQ(set.index_of_try(6), 1);
108  EXPECT_EQ(set.index_of_try(2), -1);
109 }
110 
111 TEST(vector_set, RemoveContained)
112 {
113  VectorSet<int> set = {4, 5, 6, 7};
114  EXPECT_EQ(set.size(), 4);
115  set.remove_contained(5);
116  EXPECT_EQ(set.size(), 3);
117  EXPECT_EQ(set[0], 4);
118  EXPECT_EQ(set[1], 7);
119  EXPECT_EQ(set[2], 6);
120  set.remove_contained(6);
121  EXPECT_EQ(set.size(), 2);
122  EXPECT_EQ(set[0], 4);
123  EXPECT_EQ(set[1], 7);
124  set.remove_contained(4);
125  EXPECT_EQ(set.size(), 1);
126  EXPECT_EQ(set[0], 7);
127  set.remove_contained(7);
128  EXPECT_EQ(set.size(), 0);
129 }
130 
131 TEST(vector_set, AddMultipleTimes)
132 {
133  VectorSet<int> set;
134  for (int i = 0; i < 100; i++) {
135  EXPECT_FALSE(set.contains(i * 13));
136  set.add(i * 12);
137  set.add(i * 13);
138  EXPECT_TRUE(set.contains(i * 13));
139  }
140 }
141 
142 TEST(vector_set, UniquePtrValue)
143 {
145  set.add_new(std::make_unique<int>());
146  set.add(std::make_unique<int>());
147  set.index_of_try(std::make_unique<int>());
148  std::unique_ptr<int> value = set.pop();
149  UNUSED_VARS(value);
150 }
151 
152 TEST(vector_set, Remove)
153 {
154  VectorSet<int> set;
155  EXPECT_TRUE(set.add(5));
156  EXPECT_TRUE(set.contains(5));
157  EXPECT_FALSE(set.remove(6));
158  EXPECT_TRUE(set.contains(5));
159  EXPECT_TRUE(set.remove(5));
160  EXPECT_FALSE(set.contains(5));
161  EXPECT_FALSE(set.remove(5));
162  EXPECT_FALSE(set.contains(5));
163 }
164 
165 TEST(vector_set, SpanConstructorExceptions)
166 {
167  std::array<ExceptionThrower, 5> array = {1, 2, 3, 4, 5};
168  array[3].throw_during_copy = true;
170 
171  EXPECT_ANY_THROW({ VectorSet<ExceptionThrower> set(span); });
172 }
173 
174 TEST(vector_set, CopyConstructorExceptions)
175 {
176  VectorSet<ExceptionThrower> set = {1, 2, 3, 4, 5};
177  set[3].throw_during_copy = true;
178 
179  EXPECT_ANY_THROW({ VectorSet<ExceptionThrower> set_copy(set); });
180 }
181 
182 TEST(vector_set, MoveConstructorExceptions)
183 {
184  VectorSet<ExceptionThrower> set = {1, 2, 3, 4, 5};
185  set[3].throw_during_copy = true;
186  set[3].throw_during_move = true;
187  /* Currently never throws on move, because values are separately allocated. */
188  VectorSet<ExceptionThrower> set_moved(std::move(set));
189  EXPECT_EQ(set.size(), 0); /* NOLINT: bugprone-use-after-move */
190  set.add_multiple({4, 5, 6, 7, 8});
191  EXPECT_EQ(set.size(), 5);
192 }
193 
194 TEST(vector_set, AddNewExceptions)
195 {
197  ExceptionThrower value;
198  value.throw_during_copy = true;
199  EXPECT_ANY_THROW({ set.add_new(value); });
200  EXPECT_EQ(set.size(), 0);
201  EXPECT_ANY_THROW({ set.add_new(value); });
202  EXPECT_EQ(set.size(), 0);
203 }
204 
205 TEST(vector_set, AddExceptions)
206 {
208  ExceptionThrower value;
209  value.throw_during_copy = true;
210  EXPECT_ANY_THROW({ set.add(value); });
211  EXPECT_EQ(set.size(), 0);
212  EXPECT_ANY_THROW({ set.add(value); });
213  EXPECT_EQ(set.size(), 0);
214 }
215 
216 TEST(vector_set, ReserveExceptions)
217 {
219  set.add_multiple({1, 2, 3, 4, 5});
220  set[2].throw_during_move = true;
221  EXPECT_ANY_THROW({ set.reserve(100); });
222 }
223 
224 TEST(vector_set, PopExceptions)
225 {
226  VectorSet<ExceptionThrower> set = {1, 2, 3};
227  set.as_span().last().throw_during_move = true;
228  EXPECT_EQ(set.size(), 3);
229  EXPECT_ANY_THROW({ set.pop(); }); /* NOLINT: bugprone-throw-keyword-missing */
230  EXPECT_EQ(set.size(), 3);
231  set.add(10);
232  EXPECT_EQ(set.size(), 4);
233 }
234 
235 TEST(vector_set, IndexOfOrAdd)
236 {
237  VectorSet<int> set;
238  EXPECT_EQ(set.index_of_or_add(3), 0);
239  EXPECT_EQ(set.index_of_or_add(3), 0);
240  EXPECT_EQ(set.index_of_or_add(2), 1);
241  EXPECT_EQ(set.index_of_or_add(0), 2);
242  EXPECT_EQ(set.index_of_or_add(2), 1);
243  EXPECT_EQ(set.index_of_or_add(3), 0);
244  EXPECT_EQ(set.index_of_or_add(5), 3);
245  EXPECT_EQ(set.index_of_or_add(8), 4);
246  EXPECT_EQ(set.index_of_or_add(5), 3);
247 }
248 
249 TEST(vector_set, Clear)
250 {
251  VectorSet<int> set = {4, 6, 2, 4};
252  EXPECT_EQ(set.size(), 3);
253  set.clear();
254  EXPECT_EQ(set.size(), 0);
255  set.add_multiple({4, 1, 6, 8, 3, 6, 9, 3});
256  EXPECT_EQ(set.size(), 6);
257  set.clear();
258  EXPECT_EQ(set.size(), 0);
259 }
260 
261 TEST(vector_set, LookupKey)
262 {
264  set.add("a");
265  set.add("b");
266  set.add("c");
267  EXPECT_EQ(set.lookup_key("a"), "a");
268  EXPECT_EQ(set.lookup_key_as("c"), "c");
269  EXPECT_EQ(set.lookup_key_ptr_as("d"), nullptr);
270  EXPECT_EQ(set.lookup_key_ptr_as("b")->size(), 1);
271  EXPECT_EQ(set.lookup_key_ptr("a"), set.lookup_key_ptr_as("a"));
272 }
273 
274 TEST(vector_set, GrowWhenEmpty)
275 {
276  /* Tests that the internal keys array is freed correctly when growing an empty set. */
277  VectorSet<int> set;
278  set.add(4);
279  set.remove(4);
280  EXPECT_TRUE(set.is_empty());
281  set.reserve(100);
282 }
283 
284 } // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
#define UNUSED_VARS(...)
Span< Key > as_span() const
int64_t index_of(const Key &key) const
void reserve(const int64_t n)
bool add(const Key &key)
const Key & lookup_key(const Key &key) const
void add_new(const Key &key)
const Key * lookup_key_ptr(const Key &key) const
const Key & lookup_key_as(const ForwardKey &key) const
int64_t index_of_try(const Key &key) const
const Key * lookup_key_ptr_as(const ForwardKey &key) const
int64_t size() const
void remove_contained(const Key &key)
bool is_empty() const
bool contains(const Key &key) const
int64_t index_of_or_add(const Key &key)
void add_multiple(Span< Key > keys)
bool remove(const Key &key)
TEST(any, DefaultConstructor)
Definition: BLI_any_test.cc:10