Blender
V4.3
source
blender
blenlib
tests
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
"
8
#include "
BLI_exception_safety_test_utils.hh
"
9
#include "
BLI_vector.hh
"
10
11
#include "
BLI_strict_flags.h
"
/* Keep last. */
12
13
namespace
blender::tests
{
14
15
TEST
(
array
, DefaultConstructor)
16
{
17
Array<int>
array
;
18
EXPECT_EQ
(
array
.
size
(), 0);
19
EXPECT_TRUE(
array
.is_empty());
20
}
21
22
TEST
(
array
, SizeConstructor)
23
{
24
Array<int>
array
(5);
25
EXPECT_EQ
(
array
.
size
(), 5);
26
EXPECT_FALSE(
array
.is_empty());
27
}
28
29
TEST
(
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
40
TEST
(
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
50
TEST
(
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
62
TEST
(
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
76
TEST
(
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
89
TEST
(
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
103
TEST
(
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
120
TEST
(
array
, TrivialTypeSizeConstructor)
121
{
122
Array<char, 1>
*
array
=
new
Array<char, 1>
(1);
123
char
*
ptr
= &(*array)[0];
124
array
->~Array();
125
126
const
char
magic
= 42;
127
*
ptr
=
magic
;
128
EXPECT_EQ
(*
ptr
,
magic
);
129
130
new
(
array
)
Array<char, 1>
(1);
131
EXPECT_EQ
((*
array
)[0],
magic
);
132
EXPECT_EQ
(*
ptr
,
magic
);
133
delete
array
;
134
}
135
136
struct
ConstructibleType
{
137
char
value
;
138
139
ConstructibleType
()
140
{
141
value = 42;
142
}
143
};
144
145
TEST
(
array
, NoInitializationSizeConstructor)
146
{
147
using
MyArray =
Array<ConstructibleType>
;
148
149
TypedBuffer<MyArray>
buffer;
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
170
TEST
(
array
, Fill)
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
182
TEST
(
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
196
TEST
(
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
204
TEST
(
array
, SizeValueConstructorExceptions)
205
{
206
ExceptionThrower
value;
207
value.
throw_during_copy
=
true
;
208
EXPECT_ANY_THROW({
Array<ExceptionThrower>
array
(5, value); });
209
}
210
211
TEST
(
array
, MoveConstructorExceptions)
212
{
213
Array<ExceptionThrower, 4>
array
(3);
214
array
[1].throw_during_move =
true
;
215
EXPECT_ANY_THROW({
Array<ExceptionThrower>
array_copy(std::move(
array
)); });
216
}
217
218
TEST
(
array
, CopyAssignmentExceptions)
219
{
220
Array<ExceptionThrower>
array
(5);
221
array
[3].throw_during_copy =
true
;
222
Array<ExceptionThrower>
array_copy(10);
223
EXPECT_ANY_THROW({ array_copy =
array
; });
224
}
225
226
TEST
(
array
, MoveAssignmentExceptions)
227
{
228
Array<ExceptionThrower, 4>
array
(4);
229
array
[2].throw_during_move =
true
;
230
Array<ExceptionThrower>
array_moved(10);
231
EXPECT_ANY_THROW({ array_moved = std::move(
array
); });
232
}
233
234
TEST
(
array
, Last)
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
245
TEST
(
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
BLI_array.hh
BLI_exception_safety_test_utils.hh
EXPECT_EQ
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BLI_strict_flags.h
ARRAY_SIZE
#define ARRAY_SIZE(arr)
Definition
BLI_utildefines.h:296
BLI_vector.hh
data
data
Definition
bmesh_operator_api_inline.hh:159
array
Definition
cycles/util/array.h:25
array::data
T * data()
Definition
cycles/util/array.h:193
array::size
size_t size() const
Definition
cycles/util/array.h:188
blender::Array
Definition
BLI_array.hh:50
blender::Array::size
int64_t size() const
Definition
BLI_array.hh:245
blender::Array::data
const T * data() const
Definition
BLI_array.hh:301
blender::IndexRange
Definition
BLI_index_range.hh:50
blender::NoInitialization
Definition
BLI_memory_utils.hh:272
blender::Span
Definition
BLI_span.hh:75
blender::TypedBuffer
Definition
BLI_memory_utils.hh:156
blender::TypedBuffer::ptr
T * ptr()
Definition
BLI_memory_utils.hh:203
blender::Vector
Definition
BLI_vector.hh:65
blender::Vector::append
void append(const T &value)
Definition
BLI_vector.hh:430
blender::Vector::data
T * data()
Definition
BLI_vector.hh:865
blender::tests::ExceptionThrower
Definition
BLI_exception_safety_test_utils.hh:12
blender::tests::ExceptionThrower::throw_during_copy
bool throw_during_copy
Definition
BLI_exception_safety_test_utils.hh:24
blender::tests
Definition
BLI_any_test.cc:10
blender::tests::TEST
TEST(any, DefaultConstructor)
Definition
BLI_any_test.cc:12
int64_t
__int64 int64_t
Definition
stdint.h:89
blender::tests::ConstructibleType
Definition
BLI_array_test.cc:136
blender::tests::ConstructibleType::ConstructibleType
ConstructibleType()
Definition
BLI_array_test.cc:139
blender::tests::ConstructibleType::value
char value
Definition
BLI_array_test.cc:137
magic
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)
Definition
texture_procedural.cc:293
ptr
PointerRNA * ptr
Definition
wm_files.cc:4126
Generated on Thu Feb 6 2025 07:36:39 for Blender by
doxygen
1.11.0