'use strict'; // These tests rely on the User Agent providing an implementation of // platform sensor backends. // // In Chromium-based browsers this implementation is provided by a polyfill // in order to reduce the amount of test-only code shipped to users. To enable // these tests the browser must be run with these options: // // --enable-blink-features=MojoJS,MojoJSTest async function loadChromiumResources() { await loadScript('/resources/testdriver.js'); await loadScript('/resources/testdriver-vendor.js'); await loadScript('/page-visibility/resources/window_state_context.js'); await import('/resources/chromium/generic_sensor_mocks.js'); } async function initialize_generic_sensor_tests() { if (typeof GenericSensorTest === 'undefined') { const script = document.createElement('script'); script.src = '/resources/test-only-api.js'; script.async = false; const p = new Promise((resolve, reject) => { script.onload = () => { resolve(); }; script.onerror = e => { reject(e); }; }) document.head.appendChild(script); await p; if (isChromiumBased) { await loadChromiumResources(); } } let sensorTest = new GenericSensorTest(); await sensorTest.initialize(); return sensorTest; } function sensor_test(func, name, properties) { promise_test(async (t) => { t.add_cleanup(() => { if (sensorTest) return sensorTest.reset(); }); let sensorTest = await initialize_generic_sensor_tests(); return func(t, sensorTest.getSensorProvider()); }, name, properties); } function verifySensorReading(pattern, values, timestamp, isNull) { // If |val| cannot be converted to a float, we return the original value. // This can happen when a value in |pattern| is not a number. function round(val) { const res = Number.parseFloat(val).toPrecision(6); return res === "NaN" ? val : res; } if (isNull) { return (values === null || values.every(r => r === null)) && timestamp === null; } return values.every((r, i) => round(r) === round(pattern[i])) && timestamp !== null; } function verifyXyzSensorReading(pattern, {x, y, z, timestamp}, isNull) { return verifySensorReading(pattern, [x, y, z], timestamp, isNull); } function verifyQuatSensorReading(pattern, {quaternion, timestamp}, isNull) { return verifySensorReading(pattern, quaternion, timestamp, isNull); } function verifyAlsSensorReading(pattern, {illuminance, timestamp}, isNull) { return verifySensorReading(pattern, [illuminance], timestamp, isNull); } function verifyGeoSensorReading(pattern, {latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed, timestamp}, isNull) { return verifySensorReading(pattern, [latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed], timestamp, isNull); } function verifyProximitySensorReading(pattern, {distance, max, near, timestamp}, isNull) { return verifySensorReading(pattern, [distance, max, near], timestamp, isNull); } // Assert that two Sensor objects have the same properties and values. // // Verifies that ``actual`` and ``expected`` have the same sensor properties // and, if so, that their values are the same. // // @param {Sensor} actual - Test value. // @param {Sensor} expected - Expected value. function assert_sensor_equals(actual, expected) { assert_true( actual instanceof Sensor, 'assert_sensor_equals: actual must be a Sensor'); assert_true( expected instanceof Sensor, 'assert_sensor_equals: expected must be a Sensor'); // These properties vary per sensor type. const CUSTOM_PROPERTIES = [ ['illuminance'], ['quaternion'], ['x', 'y', 'z'], [ 'latitude', 'longitude', 'altitude', 'accuracy', 'altitudeAccuracy', 'heading', 'speed' ] ]; // These properties are present on all objects derived from Sensor. const GENERAL_PROPERTIES = ['timestamp']; for (let customProperties of CUSTOM_PROPERTIES) { if (customProperties.every(p => p in actual) && customProperties.every(p => p in expected)) { customProperties.forEach(p => { if (customProperties == 'quaternion') { assert_array_equals( actual[p], expected[p], `assert_sensor_equals: property '${p}' does not match`); } else { assert_equals( actual[p], expected[p], `assert_sensor_equals: property '${p}' does not match`); } }); GENERAL_PROPERTIES.forEach(p => { assert_equals( actual[p], expected[p], `assert_sensor_equals: property '${p}' does not match`); }); return; } } assert_true(false, 'assert_sensor_equals: sensors have different attributes'); }