Blender V4.3
BLI_array_utils_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_utils.h"
8#include "BLI_array_utils.hh"
9#include "BLI_utildefines.h"
11
12/* -------------------------------------------------------------------- */
13/* tests */
14
15/* BLI_array_reverse */
16TEST(array_utils, ReverseStringEmpty)
17{
18 char data[] = "";
19 BLI_array_reverse(data, ARRAY_SIZE(data) - 1);
20 EXPECT_STREQ("", data);
21}
22
23TEST(array_utils, ReverseStringSingle)
24{
25 char data[] = "0";
26 BLI_array_reverse(data, ARRAY_SIZE(data) - 1);
27 EXPECT_STREQ("0", data);
28}
29
30TEST(array_utils, ReverseString4)
31{
32 char data[] = "0123";
33 BLI_array_reverse(data, ARRAY_SIZE(data) - 1);
34 EXPECT_STREQ("3210", data);
35}
36
37TEST(array_utils, ReverseInt4)
38{
39 const int data_cmp[] = {3, 2, 1, 0};
40 int data[] = {0, 1, 2, 3};
41 BLI_array_reverse(data, ARRAY_SIZE(data));
42 EXPECT_EQ_ARRAY(data_cmp, data, ARRAY_SIZE(data));
43}
44
45/* BLI_array_findindex */
46TEST(array_utils, FindIndexStringEmpty)
47{
48 char data[] = "", find = '0';
49 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data) - 1, &find), -1);
50 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data) - 1, &find), -1);
51}
52
53TEST(array_utils, FindIndexStringSingle)
54{
55 char data[] = "0", find = '0';
56 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data) - 1, &find), 0);
57 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data) - 1, &find), 0);
58}
59
60TEST(array_utils, FindIndexStringSingleMissing)
61{
62 char data[] = "1", find = '0';
63 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data) - 1, &find), -1);
64 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data) - 1, &find), -1);
65}
66
67TEST(array_utils, FindIndexString4)
68{
69 char data[] = "0123", find = '3';
70 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data) - 1, &find), 3);
71 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data) - 1, &find), 3);
72}
73
74TEST(array_utils, FindIndexInt4)
75{
76 int data[] = {0, 1, 2, 3}, find = 3;
77 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data), &find), 3);
78 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data), &find), 3);
79}
80
81TEST(array_utils, FindIndexInt4_DupeEnd)
82{
83 int data[] = {0, 1, 2, 0}, find = 0;
84 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data), &find), 0);
85 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data), &find), 3);
86}
87
88TEST(array_utils, FindIndexInt4_DupeMid)
89{
90 int data[] = {1, 0, 0, 3}, find = 0;
91 EXPECT_EQ(BLI_array_findindex(data, ARRAY_SIZE(data), &find), 1);
92 EXPECT_EQ(BLI_array_rfindindex(data, ARRAY_SIZE(data), &find), 2);
93}
94
95TEST(array_utils, FindIndexPointer)
96{
97 const char *data[4] = {nullptr};
98 STACK_DECLARE(data);
99
100 STACK_INIT(data, ARRAY_SIZE(data));
101
102 const char *a = "a", *b = "b", *c = "c", *d = "d";
103
104#define STACK_PUSH_AND_CHECK_FORWARD(v, i) \
105 { \
106 STACK_PUSH(data, v); \
107 EXPECT_EQ(BLI_array_findindex(data, STACK_SIZE(data), &(v)), i); \
108 } \
109 ((void)0)
110
111#define STACK_PUSH_AND_CHECK_BACKWARD(v, i) \
112 { \
113 STACK_PUSH(data, v); \
114 EXPECT_EQ(BLI_array_rfindindex(data, STACK_SIZE(data), &(v)), i); \
115 } \
116 ((void)0)
117
118#define STACK_PUSH_AND_CHECK_BOTH(v, i) \
119 { \
120 STACK_PUSH(data, v); \
121 EXPECT_EQ(BLI_array_findindex(data, STACK_SIZE(data), &(v)), i); \
122 EXPECT_EQ(BLI_array_rfindindex(data, STACK_SIZE(data), &(v)), i); \
123 } \
124 ((void)0)
125
130
131 STACK_POP(data);
133
134 STACK_POP(data);
136
137 STACK_POP(data);
138 STACK_POP(data);
139
142
143#undef STACK_PUSH_AND_CHECK_FORWARD
144#undef STACK_PUSH_AND_CHECK_BACKWARD
145#undef STACK_PUSH_AND_CHECK_BOTH
146}
147
148/* BLI_array_binary_and */
149#define BINARY_AND_TEST(data_cmp, data_a, data_b, data_combine, length) \
150 { \
151 BLI_array_binary_and(data_combine, data_a, data_b, length); \
152 EXPECT_EQ_ARRAY(data_cmp, data_combine, length); \
153 } \
154 ((void)0)
155
156TEST(array_utils, BinaryAndInt4Zero)
157{
158 const int data_cmp[] = {0, 0, 0, 0};
159 int data_a[] = {0, 1, 0, 1}, data_b[] = {1, 0, 1, 0};
160 int data_combine[ARRAY_SIZE(data_cmp)];
161 BINARY_AND_TEST(data_cmp, data_a, data_b, data_combine, ARRAY_SIZE(data_cmp));
162}
163
164TEST(array_utils, BinaryAndInt4Mix)
165{
166 const int data_cmp[] = {1, 0, 1, 0};
167 int data_a[] = {1, 1, 1, 1}, data_b[] = {1, 0, 1, 0};
168 int data_combine[ARRAY_SIZE(data_cmp)];
169 BINARY_AND_TEST(data_cmp, data_a, data_b, data_combine, ARRAY_SIZE(data_cmp));
170}
171#undef BINARY_AND_TEST
172
173/* BLI_array_binary_or */
174#define BINARY_OR_TEST(data_cmp, data_a, data_b, data_combine, length) \
175 { \
176 BLI_array_binary_or(data_combine, data_a, data_b, length); \
177 EXPECT_EQ_ARRAY(data_combine, data_cmp, length); \
178 } \
179 ((void)0)
180
181TEST(array_utils, BinaryOrInt4Alternate)
182{
183 int data_a[] = {0, 1, 0, 1}, data_b[] = {1, 0, 1, 0}, data_cmp[] = {1, 1, 1, 1};
184 int data_combine[ARRAY_SIZE(data_cmp)];
185 BINARY_OR_TEST(data_cmp, data_a, data_b, data_combine, ARRAY_SIZE(data_cmp));
186}
187
188TEST(array_utils, BinaryOrInt4Mix)
189{
190 int data_a[] = {1, 1, 0, 0}, data_b[] = {0, 0, 1, 0}, data_cmp[] = {1, 1, 1, 0};
191 int data_combine[ARRAY_SIZE(data_cmp)];
192 BINARY_OR_TEST(data_cmp, data_a, data_b, data_combine, ARRAY_SIZE(data_cmp));
193}
194#undef BINARY_OR_TEST
195
196/* BLI_array_deduplicate_ordered */
197#define DEDUPLICATE_ORDERED_TEST(data, data_cmp) \
198 { \
199 const uint data_len_new = BLI_array_deduplicate_ordered(data, ARRAY_SIZE(data)); \
200 EXPECT_EQ(data_len_new, ARRAY_SIZE(data_cmp)); \
201 EXPECT_EQ_ARRAY(data, data_cmp, data_len_new); \
202 /* Ensure running a second time does nothing. */ \
203 const uint data_len_test = BLI_array_deduplicate_ordered(data, data_len_new); \
204 EXPECT_EQ(data_len_test, ARRAY_SIZE(data_cmp)); \
205 EXPECT_EQ_ARRAY(data, data_cmp, data_len_new); \
206 } \
207 ((void)0)
208
209TEST(array_utils, DeduplicateOrdered1)
210{
211 int data[] = {0};
212 const int data_cmp[] = {0};
213 DEDUPLICATE_ORDERED_TEST(data, data_cmp);
214}
215
216TEST(array_utils, DeduplicateOrdered2)
217{
218 int data[] = {1, 2};
219 const int data_cmp[] = {1, 2};
220 DEDUPLICATE_ORDERED_TEST(data, data_cmp);
221}
222
223TEST(array_utils, DeduplicateOrdered2Same)
224{
225 int data[] = {1, 1};
226 const int data_cmp[] = {1};
227 DEDUPLICATE_ORDERED_TEST(data, data_cmp);
228}
229
230TEST(array_utils, DeduplicateOrdered3Same)
231{
232 int data[] = {1, 1, 1};
233 const int data_cmp[] = {1};
234 DEDUPLICATE_ORDERED_TEST(data, data_cmp);
235}
236
237TEST(array_utils, DeduplicateOrdered3)
238{
239 int data[] = {3, 3, 2, 2, 1, 1};
240 const int data_cmp[] = {3, 2, 1};
241 DEDUPLICATE_ORDERED_TEST(data, data_cmp);
242}
243
244#undef DEDUPLICATE_ORDERED_TEST
245
248{
249 using namespace blender;
250 Vector<IndexRange> ranges = array_utils::find_all_ranges(data, true);
251 EXPECT_EQ(ranges.size(), data_cmp.size());
252 EXPECT_EQ_ARRAY(data_cmp.data(), ranges.as_span().data(), data_cmp.size());
253}
254
255TEST(array_utils, FindAllRanges1)
256{
257 using namespace blender;
258 const std::array data = {false};
259 Vector<IndexRange> ranges = array_utils::find_all_ranges(Span(data.data(), data.size()), true);
260 EXPECT_EQ(ranges.size(), 0);
261}
262
263TEST(array_utils, FindAllRanges2)
264{
265 using namespace blender;
266 const std::array data = {true, true, true};
267 const std::array data_cmp = {IndexRange(0, 3)};
268 find_all_ranges_test(data, data_cmp);
269}
270
271TEST(array_utils, FindAllRanges3)
272{
273 using namespace blender;
274 const std::array data = {true, false};
275 const std::array data_cmp = {IndexRange(0, 1)};
276 find_all_ranges_test(data, data_cmp);
277}
278
279TEST(array_utils, FindAllRanges4)
280{
281 using namespace blender;
282 const std::array data = {false, true};
283 const std::array data_cmp = {IndexRange(1, 1)};
284 find_all_ranges_test(data, data_cmp);
285}
286
287TEST(array_utils, FindAllRanges5)
288{
289 using namespace blender;
290 const std::array data = {true, false, false, true, true, false, true};
291 const std::array data_cmp = {IndexRange(0, 1), IndexRange(3, 2), IndexRange(6, 1)};
292 find_all_ranges_test(data, data_cmp);
293}
Generic array manipulation API.
#define BLI_array_reverse(arr, arr_len)
#define BLI_array_findindex(arr, arr_len, p)
#define BLI_array_rfindindex(arr, arr_len, p)
#define BINARY_OR_TEST(data_cmp, data_a, data_b, data_combine, length)
#define STACK_PUSH_AND_CHECK_FORWARD(v, i)
#define DEDUPLICATE_ORDERED_TEST(data, data_cmp)
#define STACK_PUSH_AND_CHECK_BOTH(v, i)
#define STACK_PUSH_AND_CHECK_BACKWARD(v, i)
#define BINARY_AND_TEST(data_cmp, data_a, data_b, data_combine, length)
TEST(array_utils, ReverseStringEmpty)
static void find_all_ranges_test(const blender::Span< bool > data, const blender::Span< blender::IndexRange > data_cmp)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define ARRAY_SIZE(arr)
#define STACK_POP(stack)
#define STACK_DECLARE(stack)
#define STACK_INIT(stack, stack_num)
constexpr const T * data() const
Definition BLI_span.hh:216
constexpr int64_t size() const
Definition BLI_span.hh:253
local_group_size(16, 16) .push_constant(Type b