From 65bb33635dbb1068182ccf52c13998b157ae991a Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Sat, 2 May 2020 07:37:58 -0700 Subject: [PATCH] Add ignoring insertion markers in code gen --- core/generator.js | 4 + tests/mocha/index.html | 1 + tests/mocha/insertion_marker_test.js | 203 +++++++++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 tests/mocha/insertion_marker_test.js diff --git a/core/generator.js b/core/generator.js index 6937042d5..f556f6894 100644 --- a/core/generator.js +++ b/core/generator.js @@ -172,6 +172,10 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { // Skip past this block if it is disabled. return opt_thisOnly ? '' : this.blockToCode(block.getNextBlock()); } + if (block.isInsertionMarker()) { + // Skip past insertion markers. + return opt_thisOnly ? '' : this.blockToCode(block.getChildren(false)[0]); + } var func = this[block.type]; if (typeof func != 'function') { diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 75869ca30..7e835769a 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -59,6 +59,7 @@ + diff --git a/tests/mocha/insertion_marker_test.js b/tests/mocha/insertion_marker_test.js new file mode 100644 index 000000000..3a43c8561 --- /dev/null +++ b/tests/mocha/insertion_marker_test.js @@ -0,0 +1,203 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('InsertionMarkers', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + Blockly.defineBlocksWithJsonArray([ + { + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }, + { + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "STATEMENT" + } + ], + "previousStatement": null, + "nextStatement": null + }]); + }); + teardown(function() { + this.workspace.dispose(); + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + suite('Code Generation', function() { + setup(function() { + Blockly.JavaScript['stack_block'] = function(_) { + return 'stack;\n'; + }; + Blockly.JavaScript['row_block'] = function(block) { + var value = Blockly.JavaScript + .valueToCode(block, 'INPUT', Blockly.JavaScript.ORDER_NONE); + var code = 'row(' + value + ')'; + return [code, Blockly.JavaScript.ORDER_NONE]; + }; + Blockly.JavaScript['statement_block'] = function(block) { + return 'statement{\n' + Blockly.JavaScript + .statementToCode(block, 'STATEMENT') + '};\n'; + }; + + this.assertGen = function(xml, expectedCode) { + Blockly.Xml.domToWorkspace(xml, this.workspace); + var block = this.workspace.getBlockById('insertion'); + block.isInsertionMarker_ = true; + var code = Blockly.JavaScript.workspaceToCode(this.workspace); + chai.assert.equal(code, expectedCode); + }; + }); + teardown(function() { + delete Blockly.JavaScript['stack_block']; + delete Blockly.JavaScript['row_block']; + delete Blockly.JavaScript['statement_block']; + delete this.assertGen; + }); + test('Marker Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'statement{\n};\n'); + }); + test('Marker Enclosed', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'statement{\n};\n'); + }); + test('Marker Enclosed and Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, + 'statement{\n' + + ' statement{\n' + + ' };\n' + + '};\n'); + }); + test('Marker Prev', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack;\n'); + }); + test('Marker Next', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack;\n'); + }); + test('Marker Middle of Stack', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, + 'stack;\n' + + 'stack;\n'); + }); + test('Marker On Output', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row();\n'); + }); + test('Marker On Input', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row();\n'); + }); + test('Marker Middle of Row', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row(row());\n'); + }); + test('Marker Detatched', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack;\n'); + }); + }); +});