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