diff --git a/src/engine/runtime.js b/src/engine/runtime.js index ca7447ffa..945f5294d 100644 --- a/src/engine/runtime.js +++ b/src/engine/runtime.js @@ -1547,6 +1547,7 @@ class Runtime extends EventEmitter { dispose () { this.stopAll(); this.targets.map(this.disposeTarget, this); + this.monitorBlocks = new Blocks(true); this._monitorState = OrderedMap({}); // @todo clear out extensions? turboMode? etc. diff --git a/test/fixtures/monitored_variables.sb3 b/test/fixtures/monitored_variables.sb3 new file mode 100644 index 000000000..cae7b47d5 Binary files /dev/null and b/test/fixtures/monitored_variables.sb3 differ diff --git a/test/integration/variable_monitor_reset.js b/test/integration/variable_monitor_reset.js new file mode 100644 index 000000000..745d50a58 --- /dev/null +++ b/test/integration/variable_monitor_reset.js @@ -0,0 +1,43 @@ +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 projectUri = path.resolve(__dirname, '../fixtures/monitored_variables.sb3'); +const project = readFileToBuffer(projectUri); + +const anotherProjectUri = path.resolve(__dirname, '../fixtures/default.sb2'); +const anotherProject = readFileToBuffer(anotherProjectUri); + +test('importing one project after the other resets monitored variables', t => { + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Start VM, load project, and run + vm.start(); + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + vm.loadProject(project).then(() => { + + const refSprite = vm.runtime.targets[1]; + const refVarId = Object.keys(refSprite.variables)[0]; + const refBlock = vm.runtime.monitorBlocks.getBlock(refVarId); + t.ok(refBlock); + const jamalSprite = vm.runtime.targets[2]; + const jamalVarId = Object.keys(jamalSprite.variables)[0]; + const jamalBlock = vm.runtime.monitorBlocks.getBlock(jamalVarId); + t.ok(jamalBlock); + vm.loadProject(anotherProject).then(() => { + // Blocks from the previously loaded project should be gone. + const refVarBlock = vm.runtime.monitorBlocks.getBlock(refVarId); + t.notOk(refVarBlock); + const jamalVarBlock = vm.runtime.monitorBlocks.getBlock(jamalVarId); + t.notOk(jamalVarBlock); + + t.end(); + process.nextTick(process.exit); + }); + }); +});