Blender V4.3
BLI_array_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
7#include "BLI_array.hh"
9#include "BLI_vector.hh"
10
11#include "BLI_strict_flags.h" /* Keep last. */
12
13namespace blender::tests {
14
15TEST(array, DefaultConstructor)
16{
18 EXPECT_EQ(array.size(), 0);
19 EXPECT_TRUE(array.is_empty());
20}
21
22TEST(array, SizeConstructor)
23{
25 EXPECT_EQ(array.size(), 5);
26 EXPECT_FALSE(array.is_empty());
27}
28
29TEST(array, FillConstructor)
30{
31 Array<int> array(5, 8);
32 EXPECT_EQ(array.size(), 5);
33 EXPECT_EQ(array[0], 8);
34 EXPECT_EQ(array[1], 8);
35 EXPECT_EQ(array[2], 8);
36 EXPECT_EQ(array[3], 8);
37 EXPECT_EQ(array[4], 8);
38}
39
40TEST(array, InitializerListConstructor)
41{
42 Array<int> array = {4, 5, 6, 7};
43 EXPECT_EQ(array.size(), 4);
44 EXPECT_EQ(array[0], 4);
45 EXPECT_EQ(array[1], 5);
46 EXPECT_EQ(array[2], 6);
47 EXPECT_EQ(array[3], 7);
48}
49
50TEST(array, SpanConstructor)
51{
52 int stackarray[4] = {6, 7, 8, 9};
53 Span<int> span(stackarray, ARRAY_SIZE(stackarray));
54 Array<int> array(span);
55 EXPECT_EQ(array.size(), 4);
56 EXPECT_EQ(array[0], 6);
57 EXPECT_EQ(array[1], 7);
58 EXPECT_EQ(array[2], 8);
59 EXPECT_EQ(array[3], 9);
60}
61
62TEST(array, CopyConstructor)
63{
64 Array<int> array = {5, 6, 7, 8};
65 Array<int> new_array(array);
66
67 EXPECT_EQ(array.size(), 4);
68 EXPECT_EQ(new_array.size(), 4);
69 EXPECT_NE(array.data(), new_array.data());
70 EXPECT_EQ(new_array[0], 5);
71 EXPECT_EQ(new_array[1], 6);
72 EXPECT_EQ(new_array[2], 7);
73 EXPECT_EQ(new_array[3], 8);
74}
75
76TEST(array, MoveConstructor)
77{
78 Array<int> array = {5, 6, 7, 8};
79 Array<int> new_array(std::move(array));
80
81 EXPECT_EQ(array.size(), 0); /* NOLINT: bugprone-use-after-move */
82 EXPECT_EQ(new_array.size(), 4);
83 EXPECT_EQ(new_array[0], 5);
84 EXPECT_EQ(new_array[1], 6);
85 EXPECT_EQ(new_array[2], 7);
86 EXPECT_EQ(new_array[3], 8);
87}
88
89TEST(array, CopyAssignment)
90{
91 Array<int> array = {1, 2, 3};
92 Array<int> new_array = {4};
93 EXPECT_EQ(new_array.size(), 1);
94 new_array = array;
95 EXPECT_EQ(new_array.size(), 3);
96 EXPECT_EQ(array.size(), 3);
97 EXPECT_NE(array.data(), new_array.data());
98 EXPECT_EQ(new_array[0], 1);
99 EXPECT_EQ(new_array[1], 2);
100 EXPECT_EQ(new_array[2], 3);
101}
102
103TEST(array, MoveAssignment)
104{
105 Array<int> array = {1, 2, 3};
106 Array<int> new_array = {4};
107 EXPECT_EQ(new_array.size(), 1);
108 new_array = std::move(array);
109 EXPECT_EQ(new_array.size(), 3);
110 EXPECT_EQ(array.size(), 0); /* NOLINT: bugprone-use-after-move */
111 EXPECT_EQ(new_array[0], 1);
112 EXPECT_EQ(new_array[1], 2);
113 EXPECT_EQ(new_array[2], 3);
114}
115
120TEST(array, TrivialTypeSizeConstructor)
121{
123 char *ptr = &(*array)[0];
124 array->~Array();
125
126 const char magic = 42;
127 *ptr = magic;
129
130 new (array) Array<char, 1>(1);
131 EXPECT_EQ((*array)[0], magic);
133 delete array;
134}
135
137 char value;
138
140 {
141 value = 42;
142 }
143};
144
145TEST(array, NoInitializationSizeConstructor)
146{
147 using MyArray = Array<ConstructibleType>;
148
150 memset((void *)&buffer, 100, sizeof(MyArray));
151
152 /* Doing this to avoid some compiler optimization. */
153 for (int64_t i : IndexRange(sizeof(MyArray))) {
154 EXPECT_EQ(((char *)buffer.ptr())[i], 100);
155 }
156
157 {
158 MyArray &array = *new (buffer) MyArray(1, NoInitialization());
159 EXPECT_EQ(array[0].value, 100);
160 array.clear_without_destruct();
161 array.~Array();
162 }
163 {
164 MyArray &array = *new (buffer) MyArray(1);
165 EXPECT_EQ(array[0].value, 42);
166 array.~Array();
167 }
168}
169
171{
172 Array<int> array(5);
173 array.fill(3);
174 EXPECT_EQ(array.size(), 5u);
175 EXPECT_EQ(array[0], 3);
176 EXPECT_EQ(array[1], 3);
177 EXPECT_EQ(array[2], 3);
178 EXPECT_EQ(array[3], 3);
179 EXPECT_EQ(array[4], 3);
180}
181
182TEST(array, ReverseIterator)
183{
184 Array<int> array = {3, 4, 5, 6};
185 Vector<int> reversed_vec;
186
187 for (auto it = array.rbegin(); it != array.rend(); ++it) {
188 reversed_vec.append(*it);
189 *it += 10;
190 }
191
192 EXPECT_EQ_ARRAY(reversed_vec.data(), Span({6, 5, 4, 3}).data(), 4);
193 EXPECT_EQ_ARRAY(array.data(), Span({13, 14, 15, 16}).data(), 4);
194}
195
196TEST(array, SpanConstructorExceptions)
197{
198 std::array<ExceptionThrower, 4> values;
199 values[2].throw_during_copy = true;
200 Span<ExceptionThrower> span{values};
201 EXPECT_ANY_THROW({ Array<ExceptionThrower> array(span); });
202}
203
204TEST(array, SizeValueConstructorExceptions)
205{
206 ExceptionThrower value;
207 value.throw_during_copy = true;
208 EXPECT_ANY_THROW({ Array<ExceptionThrower> array(5, value); });
209}
210
211TEST(array, MoveConstructorExceptions)
212{
214 array[1].throw_during_move = true;
215 EXPECT_ANY_THROW({ Array<ExceptionThrower> array_copy(std::move(array)); });
216}
217
218TEST(array, CopyAssignmentExceptions)
219{
221 array[3].throw_during_copy = true;
222 Array<ExceptionThrower> array_copy(10);
223 EXPECT_ANY_THROW({ array_copy = array; });
224}
225
226TEST(array, MoveAssignmentExceptions)
227{
229 array[2].throw_during_move = true;
230 Array<ExceptionThrower> array_moved(10);
231 EXPECT_ANY_THROW({ array_moved = std::move(array); });
232}
233
235{
236 Array<int> array = {5, 7, 8, 9};
237 EXPECT_EQ(array.last(), 9);
238 EXPECT_EQ(array.last(1), 8);
239 array.last() = 1;
240 EXPECT_EQ(array[3], 1);
241 EXPECT_EQ(const_cast<const Array<int> &>(array).last(), 1);
242 EXPECT_EQ(const_cast<const Array<int> &>(array).last(2), 7);
243}
244
245TEST(array, Reinitialize)
246{
247 Array<std::string> array = {"hello", "world"};
248 EXPECT_EQ(array.size(), 2);
249 EXPECT_EQ(array[1], "world");
250 array.reinitialize(3);
251 EXPECT_EQ(array.size(), 3);
252 EXPECT_EQ(array[0], "");
253 EXPECT_EQ(array[1], "");
254 EXPECT_EQ(array[2], "");
255 array.reinitialize(0);
256 EXPECT_EQ(array.size(), 0);
257}
258
259} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define ARRAY_SIZE(arr)
size_t size() const
int64_t size() const
Definition BLI_array.hh:245
const T * data() const
Definition BLI_array.hh:301
void append(const T &value)
TEST(any, DefaultConstructor)
__int64 int64_t
Definition stdint.h:89
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)
PointerRNA * ptr
Definition wm_files.cc:4126