blob: 6e113f8d100abfb2ec4606c339eb1008c70d8eb3 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/device/public/interfaces/sensor_provider.mojom.js"></script>
<script src="resources/sensor-helpers.js"></script>
<script src="resources/generic-sensor-tests.js"></script>
<script>
'use strict';
if (!window.testRunner)
debug('This test cannot be run without the TestRunner');
const kQuaternion = [1, 0, 0, 0]; // 180 degrees around X axis.
const kRotationMatrix = [1, 0, 0, 0,
0, -1, 0, 0,
0, 0, -1, 0,
0, 0, 0, 1];
const kRotationDOMMatrix = new DOMMatrix(kRotationMatrix);
function* quaternionGen() {
let index = 0;
while (true) {
let result = [0, 0, 0, 0];
result[index] = 1;
yield result;
if (++index > 3)
index = 0;
}
}
let gen = quaternionGen();
let expectedReading;
function update_sensor_reading(buffer) {
expectedReading = gen.next().value;
buffer.set(expectedReading, 2);
}
function verify_sensor_reading(sensor, should_be_null) {
if (should_be_null)
return sensor.quaternion === null && sensor.timestamp === null;
if (sensor.timestamp === null ||
sensor.quaternion.some((e, i) => {e !== expectedReading[i]}))
return false;
return true;
}
async function checkPopulateMatrix(sensor, sensorType) {
let sensorObject = new sensorType();
// Throws with insufficient buffer space.
assert_throws({ name: 'TypeError' }, () => sensorObject.populateMatrix(new Float32Array(15)));
// Throws if no orientation data available.
assert_throws({ name: 'NotReadableError' }, () => sensorObject.populateMatrix(new Float32Array(16)));
if (window.SharedArrayBuffer) {
// Throws if passed SharedArrayBuffer view.
assert_throws({ name: 'TypeError' }, () => sensorObject.populateMatrix(new Float32Array(new SharedArrayBuffer(16))));
}
sensorObject.start();
let mockSensor = await sensor.mockSensorProvider.getCreatedSensor();
await mockSensor.setUpdateSensorReadingFunction(buffer => buffer.set(kQuaternion, 2));
await new Promise((resolve, reject) => {
let wrapper = new CallbackWrapper(() => {
// Works for all supported types.
let rotationMatrix32 = new Float32Array(16);
sensorObject.populateMatrix(rotationMatrix32);
assert_array_equals(rotationMatrix32, kRotationMatrix);
let rotationMatrix64 = new Float64Array(16);
sensorObject.populateMatrix(rotationMatrix64);
assert_array_equals(rotationMatrix64, kRotationMatrix);
let rotationDOMMatrix = new DOMMatrix();
sensorObject.populateMatrix(rotationDOMMatrix);
assert_array_equals(rotationDOMMatrix.toFloat64Array(),
kRotationMatrix);
// Sets every matrix element.
rotationMatrix64.fill(123);
sensorObject.populateMatrix(rotationMatrix64);
assert_array_equals(rotationMatrix64, kRotationMatrix);
sensorObject.stop();
resolve(mockSensor);
}, reject);
sensorObject.onreading = wrapper.callback;
sensorObject.onerror = reject;
});
return mockSensor.removeConfigurationCalled();
}
runGenericSensorTests(AbsoluteOrientationSensor,
update_sensor_reading,
verify_sensor_reading,
null,
['accelerometer', 'gyroscope', 'magnetometer']);
sensor_test(sensor => {
return checkPopulateMatrix(sensor, AbsoluteOrientationSensor);
}, 'Test AbsoluteOrientationSensor.populateMatrix() method works correctly.');
runGenericSensorTests(RelativeOrientationSensor,
update_sensor_reading,
verify_sensor_reading,
null,
['accelerometer', 'gyroscope']);
sensor_test(sensor => {
return checkPopulateMatrix(sensor, RelativeOrientationSensor);
}, 'Test RelativeOrientationSensor.populateMatrix() method works correctly.');
</script>