2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
22 #include <dali/public-api/dali-core.h>
23 #include <dali/public-api/math/matrix3.h>
25 #include <dali-test-suite-utils.h>
26 #include <dali-test-suite-internal-utils.h>
30 static void Startup();
31 static void Cleanup();
34 void (*tet_startup)() = Startup;
35 void (*tet_cleanup)() = Cleanup;
38 static void UtcDaliMatrix3FromMatrix();
39 static void UtcDaliMatrix3OperatorAssign01();
40 static void UtcDaliMatrix3OperatorAssign02();
41 static void UtcDaliMatrix3AsFloat();
42 static void UtcDaliMatrix3Invert();
43 static void UtcDaliMatrix3Transpose();
44 static void UtcDaliMatrix3Scale();
45 static void UtcDaliMatrix3SetIdentity();
46 static void UtcDaliMatrix3Magnitude();
47 static void UtcDaliMatrix3ScaleInverseTranspose();
48 static void UtcDaliMatrix3OStreamOperator();
49 static void UtcDaliMatrix3Multiply();
50 static void UtcDaliMatrix3EqualityOperator();
51 static void UtcDaliMatrix3InequalityOperator();
54 POSITIVE_TC_IDX = 0x01,
58 // Add test functionality for all APIs in the class (Positive and Negative)
60 struct tet_testlist tet_testlist[] = {
61 { UtcDaliMatrix3FromMatrix, POSITIVE_TC_IDX },
62 { UtcDaliMatrix3OperatorAssign01, POSITIVE_TC_IDX },
63 { UtcDaliMatrix3OperatorAssign02, POSITIVE_TC_IDX },
64 { UtcDaliMatrix3AsFloat, POSITIVE_TC_IDX },
65 { UtcDaliMatrix3Invert, POSITIVE_TC_IDX },
66 { UtcDaliMatrix3Transpose, POSITIVE_TC_IDX },
67 { UtcDaliMatrix3Scale, POSITIVE_TC_IDX },
68 { UtcDaliMatrix3Magnitude, POSITIVE_TC_IDX },
69 { UtcDaliMatrix3SetIdentity, POSITIVE_TC_IDX },
70 { UtcDaliMatrix3ScaleInverseTranspose, POSITIVE_TC_IDX },
71 { UtcDaliMatrix3OStreamOperator, POSITIVE_TC_IDX },
72 { UtcDaliMatrix3Multiply, POSITIVE_TC_IDX },
73 { UtcDaliMatrix3EqualityOperator, POSITIVE_TC_IDX },
74 { UtcDaliMatrix3InequalityOperator, POSITIVE_TC_IDX },
79 // Called only once before first test is run.
84 // Called only once after last test is run
91 -18.6f, 1.88e-09f, -6.85e-09f,
93 -1.36e-08f,13.2f, -13.2f);
96 -18.6f,6.91e-06f, 6.76e-06f,
97 8.04e-09f,13.2f, 13.2f,
98 3.01e-06f,13.2f, -13.2f);
101 6.24f,-12.4f, -12.4f,
102 -17.6f,-4.46f, -4.37f,
103 -0.0641f,13.2f, -13.2f);
108 -0.0371f,13.1f, -13.3f);
113 -0.257f,13.0f, -13.4f);
116 -2.43f, -13.2f, -200.9f,
118 0.257f, 13.0f, 13.4f);
134 -0.04, -0.01, -0.04);
149 -18.6f, 0.0f, -1.36e-08f,
150 1.88e-09f,13.2f, 13.2f,
151 -6.85e-09f,13.2f, -13.2f);
154 -18.6f,8.04e-09f, 3.01e-06f,
155 6.91e-06f,13.2f, 13.2f,
156 6.76e-06f,13.2f, -13.2f);
159 6.24f,-17.6f, -0.0641f,
160 -12.4f,-4.46f, 13.2f,
161 -12.4f, -4.37f, -13.2f);
164 -16.3f,9.05f, -0.0371f,
166 6.38f,11.4f, -13.3f);
169 -2.43f,18.5f, -0.257f,
171 12.9f, 1.51f, -13.4f);
175 Matrix3* matrices[5] = { &m1, &m2, &m3, &m4, &m5 };
176 Matrix3* inverseMatrices[5] = { &i1, &i2, &i3, &i4, &i5 };
177 Matrix3* transposeMatrices[5] = { &t1, &t2, &t3, &t4, &t5 };
180 static void UtcDaliMatrix3FromMatrix()
182 float els0[] = { 0.0f, 1.0f, 2.0f, 3.0f,
183 4.0f, 5.0f, 6.0f, 7.0f,
184 8.0f, 9.0f, 10.0f, 11.0f,
185 12.0f, 13.0f, 14.0f, 15.0f};
187 Matrix3 m1(0.0f, 1.0f, 2.0f,
193 DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
196 static void UtcDaliMatrix3OperatorAssign01()
198 float els0[] = { 0.0f, 1.0f, 2.0f, 3.0f,
199 4.0f, 5.0f, 6.0f, 7.0f,
200 8.0f, 9.0f, 10.0f, 11.0f,
201 12.0f, 13.0f, 14.0f, 15.0f};
204 Matrix3 m1(0.0f, 1.0f, 2.0f,
210 m2 = m2; // Test branch
212 DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
216 static void UtcDaliMatrix3OperatorAssign02()
218 Matrix3 m0(0.0f, 1.0f, 2.0f,
222 Matrix3 m1(0.0f, 1.0f, 2.0f,
229 DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
235 static void UtcDaliMatrix3AsFloat()
237 float values[] = {0.0f, 1.0f, 2.0f,
241 Matrix3 m1(values[0], values[1], values[2], values[3],values[4], values[5], values[6], values[7],values[8]);
243 for (int i=0;i<9;++i)
245 DALI_TEST_EQUALS(m1.AsFloat()[i], values[i], TEST_LOCATION);
251 static void UtcDaliMatrix3Invert()
253 // We're going to invert a whole load of different matrices to make sure we don't
254 // fail on particular orientations.
255 for (int i=0;i<5;++i)
257 Matrix3 m = *matrices[i];
258 Matrix3 inv1 = *inverseMatrices[i];
260 // Convert to Mat4, perform inverse, and convert back to Mat3
261 float* mf = m.AsFloat();
262 float els[] = { mf[0], mf[1], mf[2], 0.0f,
263 mf[3], mf[4], mf[5], 0.0f,
264 mf[6], mf[7], mf[8], 0.0f,
265 0.0f, 0.0f, 0.0f, 1.0f };
273 DALI_TEST_EQUALS(mInv, inv1, 0.01f, TEST_LOCATION);
274 DALI_TEST_EQUALS(mInv, inv2, 0.01f, TEST_LOCATION);
277 m2.Invert(); // double invert - should be back to m
279 DALI_TEST_EQUALS(m, m2, 0.01f, TEST_LOCATION);
283 static void UtcDaliMatrix3Transpose()
285 for (int i=0;i<5;++i)
287 Matrix3 m0 = *matrices[i];
288 Matrix3 trans = *transposeMatrices[i];
293 DALI_TEST_EQUALS(m1, trans, 0.001f, TEST_LOCATION);
298 DALI_TEST_EQUALS(m0, m2, 0.001f, TEST_LOCATION);
303 static void UtcDaliMatrix3SetIdentity()
305 Matrix3 m( 0.0f, 1.0f, 2.0f,
310 DALI_TEST_EQUALS(m, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
314 static void UtcDaliMatrix3Scale()
316 Matrix3 m1( 0.0f, 1.0f, 2.0f,
320 Matrix3 m2( 0.0f, 3.0f, 6.0f,
322 24.0f, 27.0f, 30.0f);
326 DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
329 static void UtcDaliMatrix3Magnitude()
331 Matrix3 m1( 0.0f, 1.0f, -2.0f,
335 DALI_TEST_EQUALS(Matrix3::IDENTITY.Magnitude(), 1.0f, 0.001f, TEST_LOCATION);
336 DALI_TEST_EQUALS(m1.Magnitude(), 12.0f, 0.001f, TEST_LOCATION);
341 static void UtcDaliMatrix3ScaleInverseTranspose()
343 Matrix3* matrices[6] = { &m1, &m2, &m3, &m4, &m5, &m6 };
346 for (int i=0;i<6;++i)
348 Matrix3 m0 = *matrices[i];
353 m1.Scale(3.0f/(m1.Magnitude()));
356 m2.ScaledInverseTranspose();
358 DALI_TEST_EQUALS(m1, m2, 0.001f, TEST_LOCATION);
362 static void UtcDaliMatrix3OStreamOperator()
364 std::ostringstream oss;
366 Matrix3 matrix( 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f );
370 std::string expectedOutput = "[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]";
372 DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
375 static void UtcDaliMatrix3Multiply()
377 Matrix3 m1( 0.0f, 3.0f, 6.0f,
379 24.0f, 27.0f, 30.0f);
381 Matrix3 m2( 0.0f, 1.0f, 0.0f,
385 Matrix3 m3( -3.0f, 0.0f, 6.0f,
386 -15.0f, 12.0f, 18.0f,
387 -27.0f, 24.0f, 30.0f);
390 Matrix3::Multiply(result, m1, m2);
392 DALI_TEST_EQUALS(m3, result, 0.01f, TEST_LOCATION);
395 static void UtcDaliMatrix3EqualityOperator()
397 Matrix3 m1( 0.0f, 3.0f, 6.0f,
399 24.0f, 27.0f, 30.0f);
401 Matrix3 m2( 0.0f, 3.0f, 6.0f,
403 24.0f, 27.0f, 30.0f);
405 DALI_TEST_CHECK(m1 == m2);
408 static void UtcDaliMatrix3InequalityOperator()
410 Matrix3 m1( 1.0f, 0.0f, 0.0f,
414 Matrix3 m2( 0.0f, 3.0f, 6.0f,
416 24.0f, 27.0f, 30.0f);
418 DALI_TEST_CHECK(m1 != m2);