Blender V4.3
BLI_index_range_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_index_range.hh"
8#include "BLI_vector.hh"
9
10#include "BLI_strict_flags.h" /* Keep last. */
11
12namespace blender::tests {
13
14TEST(index_range, DefaultConstructor)
15{
17 EXPECT_EQ(range.size(), 0);
18
20 for (int64_t value : range) {
21 vector.append(value);
22 }
23 EXPECT_EQ(vector.size(), 0);
24}
25
26TEST(index_range, FromBeginSize)
27{
28 {
29 const IndexRange range = IndexRange::from_begin_size(0, 0);
30 EXPECT_TRUE(range.is_empty());
31 }
32 {
33 const IndexRange range = IndexRange::from_begin_size(0, 10);
34 EXPECT_EQ(range.size(), 10);
35 EXPECT_EQ(range.first(), 0);
36 }
37 {
38 const IndexRange range = IndexRange::from_begin_size(4, 10);
39 EXPECT_EQ(range.size(), 10);
40 EXPECT_EQ(range.first(), 4);
41 EXPECT_EQ(range.last(), 13);
42 }
43}
44
45TEST(index_range, FromBeginEnd)
46{
47 {
48 const IndexRange range = IndexRange::from_begin_end(0, 0);
49 EXPECT_TRUE(range.is_empty());
50 }
51 {
52 const IndexRange range = IndexRange::from_begin_end(0, 10);
53 EXPECT_EQ(range.size(), 10);
54 EXPECT_EQ(range.first(), 0);
55 }
56 {
57 const IndexRange range = IndexRange::from_begin_end(4, 10);
58 EXPECT_EQ(range.size(), 6);
59 EXPECT_EQ(range.first(), 4);
60 EXPECT_EQ(range.last(), 9);
61 }
62}
63
64TEST(index_range, FromBeginEndInclusive)
65{
66 {
68 EXPECT_EQ(range.size(), 1);
69 EXPECT_EQ(range.first(), 0);
70 }
71 {
73 EXPECT_EQ(range.size(), 101);
74 EXPECT_EQ(range.first(), 100);
75 EXPECT_EQ(range.last(), 200);
76 }
77}
78
79TEST(index_range, FromEndSize)
80{
81 {
82 const IndexRange range = IndexRange::from_end_size(0, 0);
83 EXPECT_TRUE(range.is_empty());
84 }
85 {
86 const IndexRange range = IndexRange::from_end_size(100, 20);
87 EXPECT_EQ(range.first(), 80);
88 EXPECT_EQ(range.last(), 99);
89 }
90}
91
92TEST(index_range, FromSingle)
93{
94 {
95 const IndexRange range = IndexRange::from_single(0);
96 EXPECT_EQ(range.size(), 1);
97 EXPECT_EQ(range.first(), 0);
98 }
99 {
100 const IndexRange range = IndexRange::from_single(100);
101 EXPECT_EQ(range.size(), 1);
102 EXPECT_EQ(range.first(), 100);
103 }
104}
105
106TEST(index_range, SingleElementRange)
107{
108 IndexRange range(4, 1);
109 EXPECT_EQ(range.size(), 1);
110 EXPECT_EQ(*range.begin(), 4);
111
113 for (int64_t value : range) {
114 vector.append(value);
115 }
116
117 EXPECT_EQ(vector.size(), 1);
118 EXPECT_EQ(vector[0], 4);
119}
120
121TEST(index_range, MultipleElementRange)
122{
123 IndexRange range(6, 4);
124 EXPECT_EQ(range.size(), 4);
125
127 for (int64_t value : range) {
128 vector.append(value);
129 }
130
131 EXPECT_EQ(vector.size(), 4);
132 for (int i = 0; i < 4; i++) {
133 EXPECT_EQ(vector[i], i + 6);
134 }
135}
136
137TEST(index_range, SubscriptOperator)
138{
139 IndexRange range(5, 5);
140 EXPECT_EQ(range[0], 5);
141 EXPECT_EQ(range[1], 6);
142 EXPECT_EQ(range[2], 7);
143}
144
145TEST(index_range, Before)
146{
147 IndexRange range = IndexRange(5, 5).before(3);
148 EXPECT_EQ(range[0], 2);
149 EXPECT_EQ(range[1], 3);
150 EXPECT_EQ(range[2], 4);
151 EXPECT_EQ(range.size(), 3);
152}
153
154TEST(index_range, After)
155{
156 IndexRange range = IndexRange(5, 5).after(4);
157 EXPECT_EQ(range[0], 10);
158 EXPECT_EQ(range[1], 11);
159 EXPECT_EQ(range[2], 12);
160 EXPECT_EQ(range[3], 13);
161 EXPECT_EQ(range.size(), 4);
162}
163
164TEST(index_range, Contains)
165{
166 IndexRange range = IndexRange(5, 3);
167 EXPECT_TRUE(range.contains(5));
168 EXPECT_TRUE(range.contains(6));
169 EXPECT_TRUE(range.contains(7));
170 EXPECT_FALSE(range.contains(4));
171 EXPECT_FALSE(range.contains(8));
172}
173
174TEST(index_range, First)
175{
176 IndexRange range = IndexRange(5, 3);
177 EXPECT_EQ(range.first(), 5);
178}
179
180TEST(index_range, Last)
181{
182 IndexRange range = IndexRange(5, 3);
183 EXPECT_EQ(range.last(), 7);
184}
185
186TEST(index_range, OneAfterEnd)
187{
188 IndexRange range = IndexRange(5, 3);
189 EXPECT_EQ(range.one_after_last(), 8);
190}
191
192TEST(index_range, OneBeforeStart)
193{
194 IndexRange range = IndexRange(5, 3);
195 EXPECT_EQ(range.one_before_start(), 4);
196}
197
198TEST(index_range, Start)
199{
200 IndexRange range = IndexRange(6, 2);
201 EXPECT_EQ(range.start(), 6);
202}
203
204TEST(index_range, Slice)
205{
206 IndexRange range = IndexRange(5, 15);
207 IndexRange slice = range.slice(2, 6);
208 EXPECT_EQ(slice.size(), 6);
209 EXPECT_EQ(slice.first(), 7);
210 EXPECT_EQ(slice.last(), 12);
211}
212
213TEST(index_range, Intersect)
214{
215 IndexRange range = IndexRange(5, 15);
216 EXPECT_EQ(range.intersect(IndexRange(2, 2)), IndexRange(5, 0));
217 EXPECT_EQ(range.intersect(IndexRange(4, 2)), IndexRange(5, 1));
218 EXPECT_EQ(range.intersect(IndexRange(3, 20)), IndexRange(5, 15));
219 EXPECT_EQ(range.intersect(IndexRange(5, 15)), IndexRange(5, 15));
220 EXPECT_EQ(range.intersect(IndexRange(15, 10)), IndexRange(15, 5));
221 EXPECT_EQ(range.intersect(IndexRange(22, 2)), IndexRange(20, 0));
222}
223
224TEST(index_range, SliceRange)
225{
226 IndexRange range = IndexRange(5, 15);
227 IndexRange slice = range.slice(IndexRange(3, 5));
228 EXPECT_EQ(slice.size(), 5);
229 EXPECT_EQ(slice.first(), 8);
230 EXPECT_EQ(slice.last(), 12);
231}
232
233TEST(index_range, DropBack)
234{
235 IndexRange a(4, 4);
236 auto slice = a.drop_back(2);
237 EXPECT_EQ(slice.size(), 2);
238 EXPECT_EQ(slice.start(), 4);
239 EXPECT_EQ(slice[1], 5);
240}
241
242TEST(index_range, DropBackAll)
243{
244 IndexRange a(4, 4);
245 auto slice = a.drop_back(a.size());
246 EXPECT_TRUE(slice.is_empty());
247}
248
249TEST(index_range, DropFront)
250{
251 IndexRange a(4, 4);
252 auto slice = a.drop_front(1);
253 EXPECT_EQ(slice.size(), 3);
254 EXPECT_EQ(slice[0], 5);
255 EXPECT_EQ(slice[1], 6);
256 EXPECT_EQ(slice.last(), 7);
257}
258
259TEST(index_range, DropFrontLargeN)
260{
261 IndexRange a(1, 5);
262 IndexRange slice = a.drop_front(100);
263 EXPECT_TRUE(slice.is_empty());
264}
265
266TEST(index_range, DropFrontAll)
267{
268 IndexRange a(50);
269 IndexRange slice = a.drop_front(a.size());
270 EXPECT_TRUE(slice.is_empty());
271}
272
273TEST(index_range, TakeFront)
274{
275 IndexRange a(4, 4);
276 IndexRange slice = a.take_front(2);
277 EXPECT_EQ(slice.size(), 2);
278 EXPECT_EQ(slice[0], 4);
279 EXPECT_EQ(slice[1], 5);
280}
281
282TEST(index_range, TakeFrontLargeN)
283{
284 IndexRange a(4, 4);
285 IndexRange slice = a.take_front(100);
286 EXPECT_EQ(slice.size(), 4);
287}
288
289TEST(index_range, TakeBack)
290{
291 IndexRange a(4, 4);
292 auto slice = a.take_back(2);
293 EXPECT_EQ(slice.size(), 2);
294 EXPECT_EQ(slice[0], 6);
295 EXPECT_EQ(slice[1], 7);
296}
297
298TEST(index_range, TakeBackLargeN)
299{
300 IndexRange a(3, 4);
301 IndexRange slice = a.take_back(100);
302 EXPECT_EQ(slice.size(), 4);
303 EXPECT_EQ(slice.size(), 4);
304}
305
306TEST(index_range, constexpr_)
307{
308 constexpr IndexRange range = IndexRange(1, 1);
309 std::array<int, range[0]> compiles = {1};
310 BLI_STATIC_ASSERT(range.size() == 1, "");
311 EXPECT_EQ(compiles[0], 1);
312}
313
314TEST(index_range, GenericAlgorithms)
315{
316 IndexRange range{4, 10};
317 EXPECT_TRUE(std::any_of(range.begin(), range.end(), [](int v) { return v == 6; }));
318 EXPECT_FALSE(std::any_of(range.begin(), range.end(), [](int v) { return v == 20; }));
319 EXPECT_EQ(std::count_if(range.begin(), range.end(), [](int v) { return v < 7; }), 3);
320}
321
322TEST(index_range, SplitByAlignment)
323{
324 {
326 EXPECT_EQ(ranges.prefix, IndexRange());
327 EXPECT_EQ(ranges.aligned, IndexRange());
328 EXPECT_EQ(ranges.suffix, IndexRange());
329 }
330 {
332 EXPECT_EQ(ranges.prefix, IndexRange());
333 EXPECT_EQ(ranges.aligned, IndexRange(0, 24));
334 EXPECT_EQ(ranges.suffix, IndexRange());
335 }
336 {
338 EXPECT_EQ(ranges.prefix, IndexRange(1, 2));
339 EXPECT_EQ(ranges.aligned, IndexRange());
340 EXPECT_EQ(ranges.suffix, IndexRange());
341 }
342 {
344 EXPECT_EQ(ranges.prefix, IndexRange(3, 5));
345 EXPECT_EQ(ranges.aligned, IndexRange(8, 40));
346 EXPECT_EQ(ranges.suffix, IndexRange(48, 5));
347 }
348 {
350 EXPECT_EQ(ranges.prefix, IndexRange());
351 EXPECT_EQ(ranges.aligned, IndexRange(3, 50));
352 EXPECT_EQ(ranges.suffix, IndexRange());
353 }
354 {
356 EXPECT_EQ(ranges.prefix, IndexRange());
357 EXPECT_EQ(ranges.aligned, IndexRange(64, 16));
358 EXPECT_EQ(ranges.suffix, IndexRange());
359 }
360 {
362 EXPECT_EQ(ranges.prefix, IndexRange(3, 5));
363 EXPECT_EQ(ranges.aligned, IndexRange());
364 EXPECT_EQ(ranges.suffix, IndexRange());
365 }
366 {
368 EXPECT_EQ(ranges.prefix, IndexRange());
369 EXPECT_EQ(ranges.aligned, IndexRange(64));
370 EXPECT_EQ(ranges.suffix, IndexRange());
371 }
372 {
374 EXPECT_EQ(ranges.prefix, IndexRange());
375 EXPECT_EQ(ranges.aligned, IndexRange(64, 64));
376 EXPECT_EQ(ranges.suffix, IndexRange());
377 }
378 {
380 EXPECT_EQ(ranges.prefix, IndexRange(4, 8));
381 EXPECT_EQ(ranges.aligned, IndexRange());
382 EXPECT_EQ(ranges.suffix, IndexRange());
383 }
384}
385
386} // namespace blender::tests
#define BLI_STATIC_ASSERT(a, msg)
Definition BLI_assert.h:87
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a vector
ATTR_WARN_UNUSED_RESULT const BMVert * v
DBVT_INLINE bool Intersect(const btDbvtAabbMm &a, const btDbvtAabbMm &b)
Definition btDbvt.h:621
constexpr int64_t first() const
static constexpr IndexRange from_end_size(const int64_t end, const int64_t size)
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t size() const
constexpr bool is_empty() const
static constexpr IndexRange from_begin_end(const int64_t begin, const int64_t end)
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
constexpr IndexRange after(int64_t n) const
constexpr IndexRange before(int64_t n) const
constexpr IndexRange take_back(int64_t n) const
static constexpr IndexRange from_single(const int64_t index)
constexpr IndexRange slice(int64_t start, int64_t size) const
constexpr IndexRange take_front(int64_t n) const
static constexpr IndexRange from_begin_end_inclusive(const int64_t begin, const int64_t last)
constexpr IndexRange drop_front(int64_t n) const
IndexRange range
TEST(any, DefaultConstructor)
AlignedIndexRanges split_index_range_by_alignment(const IndexRange range, const int64_t alignment)
__int64 int64_t
Definition stdint.h:89