GCC Code Coverage Report


Directory: ./
File: src/util/transformations.test.cc
Date: 2025-09-01 06:19:01
Exec Total Coverage
Lines: 126 126 100.0%
Functions: 42 42 100.0%
Branches: 119 156 76.3%

Line Branch Exec Source
1 #include "na64util/transformations.hh"
2
3 #include <gtest/gtest.h>
4
5 namespace na64dp {
6
7 using util::Vec3;
8 using util::Matrix3;
9 using util::Float_t;
10
11 8 TEST(Transformation, simpleUzRotationIsValid) {
12 2 Vec3 u{{1, 0, 0}};
13
14
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation t;
15
1/1
✓ Branch 1 taken 1 times.
2 t.angle(0, M_PI/2);
16
1/1
✓ Branch 1 taken 1 times.
2 t.apply(u);
17
18
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.x, 0, 1e-6);
19
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.y, 1, 1e-6);
20
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.z, 0, 1e-6);
21 2 }
22
23 8 TEST(Transformation, sizedUzRotationIsValid) {
24 2 Vec3 u{{10, 0, 0}};
25
26
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation t;
27
1/1
✓ Branch 1 taken 1 times.
2 t.angle(0, M_PI/2);
28
1/1
✓ Branch 1 taken 1 times.
2 t.apply(u);
29
30
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.x, 0, 1e-6);
31
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.y, 10, 1e-6);
32
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(u.c.z, 0, 1e-6);
33 2 }
34
35 8 TEST(Transformation, simpleUvRotationIsValid) {
36 2 Vec3 v{{0, 1, 0}};
37
38
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation t;
39
1/1
✓ Branch 1 taken 1 times.
2 t.angle(0, M_PI/2);
40
1/1
✓ Branch 1 taken 1 times.
2 t.apply(v);
41
42
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.x, -1, 1e-6);
43
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.y, 0, 1e-6);
44
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.z, 0, 1e-6);
45 2 }
46
47 8 TEST(Transformation, sizedUvRotationIsValid) {
48 2 Vec3 v{{0, 10, 0}};
49
50
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation t;
51
1/1
✓ Branch 1 taken 1 times.
2 t.angle(0, M_PI/2);
52
1/1
✓ Branch 1 taken 1 times.
2 t.apply(v);
53
54
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.x,-10, 1e-6);
55
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.y, 0, 1e-6);
56
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.z, 0, 1e-6);
57 2 }
58
59 8 TEST(Transformation, arbitraryVectorRotation) {
60 2 Vec3 v{{-2.12, 12.2, -3.87}};
61 // NOTE: x, y, z angles here, but internal rotation is applied in order z,y,x
62 //const Float_t rot[3] = {M_PI/3, -M_PI/16, 3*M_PI/4};
63 //util::apply_std_rotation(v, rot);
64
65
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation t;
66
1/1
✓ Branch 1 taken 1 times.
2 t.angle(0, 3*M_PI/4);
67
1/1
✓ Branch 1 taken 1 times.
2 t.angle(1, -M_PI/16);
68
1/1
✓ Branch 1 taken 1 times.
2 t.angle(2, M_PI/3);
69
1/1
✓ Branch 1 taken 1 times.
2 t.apply(v);
70
71 // -4.02239429, -9.34407109, 8.05108562
72
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.x, -4.02239429, 1e-6);
73
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.y, -9.34407109, 1e-6);
74
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR(v.c.z, 8.05108562, 1e-6);
75 2 }
76
77
78 8 TEST(Transformation, initialOffsetIsCorrect) {
79
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
80
81
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{0, 0, 0}} - T.o()).norm(), 0, 1e-6 );
82 2 }
83
84 8 TEST(Transformation, offsetGetSetWorks) {
85
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
86 2 T.o(Vec3{{1, 2, 3}});
87
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{1, 2, 3}} - T.o()).norm(), 0, 1e-6 );
88 2 }
89
90 8 TEST(Transformation, initialBasisIsCorrect) {
91
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
92
93
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{1, 0, 0}} - T.u()).norm(), 0, 1e-6 );
94
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{0, 1, 0}} - T.v()).norm(), 0, 1e-6 );
95
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{0, 0, 1}} - T.w()).norm(), 0, 1e-6 );
96 2 }
97
98 8 TEST(Transformation, basisGetSetWorks) {
99
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
100
101 2 T.u(Vec3{{0, 0, 1}});
102 2 T.v(Vec3{{1, 0, 1}});
103 2 T.w(Vec3{{1, 1, 1}});
104
105
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{0, 0, 1}} - T.u()).norm(), 0, 1e-6 );
106
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{1, 0, 1}} - T.v()).norm(), 0, 1e-6 );
107
2/3
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( (Vec3{{1, 1, 1}} - T.w()).norm(), 0, 1e-6 );
108 2 }
109
110 8 TEST(Transformation, initialAnglesAreCorrect) {
111
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
112
113
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(0), 0, 1e-6 );
114
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(1), 0, 1e-6 );
115
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(2), 0, 1e-6 );
116 2 }
117
118 8 TEST(Transformation, anglesGetSetWorks) {
119
1/1
✓ Branch 1 taken 1 times.
2 util::Transformation T;
120
121
1/1
✓ Branch 1 taken 1 times.
2 T.angle(2, 2.34);
122
1/1
✓ Branch 1 taken 1 times.
2 T.angle(0, 0.12);
123
1/1
✓ Branch 1 taken 1 times.
2 T.angle(1, 1.23);
124
125
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(0), 0.12, 1e-6 );
126
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(1), 1.23, 1e-6 );
127
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
2 EXPECT_NEAR( T.angle(2), 2.34, 1e-6 );
128 2 }
129
130 // these values were pre-calculated for sample given below
131 static Float_t _gTransformedVectorSamples[][2][3] = {
132 {{7.734556e+00, 1.062882e+01, 1.984666e+00}, {-4.492330e+01, 2.586341e+02, 3.246454e+01}},
133 {{4.677710e+00, 8.355586e+00, 1.950938e+00}, {-2.818364e+01, 1.985020e+02, 3.786228e+01}},
134 {{9.483337e+00, 9.465663e+00, 6.241140e+00}, {-8.540511e+01, 2.388219e+02, 2.319455e+01}},
135 {{2.157431e+00, 6.181000e+00, 9.541237e+00}, {-5.366580e+01, 1.417398e+02, 6.257688e+01}},
136 {{3.762719e+00, 9.179159e+00, 5.416733e+00}, {-3.462582e+01, 2.131077e+02, 6.119522e+01}},
137 {{9.065874e+00, 2.088812e+00, 4.908827e+00}, {-1.043431e+02, 7.620484e+01, -3.369938e+01}},
138 {{8.711467e+00, 8.200485e+00, 8.451773e+00}, {-9.500193e+01, 2.083453e+02, 2.587281e+01}},
139 {{6.832368e-01, 7.340059e+00, 1.080566e+01}, {-4.310456e+01, 1.619517e+02, 8.611005e+01}},
140 {{2.134734e+00, 1.008227e+01, 1.028308e+01}, {-4.180284e+01, 2.269067e+02, 9.458950e+01}},
141 {{5.658832e-02, 2.580660e+00, 7.324582e+00}, {-3.922784e+01, 5.602782e+01, 4.430639e+01}}
142 };
143
144 8 TEST(Transformation, arbitraryTransformWorks) {
145 2 const Vec3 u = {{ 10.23, 0.34, 5.67}}
146 2 , v = {{ -0.001, -23.45, -1.23}}
147 2 , w = {{ -1.23, -0.34, 5.67}}
148 2 , o = {{-12.3, 5e-7, 3.43783}}
149 ;
150 2 const Float_t angles[] = {-M_PI/123, -2*M_PI/5, 7*M_PI/8};
151 util::Transformation T( o, u, v, w
152 2 , angles[0], angles[1], angles[2]
153 , na64sw_Rotation_xyz
154
1/1
✓ Branch 1 taken 1 times.
2 );
155 // check general validity with getters
156
2/3
✓ Branch 5 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
2 EXPECT_NEAR((T.u() - u).norm()/u.norm(), 0, 1e-6);
157
2/3
✓ Branch 5 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
2 EXPECT_NEAR((T.v() - v).norm()/v.norm(), 0, 1e-6);
158
2/3
✓ Branch 5 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
2 EXPECT_NEAR((T.w() - w).norm()/w.norm(), 0, 1e-6);
159
2/3
✓ Branch 5 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
2 EXPECT_NEAR((T.o() - o).norm()/o.norm(), 0, 1e-6);
160
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for(int i = 0; i < 3; ++i) {
161
3/4
✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
6 EXPECT_NEAR(T.angle(i), angles[i], 1e-6);
162 }
163 // check vs samples
164 22 for( size_t n = 0
165
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
22 ; n < sizeof(_gTransformedVectorSamples)/sizeof(*_gTransformedVectorSamples)
166 ; ++n ) {
167 20 Vec3 v{{ _gTransformedVectorSamples[n][0][0]
168 20 , _gTransformedVectorSamples[n][0][1]
169 20 , _gTransformedVectorSamples[n][0][2]
170 20 }};
171 20 Vec3 ctrl {{ _gTransformedVectorSamples[n][1][0]
172 20 , _gTransformedVectorSamples[n][1][1]
173 20 , _gTransformedVectorSamples[n][1][2]
174 20 }};
175
1/1
✓ Branch 1 taken 10 times.
20 Vec3 t = T(v);
176 20 Vec3 r = t - ctrl;
177
2/3
✓ Branch 3 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
20 EXPECT_NEAR(r.norm()/ctrl.norm(), 0, 1e-6);
178 }
179 2 }
180
181 // units
182
183 8 TEST(UnitsTransformation, simpleDegToRadUnitsConversionWorks) {
184 2 float ctrl = 60.; // degrees
185
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
6 ctrl *= util::Units::get_units_conversion_factor( "deg", "angle" );
186 // ^^^ ctrl should now be in radians
187
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR( ctrl
188 , M_PI/3
189 2 , 1e-6 );
190 2 }
191
192 8 TEST(UnitsTransformation, lengthUnitsConversionWorks) {
193 2 float ctrl = 126; // 126 mm
194
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
6 ctrl *= util::Units::get_units_conversion_factor( "mm", "m" );
195
2/3
✓ Branch 1 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 EXPECT_NEAR( ctrl
196 , 0.126 // m
197 , 1e-6
198 2 );
199 2 }
200
201 }
202