Index: content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java |
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java |
index eca18512f2ffd4a6b6896febc09cadbf7f831a90..4f70a1e22290f859d7be27096312323f6ae70d35 100644 |
--- a/content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java |
+++ b/content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java |
@@ -6,6 +6,7 @@ package org.chromium.content.browser; |
import android.hardware.Sensor; |
import android.hardware.SensorEventListener; |
+import android.hardware.SensorManager; |
import android.os.Handler; |
import android.test.AndroidTestCase; |
import android.test.suitebuilder.annotation.SmallTest; |
@@ -13,7 +14,6 @@ import android.test.suitebuilder.annotation.SmallTest; |
import java.util.HashSet; |
import java.util.Set; |
- |
/** |
* Test suite for DeviceMotionAndOrientation. |
*/ |
@@ -206,6 +206,102 @@ public class DeviceMotionAndOrientationTest extends AndroidTestCase { |
mDeviceMotionAndOrientation.verifyCalls(""); |
} |
+ // Tests for correct Device Orientation angles. |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrixIdentity() { |
+ float[] gravity = {0, 0, 1}; |
+ float[] magnetic = {0, 1, 0}; |
+ double[] expectedAngles = {0, 0, 0}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrix45DegreesX() { |
+ float[] gravity = {0, (float)Math.sin(Math.PI / 4), (float)Math.cos(Math.PI / 4)}; |
+ float[] magnetic = {0, 1, 0}; |
+ double[] expectedAngles = {0, Math.PI / 4, 0}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrix45DegreesY() { |
+ float[] gravity = {-(float)Math.sin(Math.PI / 4), 0, (float)Math.cos(Math.PI / 4)}; |
+ float[] magnetic = {0, 1, 0}; |
+ double[] expectedAngles = {0, 0, Math.PI / 4}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrix45DegreesZ() { |
+ float[] gravity = {0, 0, 1}; |
+ float[] magnetic = {(float)Math.sin(Math.PI / 4), (float)Math.cos(Math.PI / 4), 0}; |
+ double[] expectedAngles = {Math.PI / 4, 0, 0}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrixGimbalLock() { |
+ float[] gravity = {0, 1, 0}; |
+ float[] magnetic = {(float)Math.sin(Math.PI / 4), 0, -(float)Math.cos(Math.PI / 4)}; |
+ double[] expectedAngles = {Math.PI / 4, Math.PI / 2, 0}; // favor yaw instead of roll |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrixPitchGreaterThan90() { |
+ final double largePitchAngle = Math.PI / 2 + Math.PI / 4; |
+ float[] gravity = {0, (float)Math.cos(largePitchAngle - Math.PI / 2), |
+ -(float)Math.sin(largePitchAngle - Math.PI / 2)}; |
+ float[] magnetic = {0, 0, -1}; |
+ double[] expectedAngles = {0, largePitchAngle, 0}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ @SmallTest |
+ public void testOrientationAnglesFromRotationMatrixRoll90() { |
+ float[] gravity = {-1, 0, 0}; |
+ float[] magnetic = {0, 1, 0}; |
+ double[] expectedAngles = {Math.PI, -Math.PI, -Math.PI / 2}; |
+ |
+ verifyOrientationAngles(gravity, magnetic, expectedAngles); |
+ } |
+ |
+ /** |
+ * Helper method for verifying angles obtained from rotation matrix. |
+ * |
+ * @param gravity |
+ * gravity vector in the device frame |
+ * @param magnetic |
+ * magnetic field vector in the device frame |
+ * @param expectedAngles |
+ * expectedAngles[0] rotation angle in radians around the Z-axis |
+ * expectedAngles[1] rotation angle in radians around the X-axis |
+ * expectedAngles[2] rotation angle in radians around the Y-axis |
+ */ |
+ private void verifyOrientationAngles(float[] gravity, float[] magnetic, |
+ double[] expectedAngles) { |
+ float[] R = new float[9]; |
+ double[] values = new double[3]; |
+ SensorManager.getRotationMatrix(R, null, gravity, magnetic); |
+ mDeviceMotionAndOrientation.computeDeviceOrientationFromRotationMatrix(R, values); |
+ |
+ assertEquals(expectedAngles.length, values.length); |
+ final double epsilon = 0.001; |
+ for (int i = 0; i < expectedAngles.length; ++i) { |
+ assertEquals(expectedAngles[i], values[i], epsilon); |
+ } |
+ |
+ } |
+ |
+ // -- End Tests for correct Device Orientation angles. |
+ |
private static class DeviceMotionAndOrientationForTests extends DeviceMotionAndOrientation { |
private double value1 = 0; |