@@ -13,6 +13,185 @@ class TestMath: public ::testing::Test
13
13
{
14
14
};
15
15
16
+ // Testing the operators within the member functions of Vec3
17
+ template <typename ValueT>
18
+ void testMemberOperatorsImpl ()
19
+ {
20
+ using namespace openvdb ;
21
+ using Vec3T = math::Vec3<ValueT>;
22
+
23
+ {
24
+ Vec3T vecA (3.14 ,2.18 ,ValueT (-299792458 .f ));
25
+
26
+ // Alternative indexed the elements
27
+ EXPECT_EQ (vecA (0 ), ValueT (3.14 ));
28
+ EXPECT_EQ (vecA (1 ), ValueT (2.18 ));
29
+ EXPECT_EQ (vecA (2 ), ValueT (-299792458 .f ));
30
+
31
+ // Assignment operator
32
+ Vec3T vecB = vecA;
33
+ EXPECT_EQ (vecB (0 ), vecA (0 ));
34
+ EXPECT_EQ (vecB (1 ), vecA (1 ));
35
+ EXPECT_EQ (vecB (2 ), vecA (2 ));
36
+
37
+ // Negation operator
38
+ Vec3T vecC = -vecA;
39
+ EXPECT_EQ (vecC (0 ), -vecA (0 ));
40
+ EXPECT_EQ (vecC (1 ), -vecA (1 ));
41
+ EXPECT_EQ (vecC (2 ), -vecA (2 ));
42
+
43
+ // Multiply each element of the vector by a scalar
44
+ Vec3T vecD = vecA;
45
+ const ValueT gr = ValueT (1.6180339887 );
46
+ vecD *= gr;
47
+ EXPECT_EQ (vecD (0 ), ValueT (gr * vecA (0 )));
48
+ EXPECT_EQ (vecD (1 ), ValueT (gr * vecA (1 )));
49
+ EXPECT_EQ (vecD (2 ), ValueT (gr * vecA (2 )));
50
+
51
+ // Multiply each element of the vector by the corresponding element
52
+ Vec3T vecE = vecA;
53
+ Vec3T vecF (-2.5 , 1.2 , 3.14159 );
54
+ vecE *= vecF;
55
+ EXPECT_EQ (vecE (0 ), ValueT (vecA (0 ) * vecF (0 )));
56
+ EXPECT_EQ (vecE (1 ), ValueT (vecA (1 ) * vecF (1 )));
57
+ EXPECT_EQ (vecE (2 ), ValueT (vecA (2 ) * vecF (2 )));
58
+
59
+ // Divide each element of the vector by a scalar
60
+ Vec3T vecG = vecA;
61
+ vecG /= gr;
62
+ EXPECT_EQ (vecG (0 ), ValueT (vecA (0 ) / gr));
63
+ EXPECT_EQ (vecG (1 ), ValueT (vecA (1 ) / gr));
64
+ EXPECT_EQ (vecG (2 ), ValueT (vecA (2 ) / gr));
65
+
66
+ // Divide each element of the vector by the corresponding element of the given vector
67
+ Vec3T vecH = vecA;
68
+ vecH /= vecF;
69
+ EXPECT_EQ (vecH (0 ), ValueT (vecA (0 ) / vecF (0 )));
70
+ EXPECT_EQ (vecH (1 ), ValueT (vecA (1 ) / vecF (1 )));
71
+ EXPECT_EQ (vecH (2 ), ValueT (vecA (2 ) / vecF (2 )));
72
+
73
+ // Add a scalar to each element of the vector
74
+ Vec3T vecI = vecA;
75
+ vecI += gr;
76
+ EXPECT_EQ (vecI (0 ), ValueT (vecA (0 ) + gr));
77
+ EXPECT_EQ (vecI (1 ), ValueT (vecA (1 ) + gr));
78
+ EXPECT_EQ (vecI (2 ), ValueT (vecA (2 ) + gr));
79
+
80
+ // Add each element of the given vector to the corresponding element of this vector
81
+ Vec3T vecJ = vecA;
82
+ vecJ += vecF;
83
+ EXPECT_EQ (vecJ (0 ), ValueT (vecA (0 ) + vecF (0 )));
84
+ EXPECT_EQ (vecJ (1 ), ValueT (vecA (1 ) + vecF (1 )));
85
+ EXPECT_EQ (vecJ (2 ), ValueT (vecA (2 ) + vecF (2 )));
86
+
87
+ // Subtract a scalar from each element of this vector
88
+ Vec3T vecK = vecA;
89
+ vecK -= gr;
90
+ EXPECT_EQ (vecK (0 ), ValueT (vecA (0 ) - gr));
91
+ EXPECT_EQ (vecK (1 ), ValueT (vecA (1 ) - gr));
92
+ EXPECT_EQ (vecK (2 ), ValueT (vecA (2 ) - gr));
93
+
94
+ // Subtract each element of the given vector from the corresponding element of this vector
95
+ Vec3T vecL = vecA;
96
+ vecL -= vecF;
97
+ EXPECT_EQ (vecL (0 ), ValueT (vecA (0 ) - vecF (0 )));
98
+ EXPECT_EQ (vecL (1 ), ValueT (vecA (1 ) - vecF (1 )));
99
+ EXPECT_EQ (vecL (2 ), ValueT (vecA (2 ) - vecF (2 )));
100
+ }
101
+ }
102
+
103
+ TEST_F (TestMath, testMemberOperators)
104
+ {
105
+ using namespace openvdb ;
106
+
107
+ testMemberOperatorsImpl<math::half>();
108
+ testMemberOperatorsImpl<float >();
109
+ testMemberOperatorsImpl<double >();
110
+ }
111
+
112
+ template <typename ValueT>
113
+ void testFreeFunctionOperatorsImpl ()
114
+ {
115
+ using namespace openvdb ;
116
+ using Vec3T = math::Vec3<ValueT>;
117
+
118
+ {
119
+ // Vec3T vecA(3.14,2.18,ValueT(-299792458.f));
120
+ Vec3T vecA (1 ,2 ,3 );
121
+ Vec3T vecB (3 ,4 ,5 );
122
+ const ValueT gr = ValueT (1.6180339887 );
123
+
124
+ // / Equality operator, does exact floating point comparisons ==
125
+ bool eqRes = vecA == vecB;
126
+ EXPECT_FALSE (eqRes);
127
+
128
+ // / Inequality operator, does exact floating point comparisons !=
129
+ bool ineqRes = vecA != vecB;
130
+ EXPECT_TRUE (ineqRes);
131
+
132
+ // / Multiply each element of the given vector by @a scalar and return the result. scalar * vec
133
+ Vec3T scalarMultiplyA = gr * vecA;
134
+ EXPECT_EQ (scalarMultiplyA (0 ), ValueT (vecA (0 ) * gr));
135
+ EXPECT_EQ (scalarMultiplyA (1 ), ValueT (vecA (1 ) * gr));
136
+ EXPECT_EQ (scalarMultiplyA (2 ), ValueT (vecA (2 ) * gr));
137
+
138
+ // / Multiply each element of the given vector by @a scalar and return the result. vec * scalar
139
+ Vec3T scalarMultiplyB = vecA * gr;
140
+ EXPECT_EQ (scalarMultiplyB (0 ), ValueT (vecA (0 ) * gr));
141
+ EXPECT_EQ (scalarMultiplyB (1 ), ValueT (vecA (1 ) * gr));
142
+ EXPECT_EQ (scalarMultiplyB (2 ), ValueT (vecA (2 ) * gr));
143
+
144
+ // / Multiply corresponding elements of @a v0 and @a v1 and return the result. vec0 * vec1
145
+ Vec3T multiplyRes = vecA * vecB;
146
+ EXPECT_EQ (multiplyRes, Vec3T (3 , 8 , 15 ));
147
+
148
+ // / Divide @a scalar by each element of the given vector and return the result. a / vec
149
+ Vec3T scalarDivA = gr / vecA;
150
+ EXPECT_EQ (scalarDivA (0 ), ValueT (gr / vecA (0 )));
151
+ EXPECT_EQ (scalarDivA (1 ), ValueT (gr / vecA (1 )));
152
+ EXPECT_EQ (scalarDivA (2 ), ValueT (gr / vecA (2 )));
153
+
154
+ // / Divide each element of the given vector by @a scalar and return the result. vec / scalar
155
+ Vec3T scalarDivB = vecA / gr;
156
+ EXPECT_EQ (scalarDivB (0 ), ValueT (vecA (0 ) / gr));
157
+ EXPECT_EQ (scalarDivB (1 ), ValueT (vecA (1 ) / gr));
158
+ EXPECT_EQ (scalarDivB (2 ), ValueT (vecA (2 ) / gr));
159
+
160
+ // / Divide corresponding elements of @a v0 and @a v1 and return the result. vec0 / vec1
161
+ Vec3T divRes = vecA / vecB;
162
+ EXPECT_EQ (divRes (0 ), ValueT (ValueT (vecA (0 )) / ValueT (vecB (0 ))));
163
+ EXPECT_EQ (divRes (1 ), ValueT (ValueT (vecA (1 )) / ValueT (vecB (1 ))));
164
+ EXPECT_EQ (divRes (2 ), ValueT (ValueT (vecA (2 )) / ValueT (vecB (2 ))));
165
+
166
+ // / Add corresponding elements of @a v0 and @a v1 and return the result. vec0 + vec1
167
+ Vec3T addRes = vecA + vecB;
168
+ EXPECT_EQ (addRes, Vec3T (4 , 6 , 8 ));
169
+
170
+ // / Add @a scalar to each element of the given vector and return the result. a + vec
171
+ Vec3T addScalarRes = vecA + gr;
172
+ EXPECT_EQ (addScalarRes (0 ), ValueT (vecA (0 ) + gr));
173
+ EXPECT_EQ (addScalarRes (1 ), ValueT (vecA (1 ) + gr));
174
+ EXPECT_EQ (addScalarRes (2 ), ValueT (vecA (2 ) + gr));
175
+
176
+ // / Subtract corresponding elements of @a v0 and @a v1 and return the result. vec0 - vec1
177
+ Vec3T subtractRes = vecA - vecB;
178
+ EXPECT_EQ (subtractRes, Vec3T (-2 , -2 , -2 ));
179
+
180
+ // / Subtract @a scalar from each element of the given vector and return the result. vec0 - a
181
+ Vec3T subScalarRes = vecA - gr;
182
+ EXPECT_EQ (subScalarRes (0 ), ValueT (vecA (0 ) - gr));
183
+ EXPECT_EQ (subScalarRes (1 ), ValueT (vecA (1 ) - gr));
184
+ EXPECT_EQ (subScalarRes (2 ), ValueT (vecA (2 ) - gr));
185
+ }
186
+ }
187
+
188
+ TEST_F (TestMath, testFreeFunctionOperators)
189
+ {
190
+ using namespace openvdb ;
191
+ testFreeFunctionOperatorsImpl<math::half>();
192
+
193
+ }
194
+
16
195
17
196
// This suite of tests obviously needs to be expanded!
18
197
TEST_F (TestMath, testAll)
@@ -23,6 +202,7 @@ TEST_F(TestMath, testAll)
23
202
EXPECT_EQ (math::Sign ( 3 ), 1 );
24
203
EXPECT_EQ (math::Sign (-1.0 ),-1 );
25
204
EXPECT_EQ (math::Sign ( 0 .0f ), 0 );
205
+ EXPECT_EQ (math::Sign (math::half (0 .)), 0 );
26
206
}
27
207
{// SignChange
28
208
EXPECT_TRUE ( math::SignChange ( -1 , 1 ));
0 commit comments