Spaces:
Running
Running
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); | |
}); | |
}); | |
}); | |