Blender V5.0
BLI_vector_list_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_list.hh"
7#include "testing/testing.h"
8
9#include "BLI_strict_flags.h" /* IWYU pragma: keep. Keep last. */
10
11namespace blender::tests {
12
13TEST(vectorlist, DefaultConstructor)
14{
16 EXPECT_EQ(vec.size(), 0);
17}
18
19TEST(vectorlist, MoveConstructor)
20{
21 VectorList<int> vec1;
22 vec1.append(1);
23 vec1.append(2);
24 vec1.append(3);
25 vec1.append(4);
26 VectorList<int> vec2(std::move(vec1));
27
28 EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
29 EXPECT_EQ(vec2.size(), 4);
30 EXPECT_EQ(vec2[0], 1);
31 EXPECT_EQ(vec2[1], 2);
32 EXPECT_EQ(vec2[2], 3);
33 EXPECT_EQ(vec2[3], 4);
34}
35
36TEST(vectorlist, MoveOperator)
37{
38 VectorList<int> vec1;
39 vec1.append(1);
40 vec1.append(2);
41 vec1.append(3);
42 vec1.append(4);
43 VectorList<int> vec2;
44 vec2 = std::move(vec1);
45
46 EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
47 EXPECT_EQ(vec2.size(), 4);
48 EXPECT_EQ(vec2[0], 1);
49 EXPECT_EQ(vec2[1], 2);
50 EXPECT_EQ(vec2[2], 3);
51 EXPECT_EQ(vec2[3], 4);
52}
53
54TEST(vectorlist, Append)
55{
57 vec.append(3);
58 vec.append(6);
59 vec.append(7);
60 EXPECT_EQ(vec.size(), 3);
61 EXPECT_EQ(vec[0], 3);
62 EXPECT_EQ(vec[1], 6);
63 EXPECT_EQ(vec[2], 7);
64}
65
66TEST(vectorlist, Iterator)
67{
69 vec.append(1);
70 vec.append(4);
71 vec.append(9);
72 vec.append(16);
73 int i = 1;
74 for (int value : vec) {
75 EXPECT_EQ(value, i * i);
76 i++;
77 }
78}
79
80TEST(vectorlist, ConstIterator)
81{
83 vec.append(1);
84 vec.append(4);
85 vec.append(9);
86 vec.append(16);
87 const VectorList<int> &const_ref = vec;
88 int i = 0;
89 for (int value : const_ref) {
90 i++;
91 EXPECT_EQ(value, i * i);
92 }
93 EXPECT_EQ(i, 4);
94}
95
96TEST(vectorlist, LimitIterator)
97{
99 for (int64_t i : IndexRange(1024)) {
100 vec.append(int(i));
101 }
102 int i = 0;
103 for (int value : vec) {
104 EXPECT_EQ(value, i);
105 i++;
106 }
107 EXPECT_EQ(i, 1024);
108}
109
110TEST(vectorlist, IteratorAfterClear)
111{
113 for (int64_t i : IndexRange(1024)) {
114 vec.append(int(i));
115 }
116 vec.clear();
117 for (int64_t i : IndexRange(512)) {
118 vec.append(int(-i));
119 }
120 int i = 0;
121 for (int value : vec) {
122 EXPECT_EQ(value, -i);
123 i++;
124 }
125 EXPECT_EQ(i, 512);
126}
127
128TEST(vectorlist, LimitIndexing)
129{
131 for (int64_t i : IndexRange(1024)) {
132 vec.append(int(i));
133 }
134 for (int64_t i : IndexRange(1024)) {
135 EXPECT_EQ(vec[i], i);
136 }
137}
138
139TEST(vectorlist, ConstLimitIndexing)
140{
142 for (int64_t i : IndexRange(1024)) {
143 vec.append(int(i));
144 }
145 const VectorList<int, 8, 128> &const_ref = vec;
146 for (int64_t i : IndexRange(1024)) {
147 EXPECT_EQ(const_ref[i], i);
148 }
149}
150
152{
153 VectorList<int> vec;
154 vec.append(3);
155 vec.append(5);
156 vec.append(1);
157 return vec;
158}
159
160TEST(vectorlist, ReturnByValue)
161{
163 EXPECT_EQ(vec.size(), 3);
164 EXPECT_EQ(vec[0], 3);
165 EXPECT_EQ(vec[1], 5);
166 EXPECT_EQ(vec[2], 1);
167}
168
169TEST(vectorlist, IsEmpty)
170{
171 VectorList<int> vec;
172 EXPECT_TRUE(vec.is_empty());
173 vec.append(1);
174 EXPECT_FALSE(vec.is_empty());
175 vec.clear();
176 EXPECT_TRUE(vec.is_empty());
177}
178
179TEST(vectorlist, First)
180{
181 VectorList<int> vec;
182 vec.append(3);
183 vec.append(5);
184 vec.append(7);
185 EXPECT_EQ(vec.first(), 3);
186}
187
188TEST(vectorlist, Last)
189{
190 VectorList<int> vec;
191 vec.append(3);
192 vec.append(5);
193 vec.append(7);
194 EXPECT_EQ(vec.last(), 7);
195}
196
198 public:
200 bool copy_constructed = false;
201 bool move_constructed = false;
202 bool copy_assigned = false;
203 bool move_assigned = false;
204
206
208
210
212 {
213 if (this == &other) {
214 return *this;
215 }
216
217 copy_assigned = true;
218 return *this;
219 }
220
222 {
223 if (this == &other) {
224 return *this;
225 }
226
227 move_assigned = true;
228 return *this;
229 }
230};
231
232TEST(vectorlist, AppendCallsCopyConstructor)
233{
235 TypeConstructMock value;
236 vec.append(value);
237 EXPECT_TRUE(vec[0].copy_constructed);
238}
239
240TEST(vectorlist, AppendCallsMoveConstructor)
241{
244 EXPECT_TRUE(vec[0].move_constructed);
245}
246
247TEST(vectorlist, OveralignedValues)
248{
250 for (int i = 0; i < 100; i++) {
251 vec.append({});
252 EXPECT_EQ(uintptr_t(&vec.last()) % 512, 0);
253 }
254}
255
256TEST(vectorlist, AppendExceptions)
257{
259 vec.append({});
260 vec.append({});
261 ExceptionThrower *ptr1 = &vec.last();
262 ExceptionThrower value;
263 value.throw_during_copy = true;
264 EXPECT_ANY_THROW({ vec.append(value); });
265 EXPECT_EQ(vec.size(), 2);
266 ExceptionThrower *ptr2 = &vec.last();
267 EXPECT_EQ(ptr1, ptr2);
268}
269
270} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
return true
long long int int64_t
void append(const T &value)
TypeConstructMock(const TypeConstructMock &)
TypeConstructMock(TypeConstructMock &&) noexcept
TypeConstructMock & operator=(TypeConstructMock &&other) noexcept
TypeConstructMock & operator=(const TypeConstructMock &other)
static VectorList< int > return_by_value_helper()
TEST(blf_load, load)
Definition BLF_tests.cc:34
i
Definition text_draw.cc:230