xref: /aosp_15_r20/frameworks/av/media/libheadtracking/TestUtil.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker #pragma once
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "media/Pose.h"
21*ec779b8eSAndroid Build Coastguard Worker #include "media/Twist.h"
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker namespace {
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker constexpr float kPoseComparisonPrecision = 1e-5;
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker }  // namespace
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker // These specializations make {EXPECT,ASSERT}_{EQ,NE} work correctly for Pose3f, Twist3f, Vector3f
30*ec779b8eSAndroid Build Coastguard Worker // and Quaternionf.
31*ec779b8eSAndroid Build Coastguard Worker namespace testing {
32*ec779b8eSAndroid Build Coastguard Worker namespace internal {
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker template <>
35*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperEQ<android::media::Pose3f, android::media::Pose3f>(
36*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const android::media::Pose3f& lhs,
37*ec779b8eSAndroid Build Coastguard Worker         const android::media::Pose3f& rhs) {
38*ec779b8eSAndroid Build Coastguard Worker     if (lhs.isApprox(rhs, kPoseComparisonPrecision)) {
39*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
40*ec779b8eSAndroid Build Coastguard Worker     }
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
43*ec779b8eSAndroid Build Coastguard Worker }
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker template <>
46*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperNE<android::media::Pose3f, android::media::Pose3f>(
47*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const android::media::Pose3f& lhs,
48*ec779b8eSAndroid Build Coastguard Worker         const android::media::Pose3f& rhs) {
49*ec779b8eSAndroid Build Coastguard Worker     if (!lhs.isApprox(rhs, kPoseComparisonPrecision)) {
50*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
51*ec779b8eSAndroid Build Coastguard Worker     }
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
54*ec779b8eSAndroid Build Coastguard Worker }
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker template <>
57*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperEQ<android::media::Twist3f, android::media::Twist3f>(
58*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const android::media::Twist3f& lhs,
59*ec779b8eSAndroid Build Coastguard Worker         const android::media::Twist3f& rhs) {
60*ec779b8eSAndroid Build Coastguard Worker     if (lhs.isApprox(rhs, kPoseComparisonPrecision)) {
61*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
62*ec779b8eSAndroid Build Coastguard Worker     }
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker 
67*ec779b8eSAndroid Build Coastguard Worker template <>
68*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperNE<android::media::Twist3f, android::media::Twist3f>(
69*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const android::media::Twist3f& lhs,
70*ec779b8eSAndroid Build Coastguard Worker         const android::media::Twist3f& rhs) {
71*ec779b8eSAndroid Build Coastguard Worker     if (!lhs.isApprox(rhs, kPoseComparisonPrecision)) {
72*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
76*ec779b8eSAndroid Build Coastguard Worker }
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker template <>
79*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperEQ<Eigen::Vector3f, Eigen::Vector3f>(const char* lhs_expression,
80*ec779b8eSAndroid Build Coastguard Worker                                                                      const char* rhs_expression,
81*ec779b8eSAndroid Build Coastguard Worker                                                                      const Eigen::Vector3f& lhs,
82*ec779b8eSAndroid Build Coastguard Worker                                                                      const Eigen::Vector3f& rhs) {
83*ec779b8eSAndroid Build Coastguard Worker     if (lhs.isApprox(rhs)) {
84*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
85*ec779b8eSAndroid Build Coastguard Worker     }
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
88*ec779b8eSAndroid Build Coastguard Worker }
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker template <>
91*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperNE<Eigen::Vector3f, Eigen::Vector3f>(const char* lhs_expression,
92*ec779b8eSAndroid Build Coastguard Worker                                                                      const char* rhs_expression,
93*ec779b8eSAndroid Build Coastguard Worker                                                                      const Eigen::Vector3f& lhs,
94*ec779b8eSAndroid Build Coastguard Worker                                                                      const Eigen::Vector3f& rhs) {
95*ec779b8eSAndroid Build Coastguard Worker     if (!lhs.isApprox(rhs)) {
96*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
97*ec779b8eSAndroid Build Coastguard Worker     }
98*ec779b8eSAndroid Build Coastguard Worker 
99*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
100*ec779b8eSAndroid Build Coastguard Worker }
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker template <>
103*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperEQ<Eigen::Quaternionf, Eigen::Quaternionf>(
104*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const Eigen::Quaternionf& lhs,
105*ec779b8eSAndroid Build Coastguard Worker         const Eigen::Quaternionf& rhs) {
106*ec779b8eSAndroid Build Coastguard Worker     // Negating the coefs results in an equivalent quaternion.
107*ec779b8eSAndroid Build Coastguard Worker     if (lhs.isApprox(rhs) || lhs.isApprox(Eigen::Quaternionf(-rhs.coeffs()))) {
108*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
109*ec779b8eSAndroid Build Coastguard Worker     }
110*ec779b8eSAndroid Build Coastguard Worker 
111*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
112*ec779b8eSAndroid Build Coastguard Worker }
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker template <>
115*ec779b8eSAndroid Build Coastguard Worker inline AssertionResult CmpHelperNE<Eigen::Quaternionf, Eigen::Quaternionf>(
116*ec779b8eSAndroid Build Coastguard Worker         const char* lhs_expression, const char* rhs_expression, const Eigen::Quaternionf& lhs,
117*ec779b8eSAndroid Build Coastguard Worker         const Eigen::Quaternionf& rhs) {
118*ec779b8eSAndroid Build Coastguard Worker     // Negating the coefs results in an equivalent quaternion.
119*ec779b8eSAndroid Build Coastguard Worker     if (!(lhs.isApprox(rhs) || lhs.isApprox(Eigen::Quaternionf(-rhs.coeffs())))) {
120*ec779b8eSAndroid Build Coastguard Worker         return AssertionSuccess();
121*ec779b8eSAndroid Build Coastguard Worker     }
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
124*ec779b8eSAndroid Build Coastguard Worker }
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker }  // namespace internal
127*ec779b8eSAndroid Build Coastguard Worker }  // namespace testing
128