1b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan/* 2b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * Copyright (C) 2016 The Android Open Source Project 3b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * 4b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * Licensed under the Apache License, Version 2.0 (the "License"); 5b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * you may not use this file except in compliance with the License. 6b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * You may obtain a copy of the License at 7b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * 8b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * http://www.apache.org/licenses/LICENSE-2.0 9b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * 10b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * Unless required by applicable law or agreed to in writing, software 11b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * distributed under the License is distributed on an "AS IS" BASIS, 12b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * See the License for the specific language governing permissions and 14b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * limitations under the License. 15b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan */ 16b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 17b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayanpackage com.android.server; 18b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 19b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayanimport android.test.AndroidTestCase; 20b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 21b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayanimport java.lang.Exception; 22b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayanimport java.lang.Math; 23b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 24b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan/** 25b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan * Tests for {@link com.android.server.AnyMotionDetector.Vector3} 26b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan */ 27b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayanpublic class Vector3Test extends AndroidTestCase { 28b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private static final float tolerance = 1.0f / (1 << 12); 29b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private static final float STATIONARY_ANGLE_THRESHOLD = 0.05f; 30b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 31b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 unitXAxis; 32b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 unitYAxis; 33b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 unitZAxis; 34b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 x3; 35b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 case1A; 36b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 case1B; 37b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 case2A; 38b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 case2B; 39b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 x1y1; 40b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 xn1y1; 41b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 x1z1; 42b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 y1z1; 43b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private AnyMotionDetector.Vector3 piOverSixUnitCircle; 44b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 45b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 46b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan private boolean nearlyEqual(float a, float b) { 47b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan return Math.abs(a - b) <= tolerance; 48b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 49b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 50b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void setUp() throws Exception { 51b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan super.setUp(); 52b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan unitXAxis = new AnyMotionDetector.Vector3(0, 1, 0, 0); 53b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan unitYAxis = new AnyMotionDetector.Vector3(0, 0, 1, 0); 54b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan unitZAxis = new AnyMotionDetector.Vector3(0, 0, 0, 1); 55b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan x3 = new AnyMotionDetector.Vector3(0, 3, 0, 0); 56b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan x1y1 = new AnyMotionDetector.Vector3(0, 1, 1, 0); 57b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan xn1y1 = new AnyMotionDetector.Vector3(0, -1, 1, 0); 58b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan x1z1 = new AnyMotionDetector.Vector3(0, 1, 0, 1); 59b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan y1z1 = new AnyMotionDetector.Vector3(0, 0, 1, 1); 60b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan piOverSixUnitCircle = new AnyMotionDetector.Vector3( 61b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 0, (float)Math.sqrt(3)/2, (float)0.5, 0); 62b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 63b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan case1A = new AnyMotionDetector.Vector3(0, -9.81f, -0.02f, 0.3f); 64b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan case1B = new AnyMotionDetector.Vector3(0, -9.80f, -0.02f, 0.3f); 65b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan case2A = new AnyMotionDetector.Vector3(0, 1f, 2f, 3f); 66b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan case2B = new AnyMotionDetector.Vector3(0, 4f, 5f, 6f); 67b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 68b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 69b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Norm() { 70b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxis.norm(), 1.0f)); 71b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitYAxis.norm(), 1.0f)); 72b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitZAxis.norm(), 1.0f)); 73b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(x1y1.norm(), (float)Math.sqrt(2))); 74b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 75b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 76b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3AngleBetween() { 77b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // Zero angle. 78b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxis.angleBetween(unitXAxis), 0.0f)); 79b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitYAxis.angleBetween(unitYAxis), 0.0f)); 80b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitZAxis.angleBetween(unitZAxis), 0.0f)); 81b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 82b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // Unit axes should be perpendicular. 83b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxis.angleBetween(unitYAxis), 90.0f)); 84b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxis.angleBetween(unitZAxis), 90.0f)); 85b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitYAxis.angleBetween(unitZAxis), 90.0f)); 86b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 87b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // 45 degree angles. 88b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxis.angleBetween(x1y1), 45.0f)); 89b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitYAxis.angleBetween(x1y1), 45.0f)); 90b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 91b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // 135 degree angles. 92b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xn1y1.angleBetween(unitXAxis), 135.0f)); 93b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 94b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // 30 degree angles. 95b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(piOverSixUnitCircle.angleBetween(unitXAxis), 30.0f)); 96b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 97b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // These vectors are expected to be still. 98b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(case1A.angleBetween(case1A) < STATIONARY_ANGLE_THRESHOLD); 99b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(case1A.angleBetween(case1B) < STATIONARY_ANGLE_THRESHOLD); 100b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(unitXAxis.angleBetween(unitXAxis) < STATIONARY_ANGLE_THRESHOLD); 101b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(unitYAxis.angleBetween(unitYAxis) < STATIONARY_ANGLE_THRESHOLD); 102b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(unitZAxis.angleBetween(unitZAxis) < STATIONARY_ANGLE_THRESHOLD); 103b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 104b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 105b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Normalized() { 106b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 unitXAxisNormalized = unitXAxis.normalized(); 107b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxisNormalized.x, unitXAxis.x)); 108b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxisNormalized.y, unitXAxis.y)); 109b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(unitXAxisNormalized.z, unitXAxis.z)); 110b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 111b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan // Normalizing the vector created by multiplying the unit vector by 3 gets the unit vector. 112b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 x3Normalized = x3.normalized(); 113b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(x3Normalized.x, unitXAxis.x)); 114b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(x3Normalized.y, unitXAxis.y)); 115b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(x3Normalized.z, unitXAxis.z)); 116b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 117b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 118b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Cross() { 119b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 xCrossX = unitXAxis.cross(unitXAxis); 120b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossX.x, 0f)); 121b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossX.y, 0f)); 122b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossX.z, 0f)); 123b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 124b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 xCrossNx = unitXAxis.cross(unitXAxis.times(-1)); 125b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossNx.x, 0f)); 126b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossNx.y, 0f)); 127b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xCrossNx.z, 0f)); 128b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 129b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 cross2 = case2A.cross(case2B); 130b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(cross2.x, -3)); 131b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(cross2.y, 6)); 132b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(cross2.z, -3)); 133b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 134b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 135b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Times() { 136b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 yTimes2 = unitYAxis.times(2); 137b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(yTimes2.x, 0f)); 138b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(yTimes2.y, 2f)); 139b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(yTimes2.z, 0f)); 140b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 141b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 142b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Plus() { 143b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 xPlusY = unitXAxis.plus(unitYAxis); 144b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xPlusY.x, 1f)); 145b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xPlusY.y, 1f)); 146b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xPlusY.z, 0f)); 147b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 148b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 149b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3Minus() { 150b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan AnyMotionDetector.Vector3 xMinusY = unitXAxis.minus(unitYAxis); 151b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xMinusY.x, 1f)); 152b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xMinusY.y, -1f)); 153b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xMinusY.z, 0f)); 154b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 155b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan 156b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan public void testVector3DotProduct() { 157b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan float xDotX = unitXAxis.dotProduct(unitXAxis); 158b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan float xDotY = unitXAxis.dotProduct(unitYAxis); 159b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan float xDotZ = unitXAxis.dotProduct(unitZAxis); 160b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xDotX, 1f)); 161b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xDotY, 0f)); 162b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan assertTrue(nearlyEqual(xDotZ, 0f)); 163b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan } 164b070577d35436ca0f5463e6ed19a28ae431cfbfbKevin Gabayan} 165