28#ifndef OZZ_OZZ_BASE_MATHS_GTEST_MATH_HELPER_H_
29#define OZZ_OZZ_BASE_MATHS_GTEST_MATH_HELPER_H_
31static const float kFloatNearTolerance = 1e-5f;
32static const float kFloatNearEstTolerance = 1e-3f;
36inline void ExpectFloatNear(
float _a,
float _b,
37 float _tol = kFloatNearTolerance) {
38 EXPECT_NEAR(_a, _b, _tol);
43inline void ExpectIntEq(
int _a,
int _b) { EXPECT_EQ(_a, _b); }
47inline void ExpectTrue(
bool _b) { EXPECT_TRUE(_b); }
51#define EXPECT_FLOAT_EQ_EST(_expected, _x) \
52 EXPECT_NEAR(_expected, _x, kFloatNearEstTolerance)
56#define EXPECT_FLOAT4_EQ(_expected, _x, _y, _z, _w) \
60 const ozz::math::Float4 expected(_expected); \
61 ExpectFloatNear(expected.x, _x); \
62 ExpectFloatNear(expected.y, _y); \
63 ExpectFloatNear(expected.z, _z); \
64 ExpectFloatNear(expected.w, _w); \
70#define EXPECT_FLOAT3_EQ(_expected, _x, _y, _z) \
74 const ozz::math::Float3 expected(_expected); \
75 ExpectFloatNear(expected.x, _x); \
76 ExpectFloatNear(expected.y, _y); \
77 ExpectFloatNear(expected.z, _z); \
83#define EXPECT_FLOAT2_EQ(_expected, _x, _y) \
87 const ozz::math::Float2 expected(_expected); \
88 ExpectFloatNear(expected.x, _x); \
89 ExpectFloatNear(expected.y, _y); \
94#define EXPECT_QUATERNION_EQ(_expected, _x, _y, _z, _w) \
98 const ozz::math::Quaternion expected(_expected); \
99 ExpectFloatNear(expected.x, _x); \
100 ExpectFloatNear(expected.y, _y); \
101 ExpectFloatNear(expected.z, _z); \
102 ExpectFloatNear(expected.w, _w); \
106#define _IMPL_EXPECT_SIMDFLOAT_EQ_TOL(_expected, _x, _y, _z, _w, _tol) \
110 ozz::math::SimdFloat4 ret; \
113 ExpectFloatNear(u.af[0], _x, _tol); \
114 ExpectFloatNear(u.af[1], _y, _tol); \
115 ExpectFloatNear(u.af[2], _z, _tol); \
116 ExpectFloatNear(u.af[3], _w, _tol); \
120#define _IMPL_EXPECT_SIMDFLOAT_EQ(_expected, _x, _y, _z, _w) \
121 _IMPL_EXPECT_SIMDFLOAT_EQ_TOL(_expected, _x, _y, _z, _w, kFloatNearTolerance)
123#define _IMPL_EXPECT_SIMDFLOAT_EQ_EST(_expected, _x, _y, _z, _w) \
124 _IMPL_EXPECT_SIMDFLOAT_EQ_TOL(_expected, _x, _y, _z, _w, \
125 kFloatNearEstTolerance)
128#define EXPECT_SIMDFLOAT_EQ(_expected, _x, _y, _z, _w) \
132 _IMPL_EXPECT_SIMDFLOAT_EQ(_expected, _x, _y, _z, _w); \
138#define EXPECT_SIMDFLOAT_EQ_EST(_expected, _x, _y, _z, _w) \
142 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(_expected, _x, _y, _z, _w); \
148#define _IMPL_EXPECT_SIMDFLOAT2_EQ_TOL(_expected, _x, _y, _tol) \
152 ozz::math::SimdFloat4 ret; \
155 ExpectFloatNear(u.af[0], _x, _tol); \
156 ExpectFloatNear(u.af[1], _y, _tol); \
161#define EXPECT_SIMDFLOAT2_EQ(_expected, _x, _y) \
165 _IMPL_EXPECT_SIMDFLOAT2_EQ_TOL(_expected, _x, _y, kFloatNearTolerance); \
171#define EXPECT_SIMDFLOAT2_EQ_EST(_expected, _x, _y) \
175 _IMPL_EXPECT_SIMDFLOAT2_EQ_TOL(_expected, _x, _y, kFloatNearEstTolerance); \
181#define EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, _tol) \
185 _IMPL_EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, _tol); \
191#define _IMPL_EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, _tol) \
195 ozz::math::SimdFloat4 ret; \
198 ExpectFloatNear(u.af[0], _x, _tol); \
199 ExpectFloatNear(u.af[1], _y, _tol); \
200 ExpectFloatNear(u.af[2], _z, _tol); \
205#define EXPECT_SIMDFLOAT3_EQ(_expected, _x, _y, _z) \
209 _IMPL_EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, \
210 kFloatNearTolerance); \
216#define EXPECT_SIMDFLOAT3_EQ_EST(_expected, _x, _y, _z) \
220 _IMPL_EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, \
221 kFloatNearEstTolerance); \
227#define EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, _tol) \
231 _IMPL_EXPECT_SIMDFLOAT3_EQ_TOL(_expected, _x, _y, _z, _tol); \
236#define EXPECT_SIMDINT_EQ(_expected, _x, _y, _z, _w) \
241 ozz::math::SimdInt4 ret; \
244 ExpectIntEq(u.ai[0], static_cast<int>(_x)); \
245 ExpectIntEq(u.ai[1], static_cast<int>(_y)); \
246 ExpectIntEq(u.ai[2], static_cast<int>(_z)); \
247 ExpectIntEq(u.ai[3], static_cast<int>(_w)); \
252#define EXPECT_FLOAT4x4_EQ(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, _y3, \
253 _z0, _z1, _z2, _z3, _w0, _w1, _w2, _w3) \
257 const ozz::math::Float4x4 expected(_expected); \
258 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[0], _x0, _x1, _x2, _x3); \
259 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[1], _y0, _y1, _y2, _y3); \
260 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[2], _z0, _z1, _z2, _z3); \
261 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[3], _w0, _w1, _w2, _w3); \
267#define EXPECT_SIMDQUATERNION_EQ(_expected, _x, _y, _z, _w) \
271 _IMPL_EXPECT_SIMDFLOAT_EQ(_expected.xyzw, _x, _y, _z, _w); \
277#define EXPECT_SIMDQUATERNION_EQ_EST(_expected, _x, _y, _z, _w) \
281 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(_expected.xyzw, _x, _y, _z, _w); \
287#define EXPECT_SIMDQUATERNION_EQ_TOL(_expected, _x, _y, _z, _w, _tol) \
291 _IMPL_EXPECT_SIMDFLOAT_EQ_TOL(_expected.xyzw, _x, _y, _z, _w, _tol); \
296#define EXPECT_SOAFLOAT4_EQ(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, _y3, \
297 _z0, _z1, _z2, _z3, _w0, _w1, _w2, _w3) \
301 const ozz::math::SoaFloat4 expected(_expected); \
302 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.x, _x0, _x1, _x2, _x3); \
303 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.y, _y0, _y1, _y2, _y3); \
304 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.z, _z0, _z1, _z2, _z3); \
305 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.w, _w0, _w1, _w2, _w3); \
311#define EXPECT_SOAFLOAT4_EQ_EST(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, \
312 _y3, _z0, _z1, _z2, _z3, _w0, _w1, _w2, _w3) \
316 const ozz::math::SoaFloat4 expected(_expected); \
317 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.x, _x0, _x1, _x2, _x3); \
318 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.y, _y0, _y1, _y2, _y3); \
319 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.z, _z0, _z1, _z2, _z3); \
320 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.w, _w0, _w1, _w2, _w3); \
325#define EXPECT_SOAFLOAT3_EQ(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, _y3, \
326 _z0, _z1, _z2, _z3) \
330 const ozz::math::SoaFloat3 expected(_expected); \
331 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.x, _x0, _x1, _x2, _x3); \
332 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.y, _y0, _y1, _y2, _y3); \
333 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.z, _z0, _z1, _z2, _z3); \
339#define EXPECT_SOAFLOAT3_EQ_EST(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, \
340 _y3, _z0, _z1, _z2, _z3) \
344 const ozz::math::SoaFloat3 expected(_expected); \
345 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.x, _x0, _x1, _x2, _x3); \
346 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.y, _y0, _y1, _y2, _y3); \
347 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.z, _z0, _z1, _z2, _z3); \
352#define EXPECT_SOAFLOAT2_EQ(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, _y3) \
356 const ozz::math::SoaFloat2 expected(_expected); \
357 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.x, _x0, _x1, _x2, _x3); \
358 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.y, _y0, _y1, _y2, _y3); \
364#define EXPECT_SOAFLOAT2_EQ_EST(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, \
369 const ozz::math::SoaFloat2 expected(_expected); \
370 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.x, _x0, _x1, _x2, _x3); \
371 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.y, _y0, _y1, _y2, _y3); \
376#define EXPECT_SOAFLOAT1_EQ(_expected, _x0, _x1, _x2, _x3) \
377 _IMPL_EXPECT_SIMDFLOAT_EQ(_expected, _x0, _x1, _x2, _x3);
381#define EXPECT_SOAFLOAT1_EQ_EST(_expected, _x0, _x1, _x2, _x3) \
382 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(_expected, _x0, _x1, _x2, _x3);
386#define EXPECT_SOAQUATERNION_EQ(_expected, _x0, _x1, _x2, _x3, _y0, _y1, _y2, \
387 _y3, _z0, _z1, _z2, _z3, _w0, _w1, _w2, _w3) \
391 const ozz::math::SoaQuaternion expected(_expected); \
392 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.x, _x0, _x1, _x2, _x3); \
393 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.y, _y0, _y1, _y2, _y3); \
394 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.z, _z0, _z1, _z2, _z3); \
395 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.w, _w0, _w1, _w2, _w3); \
402#define EXPECT_SOAQUATERNION_EQ_EST(_expected, _x0, _x1, _x2, _x3, _y0, _y1, \
403 _y2, _y3, _z0, _z1, _z2, _z3, _w0, _w1, \
408 const ozz::math::SoaQuaternion expected(_expected); \
409 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.x, _x0, _x1, _x2, _x3); \
410 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.y, _y0, _y1, _y2, _y3); \
411 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.z, _z0, _z1, _z2, _z3); \
412 _IMPL_EXPECT_SIMDFLOAT_EQ_EST(expected.w, _w0, _w1, _w2, _w3); \
416#define EXPECT_SOAFLOAT4x4_EQ( \
417 _expected, col0xx, col0xy, col0xz, col0xw, col0yx, col0yy, col0yz, col0yw, \
418 col0zx, col0zy, col0zz, col0zw, col0wx, col0wy, col0wz, col0ww, col1xx, \
419 col1xy, col1xz, col1xw, col1yx, col1yy, col1yz, col1yw, col1zx, col1zy, \
420 col1zz, col1zw, col1wx, col1wy, col1wz, col1ww, col2xx, col2xy, col2xz, \
421 col2xw, col2yx, col2yy, col2yz, col2yw, col2zx, col2zy, col2zz, col2zw, \
422 col2wx, col2wy, col2wz, col2ww, col3xx, col3xy, col3xz, col3xw, col3yx, \
423 col3yy, col3yz, col3yw, col3zx, col3zy, col3zz, col3zw, col3wx, col3wy, \
428 const ozz::math::SoaFloat4x4 expected(_expected); \
429 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[0].x, col0xx, col0xy, col0xz, \
431 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[0].y, col0yx, col0yy, col0yz, \
433 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[0].z, col0zx, col0zy, col0zz, \
435 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[0].w, col0wx, col0wy, col0wz, \
437 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[1].x, col1xx, col1xy, col1xz, \
439 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[1].y, col1yx, col1yy, col1yz, \
441 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[1].z, col1zx, col1zy, col1zz, \
443 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[1].w, col1wx, col1wy, col1wz, \
445 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[2].x, col2xx, col2xy, col2xz, \
447 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[2].y, col2yx, col2yy, col2yz, \
449 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[2].z, col2zx, col2zy, col2zz, \
451 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[2].w, col2wx, col2wy, col2wz, \
453 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[3].x, col3xx, col3xy, col3xz, \
455 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[3].y, col3yx, col3yy, col3yz, \
457 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[3].z, col3zx, col3zy, col3zz, \
459 _IMPL_EXPECT_SIMDFLOAT_EQ(expected.cols[3].w, col3wx, col3wy, col3wz, \