From e3e1f57b384515e1f245205838411cb29ed7086a Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Tue, 21 May 2024 15:29:41 -0400 Subject: [PATCH 1/3] Refactor to support reuse --- src/agent/driver-test-runner.js | 73 +++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/src/agent/driver-test-runner.js b/src/agent/driver-test-runner.js index e6f4af3..6d88d5f 100644 --- a/src/agent/driver-test-runner.js +++ b/src/agent/driver-test-runner.js @@ -66,6 +66,38 @@ export class DriverTestRunner { await this.atDriver.sendKeys(sequence); } + /** + * @param {import('./at-driver').ATKeySequence} sequence + * @param {string} desiredResponse + */ + async pressKeysToChangeSetting(sequence, desiredResponse) { + // This timeout may be reached as many as two times for every test. + // Delays of over 500ms have been observed during local testing in a + // Windows virtual machine. + const MODE_SWITCH_SPEECH_TIMEOUT = 750; + + let unknownCollected = ''; + // there are 2 modes, so we will try pressing mode switch up to twice + for (let triesRemain = 2; triesRemain > 0; triesRemain--) { + const speechResponse = await this._collectSpeech(MODE_SWITCH_SPEECH_TIMEOUT, () => + this.sendKeys(sequence) + ); + while (speechResponse.length) { + const lastMessage = speechResponse.shift().trim(); + if (lastMessage.toLowerCase() === desiredResponse.toLowerCase()) { + // our mode is correct, we are done + return; + } + + if (unknownCollected.length) unknownCollected += '\n'; + unknownCollected += lastMessage; + } + } + throw new Error( + `Unable to apply setting. Expected: "${desiredResponse}" Got: "${unknownCollected}"` + ); + } + /** * Used for v2 tests to ensure proper settings. * @@ -75,42 +107,23 @@ export class DriverTestRunner { async ensureSettings(settings) { const { atName } = await this.collectedCapabilities; if (atName == 'NVDA') { + const desiredResponse = { browsemode: 'Browse mode', focusmode: 'Focus mode' }[ + settings.toLowerCase() + ]; + if (!desiredResponse) { + throw new Error(`Unknown command settings for NVDA "${settings}"`); + } + // disable the "beeps" when switching focus/browse mode, forces it to speak the mode after switching await this.atDriver._send({ method: 'nvda:settings.setSettings', params: { settings: [{ name: 'virtualBuffers.passThroughAudioIndication', value: false }] }, }); + try { - const desiredResponse = { browsemode: 'Browse mode', focusmode: 'Focus mode' }[ - settings.toLowerCase() - ]; - if (!desiredResponse) { - throw new Error(`Unknown command settings for NVDA "${settings}"`); - } - // This timeout may be reached as many as two times for every test. - // Delays of over 500ms have been observed during local testing in a - // Windows virtual machine. - const MODE_SWITCH_SPEECH_TIMEOUT = 750; - - let unknownCollected = ''; - // there are 2 modes, so we will try pressing mode switch up to twice - for (let triesRemain = 2; triesRemain > 0; triesRemain--) { - const speechResponse = await this._collectSpeech(MODE_SWITCH_SPEECH_TIMEOUT, () => - this.sendKeys(ATKey.sequence(ATKey.chord(ATKey.key('insert'), ATKey.key('space')))) - ); - while (speechResponse.length) { - const lastMessage = speechResponse.shift().trim(); - if (lastMessage.toLowerCase() === desiredResponse.toLowerCase()) { - // our mode is correct, we are done - return; - } - - if (unknownCollected.length) unknownCollected += '\n'; - unknownCollected += lastMessage; - } - } - throw new Error( - `Unable to ensure proper mode. Expected: "${desiredResponse}" Got: "${unknownCollected}"` + await this.pressKeysToChangeSetting( + ATKey.sequence(ATKey.chord(ATKey.key('insert'), ATKey.key('space'))), + desiredResponse ); } finally { // turn the "beeps" back on so mode switches won't be spoken (default setting) From 1aa5a49b0e4a589848c6cc57e402164a063a9065 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Tue, 21 May 2024 23:07:44 -0400 Subject: [PATCH 2/3] Add support for modifying VoiceOver settings --- src/agent/driver-test-runner.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/agent/driver-test-runner.js b/src/agent/driver-test-runner.js index 6d88d5f..b2c9ecf 100644 --- a/src/agent/driver-test-runner.js +++ b/src/agent/driver-test-runner.js @@ -135,7 +135,27 @@ export class DriverTestRunner { }); } } else if (atName == 'VoiceOver') { - if (settings !== 'defaultMode') { + if (settings === 'quickNavOn' || settings === 'arrowQuickKeyNavOn') { + await this.pressKeysToChangeSetting( + ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))), + 'quick nav on' + ); + } else if (settings === 'quickNavOff' || settings === 'arrowQuickKeyNavOff') { + await this.pressKeysToChangeSetting( + ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))), + 'quick nav off' + ); + } else if (settings === 'singleQuickKeyNavOn') { + await this.pressKeysToChangeSetting( + ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))), + 'single-key quick nav on' + ); + } else if (settings === 'singleQuickKeyNavOff') { + await this.pressKeysToChangeSetting( + ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))), + 'single-key quick nav off' + ); + } else if (settings !== 'defaultMode') { throw new Error(`Unrecognized setting for VoiceOver: ${settings}`); } return; From 862c89be51230a0df0b88d344de8d8089429f377 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Wed, 22 May 2024 12:15:00 -0400 Subject: [PATCH 3/3] Rename method --- src/agent/driver-test-runner.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/agent/driver-test-runner.js b/src/agent/driver-test-runner.js index b2c9ecf..7efca34 100644 --- a/src/agent/driver-test-runner.js +++ b/src/agent/driver-test-runner.js @@ -70,7 +70,7 @@ export class DriverTestRunner { * @param {import('./at-driver').ATKeySequence} sequence * @param {string} desiredResponse */ - async pressKeysToChangeSetting(sequence, desiredResponse) { + async pressKeysToToggleSetting(sequence, desiredResponse) { // This timeout may be reached as many as two times for every test. // Delays of over 500ms have been observed during local testing in a // Windows virtual machine. @@ -121,7 +121,7 @@ export class DriverTestRunner { }); try { - await this.pressKeysToChangeSetting( + await this.pressKeysToToggleSetting( ATKey.sequence(ATKey.chord(ATKey.key('insert'), ATKey.key('space'))), desiredResponse ); @@ -136,22 +136,22 @@ export class DriverTestRunner { } } else if (atName == 'VoiceOver') { if (settings === 'quickNavOn' || settings === 'arrowQuickKeyNavOn') { - await this.pressKeysToChangeSetting( + await this.pressKeysToToggleSetting( ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))), 'quick nav on' ); } else if (settings === 'quickNavOff' || settings === 'arrowQuickKeyNavOff') { - await this.pressKeysToChangeSetting( + await this.pressKeysToToggleSetting( ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))), 'quick nav off' ); } else if (settings === 'singleQuickKeyNavOn') { - await this.pressKeysToChangeSetting( + await this.pressKeysToToggleSetting( ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))), 'single-key quick nav on' ); } else if (settings === 'singleQuickKeyNavOff') { - await this.pressKeysToChangeSetting( + await this.pressKeysToToggleSetting( ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))), 'single-key quick nav off' );