blob: 011a068e69330bc411817a9cf12af23a4f0aa7ae [file] [log] [blame]
<!DOCTYPE html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/gamepad-helpers.js"></script>
<script>
function testGamepadStateOneConnected() {
// To pass this test, Gamepad 0 should have the values set in
// connectGamepads.
let gamepad = navigator.getGamepads()[0];
assert_equals(gamepad.id, 'MockStick 3000');
assert_equals(gamepad.buttons.length, 2);
assert_equals(gamepad.buttons[0].value, 1.0);
assert_true(gamepad.buttons[0].pressed);
assert_equals(gamepad.buttons[1].value, 0.0);
assert_false(gamepad.buttons[1].pressed);
assert_equals(gamepad.axes.length, 2);
assert_equals(gamepad.axes[0], 0.5);
assert_equals(gamepad.axes[1], -1.0);
}
function testNoChangeReturnsSameObjects() {
// Check that accessing gamepad state fetches the same objects until their
// values change.
assert_equals(navigator.getGamepads(),
navigator.getGamepads(), 'gamepad arrays differ');
assert_equals(navigator.getGamepads()[0],
navigator.getGamepads()[0], 'gamepad objects differ');
assert_equals(navigator.getGamepads()[0].axes,
navigator.getGamepads()[0].axes, 'axes arrays differ');
assert_equals(navigator.getGamepads()[0].buttons,
navigator.getGamepads()[0].buttons, 'gamepad buttons differ');
}
function testSameValueUpdateReturnsSameObjects() {
// Test that updates with the same value do not cause a new gamepad object
// to be returned.
let gamepadBefore = navigator.getGamepads()[0];
gamepadController.setAxisCount(0, gamepadBefore.axes.length);
gamepadController.setButtonCount(0, gamepadBefore.buttons.length);
let gamepadAfter = navigator.getGamepads()[0];
assert_equals(
gamepadBefore, gamepadAfter,
"expected same gamepad after same-value setAxisCount/setButtonCount");
assert_equals(
gamepadBefore.timestamp, gamepadAfter.timestamp,
"expected same timestamp after same-value setAxisCount/setButtonCount");
assert_equals(
gamepadBefore.axes, gamepadAfter.axes,
"expected same axes after same-value setAxisCount/setButtonCount");
assert_equals(
gamepadBefore.buttons, gamepadAfter.buttons,
"expected same buttons after same-value setAxisCount/setButtonCount");
gamepadBefore = navigator.getGamepads()[0];
gamepadController.setAxisData(0, 0, gamepadBefore.axes[0]);
gamepadController.setButtonData(0, 1, gamepadBefore.buttons[1].value);
gamepadAfter = navigator.getGamepads()[0];
assert_equals(
gamepadBefore, gamepadAfter,
"expected same gamepad after same-value setAxisData/setButtonData");
assert_equals(
gamepadBefore.timestamp, gamepadAfter.timestamp,
"expected same timestamp after same-value setAxisData/setButtonData");
assert_equals(
gamepadBefore.axes, gamepadAfter.axes,
"expected same axes after same-value setAxisData/setButtonData");
assert_equals(
gamepadBefore.buttons, gamepadAfter.buttons,
"expected same buttons after same-value setAxisData/setButtonData");
}
function testDifferentValueUpdateReturnsNewObjects() {
// Test that changing an axis value causes a new gamepad object to be
// returned.
// TODO(crbug.com/855760): Check that the buttons array is preserved.
gamepadBefore = navigator.getGamepads()[0];
gamepadController.setAxisData(0, 0, gamepadBefore.axes[0] + 0.1);
gamepadAfter = navigator.getGamepads()[0];
assert_not_equals(gamepadBefore, gamepadAfter,
"expected new gamepad after new-value setAxisData");
assert_not_equals(gamepadBefore.timestamp,
gamepadAfter.timestamp,
"expected new timestamp after new-value setAxisData");
assert_not_equals(gamepadBefore.axes, gamepadAfter.axes,
"expected new axes after new-value setAxisData");
// Test that changing a button value causes a new gamepad object to be
// returned.
// TODO(crbug.com/855760): Check that the axes array is preserved.
gamepadBefore = navigator.getGamepads()[0];
gamepadController.setButtonData(0, 0, gamepadBefore.buttons[0].value + 0.1);
gamepadAfter = navigator.getGamepads()[0];
assert_not_equals(gamepadBefore, gamepadAfter,
"expected new gamepad after new-value setButtonData");
assert_not_equals(gamepadBefore.timestamp,
gamepadAfter.timestamp,
"expected new timestamp after new-value setButtonData");
assert_not_equals(gamepadBefore.buttons, gamepadAfter.buttons,
"expected new buttons after new-value setButtonData");
// Test that changing a button value and an axis value causes a new gamepad
// object to be returned.
gamepadBefore = navigator.getGamepads()[0];
gamepadController.setAxisData(0, 0, gamepadBefore.axes[0] - 0.1);
gamepadController.setButtonData(0, 0, gamepadBefore.buttons[0].value - 0.1);
gamepadAfter = navigator.getGamepads()[0];
assert_not_equals(
gamepadBefore, gamepadAfter,
"expected new gamepad after new-value setAxisData/setButtonData");
assert_not_equals(
gamepadBefore.timestamp, gamepadAfter.timestamp,
"expected new timestamp after new-value setAxisData/setButtonData");
assert_not_equals(
gamepadBefore.axes, gamepadAfter.axes,
"expected new axes after new-value setAxisData/setButtonData");
assert_not_equals(
gamepadBefore.buttons, gamepadAfter.buttons,
"expected new buttons after new-value setAxisData/setButtonData");
}
promise_test(async () => {
// First disconnect all gamepads.
disconnectGamepads();
testGamepadStateAllDisconnected();
// Simulate a gamepad connection and verify the state changes as expected.
let connectPromise = ongamepadconnected();
connectGamepads(1);
await connectPromise;
testGamepadStateOneConnected();
// Chrome has different internal behavior depending on whether a gamepad
// event listener is registered. Exercise both paths to verify that the
// state changes are handled correctly in either case.
let disconnectListener = (e) => {};
window.addEventListener('gamepaddisconnected', disconnectListener);
testNoChangeReturnsSameObjects();
testSameValueUpdateReturnsSameObjects();
testDifferentValueUpdateReturnsNewObjects();
window.removeEventListener('gamepaddisconnected', disconnectListener);
testNoChangeReturnsSameObjects();
testSameValueUpdateReturnsSameObjects();
testDifferentValueUpdateReturnsNewObjects();
// Disconnect all gamepads to end the test.
let disconnectPromise = ongamepaddisconnected();
disconnectGamepads();
await disconnectPromise;
testGamepadStateAllDisconnected();
}, "Typical polling access to gamepads contents.");
</script>
</body>