From ecbfcd78bdcd80108bcdc5a6887e041b9d72c169 Mon Sep 17 00:00:00 2001 From: picklesrus Date: Wed, 6 Feb 2019 16:48:39 -0500 Subject: [PATCH 1/3] Fix sb2 loading of broadcast messages with special characters. --- src/serialization/sb2.js | 2 +- test/fixtures/broadcast_special_chars.sb2 | Bin 0 -> 54753 bytes .../broadcast_special_chars_sb2.js | 86 ++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/broadcast_special_chars.sb2 create mode 100644 test/integration/broadcast_special_chars_sb2.js diff --git a/src/serialization/sb2.js b/src/serialization/sb2.js index e606f5a69..f8d1b9e65 100644 --- a/src/serialization/sb2.js +++ b/src/serialization/sb2.js @@ -227,7 +227,7 @@ const globalBroadcastMsgStateGenerator = (function () { if (name === '') { name = emptyStringName; } - broadcastMsgNameMap[name] = `broadcastMsgId-${name}`; + broadcastMsgNameMap[name] = `broadcastMsgId-${StringUtil.replaceUnsafeChars(name)}`; allBroadcastFields.push(field); return broadcastMsgNameMap[name]; }, diff --git a/test/fixtures/broadcast_special_chars.sb2 b/test/fixtures/broadcast_special_chars.sb2 new file mode 100644 index 0000000000000000000000000000000000000000..afaf4ba25b0197665599cca3699026fa3fc37aa5 GIT binary patch literal 54753 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 vp)ch>NlsMz(ic#)|L)6wYvaGWAG-N3-E7{7 { + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Evaluate playground data and exit + vm.on('playgroundData', e => { + const threads = JSON.parse(e.threads); + // All monitors should create threads that finish during the step and + // are revoved from runtime.threads. + t.equal(threads.length, 0); + + t.equal(vm.runtime.targets.length, 2); + + const stage = vm.runtime.targets[0]; + const cat = vm.runtime.targets[1]; + + const allBroadcastFields = VariableUtil.getAllVarRefsForTargets(vm.runtime.targets, true); + + const abMessageId = Object.keys(stage.variables).filter(k => stage.variables[k].name === 'a&b')[0]; + const abMessage = stage.variables[abMessageId]; + // Check for unsafe characters, replaceUnsafeChars should just result in the original string + // (e.g. there was nothing to replace) + // Check that the variable ID does not have any unsafe characters + t.equal(StringUtil.replaceUnsafeChars(abMessageId), abMessageId); + + // Check that the message still has the correct info + t.equal(StringUtil.replaceUnsafeChars(abMessage.id), abMessage.id); + t.equal(abMessage.id, abMessageId); + t.equal(abMessage.type, Variable.BROADCAST_MESSAGE_TYPE); + t.equal(abMessage.value, 'a&b'); + + + const ltPerfectMessageId = Object.keys(stage.variables).filter(k => stage.variables[k].name === '< perfect')[0]; + const ltPerfectMessage = stage.variables[ltPerfectMessageId]; + // Check for unsafe characters, replaceUnsafeChars should just result in the original string + // (e.g. there was nothing to replace) + // Check that the variable ID does not have any unsafe characters + t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessageId), ltPerfectMessageId); + + // // Check that the message still has the correct info + t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessage.id), ltPerfectMessage.id); + t.equal(ltPerfectMessage.id, ltPerfectMessageId); + t.equal(ltPerfectMessage.type, Variable.BROADCAST_MESSAGE_TYPE); + t.equal(ltPerfectMessage.value, '< perfect'); + + // // Find all the references for this variable, and verify they have the correct ID + // // There should be one + t.equal(allBroadcastFields[ltPerfectMessageId].length, 1); + t.equal(allBroadcastFields[abMessageId].length, 1); + const catBlocks = Object.keys(cat.blocks._blocks).map(blockId => cat.blocks._blocks[blockId]); + const catMessageBlocks = catBlocks.filter(block => block.fields.hasOwnProperty('BROADCAST_OPTION')); + t.equal(catMessageBlocks.length, 2); + t.equal(catMessageBlocks[0].fields.BROADCAST_OPTION.id, ltPerfectMessageId); + t.equal(catMessageBlocks[1].fields.BROADCAST_OPTION.id, abMessageId); + + t.end(); + process.nextTick(process.exit); + }); + + // Start VM, load project, and run + t.doesNotThrow(() => { + vm.start(); + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + vm.loadProject(project).then(() => { + vm.greenFlag(); + setTimeout(() => { + vm.getPlaygroundData(); + vm.stopAll(); + }, 100); + }); + }); +}); From aead1ba8f41cace734dac9a659d6121db1db68b6 Mon Sep 17 00:00:00 2001 From: picklesrus Date: Wed, 6 Feb 2019 16:53:25 -0500 Subject: [PATCH 2/3] Fix a typo in the variable test. --- test/integration/variable_special_chars_sb3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/variable_special_chars_sb3.js b/test/integration/variable_special_chars_sb3.js index 1c506406d..b599415af 100644 --- a/test/integration/variable_special_chars_sb3.js +++ b/test/integration/variable_special_chars_sb3.js @@ -10,7 +10,7 @@ const VariableUtil = require('../../src/util/variable-util'); const projectUri = path.resolve(__dirname, '../fixtures/variable_characters.sb3'); const project = readFileToBuffer(projectUri); -test('importing sb2 project with special chars in variable names', t => { +test('importing sb3 project with special chars in variable names', t => { const vm = new VirtualMachine(); vm.attachStorage(makeTestStorage()); From b904f19c1da5bf0e3afca5296603e918bc4f917f Mon Sep 17 00:00:00 2001 From: picklesrus Date: Wed, 6 Feb 2019 16:58:46 -0500 Subject: [PATCH 3/3] Fix loading broadcast messages with special characters for projects that were converted from 2.0. --- src/engine/blocks.js | 6 +- src/serialization/sb3.js | 2 +- src/util/variable-util.js | 5 +- test/fixtures/broadcast_special_chars.sb3 | Bin 0 -> 43316 bytes test/fixtures/events.json | 6 ++ .../broadcast_special_chars_sb2.js | 13 ++- .../broadcast_special_chars_sb3.js | 83 ++++++++++++++++++ test/unit/engine_blocks.js | 32 +++++++ 8 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 test/fixtures/broadcast_special_chars.sb3 create mode 100644 test/integration/broadcast_special_chars_sb3.js diff --git a/src/engine/blocks.js b/src/engine/blocks.js index 05de4e7e6..e22122edd 100644 --- a/src/engine/blocks.js +++ b/src/engine/blocks.js @@ -823,11 +823,12 @@ class Blocks { * @param {Array} optBlocks Optional list of blocks to constrain the search to. * This is useful for getting variable/list references for a stack of blocks instead * of all blocks on the workspace + * @param {?boolean} optIncludeBroadcast Optional whether to include broadcast fields. * @return {object} A map of variable ID to a list of all variable references * for that ID. A variable reference contains the field referencing that variable * and also the type of the variable being referenced. */ - getAllVariableAndListReferences (optBlocks) { + getAllVariableAndListReferences (optBlocks, optIncludeBroadcast) { const blocks = optBlocks ? optBlocks : this._blocks; const allReferences = Object.create(null); for (const blockId in blocks) { @@ -839,6 +840,9 @@ class Blocks { } else if (blocks[blockId].fields.LIST) { varOrListField = blocks[blockId].fields.LIST; varType = Variable.LIST_TYPE; + } else if (optIncludeBroadcast && blocks[blockId].fields.BROADCAST_OPTION) { + varOrListField = blocks[blockId].fields.BROADCAST_OPTION; + varType = Variable.BROADCAST_MESSAGE_TYPE; } if (varOrListField) { const currVarId = varOrListField.id; diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js index ccc5dfb09..5b4d5a76e 100644 --- a/src/serialization/sb3.js +++ b/src/serialization/sb3.js @@ -1141,7 +1141,7 @@ const deserializeMonitor = function (monitorData, runtime, targets, extensions) // This is to fix up projects imported from 2.0 where xml-unsafe names // were getting added to the variable ids. const replaceUnsafeCharsInVariableIds = function (targets) { - const allVarRefs = VariableUtil.getAllVarRefsForTargets(targets); + const allVarRefs = VariableUtil.getAllVarRefsForTargets(targets, true); // Re-id the variables in the actual targets targets.forEach(t => { Object.keys(t.variables).forEach(id => { diff --git a/src/util/variable-util.js b/src/util/variable-util.js index c1dab8f8e..3e34a7327 100644 --- a/src/util/variable-util.js +++ b/src/util/variable-util.js @@ -15,12 +15,13 @@ class VariableUtil { * in the project. * @param {Array.} targets The list of targets to get the variable * and list references from. + * @param {boolean} shouldIncludeBroadcast Whether to include broadcast message fields. * @return {object} An object with variable ids as the keys and a list of block fields referencing * the variable. */ - static getAllVarRefsForTargets (targets) { + static getAllVarRefsForTargets (targets, shouldIncludeBroadcast) { return targets - .map(t => t.blocks.getAllVariableAndListReferences()) + .map(t => t.blocks.getAllVariableAndListReferences(null, shouldIncludeBroadcast)) .reduce(VariableUtil._mergeVarRefObjects, {}); } diff --git a/test/fixtures/broadcast_special_chars.sb3 b/test/fixtures/broadcast_special_chars.sb3 new file mode 100644 index 0000000000000000000000000000000000000000..9a840b0ef3dacae8acdb47ca0d6b6e24a3900543 GIT binary patch literal 43316 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 mock variable" } }, + "mockBroadcastBlock": { + "name": "block", + "xml": { + "outerHTML": "my message" + } + }, "mockListBlock": { "name": "block", "xml": { diff --git a/test/integration/broadcast_special_chars_sb2.js b/test/integration/broadcast_special_chars_sb2.js index db43dd621..eec5d6b5e 100644 --- a/test/integration/broadcast_special_chars_sb2.js +++ b/test/integration/broadcast_special_chars_sb2.js @@ -10,15 +10,13 @@ const VariableUtil = require('../../src/util/variable-util'); const projectUri = path.resolve(__dirname, '../fixtures/broadcast_special_chars.sb2'); const project = readFileToBuffer(projectUri); -test('importing sb2 project with special chars in variable names', t => { +test('importing sb2 project with special chars in message names', t => { const vm = new VirtualMachine(); vm.attachStorage(makeTestStorage()); // Evaluate playground data and exit vm.on('playgroundData', e => { const threads = JSON.parse(e.threads); - // All monitors should create threads that finish during the step and - // are revoved from runtime.threads. t.equal(threads.length, 0); t.equal(vm.runtime.targets.length, 2); @@ -32,7 +30,7 @@ test('importing sb2 project with special chars in variable names', t => { const abMessage = stage.variables[abMessageId]; // Check for unsafe characters, replaceUnsafeChars should just result in the original string // (e.g. there was nothing to replace) - // Check that the variable ID does not have any unsafe characters + // Check that the message ID does not have any unsafe characters t.equal(StringUtil.replaceUnsafeChars(abMessageId), abMessageId); // Check that the message still has the correct info @@ -46,17 +44,16 @@ test('importing sb2 project with special chars in variable names', t => { const ltPerfectMessage = stage.variables[ltPerfectMessageId]; // Check for unsafe characters, replaceUnsafeChars should just result in the original string // (e.g. there was nothing to replace) - // Check that the variable ID does not have any unsafe characters + // Check that the message ID does not have any unsafe characters t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessageId), ltPerfectMessageId); - // // Check that the message still has the correct info + // Check that the message still has the correct info t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessage.id), ltPerfectMessage.id); t.equal(ltPerfectMessage.id, ltPerfectMessageId); t.equal(ltPerfectMessage.type, Variable.BROADCAST_MESSAGE_TYPE); t.equal(ltPerfectMessage.value, '< perfect'); - // // Find all the references for this variable, and verify they have the correct ID - // // There should be one + // Find all the references for these messages, and verify they have the correct ID t.equal(allBroadcastFields[ltPerfectMessageId].length, 1); t.equal(allBroadcastFields[abMessageId].length, 1); const catBlocks = Object.keys(cat.blocks._blocks).map(blockId => cat.blocks._blocks[blockId]); diff --git a/test/integration/broadcast_special_chars_sb3.js b/test/integration/broadcast_special_chars_sb3.js new file mode 100644 index 000000000..62e0770c7 --- /dev/null +++ b/test/integration/broadcast_special_chars_sb3.js @@ -0,0 +1,83 @@ +const path = require('path'); +const test = require('tap').test; +const makeTestStorage = require('../fixtures/make-test-storage'); +const readFileToBuffer = require('../fixtures/readProjectFile').readFileToBuffer; +const VirtualMachine = require('../../src/index'); +const Variable = require('../../src/engine/variable'); +const StringUtil = require('../../src/util/string-util'); +const VariableUtil = require('../../src/util/variable-util'); + +const projectUri = path.resolve(__dirname, '../fixtures/broadcast_special_chars.sb3'); +const project = readFileToBuffer(projectUri); + +test('importing sb3 project with special chars in message names', t => { + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Evaluate playground data and exit + vm.on('playgroundData', e => { + const threads = JSON.parse(e.threads); + t.equal(threads.length, 0); + + t.equal(vm.runtime.targets.length, 2); + + const stage = vm.runtime.targets[0]; + const cat = vm.runtime.targets[1]; + + const allBroadcastFields = VariableUtil.getAllVarRefsForTargets(vm.runtime.targets, true); + + const abMessageId = Object.keys(stage.variables).filter(k => stage.variables[k].name === 'a&b')[0]; + const abMessage = stage.variables[abMessageId]; + // Check for unsafe characters, replaceUnsafeChars should just result in the original string + // (e.g. there was nothing to replace) + // Check that the message ID does not have any unsafe characters + t.equal(StringUtil.replaceUnsafeChars(abMessageId), abMessageId); + + // Check that the message still has the correct info + t.equal(StringUtil.replaceUnsafeChars(abMessage.id), abMessage.id); + t.equal(abMessage.id, abMessageId); + t.equal(abMessage.type, Variable.BROADCAST_MESSAGE_TYPE); + t.equal(abMessage.value, 'a&b'); + + + const ltPerfectMessageId = Object.keys(stage.variables).filter(k => stage.variables[k].name === '< perfect')[0]; + const ltPerfectMessage = stage.variables[ltPerfectMessageId]; + // Check for unsafe characters, replaceUnsafeChars should just result in the original string + // (e.g. there was nothing to replace) + // Check that the message ID does not have any unsafe characters + t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessageId), ltPerfectMessageId); + + // Check that the message still has the correct info + t.equal(StringUtil.replaceUnsafeChars(ltPerfectMessage.id), ltPerfectMessage.id); + t.equal(ltPerfectMessage.id, ltPerfectMessageId); + t.equal(ltPerfectMessage.type, Variable.BROADCAST_MESSAGE_TYPE); + t.equal(ltPerfectMessage.value, '< perfect'); + + // Find all the references for these messages, and verify they have the correct ID + t.equal(allBroadcastFields[ltPerfectMessageId].length, 1); + t.equal(allBroadcastFields[abMessageId].length, 1); + const catBlocks = Object.keys(cat.blocks._blocks).map(blockId => cat.blocks._blocks[blockId]); + const catMessageBlocks = catBlocks.filter(block => block.fields.hasOwnProperty('BROADCAST_OPTION')); + t.equal(catMessageBlocks.length, 2); + t.equal(catMessageBlocks[0].fields.BROADCAST_OPTION.id, ltPerfectMessageId); + t.equal(catMessageBlocks[1].fields.BROADCAST_OPTION.id, abMessageId); + + t.end(); + process.nextTick(process.exit); + }); + + // Start VM, load project, and run + t.doesNotThrow(() => { + vm.start(); + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + vm.loadProject(project).then(() => { + vm.greenFlag(); + setTimeout(() => { + vm.getPlaygroundData(); + vm.stopAll(); + }, 100); + }); + }); +}); diff --git a/test/unit/engine_blocks.js b/test/unit/engine_blocks.js index 3b3ecedc1..c25d5b42b 100644 --- a/test/unit/engine_blocks.js +++ b/test/unit/engine_blocks.js @@ -809,3 +809,35 @@ test('getAllVariableAndListReferences returns references when variable blocks ex t.end(); }); + +test('getAllVariableAndListReferences does not return broadcast blocks if the flag is left out', t => { + const b = new Blocks(new Runtime()); + b.createBlock(adapter(events.mockBroadcastBlock)[0]); + b.createBlock(adapter(events.mockBroadcastBlock)[1]); + + t.equal(Object.keys(b.getAllVariableAndListReferences()).length, 0); + t.end(); +}); + +test('getAllVariableAndListReferences returns broadcast when we tell it to', t => { + const b = new Blocks(new Runtime()); + + b.createBlock(adapter(events.mockVariableBlock)[0]); + // Make the broadcast block and its shadow (which includes the actual broadcast field). + b.createBlock(adapter(events.mockBroadcastBlock)[0]); + b.createBlock(adapter(events.mockBroadcastBlock)[1]); + + const varListRefs = b.getAllVariableAndListReferences(null, true); + + t.equal(Object.keys(varListRefs).length, 2); + t.equal(Array.isArray(varListRefs['mock var id']), true); + t.equal(varListRefs['mock var id'].length, 1); + t.equal(varListRefs['mock var id'][0].type, Variable.SCALAR_TYPE); + t.equal(varListRefs['mock var id'][0].referencingField.value, 'a mock variable'); + t.equal(Array.isArray(varListRefs['mock broadcast message id']), true); + t.equal(varListRefs['mock broadcast message id'].length, 1); + t.equal(varListRefs['mock broadcast message id'][0].type, Variable.BROADCAST_MESSAGE_TYPE); + t.equal(varListRefs['mock broadcast message id'][0].referencingField.value, 'my message'); + + t.end(); +});