diff --git a/core/procedures.js b/core/procedures.js index 007f7deac..610c7890d 100644 --- a/core/procedures.js +++ b/core/procedures.js @@ -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]; diff --git a/tests/mocha/procedures_test.js b/tests/mocha/procedures_test.js index 2b0047e47..32752ee57 100644 --- a/tests/mocha/procedures_test.js +++ b/tests/mocha/procedures_test.js @@ -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(