From e18bd83ad914c33f4064ab6c2a3caa1fe6831303 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 13 May 2025 13:48:20 -0700 Subject: [PATCH 1/3] refactor: Update to use `IFocusableNode` in place of `INavigable`. --- src/actions/clipboard.ts | 6 ++---- src/actions/delete.ts | 2 +- src/actions/disconnect.ts | 4 ++-- src/actions/enter.ts | 7 ++----- src/flyout_cursor.ts | 24 +++--------------------- src/index.ts | 24 +++--------------------- src/keyboard_drag_strategy.ts | 1 - src/navigation.ts | 17 +++++++---------- test/index.html | 8 -------- test/index.ts | 13 ++----------- test/webdriverio/index.ts | 11 ++--------- 11 files changed, 24 insertions(+), 93 deletions(-) diff --git a/src/actions/clipboard.ts b/src/actions/clipboard.ts index e3227394..1e666496 100644 --- a/src/actions/clipboard.ts +++ b/src/actions/clipboard.ts @@ -17,7 +17,7 @@ import { getFocusManager, } from 'blockly'; import * as Constants from '../constants'; -import type {BlockSvg, WorkspaceSvg, INavigable} from 'blockly'; +import type {BlockSvg, WorkspaceSvg} from 'blockly'; import {Navigation} from '../navigation'; import {getShortActionShortcut} from '../shortcut_formatting'; import * as Blockly from 'blockly'; @@ -366,9 +366,7 @@ export class Clipboard { ? workspace : this.copyWorkspace; - const targetNode = FocusableTreeTraverser.findFocusedNode( - pasteWorkspace, - ) as unknown as INavigable; + const targetNode = FocusableTreeTraverser.findFocusedNode(pasteWorkspace); // If we're pasting in the flyout it still targets the workspace. Focus // first as to ensure correct selection handling. getFocusManager().focusTree(workspace); diff --git a/src/actions/delete.ts b/src/actions/delete.ts index 7874e37a..5c5be195 100644 --- a/src/actions/delete.ts +++ b/src/actions/delete.ts @@ -12,7 +12,7 @@ import { LineCursor, } from 'blockly'; import * as Constants from '../constants'; -import type {BlockSvg, WorkspaceSvg} from 'blockly'; +import type {WorkspaceSvg} from 'blockly'; import {Navigation} from '../navigation'; const KeyCodes = BlocklyUtils.KeyCodes; diff --git a/src/actions/disconnect.ts b/src/actions/disconnect.ts index bbc66b35..a0162b9d 100644 --- a/src/actions/disconnect.ts +++ b/src/actions/disconnect.ts @@ -11,7 +11,7 @@ import { utils as BlocklyUtils, } from 'blockly'; import * as Constants from '../constants'; -import type {WorkspaceSvg, INavigable} from 'blockly'; +import type {WorkspaceSvg, IFocusableNode} from 'blockly'; import {Navigation} from '../navigation'; const KeyCodes = BlocklyUtils.KeyCodes; @@ -79,7 +79,7 @@ export class DisconnectAction { if (!cursor) { return; } - let curNode: INavigable | null = cursor.getCurNode(); + let curNode: IFocusableNode | null = cursor.getCurNode(); let wasVisitingConnection = true; while ( curNode && diff --git a/src/actions/enter.ts b/src/actions/enter.ts index 408b14f6..3fc4e254 100644 --- a/src/actions/enter.ts +++ b/src/actions/enter.ts @@ -17,7 +17,7 @@ import { FocusableTreeTraverser, } from 'blockly/core'; -import type {Block, INavigable} from 'blockly/core'; +import type {Block} from 'blockly/core'; import * as Constants from '../constants'; import type {Navigation} from '../navigation'; @@ -59,7 +59,6 @@ export class EnterAction { let flyoutCursor; let curNode; - let nodeType; switch (this.navigation.getState(workspace)) { case Constants.STATE.WORKSPACE: @@ -128,9 +127,7 @@ export class EnterAction { Events.setGroup(true); } - const stationaryNode = FocusableTreeTraverser.findFocusedNode( - workspace, - ) as unknown as INavigable; + const stationaryNode = FocusableTreeTraverser.findFocusedNode(workspace); const newBlock = this.createNewBlock(workspace); if (!newBlock) return; const insertStartPoint = stationaryNode diff --git a/src/flyout_cursor.ts b/src/flyout_cursor.ts index 4b917324..07274e95 100644 --- a/src/flyout_cursor.ts +++ b/src/flyout_cursor.ts @@ -33,7 +33,7 @@ export class FlyoutCursor extends Blockly.LineCursor { * @returns The next element, or null if the current node is * not set or there is no next value. */ - override next(): Blockly.INavigable | null { + override next(): Blockly.IFocusableNode | null { const curNode = this.getCurNode(); if (!curNode) { return null; @@ -46,22 +46,13 @@ export class FlyoutCursor extends Blockly.LineCursor { return newNode; } - /** - * This is a no-op since a flyout cursor can not go in. - * - * @returns Always null. - */ - override in(): null { - return null; - } - /** * Moves the cursor to the previous stack of blocks in the flyout. * * @returns The previous element, or null if the current * node is not set or there is no previous value. */ - override prev(): Blockly.INavigable | null { + override prev(): Blockly.IFocusableNode | null { const curNode = this.getCurNode(); if (!curNode) { return null; @@ -74,16 +65,7 @@ export class FlyoutCursor extends Blockly.LineCursor { return newNode; } - /** - * This is a no-op since a flyout cursor can not go out. - * - * @returns Always null. - */ - override out(): null { - return null; - } - - override setCurNode(node: Blockly.INavigable | null) { + override setCurNode(node: Blockly.IFocusableNode | null) { super.setCurNode(node); let bounds: Blockly.utils.Rect | undefined; diff --git a/src/index.ts b/src/index.ts index 77a03369..53d61283 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,16 +8,6 @@ import * as Blockly from 'blockly/core'; import {NavigationController} from './navigation_controller'; import {enableBlocksOnDrag} from './disabled_blocks'; -/** Options object for KeyboardNavigation instances. */ -export interface NavigationOptions { - cursor: Partial; -} - -/** Default options for LineCursor instances. */ -const defaultOptions: NavigationOptions = { - cursor: {}, -}; - /** Plugin for keyboard navigation. */ export class KeyboardNavigation { /** The workspace. */ @@ -38,19 +28,11 @@ export class KeyboardNavigation { /** * Constructs the keyboard navigation. * - * @param workspace The workspace that the plugin will - * be added to. - * @param options Options. + * @param workspace The workspace that the plugin will be added to. */ - constructor( - workspace: Blockly.WorkspaceSvg, - options: Partial, - ) { + constructor(workspace: Blockly.WorkspaceSvg) { this.workspace = workspace; - // Regularise options and apply defaults. - options = {...defaultOptions, ...options}; - this.navigationController = new NavigationController(); this.navigationController.init(); this.navigationController.addWorkspace(workspace); @@ -59,7 +41,7 @@ export class KeyboardNavigation { this.originalTheme = workspace.getTheme(); this.setGlowTheme(); - this.cursor = new Blockly.LineCursor(workspace, options.cursor); + this.cursor = new Blockly.LineCursor(workspace); // Add the event listener to enable disabled blocks on drag. workspace.addChangeListener(enableBlocksOnDrag); diff --git a/src/keyboard_drag_strategy.ts b/src/keyboard_drag_strategy.ts index 2825e794..64e90b57 100644 --- a/src/keyboard_drag_strategy.ts +++ b/src/keyboard_drag_strategy.ts @@ -10,7 +10,6 @@ import { RenderedConnection, dragging, utils, - INavigable, } from 'blockly'; import {Direction, getDirectionFromXY} from './drag_direction'; import {showUnconstrainedMoveHint} from './hints'; diff --git a/src/navigation.ts b/src/navigation.ts index 3d8f4cf0..2c4a34f5 100644 --- a/src/navigation.ts +++ b/src/navigation.ts @@ -15,7 +15,6 @@ import * as Constants from './constants'; import { registrationName as cursorRegistrationName, registrationType as cursorRegistrationType, - FlyoutCursor, } from './flyout_cursor'; /** @@ -151,7 +150,7 @@ export class Navigation { if (FlyoutCursorClass) { flyoutWorkspace .getMarkerManager() - .setCursor(new Blockly.LineCursor(flyout.getWorkspace())); + .setCursor(new FlyoutCursorClass(flyout)); } } @@ -258,7 +257,7 @@ export class Navigation { } private isFlyoutItemDisposed( - node: Blockly.INavigable, + node: Blockly.IFocusableNode, sourceBlock: Blockly.BlockSvg | null, ) { if (sourceBlock?.disposed) { @@ -368,9 +367,7 @@ export class Navigation { : flyoutContents[flyoutContents.length - 1]; if (!defaultFlyoutItem) return false; const defaultFlyoutItemElement = defaultFlyoutItem.getElement(); - flyoutCursor.setCurNode( - defaultFlyoutItemElement as unknown as Blockly.INavigable, - ); + flyoutCursor.setCurNode(defaultFlyoutItemElement); return true; } @@ -420,11 +417,11 @@ export class Navigation { * @param workspace The main workspace the flyout is on. * @returns The flyout's cursor or null if no flyout exists. */ - getFlyoutCursor(workspace: Blockly.WorkspaceSvg): FlyoutCursor | null { + getFlyoutCursor(workspace: Blockly.WorkspaceSvg): Blockly.LineCursor | null { const flyout = workspace.getFlyout(); const cursor = flyout ? flyout.getWorkspace().getCursor() : null; - return cursor as FlyoutCursor; + return cursor; } /** @@ -437,7 +434,7 @@ export class Navigation { * wrong. */ findInsertStartPoint( - stationaryNode: Blockly.INavigable, + stationaryNode: Blockly.IFocusableNode, movingBlock: Blockly.BlockSvg, ): Blockly.RenderedConnection | null { const movingHasOutput = !!movingBlock.outputConnection; @@ -517,7 +514,7 @@ export class Navigation { * @returns True if the connection was successful, false otherwise. */ tryToConnectBlock( - stationaryNode: Blockly.INavigable, + stationaryNode: Blockly.IFocusableNode, movingBlock: Blockly.BlockSvg, ): boolean { const destConnection = this.findInsertStartPoint( diff --git a/test/index.html b/test/index.html index bf0f5f13..26036f2f 100644 --- a/test/index.html +++ b/test/index.html @@ -190,14 +190,6 @@ -
- - -
diff --git a/test/index.ts b/test/index.ts index 55946920..38a3e792 100644 --- a/test/index.ts +++ b/test/index.ts @@ -49,9 +49,6 @@ function getOptions() { renderer = 'thrasos'; } - const noStackParam = params.get('noStack'); - const stackConnections = !noStackParam; - const toolboxParam = params.get('toolbox'); const toolbox = toolboxParam ?? 'toolbox'; const toolboxObject = @@ -66,13 +63,10 @@ function getOptions() { (document.getElementById('toolbox') as HTMLSelectElement).value = toolbox; (document.getElementById('renderer') as HTMLSelectElement).value = renderer; (document.getElementById('scenario') as HTMLSelectElement).value = scenario; - (document.getElementById('noStack') as HTMLInputElement).checked = - !stackConnections; }); return { scenario, - stackConnections, renderer, toolbox: toolboxObject, }; @@ -85,7 +79,7 @@ function getOptions() { * @returns The created workspace. */ function createWorkspace(): Blockly.WorkspaceSvg { - const {scenario, stackConnections, renderer, toolbox} = getOptions(); + const {scenario, renderer, toolbox} = getOptions(); const injectOptions = { toolbox, @@ -97,10 +91,7 @@ function createWorkspace(): Blockly.WorkspaceSvg { } const workspace = Blockly.inject(blocklyDiv, injectOptions); - const navigationOptions = { - cursor: {stackConnections}, - }; - new KeyboardNavigation(workspace, navigationOptions); + new KeyboardNavigation(workspace); registerRunCodeShortcut(); // Disable blocks that aren't inside the setup or draw loops. diff --git a/test/webdriverio/index.ts b/test/webdriverio/index.ts index a01d450b..849d83b0 100644 --- a/test/webdriverio/index.ts +++ b/test/webdriverio/index.ts @@ -44,9 +44,6 @@ function getOptions() { renderer = 'thrasos'; } - const noStackParam = params.get('noStack'); - const stackConnections = !noStackParam; - const toolboxParam = params.get('toolbox'); const toolbox = toolboxParam ?? 'toolbox'; const toolboxObject = @@ -57,7 +54,6 @@ function getOptions() { return { scenario, - stackConnections, renderer, toolbox: toolboxObject, rtl, @@ -71,7 +67,7 @@ function getOptions() { * @returns The created workspace. */ function createWorkspace(): Blockly.WorkspaceSvg { - const {scenario, stackConnections, renderer, toolbox, rtl} = getOptions(); + const {scenario, renderer, toolbox, rtl} = getOptions(); const injectOptions = { toolbox, @@ -84,10 +80,7 @@ function createWorkspace(): Blockly.WorkspaceSvg { } const workspace = Blockly.inject(blocklyDiv, injectOptions); - const navigationOptions = { - cursor: {stackConnections}, - }; - new KeyboardNavigation(workspace, navigationOptions); + new KeyboardNavigation(workspace); // Disable blocks that aren't inside the setup or draw loops. workspace.addChangeListener(Blockly.Events.disableOrphans); From c014210ca3a89c808a4ba2e9105a7ae03847b3a4 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 14 May 2025 09:30:44 -0700 Subject: [PATCH 2/3] chore: Fix tests. --- test/webdriverio/test/basic_test.ts | 97 ++++++++--------------------- 1 file changed, 25 insertions(+), 72 deletions(-) diff --git a/test/webdriverio/test/basic_test.ts b/test/webdriverio/test/basic_test.ts index cd4f9e7b..d65bc8bd 100644 --- a/test/webdriverio/test/basic_test.ts +++ b/test/webdriverio/test/basic_test.ts @@ -44,13 +44,12 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.pause(PAUSE_TIME); } - const selectedId = await this.browser.execute(() => { - return Blockly.common.getSelected()?.id; - }); - chai.assert.equal(selectedId, 'controls_repeat_1'); + chai + .expect(await getCurrentFocusNodeId(this.browser)) + .to.include('controls_if_2'); }); - test('Down from statement block selects next connection', async function () { + test('Down from statement block selects next block across stacks', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'p5_canvas_1'); @@ -60,15 +59,10 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_canvas_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('p5_draw_1'); }); - test("Up from statement block selects previous block's connection", async function () { + test('Up from statement block selects previous block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'simple_circle_1'); @@ -78,15 +72,10 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('draw_emoji_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('draw_emoji_1'); }); - test('Down from parent block selects input connection', async function () { + test('Down from parent block selects first child block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'p5_setup_1'); @@ -95,15 +84,10 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.pause(PAUSE_TIME); chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_setup_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('p5_canvas_1'); }); - test('Up from child block selects input connection', async function () { + test('Up from child block selects parent block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'p5_canvas_1'); @@ -112,12 +96,7 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.pause(PAUSE_TIME); chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_setup_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('p5_setup_1'); }); test('Right from block selects first field', async function () { @@ -205,8 +184,7 @@ suite('Keyboard navigation on Blocks', function () { ); }); - // Test will fail until we update to a newer version of field-colour - test.skip("Right from last inline input selects block's next connection", async function () { + test('Right from last inline input selects next block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'colour_picker_1'); @@ -216,16 +194,10 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('simple_circle_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('controls_repeat_ext_1'); }); - // Test will fail until we update to a newer version of field-colour - test.skip("Down from inline input selects block's next connection", async function () { + test('Down from inline input selects next block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeById(this.browser, 'colour_picker_1'); @@ -235,25 +207,20 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('simple_circle_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('controls_repeat_ext_1'); }); - test("Down from inline input selects block's child connection", async function () { + test("Down from inline input selects block's child block", async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); - await setCurrentCursorNodeById(this.browser, 'math_number_2'); + await setCurrentCursorNodeById(this.browser, 'logic_boolean_1'); await this.browser.pause(PAUSE_TIME); await this.browser.keys(Key.ArrowDown); await this.browser.pause(PAUSE_TIME); chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_repeat_ext_1_connection_'); + .to.include('text_print_1'); }); test('Right from text block selects shadow block then field', async function () { @@ -278,11 +245,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('text_print_1_connection_'); - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('controls_repeat_1'); }); }); @@ -364,7 +327,7 @@ suite('Keyboard navigation on Fields', function () { chai.assert.equal(await getFocusedFieldName(this.browser), 'WIDTH'); }); - test("Right from second field selects block's next connection", async function () { + test('Right from second field selects next block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeByIdAndFieldName( @@ -378,10 +341,10 @@ suite('Keyboard navigation on Fields', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_canvas_1_connection_'); + .to.include('p5_draw_1'); }); - test("Down from field selects block's next connection", async function () { + test('Down from field selects next block', async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeByIdAndFieldName( @@ -395,15 +358,10 @@ suite('Keyboard navigation on Fields', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_canvas_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('p5_draw_1'); }); - test("Down from field selects block's child connection", async function () { + test("Down from field selects block's child block", async function () { await tabNavigateToWorkspace(this.browser); await this.browser.pause(PAUSE_TIME); await setCurrentCursorNodeByIdAndFieldName( @@ -417,11 +375,6 @@ suite('Keyboard navigation on Fields', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_repeat_1_connection_'); - - chai.assert.equal( - await getFocusedConnectionType(this.browser), - Blockly.ConnectionType.NEXT_STATEMENT, - ); + .to.include('draw_emoji_1'); }); }); From c0ad421fe6b7879e8a810ec1743dfeeb1d583ac9 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 14 May 2025 10:33:24 -0700 Subject: [PATCH 3/3] refactor: Use .equal instead of .to.include --- test/webdriverio/test/basic_test.ts | 34 ++++++++++------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/test/webdriverio/test/basic_test.ts b/test/webdriverio/test/basic_test.ts index d65bc8bd..b2287b89 100644 --- a/test/webdriverio/test/basic_test.ts +++ b/test/webdriverio/test/basic_test.ts @@ -46,7 +46,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_if_2'); + .equal('controls_if_2'); }); test('Down from statement block selects next block across stacks', async function () { @@ -57,9 +57,7 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.keys(Key.ArrowDown); await this.browser.pause(PAUSE_TIME); - chai - .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_draw_1'); + chai.expect(await getCurrentFocusNodeId(this.browser)).equal('p5_draw_1'); }); test('Up from statement block selects previous block', async function () { @@ -72,7 +70,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('draw_emoji_1'); + .equal('draw_emoji_1'); }); test('Down from parent block selects first child block', async function () { @@ -82,9 +80,7 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.pause(PAUSE_TIME); await this.browser.keys(Key.ArrowDown); await this.browser.pause(PAUSE_TIME); - chai - .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_canvas_1'); + chai.expect(await getCurrentFocusNodeId(this.browser)).equal('p5_canvas_1'); }); test('Up from child block selects parent block', async function () { @@ -94,9 +90,7 @@ suite('Keyboard navigation on Blocks', function () { await this.browser.pause(PAUSE_TIME); await this.browser.keys(Key.ArrowUp); await this.browser.pause(PAUSE_TIME); - chai - .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_setup_1'); + chai.expect(await getCurrentFocusNodeId(this.browser)).equal('p5_setup_1'); }); test('Right from block selects first field', async function () { @@ -194,7 +188,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_repeat_ext_1'); + .equal('controls_repeat_ext_1'); }); test('Down from inline input selects next block', async function () { @@ -207,7 +201,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_repeat_ext_1'); + .equal('controls_repeat_ext_1'); }); test("Down from inline input selects block's child block", async function () { @@ -220,7 +214,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('text_print_1'); + .equal('text_print_1'); }); test('Right from text block selects shadow block then field', async function () { @@ -245,7 +239,7 @@ suite('Keyboard navigation on Blocks', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('controls_repeat_1'); + .equal('controls_repeat_1'); }); }); @@ -339,9 +333,7 @@ suite('Keyboard navigation on Fields', function () { await this.browser.keys(Key.ArrowRight); await this.browser.pause(PAUSE_TIME); - chai - .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_draw_1'); + chai.expect(await getCurrentFocusNodeId(this.browser)).equal('p5_draw_1'); }); test('Down from field selects next block', async function () { @@ -356,9 +348,7 @@ suite('Keyboard navigation on Fields', function () { await this.browser.keys(Key.ArrowDown); await this.browser.pause(PAUSE_TIME); - chai - .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('p5_draw_1'); + chai.expect(await getCurrentFocusNodeId(this.browser)).equal('p5_draw_1'); }); test("Down from field selects block's child block", async function () { @@ -375,6 +365,6 @@ suite('Keyboard navigation on Fields', function () { chai .expect(await getCurrentFocusNodeId(this.browser)) - .to.include('draw_emoji_1'); + .equal('draw_emoji_1'); }); });