'use strict'; async function checkQuaternion( t, sensorType, testDriverName, permissionName, readings) { await test_driver.set_permission({name: permissionName}, 'granted'); await test_driver.create_virtual_sensor(testDriverName); const sensor = new sensorType(); t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['activate', 'reading', 'error']); sensor.start(); await sensorWatcher.wait_for('activate'); await Promise.all([ test_driver.update_virtual_sensor(testDriverName, readings.next().value), sensorWatcher.wait_for('reading') ]); assert_equals(sensor.quaternion.length, 4, 'Quaternion length must be 4'); assert_true( sensor.quaternion instanceof Array, 'Quaternion is must be array'); }; async function checkPopulateMatrix( t, sensorProvider, sensorType, testDriverName, permissionName, readings) { await test_driver.set_permission({name: permissionName}, 'granted'); await test_driver.create_virtual_sensor(testDriverName); const sensor = new sensorType(); t.add_cleanup(async () => { sensor.stop(); await test_driver.remove_virtual_sensor(testDriverName); }); const sensorWatcher = new EventWatcher(t, sensor, ['activate', 'reading', 'error']); // Throws with insufficient buffer space. assert_throws_js( TypeError, () => sensor.populateMatrix(new Float32Array(15))); // Throws if no orientation data available. assert_throws_dom( 'NotReadableError', () => sensor.populateMatrix(new Float32Array(16))); // Throws if passed SharedArrayBuffer view. assert_throws_js( TypeError, // See https://github.com/whatwg/html/issues/5380 for why not `new // SharedArrayBuffer()` WebAssembly.Memory's size is in multiples of 64KiB () => sensor.populateMatrix(new Float32Array( new WebAssembly.Memory({shared: true, initial: 1, maximum: 1}) .buffer))); sensor.start(); await sensorWatcher.wait_for('activate'); await Promise.all([ test_driver.update_virtual_sensor(testDriverName, readings.next().value), sensorWatcher.wait_for('reading') ]); // Works for all supported types. const rotationMatrix32 = new Float32Array(16); sensor.populateMatrix(rotationMatrix32); assert_array_approx_equals(rotationMatrix32, kRotationMatrix, kEpsilon); let rotationMatrix64 = new Float64Array(16); sensor.populateMatrix(rotationMatrix64); assert_array_approx_equals(rotationMatrix64, kRotationMatrix, kEpsilon); let rotationDOMMatrix = new DOMMatrix(); sensor.populateMatrix(rotationDOMMatrix); assert_array_approx_equals( rotationDOMMatrix.toFloat64Array(), kRotationMatrix, kEpsilon); // Sets every matrix element. rotationMatrix64.fill(123); sensor.populateMatrix(rotationMatrix64); assert_array_approx_equals(rotationMatrix64, kRotationMatrix, kEpsilon); } function runOrientationSensorTests(sensorData, readingData) { validate_sensor_data(sensorData); validate_reading_data(readingData); const {sensorName, permissionName, testDriverName} = sensorData; const sensorType = self[sensorName]; const readings = new RingBuffer(readingData.readings); promise_test(async t => { assert_implements(sensorName in self, `${sensorName} is not supported.`); return checkQuaternion( t, sensorType, testDriverName, permissionName, readings); }, `${sensorName}.quaternion return a four-element FrozenArray.`); promise_test(async (t, sensorProvider) => { assert_implements(sensorName in self, `${sensorName} is not supported.`); return checkPopulateMatrix( t, sensorProvider, sensorType, testDriverName, permissionName, readings); }, `${sensorName}.populateMatrix() method works correctly.`); }