From fec2c9ea39b601c593415c6448d7bbdcdd0ae796 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Thu, 31 Aug 2023 22:19:38 +0000 Subject: [PATCH] fix: support loading stringified XML from JSOn --- .../src/dynamic_if.ts | 7 +- .../src/dynamic_list_create.ts | 7 +- .../src/dynamic_text_join.ts | 7 +- .../test/dynamic_if.mocha.js | 73 ++++++++++++++ .../test/dynamic_list_create.mocha.js | 95 +++++++++++++++++++ .../test/dynamic_text_join.mocha.js | 95 +++++++++++++++++++ 6 files changed, 281 insertions(+), 3 deletions(-) diff --git a/plugins/block-dynamic-connection/src/dynamic_if.ts b/plugins/block-dynamic-connection/src/dynamic_if.ts index ebc06288eb..91b42e0b73 100644 --- a/plugins/block-dynamic-connection/src/dynamic_if.ts +++ b/plugins/block-dynamic-connection/src/dynamic_if.ts @@ -171,7 +171,12 @@ const DYNAMIC_IF_MIXIN = { * @param state The state to apply to this block, ie the else if count * and else state. */ - loadExtraState: function(this: DynamicIfBlock, state: IfExtraState) { + loadExtraState: function(this: DynamicIfBlock, state: IfExtraState | string) { + if (typeof state === 'string') { + this.domToMutation(Blockly.utils.xml.textToDom(state)); + return; + } + this.elseifCount = state['elseIfCount'] || 0; this.elseCount = state['hasElse'] ? 1 : 0; for (let i = 1; i <= this.elseifCount; i++) { diff --git a/plugins/block-dynamic-connection/src/dynamic_list_create.ts b/plugins/block-dynamic-connection/src/dynamic_list_create.ts index 6aeea37a27..b9b389ee28 100644 --- a/plugins/block-dynamic-connection/src/dynamic_list_create.ts +++ b/plugins/block-dynamic-connection/src/dynamic_list_create.ts @@ -113,7 +113,12 @@ const DYNAMIC_LIST_CREATE_MIXIN = { * @param state The state to apply to this block, ie the item count. */ loadExtraState: function( - this: DynamicListCreateBlock, state: {[x: string]: any}) { + this: DynamicListCreateBlock, state: ({[x: string]: any} | string)) { + if (typeof state === 'string') { + this.domToMutation(Blockly.utils.xml.textToDom(state)); + return; + } + this.itemCount = state['itemCount']; // minInputs are added automatically. for (let i = this.minInputs; i < this.itemCount; i++) { diff --git a/plugins/block-dynamic-connection/src/dynamic_text_join.ts b/plugins/block-dynamic-connection/src/dynamic_text_join.ts index f63d573383..5bbde0e8bd 100644 --- a/plugins/block-dynamic-connection/src/dynamic_text_join.ts +++ b/plugins/block-dynamic-connection/src/dynamic_text_join.ts @@ -111,7 +111,12 @@ const DYNAMIC_TEXT_JOIN_MIXIN = { * @param state The state to apply to this block, ie the item count. */ loadExtraState: function( - this: DynamicTextJoinBlock, state: {[x: string]: any}) { + this: DynamicTextJoinBlock, state: ({[x: string]: any} | string)) { + if (typeof state === 'string') { + this.domToMutation(Blockly.utils.xml.textToDom(state)); + return; + } + this.itemCount = state['itemCount']; // minInputs are added automatically. for (let i = this.minInputs; i < this.itemCount; i++) { diff --git a/plugins/block-dynamic-connection/test/dynamic_if.mocha.js b/plugins/block-dynamic-connection/test/dynamic_if.mocha.js index 9e688f09dc..164b503e8b 100644 --- a/plugins/block-dynamic-connection/test/dynamic_if.mocha.js +++ b/plugins/block-dynamic-connection/test/dynamic_if.mocha.js @@ -526,6 +526,79 @@ suite('If block', function() { block, [/IF0/, /DO0/, /IF1/, /DO1/, /ELSE/], 'dynamic_if'); }, }, + { + title: 'one if one else with children - json with stringified old XML', + json: { + 'type': 'dynamic_if', + 'id': '1', + 'extraState': + '', + 'inputs': { + 'IF1': { + 'block': { + 'type': 'logic_boolean', + 'id': '2', + 'fields': { + 'BOOL': 'TRUE', + }, + }, + }, + 'IF2': { + 'block': { + 'type': 'logic_boolean', + 'id': '3', + 'fields': { + 'BOOL': 'TRUE', + }, + }, + }, + 'ELSE': { + 'block': { + 'type': 'text_print', + 'id': '4', + }, + }, + }, + }, + expectedJson: { + 'type': 'dynamic_if', + 'id': '1', + 'extraState': { + 'elseIfCount': 1, + 'hasElse': true, + }, + 'inputs': { + 'IF0': { + 'block': { + 'type': 'logic_boolean', + 'id': '2', + 'fields': { + 'BOOL': 'TRUE', + }, + }, + }, + 'IF1': { + 'block': { + 'type': 'logic_boolean', + 'id': '3', + 'fields': { + 'BOOL': 'TRUE', + }, + }, + }, + 'ELSE': { + 'block': { + 'type': 'text_print', + 'id': '4', + }, + }, + }, + }, + assertBlockStructure: (block) => { + assertBlockStructure( + block, [/IF0/, /DO0/, /IF1/, /DO1/, /ELSE/], 'dynamic_if'); + }, + }, ]; testHelpers.runSerializationTestSuite(testCases); }); diff --git a/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js b/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js index a39d16f3b9..db7c238829 100644 --- a/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js +++ b/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js @@ -438,6 +438,101 @@ suite('List create block', function() { assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]); }, }, + { + title: 'multiple inputs with children - json with stringified old XML', + json: { + 'type': 'dynamic_list_create', + 'id': '1', + 'extraState': + '', + 'inputs': { + 'ADD0': { + 'block': { + 'type': 'text', + 'id': '2', + 'fields': { + 'TEXT': 'a', + }, + }, + }, + 'ADD1': { + 'block': { + 'type': 'text', + 'id': '3', + 'fields': { + 'TEXT': 'b', + }, + }, + }, + 'ADD2': { + 'block': { + 'type': 'text', + 'id': '4', + 'fields': { + 'TEXT': 'c', + }, + }, + }, + 'ADD3': { + 'block': { + 'type': 'text', + 'id': '5', + 'fields': { + 'TEXT': 'd', + }, + }, + }, + }, + }, + expectedJson: { + 'type': 'dynamic_list_create', + 'id': '1', + 'extraState': { + 'itemCount': 4, + }, + 'inputs': { + 'ADD0': { + 'block': { + 'type': 'text', + 'id': '2', + 'fields': { + 'TEXT': 'a', + }, + }, + }, + 'ADD1': { + 'block': { + 'type': 'text', + 'id': '3', + 'fields': { + 'TEXT': 'b', + }, + }, + }, + 'ADD2': { + 'block': { + 'type': 'text', + 'id': '4', + 'fields': { + 'TEXT': 'c', + }, + }, + }, + 'ADD3': { + 'block': { + 'type': 'text', + 'id': '5', + 'fields': { + 'TEXT': 'd', + }, + }, + }, + }, + }, + assertBlockStructure: (block) => { + assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]); + }, + }, ]; testHelpers.runSerializationTestSuite(testCases); }); diff --git a/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js b/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js index 5db6193621..e4a866b1d6 100644 --- a/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js +++ b/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js @@ -438,6 +438,101 @@ suite('Text join block', function() { assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]); }, }, + { + title: 'multiple inputs with children - json with stringified old XML', + json: { + 'type': 'dynamic_text_join', + 'id': '1', + 'extraState': + '', + 'inputs': { + 'ADD0': { + 'block': { + 'type': 'text', + 'id': '2', + 'fields': { + 'TEXT': 'a', + }, + }, + }, + 'ADD1': { + 'block': { + 'type': 'text', + 'id': '3', + 'fields': { + 'TEXT': 'b', + }, + }, + }, + 'ADD2': { + 'block': { + 'type': 'text', + 'id': '4', + 'fields': { + 'TEXT': 'c', + }, + }, + }, + 'ADD3': { + 'block': { + 'type': 'text', + 'id': '5', + 'fields': { + 'TEXT': 'd', + }, + }, + }, + }, + }, + expectedJson: { + 'type': 'dynamic_text_join', + 'id': '1', + 'extraState': { + 'itemCount': 4, + }, + 'inputs': { + 'ADD0': { + 'block': { + 'type': 'text', + 'id': '2', + 'fields': { + 'TEXT': 'a', + }, + }, + }, + 'ADD1': { + 'block': { + 'type': 'text', + 'id': '3', + 'fields': { + 'TEXT': 'b', + }, + }, + }, + 'ADD2': { + 'block': { + 'type': 'text', + 'id': '4', + 'fields': { + 'TEXT': 'c', + }, + }, + }, + 'ADD3': { + 'block': { + 'type': 'text', + 'id': '5', + 'fields': { + 'TEXT': 'd', + }, + }, + }, + }, + }, + assertBlockStructure: (block) => { + assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]); + }, + }, ]; testHelpers.runSerializationTestSuite(testCases); });