/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ goog.module('Blockly.test.insertionMarker'); const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); suite('InsertionMarkers', function() { setup(function() { sharedTestSetup.call(this); this.workspace = Blockly.inject('blocklyDiv', {}); 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() { sharedTestTeardown.call(this); }); suite('Code Generation', function() { setup(function() { Blockly.JavaScript['stack_block'] = function(block) { return 'stack[' + block.id + '];\n'; }; Blockly.JavaScript['row_block'] = function(block) { const value = Blockly.JavaScript .valueToCode(block, 'INPUT', Blockly.JavaScript.ORDER_NONE); const code = 'row[' + block.id + '](' + value + ')'; return [code, Blockly.JavaScript.ORDER_NONE]; }; Blockly.JavaScript['statement_block'] = function(block) { return 'statement[' + block.id + ']{\n' + Blockly.JavaScript .statementToCode(block, 'STATEMENT') + '};\n'; }; this.assertGen = function(xml, expectedCode) { Blockly.Xml.domToWorkspace(xml, this.workspace); const block = this.workspace.getBlockById('insertion'); block.isInsertionMarker_ = true; const 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']; }); test('Marker Surrounds', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'statement[a]{\n};\n'); }); test('Marker Enclosed', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'statement[a]{\n};\n'); }); test('Marker Enclosed and Surrounds', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'statement[a]{\n' + ' statement[b]{\n' + ' };\n' + '};\n'); }); test('Marker Prev', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'stack[a];\n'); }); test('Marker Next', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'stack[a];\n'); }); test('Marker Middle of Stack', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'stack[a];\n' + 'stack[b];\n'); }); test('Marker On Output', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'row[a]();\n'); }); test('Marker On Input', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'row[a]();\n'); }); test('Marker Middle of Row', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertGen(xml, 'row[a](row[b]());\n'); }); test('Marker Detatched', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ''); this.assertGen(xml, 'stack[a];\n'); }); }); suite('Serialization', function() { setup(function() { this.assertXml = function(xmlIn, expectXml) { Blockly.Xml.domToWorkspace(xmlIn, this.workspace); const block = this.workspace.getBlockById('insertion'); block.setInsertionMarker(true); let xml = Blockly.Xml.workspaceToDom(this.workspace); Blockly.Xml.domToWorkspace(xml, this.workspace); xml = Blockly.Xml.domToText(xml); chai.assert.equal(xml, expectXml); }; }); test('Marker Surrounds', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); // Note how the x and y are not 20, they are slightly lower and end-er // because these are the coords of the wrapped block. this.assertXml(xml, '' + '' + ''); }); test('Marker Enclosed', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + ''); }); test('Marker Enclosed and Surrounds', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + '' + '' + '' + '' + ''); }); test('Marker Prev', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); // Note how the y coord is not at 20, it is lower. This is because these // are the coords of the next block. this.assertXml(xml, '' + '' + ''); }); test('Marker Next', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + ''); }); test('Marker Middle of Stack', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + '' + '' + '' + '' + ''); }); test('Marker On Output', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); // Note how the x value is not at 20. This is because these are the coords // of the wrapped block. this.assertXml(xml, '' + '' + ''); }); test('Marker On Input', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + ''); }); test('Marker Middle of Row', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + '' + '' + '' + '' + ''); }); test('Marker Detatched', function() { const xml = Blockly.Xml.textToDom( '' + ' ' + ' ' + ''); this.assertXml(xml, '' + '' + ''); }); }); });