From 6e8d200857d8d9ea964f16ec643174d7ced98186 Mon Sep 17 00:00:00 2001 From: alschmiedt Date: Wed, 4 Sep 2019 10:58:47 -0700 Subject: [PATCH] Refactors modify and add tests (#2955) * Refactors modify and add tests --- core/keyboard_nav/navigation.js | 113 ++++++++++++++----------- tests/mocha/.eslintrc.json | 3 +- tests/mocha/navigation_modify_test.js | 114 +++++++++++++++++--------- tests/mocha/navigation_test.js | 19 ++++- tests/mocha/test_helpers.js | 20 ++++- 5 files changed, 176 insertions(+), 93 deletions(-) diff --git a/core/keyboard_nav/navigation.js b/core/keyboard_nav/navigation.js index c3247aa78..1385bc38c 100644 --- a/core/keyboard_nav/navigation.js +++ b/core/keyboard_nav/navigation.js @@ -385,7 +385,7 @@ Blockly.navigation.insertFromFlyout = function() { newBlock.setConnectionsHidden(false); Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode(newBlock)); - if (!Blockly.navigation.modify()) { + if (!Blockly.navigation.modify_()) { Blockly.navigation.warn('Something went wrong while inserting a block from the flyout.'); } @@ -412,11 +412,12 @@ Blockly.navigation.resetFlyout = function(shouldHide) { /************/ /** - * Handle the modifier key (currently I for Insert). - * @return {boolean} True if the key was handled; false if something went wrong. - * @package + * Warns the user if the cursor or marker is on a type that can not be connected. + * @return {boolean} True if the marker and cursor are valid types, false + * otherwise. + * @private */ -Blockly.navigation.modify = function() { +Blockly.navigation.modifyWarn_ = function() { var markerNode = Blockly.navigation.marker_.getCurNode(); var cursorNode = Blockly.navigation.cursor_.getCurNode(); @@ -432,68 +433,83 @@ Blockly.navigation.modify = function() { var markerType = markerNode.getType(); var cursorType = cursorNode.getType(); + // Check the marker for invalid types. if (markerType == Blockly.ASTNode.types.FIELD) { Blockly.navigation.warn('Should not have been able to mark a field.'); return false; - } - if (markerType == Blockly.ASTNode.types.BLOCK) { + } else if (markerType == Blockly.ASTNode.types.BLOCK) { Blockly.navigation.warn('Should not have been able to mark a block.'); return false; - } - if (markerType == Blockly.ASTNode.types.STACK) { + } else if (markerType == Blockly.ASTNode.types.STACK) { Blockly.navigation.warn('Should not have been able to mark a stack.'); return false; } + // Check the cursor for invalid types. if (cursorType == Blockly.ASTNode.types.FIELD) { Blockly.navigation.warn('Cannot attach a field to anything else.'); return false; - } - - if (cursorType == Blockly.ASTNode.types.WORKSPACE) { + } else if (cursorType == Blockly.ASTNode.types.WORKSPACE) { Blockly.navigation.warn('Cannot attach a workspace to anything else.'); return false; } + return true; +}; + +/** + * Disconnect the block from its parent and move to the position of the + * workspace node. + * @param {!Blockly.Block} block The block to be moved to the workspace. + * @param {!Blockly.ASTNode} wsNode The workspace node holding the position the + * block will be moved to. + * @return {boolean} True if the block can be moved to the workspace, + * false otherwise. + * @private + */ +Blockly.navigation.moveBlockToWorkspace_ = function(block, wsNode) { + if (block.isShadow()) { + Blockly.navigation.warn('Cannot move a shadow block to the workspace.'); + return false; + } + if (block.getParent()) { + block.unplug(false); + } + block.moveTo(wsNode.getWsCoordinate()); + return true; +}; + +/** + * Handle the modifier key (currently I for Insert). + * Tries to connect the current marker and cursor location. Warns the user if + * the two locations can not be connected. + * @return {boolean} True if the key was handled; false if something went wrong. + * @private + */ +Blockly.navigation.modify_ = function() { + var markerNode = Blockly.navigation.marker_.getCurNode(); + var cursorNode = Blockly.navigation.cursor_.getCurNode(); + if (!Blockly.navigation.modifyWarn_()) { + return false; + } + + var markerType = markerNode.getType(); + var cursorType = cursorNode.getType(); var cursorLoc = cursorNode.getLocation(); var markerLoc = markerNode.getLocation(); - if (markerNode.isConnection()) { - // TODO: Handle the case when one or both are already connected. - if (cursorNode.isConnection()) { - return Blockly.navigation.connect(cursorLoc, markerLoc); - } else if (cursorType == Blockly.ASTNode.types.BLOCK || - cursorType == Blockly.ASTNode.types.STACK) { - return Blockly.navigation.insertBlock(cursorLoc, markerLoc); - } + if (markerNode.isConnection() && cursorNode.isConnection()) { + return Blockly.navigation.connect(cursorLoc, markerLoc); + } else if (markerNode.isConnection() && + (cursorType == Blockly.ASTNode.types.BLOCK || + cursorType == Blockly.ASTNode.types.STACK)) { + return Blockly.navigation.insertBlock(cursorLoc, markerLoc); } else if (markerType == Blockly.ASTNode.types.WORKSPACE) { - if (cursorNode.isConnection()) { - if (cursorType == Blockly.ASTNode.types.INPUT || - cursorType == Blockly.ASTNode.types.NEXT) { - Blockly.navigation.warn( - 'Cannot move a next or input connection to the workspace.'); - return false; - } - var block = cursorLoc.getSourceBlock(); - } else if (cursorType == Blockly.ASTNode.types.BLOCK || - cursorType == Blockly.ASTNode.types.STACK) { - var block = cursorLoc; - } else { - return false; - } - if (block.isShadow()) { - Blockly.navigation.warn('Cannot move a shadow block to the workspace.'); - return false; - } - if (block.getParent()) { - block.unplug(false); - } - block.moveTo(markerNode.getWsCoordinate()); - return true; + var block = Blockly.navigation.getSourceBlock_(cursorNode); + return Blockly.navigation.moveBlockToWorkspace_(block, markerNode); } - Blockly.navigation.warn('Unexpected state in Blockly.navigation.modify.'); + Blockly.navigation.warn('Unexpected state in Blockly.navigation.modify_.'); return false; - // TODO: Make sure the cursor and marker end up in the right places. }; /** @@ -768,8 +784,9 @@ Blockly.navigation.getSourceBlock_ = function(node) { } if (node.getType() === Blockly.ASTNode.types.BLOCK) { return node.getLocation(); - } else if (node.getType() === Blockly.ASTNode.types.WORKSPACE || - node.getType() === Blockly.ASTNode.types.STACK) { + } else if (node.getType() === Blockly.ASTNode.types.STACK) { + return node.getLocation(); + } else if (node.getType() === Blockly.ASTNode.types.WORKSPACE) { return null; } else { return node.getLocation().getSourceBlock(); @@ -894,7 +911,7 @@ Blockly.navigation.workspaceOnAction_ = function(action) { Blockly.navigation.cursor_.in(); return true; case Blockly.navigation.actionNames.INSERT: - Blockly.navigation.modify(); + Blockly.navigation.modify_(); return true; case Blockly.navigation.actionNames.MARK: Blockly.navigation.handleEnterForWS(); diff --git a/tests/mocha/.eslintrc.json b/tests/mocha/.eslintrc.json index 8d4e9ecf7..b4bb40fec 100644 --- a/tests/mocha/.eslintrc.json +++ b/tests/mocha/.eslintrc.json @@ -15,7 +15,8 @@ "assertUndefined": true, "assertNotUndefined": true, "defineStackBlock": true, - "defineRowBlock": true + "defineRowBlock": true, + "defineStatementBlock": true }, "extends": "../../.eslintrc.json" diff --git a/tests/mocha/navigation_modify_test.js b/tests/mocha/navigation_modify_test.js index 8ffe834f4..4f6f25594 100644 --- a/tests/mocha/navigation_modify_test.js +++ b/tests/mocha/navigation_modify_test.js @@ -5,9 +5,12 @@ suite('Insert/Modify', function() { '' + '' + '' + + '' + + '' + ''; defineStackBlock(); defineRowBlock(); + defineStatementBlock(); var toolbox = document.getElementById('toolbox-connections'); this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); @@ -17,6 +20,8 @@ suite('Insert/Modify', function() { this.stack_block_2 = this.workspace.getBlockById('stack_block_2'); this.row_block_1 = this.workspace.getBlockById('row_block_1'); this.row_block_2 = this.workspace.getBlockById('row_block_2'); + this.statement_block_1 = this.workspace.getBlockById('statement_block_1'); + this.statement_block_2 = this.workspace.getBlockById('statement_block_2'); Blockly.navigation.enableKeyboardAccessibility(); Blockly.navigation.focusWorkspace(); @@ -25,9 +30,8 @@ suite('Insert/Modify', function() { teardown(function() { delete Blockly.Blocks['stack_block']; delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; this.workspace.dispose(); - // Does disposing of the workspace dispose of cursors and markers - // correctly? }); suite('Marked Connection', function() { @@ -42,13 +46,13 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createWorkspaceNode(this.workspace, new Blockly.utils.Coordinate(0, 0))); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on compatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_2.previousConnection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.stack_block_1.getNextBlock().id, 'stack_block_2'); }); test('Cursor on incompatible connection', function() { @@ -57,21 +61,21 @@ suite('Insert/Modify', function() { this.stack_block_2.nextConnection)); // Connect method will try to find a way to connect blocks with // incompatible types. - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.stack_block_1.getNextBlock(), this.stack_block_2); }); test('Cursor on really incompatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_1.outputConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); chai.assert.isNull(this.stack_block_1.getNextBlock()); }); test('Cursor on block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.stack_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.stack_block_1.getNextBlock().id, 'stack_block_2'); }); }); @@ -86,35 +90,35 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_2.nextConnection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.stack_block_1.getPreviousBlock().id, 'stack_block_2'); }); test('Cursor on incompatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_2.previousConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); chai.assert.isNull(this.stack_block_1.getPreviousBlock()); }); test('Cursor on really incompatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_1.outputConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); chai.assert.isNull(this.stack_block_1.getNextBlock()); }); test('Cursor on block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.stack_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.stack_block_1.getPreviousBlock().id, 'stack_block_2'); }); test('Cursor on incompatible block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_1)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); chai.assert.isNull(this.stack_block_1.getPreviousBlock()); }); }); @@ -129,7 +133,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_2.outputConnection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.row_block_2.getParent().id, 'row_block_1'); }); test('Cursor on incompatible connection', function() { @@ -138,7 +142,7 @@ suite('Insert/Modify', function() { this.row_block_2.inputList[0].connection)); // Connect method will try to find a way to connect blocks with // incompatible types. - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.row_block_1.inputList[0].connection.targetBlock(), this.row_block_2); }); @@ -146,19 +150,49 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_1.previousConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.row_block_2.getParent().id, 'row_block_1'); }); }); - suite('Statement input', function() { - // TODO: fill this out. + suite('Marked Statement input', function() { + setup(function() { + this.statement_block_1.inputList[0].connection.connect( + this.stack_block_1.previousConnection); + this.stack_block_1.nextConnection.connect(this.stack_block_2.previousConnection); + Blockly.navigation.marker_.setLocation( + Blockly.ASTNode.createInputNode( + this.statement_block_1.inputList[0])); + }); + test('Cursor on block inside statement', function() { + Blockly.navigation.cursor_.setLocation( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_2.previousConnection.targetBlock(), + this.statement_block_1); + }); + test('Cursor on stack', function() { + Blockly.navigation.cursor_.setLocation( + Blockly.ASTNode.createStackNode( + this.statement_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.statement_block_2.getParent().id, 'statement_block_1'); + }); + test('Cursor on incompatible type', function() { + Blockly.navigation.cursor_.setLocation( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_1.getParent(), null); + }); + }); suite('Marker on output', function() { @@ -171,26 +205,26 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_2.inputList[0].connection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.row_block_1.getParent().id, 'row_block_2'); }); test('Cursor on incompatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_2.outputConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on really incompatible connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_1.previousConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.equal(this.row_block_1.getParent().id, 'row_block_2'); }); }); @@ -207,7 +241,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_1)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); var pos = this.row_block_1.getRelativeToSurfaceXY(); chai.assert.equal(100, pos.x); chai.assert.equal(200, pos.y); @@ -217,7 +251,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_1.outputConnection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); var pos = this.row_block_1.getRelativeToSurfaceXY(); chai.assert.equal(100, pos.x); chai.assert.equal(200, pos.y); @@ -227,7 +261,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_1.previousConnection)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); var pos = this.stack_block_1.getRelativeToSurfaceXY(); chai.assert.equal(100, pos.x); chai.assert.equal(200, pos.y); @@ -237,14 +271,16 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_1.inputList[0].connection)); - chai.assert.isFalse(Blockly.navigation.modify()); + // Move the source block to the marked location on the workspace. + chai.assert.isTrue(Blockly.navigation.modify_()); }); test('Cursor on next connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_1.nextConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + // Move the source block to the marked location on the workspace. + chai.assert.isTrue(Blockly.navigation.modify_()); }); test('Cursor on child block (row)', function() { @@ -255,7 +291,7 @@ suite('Insert/Modify', function() { Blockly.ASTNode.createBlockNode( this.row_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.isNull(this.row_block_2.getParent()); var pos = this.row_block_2.getRelativeToSurfaceXY(); chai.assert.equal(100, pos.x); @@ -270,7 +306,7 @@ suite('Insert/Modify', function() { Blockly.ASTNode.createBlockNode( this.stack_block_2)); - chai.assert.isTrue(Blockly.navigation.modify()); + chai.assert.isTrue(Blockly.navigation.modify_()); chai.assert.isNull(this.stack_block_2.getParent()); var pos = this.stack_block_2.getRelativeToSurfaceXY(); chai.assert.equal(100, pos.x); @@ -281,7 +317,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createWorkspaceNode( this.workspace, new Blockly.utils.Coordinate(100, 100))); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); }); @@ -300,7 +336,7 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createWorkspaceNode( this.workspace, new Blockly.utils.Coordinate(100, 100))); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); }); @@ -314,25 +350,25 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_1)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on stack block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.stack_block_1)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on next connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_2.nextConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on previous connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.stack_block_2.previousConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); }); suite('Marked row block', function() { @@ -345,25 +381,25 @@ suite('Insert/Modify', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.stack_block_1)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on row block', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createBlockNode( this.row_block_1)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on value input connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_2.inputList[0].connection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); test('Cursor on output connection', function() { Blockly.navigation.cursor_.setLocation( Blockly.ASTNode.createConnectionNode( this.row_block_2.outputConnection)); - chai.assert.isFalse(Blockly.navigation.modify()); + chai.assert.isFalse(Blockly.navigation.modify_()); }); }); }); diff --git a/tests/mocha/navigation_test.js b/tests/mocha/navigation_test.js index 654eb9d33..bead4fa50 100644 --- a/tests/mocha/navigation_test.js +++ b/tests/mocha/navigation_test.js @@ -282,13 +282,13 @@ suite('Navigation', function() { }); test('Insert', function() { - sinon.spy(Blockly.navigation, 'modify'); + sinon.spy(Blockly.navigation, 'modify_'); this.mockEvent.keyCode = Blockly.utils.KeyCodes.I; chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); - chai.assert.isTrue(Blockly.navigation.modify.calledOnce); + chai.assert.isTrue(Blockly.navigation.modify_.calledOnce); chai.assert.equal(Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); - Blockly.navigation.modify.restore(); + Blockly.navigation.modify_.restore(); }); test('Mark', function() { @@ -504,7 +504,7 @@ suite('Navigation', function() { var sourceNode = Blockly.ASTNode.createConnectionNode(this.basicBlock2.nextConnection); Blockly.navigation.cursor_.setLocation(sourceNode); - Blockly.navigation.modify(); + Blockly.navigation.modify_(); var insertedBlock = this.basicBlock.previousConnection.targetBlock(); chai.assert.isNotNull(insertedBlock); @@ -673,5 +673,16 @@ suite('Navigation', function() { chai.assert.equal(this.workspace.cursor.getCurNode().getType(), Blockly.ASTNode.types.WORKSPACE); }); + + test('Delete top block in stack', function() { + this.basicBlockA.nextConnection.connect(this.basicBlockB.previousConnection); + var astNode = Blockly.ASTNode.createStackNode(this.basicBlockA); + // Set the cursor to be on the stack + this.workspace.cursor.setLocation(astNode); + // Remove the top block in the stack + this.basicBlockA.dispose(); + chai.assert.equal(this.workspace.cursor.getCurNode().getType(), + Blockly.ASTNode.types.WORKSPACE); + }); }); }); diff --git a/tests/mocha/test_helpers.js b/tests/mocha/test_helpers.js index 3a44579e9..022e7eadd 100644 --- a/tests/mocha/test_helpers.js +++ b/tests/mocha/test_helpers.js @@ -1,7 +1,7 @@ /* exported assertEquals, assertNotEquals, assertArrayEquals, assertTrue, assertFalse, assertNull, assertNotNull, assertNotNullNorUndefined, assert, isEqualArrays, assertUndefined, assertNotUndefined, - defineRowBlock, defineStackBlock */ + defineRowBlock, defineStackBlock, defineStatementBlock */ function _argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) { return args.length == expectedNumberOfNonCommentArgs + 1; } @@ -158,3 +158,21 @@ function defineRowBlock() { }]); } +function defineStatementBlock() { + Blockly.defineBlocksWithJsonArray([{ + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); +} +