Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions blocks/procedures.js
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,7 @@ const procedureDefMutator = {
}
}

this.doProcedureUpdate();
this.setStatements_(state['hasStatements'] === false ? false : true);

// Call mutate callers for backwards compatibility.
Expand Down
311 changes: 277 additions & 34 deletions tests/mocha/blocks/procedures_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1985,6 +1985,55 @@ suite('Procedures', function() {
});
});

suite('extra serialization test cases', function() {
test('definitions with parameters are properly rendered', function() {
Blockly.serialization.workspaces.load({
"blocks": {
"languageVersion": 0,
"blocks": [
{
"type": "procedures_defnoreturn",
"extraState": {
"procedureId": "procId",
"params": [
{
"name": "x",
"id": "varId",
"paramId": "paramId",
},
],
},
"fields": {
"NAME": "do something",
},
},
],
},
"procedures": [
{
"id": "procId",
"name": "do something",
"returnTypes": null,
"parameters": [
{
"id": "paramId",
"name": "x",
},
],
},
],
"variables": [
{
"name": "x",
"id": "varId",
},
],
}, this.workspace);
assertDefBlockStructure(
this.workspace.getTopBlocks(false)[0], false, ['x'], ['varId']);
});
});

const testSuites = [
{title: 'procedures_defreturn', hasReturn: true,
defType: 'procedures_defreturn', callType: 'procedures_callreturn'},
Expand Down Expand Up @@ -2480,7 +2529,7 @@ suite('Procedures', function() {
*/
const testCases = [
{
title: 'Minimal definition',
title: 'XML - Minimal definition',
xml: '<block type="' + testSuite.defType + '"/>',
expectedXml:
'<block xmlns="https://developers.google.com/blockly/xml" ' +
Expand All @@ -2493,7 +2542,7 @@ suite('Procedures', function() {
},
},
{
title: 'Common definition',
title: 'XML - Common definition',
xml:
'<block type="' + testSuite.defType + '">' +
' <field name="NAME">do something</field>' +
Expand All @@ -2509,8 +2558,7 @@ suite('Procedures', function() {
},
},
{
title: 'With vars definition',
skip: true,
title: 'XML - With vars definition',
xml:
'<block type="' + testSuite.defType + '">\n' +
' <mutation>\n' +
Expand All @@ -2535,8 +2583,7 @@ suite('Procedures', function() {
},
},
{
title: 'With pre-created vars definition',
skip: true,
title: 'XML - With pre-created vars definition',
xml:
'<block type="' + testSuite.defType + '">\n' +
' <mutation>\n' +
Expand All @@ -2559,31 +2606,7 @@ suite('Procedures', function() {
},
},
{
title: 'With pre-created typed vars definition',
skip: true,
xml:
'<block type="' + testSuite.defType + '">\n' +
' <mutation>\n' +
' <arg name="preCreatedTypedVar" varid="preCreatedTypedVarId"></arg>\n' +
' </mutation>\n' +
' <field name="NAME">do something</field>\n' +
'</block>',
expectedXml:
'<block xmlns="https://developers.google.com/blockly/xml" ' +
'type="' + testSuite.defType + '" id="1">\n' +
' <mutation>\n' +
' <arg name="preCreatedTypedVar" varid="preCreatedTypedVarId"></arg>\n' +
' </mutation>\n' +
' <field name="NAME">do something</field>\n' +
'</block>',
assertBlockStructure:
(block) => {
assertDefBlockStructure(block, testSuite.hasReturn,
['preCreatedTypedVar'], ['preCreatedTypedVarId']);
},
},
{
title: 'No statements definition',
title: 'XML - No statements definition',
xml:
'<block type="procedures_defreturn">\n' +
' <mutation statements="false"></mutation>\n' +
Expand All @@ -2601,7 +2624,7 @@ suite('Procedures', function() {
},
},
{
title: 'Minimal caller',
title: 'XML - Minimal caller',
xml: '<block type="' + testSuite.callType + '"/>',
expectedXml:
'<block xmlns="https://developers.google.com/blockly/xml" ' +
Expand All @@ -2614,7 +2637,7 @@ suite('Procedures', function() {
},
},
{
title: 'Common caller',
title: 'XML - Common caller',
xml:
'<block type="' + testSuite.callType + '">\n' +
' <mutation name="do something"/>\n' +
Expand All @@ -2630,7 +2653,7 @@ suite('Procedures', function() {
},
},
{
title: 'With pre-created vars caller',
title: 'XML - With pre-created vars caller',
xml:
'<block type="' + testSuite.callType + '">\n' +
' <mutation name="do something">\n' +
Expand All @@ -2649,6 +2672,226 @@ suite('Procedures', function() {
assertCallBlockStructure(block, ['preCreatedVar'], ['preCreatedVarId']);
},
},
{
title: 'JSON - Minimal definition',
json: {
'type': testSuite.defType,
},
expectedJson: {
'type': testSuite.defType,
'id': '1',
'fields': {
'NAME': 'unnamed',
},
'extraState': {
'procedureId': '1',
},
},
assertBlockStructure:
(block) => {
assertDefBlockStructure(block, testSuite.hasReturn);
},
},
{
title: 'JSON - Common definition',
json: {
'type': testSuite.defType,
'fields': {
'NAME': 'do something',
},
},
expectedJson: {
'type': testSuite.defType,
'id': '1',
'fields': {
'NAME': 'do something',
},
'extraState': {
'procedureId': '1',
},
},
assertBlockStructure:
(block) => {
assertDefBlockStructure(block, testSuite.hasReturn);
},
},
{
title: 'JSON - With vars definition',
json: {
'type': testSuite.defType,
'fields': {
'NAME': 'do something',
},
'extraState': {
'params': [
{
'name': 'x',
'id': 'arg1',
},
{
'name': 'y',
'id': 'arg2',
},
],
},
},
expectedJson: {
'type': testSuite.defType,
'id': '1',
'fields': {
'NAME': 'do something',
},
'extraState': {
'procedureId': '1',
'params': [
{
'name': 'x',
'id': 'arg1',
'paramId': '1',
},
{
'name': 'y',
'id': 'arg2',
'paramId': '1',
},
],
},
},
assertBlockStructure:
(block) => {
assertDefBlockStructure(
block, testSuite.hasReturn, ['x', 'y'], ['arg1', 'arg2']);
},
},
{
title: 'JSON - With pre-created vars definition',
json: {
'type': testSuite.defType,
'extraState': {
'params': [
{
'name': 'preCreatedVar',
'id': 'preCreatedVarId',
},
],
},
'fields': {
'NAME': 'do something',
},
},
expectedJson: {
'type': testSuite.defType,
'id': '1',
'fields': {
'NAME': 'do something',
},
'extraState': {
'procedureId': '1',
'params': [
{
'name': 'preCreatedVar',
'id': 'preCreatedVarId',
'paramId': '1',
},
],
},
},
assertBlockStructure:
(block) => {
assertDefBlockStructure(block, testSuite.hasReturn,
['preCreatedVar'], ['preCreatedVarId']);
},
},
{
title: 'JSON - No statements definition',
json: {
'type': 'procedures_defreturn',
'fields': {
'NAME': 'do something',
},
'extraState': {
'hasStatements': false,
},
},
expectedJson: {
'type': 'procedures_defreturn',
'id': '1',
'fields': {
'NAME': 'do something',
},
'extraState': {
'procedureId': '1',
'hasStatements': false,
},
},
assertBlockStructure:
(block) => {
assertDefBlockStructure(block, true, [], [], false);
},
},
{
title: 'JSON - Minimal caller',
json: {
'type': testSuite.callType,
},
expectedJson: {
'type': testSuite.callType,
'id': '1',
'extraState': {
'name': 'unnamed',
},
},
assertBlockStructure:
(block) => {
assertCallBlockStructure(block);
},
},
{
title: 'JSON - Common caller',
json: {
'type': testSuite.callType,
'extraState': {
'name': 'do something',
},
},
expectedJson: {
'type': testSuite.callType,
'id': '1',
'extraState': {
'name': 'do something',
},
},
assertBlockStructure:
(block) => {
assertCallBlockStructure(block);
},
},
{
title: 'JSON - With pre-created vars caller',
json: {
'type': testSuite.callType,
'extraState': {
'name': 'do something',
'params': [
'preCreatedVar',
],
},
},
expectedJson: {
'type': testSuite.callType,
'id': '1',
'extraState': {
'name': 'do something',
'params': [
'preCreatedVar',
],
},
},
assertBlockStructure:
(block) => {
assertCallBlockStructure(block, ['preCreatedVar'], ['preCreatedVarId']);
},
},
];
runSerializationTestSuite(testCases);
});
Expand Down
2 changes: 1 addition & 1 deletion tests/mocha/test_helpers/serialization.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export const runSerializationTestSuite = (testCases) => {
return function() {
if (testCase.json) {
const block = Blockly.serialization.blocks.append(
testCase.json, this.workspace);
testCase.json, this.workspace, {recordUndo: true});
this.clock.runAll();
const generatedJson = Blockly.serialization.blocks.save(block);
const expectedJson = testCase.expectedJson || testCase.json;
Expand Down