1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci// Unit tests for src/core/SkPoint3.cpp and its header 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkPoint3.h" 11cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 12cb93a386Sopenharmony_ci#include "tests/Test.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cistatic void test_eq_ops(skiatest::Reporter* reporter) { 15cb93a386Sopenharmony_ci const SkPoint3 p0 = SkPoint3::Make(0, 0, 0); 16cb93a386Sopenharmony_ci const SkPoint3 p1 = SkPoint3::Make(1, 1, 1); 17cb93a386Sopenharmony_ci const SkPoint3 p2 = SkPoint3::Make(1, 1, 1); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, p0 != p1); 20cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, p1 == p2); 21cb93a386Sopenharmony_ci} 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cistatic void test_ops(skiatest::Reporter* reporter) { 24cb93a386Sopenharmony_ci SkPoint3 v = SkPoint3::Make(1, 1, 1); 25cb93a386Sopenharmony_ci v.normalize(); 26cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(v.length(), SK_Scalar1)); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci // scale 29cb93a386Sopenharmony_ci SkPoint3 p = v.makeScale(3.0f); 30cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.length(), 3.0f)); 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci p.scale(1.0f/3.0f); 33cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.length(), SK_Scalar1)); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci SkPoint3 p1 = SkPoint3::Make(20.0f, 2.0f, 10.0f); 36cb93a386Sopenharmony_ci SkPoint3 p2 = -p1; 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci // - 39cb93a386Sopenharmony_ci p = p1 - p1; 40cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.x(), 0.0f)); 41cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.y(), 0.0f)); 42cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.z(), 0.0f)); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci // + 45cb93a386Sopenharmony_ci p = p1 + p2; 46cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.x(), 0.0f)); 47cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.y(), 0.0f)); 48cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(p.z(), 0.0f)); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_cistatic void test_dot(skiatest::Reporter* reporter) { 52cb93a386Sopenharmony_ci const SkPoint3 xAxis = SkPoint3::Make(1.0f, 0.0f, 0.0f); 53cb93a386Sopenharmony_ci const SkPoint3 yAxis = SkPoint3::Make(0.0f, 1.0f, 0.0f); 54cb93a386Sopenharmony_ci const SkPoint3 zAxis = SkPoint3::Make(0.0f, 0.0f, 1.0f); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci SkScalar dot = xAxis.dot(yAxis); 57cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, 0.0f)); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci dot = yAxis.dot(zAxis); 60cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, 0.0f)); 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci dot = zAxis.dot(xAxis); 63cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, 0.0f)); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci SkPoint3 v = SkPoint3::Make(13.0f, 2.0f, 7.0f); 66cb93a386Sopenharmony_ci v.normalize(); 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci dot = v.dot(v); 69cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, 1.0f)); 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci v = SkPoint3::Make(SK_ScalarRoot2Over2, SK_ScalarRoot2Over2, 0.0f); 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci dot = xAxis.dot(v); 74cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, SK_ScalarRoot2Over2)); 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci dot = yAxis.dot(v); 77cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, SK_ScalarRoot2Over2)); 78cb93a386Sopenharmony_ci} 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_cistatic void test_length(skiatest::Reporter* reporter, 81cb93a386Sopenharmony_ci SkScalar x, SkScalar y, SkScalar z, SkScalar expectedLen) { 82cb93a386Sopenharmony_ci SkPoint3 point = SkPoint3::Make(x, y, z); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci SkScalar s1 = point.length(); 85cb93a386Sopenharmony_ci SkScalar s2 = SkPoint3::Length(x, y, z); 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(s1, s2)); 88cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(s1, expectedLen)); 89cb93a386Sopenharmony_ci} 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_cistatic void test_normalize(skiatest::Reporter* reporter, 92cb93a386Sopenharmony_ci SkScalar x, SkScalar y, SkScalar z, SkScalar expectedLen) { 93cb93a386Sopenharmony_ci SkPoint3 point = SkPoint3::Make(x, y, z); 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci bool result = point.normalize(); 96cb93a386Sopenharmony_ci SkScalar newLength = point.length(); 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci if (0 == expectedLen) { 99cb93a386Sopenharmony_ci const SkPoint3 empty = SkPoint3::Make(0.0f, 0.0f, 0.0f); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(newLength, 0)); 102cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !result); 103cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, point == empty); 104cb93a386Sopenharmony_ci } else { 105cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(newLength, SK_Scalar1)); 106cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, result); 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci SkRandom random; 109cb93a386Sopenharmony_ci random.setSeed(1234); 110cb93a386Sopenharmony_ci SkPoint3 pt3; 111cb93a386Sopenharmony_ci int testCount = 100000; 112cb93a386Sopenharmony_ci for (int index = 0; index < testCount; ++index) { 113cb93a386Sopenharmony_ci SkScalar testVal; 114cb93a386Sopenharmony_ci do { 115cb93a386Sopenharmony_ci testVal = random.nextRangeF(0, 2); 116cb93a386Sopenharmony_ci } while (!testVal); 117cb93a386Sopenharmony_ci pt3.set(testVal, 0, 0); 118cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !pt3.normalize() || 1 == pt3.fX); 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci} 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ciDEF_TEST(Point3, reporter) { 123cb93a386Sopenharmony_ci test_eq_ops(reporter); 124cb93a386Sopenharmony_ci test_ops(reporter); 125cb93a386Sopenharmony_ci test_dot(reporter); 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci static const struct { 128cb93a386Sopenharmony_ci SkScalar fX; 129cb93a386Sopenharmony_ci SkScalar fY; 130cb93a386Sopenharmony_ci SkScalar fZ; 131cb93a386Sopenharmony_ci SkScalar fLength; 132cb93a386Sopenharmony_ci } gRec[] = { 133cb93a386Sopenharmony_ci { 0.0f, 0.0f, 0.0f, 0.0f }, 134cb93a386Sopenharmony_ci { 0.3f, 0.4f, 0.5f, SK_ScalarRoot2Over2 }, 135cb93a386Sopenharmony_ci { 1.0e-37f, 1.0e-37f, 1.0e-37f, 0.0f }, // underflows 136cb93a386Sopenharmony_ci { 3.4e38f, 0.0f, 0.0f, 3.4e38f } // overflows 137cb93a386Sopenharmony_ci }; 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 140cb93a386Sopenharmony_ci test_length(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fZ, gRec[i].fLength); 141cb93a386Sopenharmony_ci test_normalize(reporter, gRec[i].fX, gRec[i].fY, gRec[i].fZ, gRec[i].fLength); 142cb93a386Sopenharmony_ci } 143cb93a386Sopenharmony_ci} 144