Blender V4.3
BLI_bounds_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_math_base.hh"
8
9#include "BLI_array.hh"
10#include "BLI_bounds.hh"
11
12namespace blender::tests {
13
14TEST(bounds, Empty)
15{
16 Bounds<float2> bounds1(float2(0.0f));
17 Bounds<float2> bounds2(float2(1.0f), float2(-1.0f));
18 Bounds<float2> bounds3(float2(-1.0f), float2(1.0f));
19 EXPECT_TRUE(bounds1.is_empty());
20 EXPECT_TRUE(bounds2.is_empty());
21 EXPECT_FALSE(bounds3.is_empty());
22}
23
24TEST(bounds, EmptyInt)
25{
26 Bounds<int> bounds1(0);
27 Bounds<int> bounds2(1, -1);
28 Bounds<int> bounds3(-1, 1);
29 EXPECT_TRUE(bounds1.is_empty());
30 EXPECT_TRUE(bounds2.is_empty());
31 EXPECT_FALSE(bounds3.is_empty());
32}
33
34TEST(bounds, Center)
35{
36 Bounds<float2> bounds1(float2(0.0f));
37 Bounds<float2> bounds2(float2(-1.0f));
38 Bounds<float2> bounds3(float2(-1.0f), float2(1.0f));
39 Bounds<float2> bounds4(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
40 EXPECT_EQ(bounds1.center(), float2(0.0f));
41 EXPECT_EQ(bounds2.center(), float2(-1.0f));
42 EXPECT_EQ(bounds3.center(), float2(0.0f));
43 EXPECT_EQ(bounds4.center(), float2(-0.5f, -0.5f));
44}
45
46TEST(bounds, Size)
47{
48 Bounds<float2> bounds1(float2(0.0f));
49 Bounds<float2> bounds2(float2(-1.0f));
50 Bounds<float2> bounds3(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
51 EXPECT_EQ(bounds1.size(), float2(0.0f));
52 EXPECT_EQ(bounds2.size(), float2(0.0f));
53 EXPECT_EQ(bounds3.size(), float2(5.0f, 9.0f));
54}
55
56TEST(bounds, Translate)
57{
58 Bounds<float2> bounds1(float2(0.0f));
59 Bounds<float2> bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
60 bounds1.translate(float2(-1.0f));
61 bounds2.translate(float2(2.0f));
62 EXPECT_EQ(bounds1.min, float2(-1.0f));
63 EXPECT_EQ(bounds1.max, float2(-1.0f));
64 EXPECT_EQ(bounds2.min, float2(-1.0f, -3.0f));
65 EXPECT_EQ(bounds2.max, float2(4.0f, 6.0f));
66}
67
68TEST(bounds, ScaleFromCenter)
69{
70 Bounds<float2> bounds1(float2(0.0f));
71 Bounds<float2> bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
72 bounds1.scale_from_center(float2(2.0f));
73 const float2 bound2_size = bounds2.size();
74 bounds2.scale_from_center(float2(2.0f, 1.0f));
75 EXPECT_EQ(bounds1.min, float2(0.0f));
76 EXPECT_EQ(bounds1.max, float2(0.0f));
77 EXPECT_EQ(bounds2.min, float2(-5.5f, -5.0f));
78 EXPECT_EQ(bounds2.max, float2(4.5f, 4.0f));
79 EXPECT_EQ(bounds2.size(), bound2_size * float2(2.0f, 1.0f));
80}
81
82TEST(bounds, Resize)
83{
84 Bounds<float2> bounds1(float2(0.0f));
85 Bounds<float2> bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
86 bounds1.resize(float2(1.0f));
87 bounds2.resize(float2(7.0f, 10.0f));
88 EXPECT_EQ(bounds1.center(), float2(0.0f));
89 EXPECT_EQ(bounds1.size(), float2(1.0f));
90 EXPECT_EQ(bounds2.size(), float2(7.0f, 10.0f));
91}
92
93TEST(bounds, Recenter)
94{
95 Bounds<float2> bounds1(float2(0.0f));
96 Bounds<float2> bounds2(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
97 bounds1.recenter(float2(-1.0f));
98 bounds2.recenter(float2(2.0f, 3.0f));
99 EXPECT_EQ(bounds1.center(), float2(-1.0f));
100 EXPECT_EQ(bounds2.center(), float2(2.0f, 3.0f));
101}
102
103TEST(bounds, Pad)
104{
105 Bounds<float2> bounds1(float2(0.0f));
106 Bounds<float2> bounds2(float2(-1.0f), float2(1.0f));
107 Bounds<float2> bounds3(float2(-3.0f, -5.0f), float2(2.0f, 4.0f));
108 bounds1.pad(float2(1.0f));
109 bounds2.pad(1.0f);
110 bounds3.pad(float2(1.0f, 2.0f));
111 EXPECT_EQ(bounds1.min, float2(-1.0f));
112 EXPECT_EQ(bounds1.max, float2(1.0f));
113 EXPECT_EQ(bounds2.min, float2(-2.0f));
114 EXPECT_EQ(bounds2.max, float2(2.0f));
115 EXPECT_EQ(bounds3.min, float2(-4.0f, -7.0f));
116 EXPECT_EQ(bounds3.max, float2(3.0f, 6.0f));
117}
118
119TEST(bounds, MinMaxEmpty)
120{
121 Span<float2> empty_span{};
122 EXPECT_TRUE(empty_span.is_empty());
123 auto result = bounds::min_max(empty_span);
124 EXPECT_EQ(result, std::nullopt);
125}
126
127TEST(bounds, MinMax)
128{
129 Array<float2> data = {float2(0, 1), float2(3, -1), float2(0, -2), float2(-1, 1)};
130 auto result = bounds::min_max(data.as_span());
131 EXPECT_EQ(result->min, float2(-1, -2));
132 EXPECT_EQ(result->max, float2(3, 1));
133}
134
135TEST(bounds, MinMaxFloat)
136{
137 Array<float> data = {1.0f, 3.0f, 0.0f, -1.0f};
138 auto result = bounds::min_max(data.as_span());
139 EXPECT_EQ(result->min, -1.0f);
140 EXPECT_EQ(result->max, 3.0f);
141}
142
143TEST(bounds, MinGreaterThanZero)
144{
145 Array<float> data = {1.5f, 3.0f, 1.1f, 100.0f};
146 auto result = bounds::min_max(data.as_span());
147 EXPECT_GT(result->min, 1.0f);
148}
149
150TEST(bounds, MinMaxRadii)
151{
152 Array<int2> data = {int2(0, 1), int2(3, -1), int2(0, -2), int2(-1, 1)};
153 Array<int> radii = {5, 1, 1, 4};
154 auto result = bounds::min_max_with_radii(data.as_span(), radii.as_span());
155 EXPECT_EQ(result->min, int2(-5, -4));
156 EXPECT_EQ(result->max, int2(5, 6));
157}
158
159TEST(bounds, Large)
160{
161 Array<int2> data(10000);
162 for (const int64_t i : data.index_range()) {
163 data[i] = int2(i, i);
164 }
165
166 auto result = bounds::min_max(data.as_span());
167 EXPECT_EQ(result->min, int2(0, 0));
168 EXPECT_EQ(result->max, int2(9999, 9999));
169}
170
171} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
std::optional< Bounds< T > > min_max_with_radii(const Span< T > values, const Span< RadiusT > radii)
std::optional< Bounds< T > > min_max(const std::optional< Bounds< T > > &a, const T &b)
Definition BLI_bounds.hh:46
TEST(any, DefaultConstructor)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
__int64 int64_t
Definition stdint.h:89
void scale_from_center(const T &scale)
void recenter(const T &new_center)
void resize(const T &new_size)
void pad(const PaddingT &padding)
void translate(const T &offset)
T center() const
bool is_empty() const