Blender V4.3
BLI_math_vector_types_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
8
9namespace blender::tests {
10
11using namespace blender::math;
12
13TEST(math_vec_types, ScalarConstructorUnsigned)
14{
15 float2 u(5u);
16 EXPECT_EQ(u[0], 5.0f);
17 EXPECT_EQ(u[1], 5.0f);
18}
19
20TEST(math_vec_types, ScalarConstructorInt)
21{
22 float2 i(-5);
23 EXPECT_EQ(i[0], -5.0f);
24 EXPECT_EQ(i[1], -5.0f);
25}
26
27TEST(math_vec_types, ScalarConstructorFloat)
28{
29 float2 f(5.2f);
30 EXPECT_FLOAT_EQ(f[0], 5.2f);
31 EXPECT_FLOAT_EQ(f[1], 5.2f);
32}
33
34TEST(math_vec_types, ScalarConstructorDouble)
35{
36 float2 d(5.2);
37 EXPECT_FLOAT_EQ(d[0], 5.2f);
38 EXPECT_FLOAT_EQ(d[1], 5.2f);
39}
40
41TEST(math_vec_types, MultiScalarConstructorVec2)
42{
43 int2 i(5, -1);
44 EXPECT_EQ(i[0], 5);
45 EXPECT_EQ(i[1], -1);
46}
47
48TEST(math_vec_types, MultiScalarConstructorVec3)
49{
50 int3 i(5, -1, 6u);
51 EXPECT_EQ(i[0], 5);
52 EXPECT_EQ(i[1], -1);
53 EXPECT_EQ(i[2], 6);
54}
55
56TEST(math_vec_types, MultiScalarConstructorVec4)
57{
58 int4 i(5, -1, 6u, 0);
59 EXPECT_EQ(i[0], 5);
60 EXPECT_EQ(i[1], -1);
61 EXPECT_EQ(i[2], 6);
62 EXPECT_EQ(i[3], 0);
63}
64
65TEST(math_vec_types, MixedScalarVectorConstructorVec3)
66{
67 float3 fl_v2(float2(5.5f), 1.8f);
68 EXPECT_FLOAT_EQ(fl_v2[0], 5.5f);
69 EXPECT_FLOAT_EQ(fl_v2[1], 5.5f);
70 EXPECT_FLOAT_EQ(fl_v2[2], 1.8f);
71
72 float3 v2_fl(1.8f, float2(5.5f));
73 EXPECT_FLOAT_EQ(v2_fl[0], 1.8f);
74 EXPECT_FLOAT_EQ(v2_fl[1], 5.5f);
75 EXPECT_FLOAT_EQ(v2_fl[2], 5.5f);
76}
77
78TEST(math_vec_types, MixedScalarVectorConstructorVec4)
79{
80 int4 v2_fl_fl(float2(1), 2, 3);
81 EXPECT_EQ(v2_fl_fl[0], 1);
82 EXPECT_EQ(v2_fl_fl[1], 1);
83 EXPECT_EQ(v2_fl_fl[2], 2);
84 EXPECT_EQ(v2_fl_fl[3], 3);
85
86 float4 fl_v2_fl(1, int2(2), 3);
87 EXPECT_EQ(fl_v2_fl[0], 1);
88 EXPECT_EQ(fl_v2_fl[1], 2);
89 EXPECT_EQ(fl_v2_fl[2], 2);
90 EXPECT_EQ(fl_v2_fl[3], 3);
91
92 double4 fl_fl_v2(1, 2, double2(3));
93 EXPECT_EQ(fl_fl_v2[0], 1);
94 EXPECT_EQ(fl_fl_v2[1], 2);
95 EXPECT_EQ(fl_fl_v2[2], 3);
96 EXPECT_EQ(fl_fl_v2[3], 3);
97
98 int4 v2_v2(float2(1), uint2(2));
99 EXPECT_EQ(v2_v2[0], 1);
100 EXPECT_EQ(v2_v2[1], 1);
101 EXPECT_EQ(v2_v2[2], 2);
102 EXPECT_EQ(v2_v2[3], 2);
103
104 float4 v3_fl(uint3(1), 2);
105 EXPECT_EQ(v3_fl[0], 1);
106 EXPECT_EQ(v3_fl[1], 1);
107 EXPECT_EQ(v3_fl[2], 1);
108 EXPECT_EQ(v3_fl[3], 2);
109
110 uint4 fl_v3(1, float3(2));
111 EXPECT_EQ(fl_v3[0], 1);
112 EXPECT_EQ(fl_v3[1], 2);
113 EXPECT_EQ(fl_v3[2], 2);
114 EXPECT_EQ(fl_v3[3], 2);
115}
116
117TEST(math_vec_types, ComponentMasking)
118{
119 int4 i(0, 1, 2, 3);
120 float2 f2 = float2(i);
121 EXPECT_EQ(f2[0], 0.0f);
122 EXPECT_EQ(f2[1], 1.0f);
123}
124
125TEST(math_vec_types, PointerConversion)
126{
127 float array[3] = {1.0f, 2.0f, 3.0f};
128 float3 farray(array);
129 EXPECT_EQ(farray[0], 1.0f);
130 EXPECT_EQ(farray[1], 2.0f);
131 EXPECT_EQ(farray[2], 3.0f);
132}
133
134TEST(math_vec_types, PointerArrayConversion)
135{
136 float array[1][3] = {{1.0f, 2.0f, 3.0f}};
137 float(*ptr)[3] = array;
138 float3 fptr(ptr);
139 EXPECT_EQ(fptr[0], 1.0f);
140 EXPECT_EQ(fptr[1], 2.0f);
141 EXPECT_EQ(fptr[2], 3.0f);
142}
143
144TEST(math_vec_types, VectorTypeConversion)
145{
146 double2 d(int2(float2(5.75f, -1.57f)));
147 EXPECT_EQ(d[0], 5.0);
148 EXPECT_EQ(d[1], -1.0);
149}
150
151TEST(math_vec_types, Add)
152{
153 float2 result = float2(1.0f, 2.0f) + float2(0.5f, 2.0f);
154 EXPECT_FLOAT_EQ(result.x, 1.5f);
155 EXPECT_FLOAT_EQ(result.y, 4.0f);
156
157 float2 result2 = float2(1.0f, 2.0f);
158 result2 += float2(0.5f, 2.0f);
159 EXPECT_FLOAT_EQ(result2.x, 1.5f);
160 EXPECT_FLOAT_EQ(result2.y, 4.0f);
161}
162
163TEST(math_vec_types, AddFloatByVector)
164{
165 float2 result = float2(0.5f, 2.0f) + 2.0f;
166 EXPECT_FLOAT_EQ(result.x, 2.5f);
167 EXPECT_FLOAT_EQ(result.y, 4.0f);
168
169 float2 result2 = 2.0f + float2(0.5f, 2.0f);
170 EXPECT_FLOAT_EQ(result2.x, 2.5f);
171 EXPECT_FLOAT_EQ(result2.y, 4.0f);
172
173 float2 result3 = float2(0.5f, 2.0f);
174 result3 += 2.0f;
175 EXPECT_FLOAT_EQ(result3.x, 2.5f);
176 EXPECT_FLOAT_EQ(result3.y, 4.0f);
177}
178
179TEST(math_vec_types, Sub)
180{
181 float2 result = float2(1.0f, 2.0f) - float2(0.5f, 2.0f);
182 EXPECT_FLOAT_EQ(result.x, 0.5f);
183 EXPECT_FLOAT_EQ(result.y, 0.0f);
184
185 float2 result2 = float2(1.0f, 2.0f);
186 result2 -= float2(0.5f, 2.0f);
187 EXPECT_FLOAT_EQ(result2.x, 0.5f);
188 EXPECT_FLOAT_EQ(result2.y, 0.0f);
189
190 float2 result3 = -float2(1.0f, 2.0f);
191 EXPECT_FLOAT_EQ(result3.x, -1.0f);
192 EXPECT_FLOAT_EQ(result3.y, -2.0f);
193}
194
195TEST(math_vec_types, SubFloatByVector)
196{
197 float2 result = float2(0.5f, 2.0f) - 2.0f;
198 EXPECT_FLOAT_EQ(result.x, -1.5f);
199 EXPECT_FLOAT_EQ(result.y, 0.0f);
200
201 float2 result2 = 2.0f - float2(0.5f, 2.0f);
202 EXPECT_FLOAT_EQ(result2.x, 1.5f);
203 EXPECT_FLOAT_EQ(result2.y, 0.0f);
204
205 float2 result3 = float2(0.5f, 2.0f);
206 result3 -= 2.0f;
207 EXPECT_FLOAT_EQ(result3.x, -1.5f);
208 EXPECT_FLOAT_EQ(result3.y, 0.0f);
209}
210
211TEST(math_vec_types, Mul)
212{
213 float2 result = float2(1.0f, 2.0f) * float2(0.5f, 2.0f);
214 EXPECT_FLOAT_EQ(result.x, 0.5f);
215 EXPECT_FLOAT_EQ(result.y, 4.0f);
216
217 float2 result2 = float2(1.0f, 2.0f);
218 result2 *= float2(0.5f, 2.0f);
219 EXPECT_FLOAT_EQ(result2.x, 0.5f);
220 EXPECT_FLOAT_EQ(result2.y, 4.0f);
221}
222
223TEST(math_vec_types, MulFloatByVector)
224{
225 float2 result = float2(0.5f, 2.0f) * 2.0f;
226 EXPECT_FLOAT_EQ(result.x, 1.0f);
227 EXPECT_FLOAT_EQ(result.y, 4.0f);
228
229 float2 result2 = 2.0f * float2(0.5f, 2.0f);
230 EXPECT_FLOAT_EQ(result2.x, 1.0f);
231 EXPECT_FLOAT_EQ(result2.y, 4.0f);
232
233 float2 result3 = float2(0.5f, 2.0f);
234 result3 *= 2.0f;
235 EXPECT_FLOAT_EQ(result3.x, 1.0f);
236 EXPECT_FLOAT_EQ(result3.y, 4.0f);
237}
238
239TEST(math_vec_types, Divide)
240{
241 float2 a(1.0f, 2.0f);
242 float2 b(0.5f, 2.0f);
243 float2 result = a / b;
244 EXPECT_FLOAT_EQ(result.x, 2.0f);
245 EXPECT_FLOAT_EQ(result.y, 1.0f);
246}
247
248TEST(math_vec_types, DivideFloatByVector)
249{
250 float a = 2.0f;
251 float2 b(0.5f, 2.0f);
252 float2 result = a / b;
253 EXPECT_FLOAT_EQ(result.x, 4.0f);
254 EXPECT_FLOAT_EQ(result.y, 1.0f);
255}
256
257TEST(math_vec_types, DivideFloatByVectorSmall)
258{
259 float2 result = 2.0f / float2(2.0f);
260 EXPECT_FLOAT_EQ(result.x, 1.0f);
261 EXPECT_FLOAT_EQ(result.y, 1.0f);
262}
263
264TEST(math_vec_types, SwizzleReinterpret)
265{
266 const float2 v01(0, 1);
267 const float2 v12(1, 2);
268 const float2 v23(2, 3);
269 const float3 v012(0, 1, 2);
270 const float3 v123(1, 2, 3);
271 const float4 v0123(0, 1, 2, 3);
272 /* Identity. */
273 EXPECT_EQ(v01.xy(), v01);
274 EXPECT_EQ(v012.xyz(), v012);
275 EXPECT_EQ(v0123.xyzw(), v0123);
276 /* Masking. */
277 EXPECT_EQ(v012.xy(), v01);
278 EXPECT_EQ(v0123.xyz(), v012);
279 /* Offset. */
280 EXPECT_EQ(v0123.yz(), v12);
281 EXPECT_EQ(v0123.zw(), v23);
282 EXPECT_EQ(v0123.yzw(), v123);
283}
284
285} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
static btMatrix3x3 Mul(const btMatrix3x3 &a, btScalar b)
static btMatrix3x3 Sub(const btMatrix3x3 &a, const btMatrix3x3 &b)
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
TEST(any, DefaultConstructor)
VecBase< uint32_t, 2 > uint2
VecBase< double, 2 > double2
VecBase< uint32_t, 3 > uint3
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
VecBase< T, 4 > xyzw() const
VecBase< T, 2 > zw() const
VecBase< T, 3 > yzw() const
VecBase< T, 2 > xy() const
VecBase< T, 3 > xyz() const
VecBase< T, 2 > yz() const
PointerRNA * ptr
Definition wm_files.cc:4126