Blender  V2.93
BLI_index_range_test.cc
Go to the documentation of this file.
1 /* Apache License, Version 2.0 */
2 
3 #include "BLI_index_range.hh"
4 #include "BLI_strict_flags.h"
5 #include "BLI_vector.hh"
6 #include "testing/testing.h"
7 
8 namespace blender::tests {
9 
10 TEST(index_range, DefaultConstructor)
11 {
12  IndexRange range;
13  EXPECT_EQ(range.size(), 0);
14 
16  for (int64_t value : range) {
17  vector.append(value);
18  }
19  EXPECT_EQ(vector.size(), 0);
20 }
21 
22 TEST(index_range, SingleElementRange)
23 {
24  IndexRange range(4, 1);
25  EXPECT_EQ(range.size(), 1);
26  EXPECT_EQ(*range.begin(), 4);
27 
29  for (int64_t value : range) {
30  vector.append(value);
31  }
32 
33  EXPECT_EQ(vector.size(), 1);
34  EXPECT_EQ(vector[0], 4);
35 }
36 
37 TEST(index_range, MultipleElementRange)
38 {
39  IndexRange range(6, 4);
40  EXPECT_EQ(range.size(), 4);
41 
43  for (int64_t value : range) {
44  vector.append(value);
45  }
46 
47  EXPECT_EQ(vector.size(), 4);
48  for (int i = 0; i < 4; i++) {
49  EXPECT_EQ(vector[i], i + 6);
50  }
51 }
52 
53 TEST(index_range, SubscriptOperator)
54 {
55  IndexRange range(5, 5);
56  EXPECT_EQ(range[0], 5);
57  EXPECT_EQ(range[1], 6);
58  EXPECT_EQ(range[2], 7);
59 }
60 
61 TEST(index_range, Before)
62 {
63  IndexRange range = IndexRange(5, 5).before(3);
64  EXPECT_EQ(range[0], 2);
65  EXPECT_EQ(range[1], 3);
66  EXPECT_EQ(range[2], 4);
67  EXPECT_EQ(range.size(), 3);
68 }
69 
70 TEST(index_range, After)
71 {
72  IndexRange range = IndexRange(5, 5).after(4);
73  EXPECT_EQ(range[0], 10);
74  EXPECT_EQ(range[1], 11);
75  EXPECT_EQ(range[2], 12);
76  EXPECT_EQ(range[3], 13);
77  EXPECT_EQ(range.size(), 4);
78 }
79 
80 TEST(index_range, Contains)
81 {
82  IndexRange range = IndexRange(5, 3);
83  EXPECT_TRUE(range.contains(5));
84  EXPECT_TRUE(range.contains(6));
85  EXPECT_TRUE(range.contains(7));
86  EXPECT_FALSE(range.contains(4));
87  EXPECT_FALSE(range.contains(8));
88 }
89 
90 TEST(index_range, First)
91 {
92  IndexRange range = IndexRange(5, 3);
93  EXPECT_EQ(range.first(), 5);
94 }
95 
96 TEST(index_range, Last)
97 {
98  IndexRange range = IndexRange(5, 3);
99  EXPECT_EQ(range.last(), 7);
100 }
101 
102 TEST(index_range, OneAfterEnd)
103 {
104  IndexRange range = IndexRange(5, 3);
105  EXPECT_EQ(range.one_after_last(), 8);
106 }
107 
108 TEST(index_range, Start)
109 {
110  IndexRange range = IndexRange(6, 2);
111  EXPECT_EQ(range.start(), 6);
112 }
113 
114 TEST(index_range, Slice)
115 {
116  IndexRange range = IndexRange(5, 15);
117  IndexRange slice = range.slice(2, 6);
118  EXPECT_EQ(slice.size(), 6);
119  EXPECT_EQ(slice.first(), 7);
120  EXPECT_EQ(slice.last(), 12);
121 }
122 
123 TEST(index_range, SliceRange)
124 {
125  IndexRange range = IndexRange(5, 15);
126  IndexRange slice = range.slice(IndexRange(3, 5));
127  EXPECT_EQ(slice.size(), 5);
128  EXPECT_EQ(slice.first(), 8);
129  EXPECT_EQ(slice.last(), 12);
130 }
131 
132 TEST(index_range, AsSpan)
133 {
134  IndexRange range = IndexRange(4, 6);
135  Span<int64_t> span = range.as_span();
136  EXPECT_EQ(span.size(), 6);
137  EXPECT_EQ(span[0], 4);
138  EXPECT_EQ(span[1], 5);
139  EXPECT_EQ(span[2], 6);
140  EXPECT_EQ(span[3], 7);
141 }
142 
143 TEST(index_range, constexpr_)
144 {
145  constexpr IndexRange range = IndexRange(1, 1);
146  std::array<int, range[0]> compiles = {1};
147  BLI_STATIC_ASSERT(range.size() == 1, "");
148  EXPECT_EQ(compiles[0], 1);
149 }
150 
151 TEST(index_range, GenericAlgorithms)
152 {
153  IndexRange range{4, 10};
154  EXPECT_TRUE(std::any_of(range.begin(), range.end(), [](int v) { return v == 6; }));
155  EXPECT_FALSE(std::any_of(range.begin(), range.end(), [](int v) { return v == 20; }));
156  EXPECT_EQ(std::count_if(range.begin(), range.end(), [](int v) { return v < 7; }), 3);
157 }
158 
159 } // namespace blender::tests
#define BLI_STATIC_ASSERT(a, msg)
Definition: BLI_assert.h:86
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr int64_t first() const
constexpr int64_t one_after_last() const
Span< int64_t > as_span() const
constexpr int64_t size() const
constexpr IndexRange after(int64_t n) const
constexpr int64_t start() const
constexpr IndexRange before(int64_t n) const
constexpr Iterator begin() const
constexpr IndexRange slice(int64_t start, int64_t size) const
constexpr bool contains(int64_t value) const
constexpr int64_t last() const
constexpr int64_t size() const
Definition: BLI_span.hh:254
TEST(array, DefaultConstructor)
std::vector< ElementType, Eigen::aligned_allocator< ElementType > > vector
Definition: vector.h:39
__int64 int64_t
Definition: stdint.h:92