From 19737d4e39ecf4c1313774d6455353fb8f6133bd Mon Sep 17 00:00:00 2001 From: Karishma Chadha Date: Tue, 11 Dec 2018 12:28:37 -0500 Subject: [PATCH] Fix issue where edge-activated hats only run on one sprite when sprite is duplicated or cloned. --- src/engine/execute.js | 1 + src/engine/runtime.js | 8 +- test/fixtures/edge-triggered-hat.sb3 | Bin 0 -> 42128 bytes .../hat-threads-run-every-frame.js | 95 ++++++++++++++++++ 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/edge-triggered-hat.sb3 diff --git a/src/engine/execute.js b/src/engine/execute.js index f0ed1f3dd..98f85b9b4 100644 --- a/src/engine/execute.js +++ b/src/engine/execute.js @@ -65,6 +65,7 @@ const handleReport = function (resolvedValue, sequencer, thread, blockCached, la if (!thread.stackClick) { const oldEdgeValue = sequencer.runtime.updateEdgeActivatedValue( currentBlockId, + thread.target.id, resolvedValue ); const edgeWasActivated = !oldEdgeValue && resolvedValue; diff --git a/src/engine/runtime.js b/src/engine/runtime.js index 071d8a4a7..978af6ef6 100644 --- a/src/engine/runtime.js +++ b/src/engine/runtime.js @@ -1233,12 +1233,14 @@ class Runtime extends EventEmitter { /** * Update an edge-activated hat block value. * @param {!string} blockId ID of hat to store value for. + * @param {!string} threadTargetId Target ID for the thread that the block belongs to * @param {*} newValue Value to store for edge-activated hat. * @return {*} The old value for the edge-activated hat. */ - updateEdgeActivatedValue (blockId, newValue) { - const oldValue = this._edgeActivatedHatValues[blockId]; - this._edgeActivatedHatValues[blockId] = newValue; + updateEdgeActivatedValue (blockId, threadTargetId, newValue) { + const blockAndTargetId = `${blockId}_${threadTargetId}`; + const oldValue = this._edgeActivatedHatValues[blockAndTargetId]; + this._edgeActivatedHatValues[blockAndTargetId] = newValue; return oldValue; } diff --git a/test/fixtures/edge-triggered-hat.sb3 b/test/fixtures/edge-triggered-hat.sb3 new file mode 100644 index 0000000000000000000000000000000000000000..762ec1af45c97aeae9dd83de5b3bda4ea1a43df5 GIT binary patch literal 42128 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 literal 0 HcmV?d00001 diff --git a/test/integration/hat-threads-run-every-frame.js b/test/integration/hat-threads-run-every-frame.js index 5d3c3527f..80a4711cf 100644 --- a/test/integration/hat-threads-run-every-frame.js +++ b/test/integration/hat-threads-run-every-frame.js @@ -5,6 +5,7 @@ const readFileToBuffer = require('../fixtures/readProjectFile').readFileToBuffer const VirtualMachine = require('../../src/index'); const Thread = require('../../src/engine/thread'); const Runtime = require('../../src/engine/runtime'); +const execute = require('../../src/engine/execute.js'); const projectUri = path.resolve(__dirname, '../fixtures/loudness-hat-block.sb2'); const project = readFileToBuffer(projectUri); @@ -103,6 +104,100 @@ test('edge activated hat thread not added twice', t => { }); }); + +/** + * Duplicating a sprite should also track duplicated edge activated hat in + * runtime's _edgeActivatedHatValues map. + */ +test('edge activated hat should trigger for both sprites when sprite is duplicated', t => { + + // Project that is similar to loudness-hat-block.sb2, but has code on the sprite so that + // the sprite can be duplicated + const projectWithSpriteUri = path.resolve(__dirname, '../fixtures/edge-triggered-hat.sb3'); + const projectWithSprite = readFileToBuffer(projectWithSpriteUri); + + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Start VM, load project, and run + t.doesNotThrow(() => { + // Note: don't run vm.start(), we handle calling _step() manually in this test + vm.runtime.currentStepTime = 0; + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + + vm.loadProject(projectWithSprite).then(() => { + t.equal(vm.runtime.threads.length, 0); + + vm.runtime._step(); + t.equal(vm.runtime.threads.length, 1); + checkIsHatThread(t, vm, vm.runtime.threads[0]); + t.assert(vm.runtime.threads[0].status === Thread.STATUS_RUNNING); + // Run execute on the thread to populate the runtime's + // _edgeActivatedHatValues object + execute(vm.runtime.sequencer, vm.runtime.threads[0]); + t.equal(Object.keys(vm.runtime._edgeActivatedHatValues).length, 1); + + vm.duplicateSprite(vm.runtime.targets[1].id).then(() => { + vm.runtime._step(); + // Check that the runtime's _edgeActivatedHatValues object has two separate keys + // after execute is run on each thread + vm.runtime.threads.forEach(thread => execute(vm.runtime.sequencer, thread)); + t.equal(Object.keys(vm.runtime._edgeActivatedHatValues).length, 2); + t.end(); + }); + + }); + }); +}); + +/** + * Cloning a sprite should also track cloned edge activated hat separately + * runtime's _edgeActivatedHatValues map. + */ +test('edge activated hat should trigger for both sprites when sprite is cloned', t => { + + // Project that is similar to loudness-hat-block.sb2, but has code on the sprite so that + // the sprite can be duplicated + const projectWithSpriteUri = path.resolve(__dirname, '../fixtures/edge-triggered-hat.sb3'); + const projectWithSprite = readFileToBuffer(projectWithSpriteUri); + + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Start VM, load project, and run + t.doesNotThrow(() => { + // Note: don't run vm.start(), we handle calling _step() manually in this test + vm.runtime.currentStepTime = 0; + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + + vm.loadProject(projectWithSprite).then(() => { + t.equal(vm.runtime.threads.length, 0); + + vm.runtime._step(); + t.equal(vm.runtime.threads.length, 1); + checkIsHatThread(t, vm, vm.runtime.threads[0]); + t.assert(vm.runtime.threads[0].status === Thread.STATUS_RUNNING); + // Run execute on the thread to populate the runtime's + // _edgeActivatedHatValues object + execute(vm.runtime.sequencer, vm.runtime.threads[0]); + t.equal(Object.keys(vm.runtime._edgeActivatedHatValues).length, 1); + + vm.runtime.targets.push(vm.runtime.targets[1].makeClone()); + + vm.runtime._step(); + // Check that the runtime's _edgeActivatedHatValues object has two separate keys + // after execute is run on each thread + vm.runtime.threads.forEach(thread => execute(vm.runtime.sequencer, thread)); + t.equal(Object.keys(vm.runtime._edgeActivatedHatValues).length, 2); + t.end(); + }); + }); +}); + /** * When adding a stack click thread first, make sure that the edge activated hat thread and * the stack click thread are both pushed and run (despite having the same top block)