* Use getBlocksByType to speed up allProcedures generation

* Add tests for allProcedures

* Add error messages for some tests
This commit is contained in:
Maribeth Bottorff
2020-05-01 11:44:26 -07:00
committed by GitHub
parent 43c2a0e85c
commit be50de6650
2 changed files with 50 additions and 18 deletions

View File

@@ -60,24 +60,13 @@ Blockly.Procedures.ProcedureBlock;
* list, and return value boolean.
*/
Blockly.Procedures.allProcedures = function(root) {
// Assume that a procedure definition is a top block.
var blocks = root.getTopBlocks(false);
var proceduresReturn = [];
var proceduresNoReturn = [];
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].getProcedureDef) {
var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ (
blocks[i]);
var tuple = procedureBlock.getProcedureDef();
if (tuple) {
if (tuple[2]) {
proceduresReturn.push(tuple);
} else {
proceduresNoReturn.push(tuple);
}
}
}
}
var proceduresNoReturn = root.getBlocksByType('procedures_defnoreturn', false)
.map(function(block) {
return /** @type {!Blockly.Procedures.ProcedureBlock} */ (block).getProcedureDef();
});
var proceduresReturn = root.getBlocksByType('procedures_defreturn', false).map(function(block) {
return /** @type {!Blockly.Procedures.ProcedureBlock} */ (block).getProcedureDef();
});
proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_);
proceduresReturn.sort(Blockly.Procedures.procTupleComparator_);
return [proceduresNoReturn, proceduresReturn];

View File

@@ -40,6 +40,49 @@ suite('Procedures', function() {
this.workspace.dispose();
});
suite('allProcedures', function() {
test('Only Procedures', function() {
var noReturnBlock = new Blockly.Block(this.workspace, 'procedures_defnoreturn');
noReturnBlock.setFieldValue('no return', 'NAME');
var returnBlock = new Blockly.Block(this.workspace, 'procedures_defreturn');
returnBlock.setFieldValue('return', 'NAME');
var allProcedures = Blockly.Procedures.allProcedures(this.workspace);
chai.assert.lengthOf(allProcedures, 2);
chai.assert.lengthOf(allProcedures[0], 1);
chai.assert.equal(allProcedures[0][0][0], 'no return');
chai.assert.lengthOf(allProcedures[1], 1);
chai.assert.equal(allProcedures[1][0][0], 'return');
});
test('Multiple Blocks', function() {
var noReturnBlock = new Blockly.Block(this.workspace, 'procedures_defnoreturn');
noReturnBlock.setFieldValue('no return', 'NAME');
var returnBlock = new Blockly.Block(this.workspace, 'procedures_defreturn');
returnBlock.setFieldValue('return', 'NAME');
var returnBlock2 = new Blockly.Block(this.workspace, 'procedures_defreturn');
returnBlock2.setFieldValue('return2', 'NAME');
var _ = new Blockly.Block(this.workspace, 'controls_if');
var allProcedures = Blockly.Procedures.allProcedures(this.workspace);
chai.assert.lengthOf(allProcedures, 2);
chai.assert.lengthOf(allProcedures[0], 1);
chai.assert.equal(allProcedures[0][0][0], 'no return');
chai.assert.lengthOf(allProcedures[1], 2);
chai.assert.equal(allProcedures[1][0][0], 'return');
chai.assert.equal(allProcedures[1][1][0], 'return2');
});
test('No Procedures', function() {
var _ = new Blockly.Block(this.workspace, 'controls_if');
var allProcedures = Blockly.Procedures.allProcedures(this.workspace);
chai.assert.lengthOf(allProcedures, 2);
chai.assert.lengthOf(allProcedures[0], 0, 'No procedures_defnoreturn blocks expected');
chai.assert.lengthOf(allProcedures[1], 0, 'No procedures_defreturn blocks expected');
});
});
suite('isNameUsed', function() {
test('No Blocks', function() {
chai.assert.isFalse(