mirror of
https://github.com/google/blockly.git
synced 2026-01-08 01:20:12 +01:00
Procedure (#3875)
* Use getBlocksByType to speed up allProcedures generation * Add tests for allProcedures * Add error messages for some tests
This commit is contained in:
committed by
GitHub
parent
43c2a0e85c
commit
be50de6650
@@ -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];
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user