Blender V5.0
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" /* IWYU pragma: keep. Keep last. */
11
12namespace blender::tests {
13
14TEST(index_range, DefaultConstructor)
15{
16 IndexRange range;
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:83
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
ATTR_WARN_UNUSED_RESULT const BMVert * v
long long int int64_t
DBVT_INLINE bool Intersect(const btDbvtAabbMm &a, const btDbvtAabbMm &b)
Definition btDbvt.h:621
constexpr int64_t one_before_start() const
constexpr int64_t first() const
constexpr int64_t one_after_last() const
constexpr Iterator end() const
constexpr IndexRange intersect(IndexRange other) const
constexpr IndexRange drop_back(int64_t n) 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 int64_t start() const
constexpr IndexRange before(int64_t n) const
constexpr IndexRange take_back(int64_t n) const
constexpr Iterator begin() const
static constexpr IndexRange from_single(const int64_t index)
constexpr IndexRange slice(int64_t start, int64_t size) const
constexpr bool contains(int64_t value) 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
TEST(blf_load, load)
Definition BLF_tests.cc:34
AlignedIndexRanges split_index_range_by_alignment(const IndexRange range, const int64_t alignment)
i
Definition text_draw.cc:230