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