Merge pull request from kchadha/return-add-sprite-function-when-deleting

Export the sprite and return an add function when deleting the sprite.
This commit is contained in:
kchadha 2018-08-09 15:25:45 -04:00 committed by GitHub
commit ec41b4a113
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 2 deletions

View file

@ -836,6 +836,7 @@ class VirtualMachine extends EventEmitter {
/** /**
* Delete a sprite and all its clones. * Delete a sprite and all its clones.
* @param {string} targetId ID of a target whose sprite to delete. * @param {string} targetId ID of a target whose sprite to delete.
* @return {Function} Returns a function to restore the sprite that was deleted
*/ */
deleteSprite (targetId) { deleteSprite (targetId) {
const target = this.runtime.getTargetById(targetId); const target = this.runtime.getTargetById(targetId);
@ -849,6 +850,8 @@ class VirtualMachine extends EventEmitter {
if (!sprite) { if (!sprite) {
throw new Error('No sprite associated with this target.'); throw new Error('No sprite associated with this target.');
} }
const spritePromise = this.exportSprite(targetId, 'uint8array');
const restoreSprite = () => spritePromise.then(spriteBuffer => this.addSprite(spriteBuffer));
this.runtime.requestRemoveMonitorByTargetId(targetId); this.runtime.requestRemoveMonitorByTargetId(targetId);
const currentEditingTarget = this.editingTarget; const currentEditingTarget = this.editingTarget;
for (let i = 0; i < sprite.clones.length; i++) { for (let i = 0; i < sprite.clones.length; i++) {
@ -867,9 +870,10 @@ class VirtualMachine extends EventEmitter {
} }
// Sprite object should be deleted by GC. // Sprite object should be deleted by GC.
this.emitTargetsUpdate(); this.emitTargetsUpdate();
} else { return restoreSprite;
throw new Error('No target with the provided id.');
} }
throw new Error('No target with the provided id.');
} }
/** /**

View file

@ -0,0 +1,65 @@
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/virtual-machine');
// const RenderedTarget = require('../../src/sprites/rendered-target');
const projectUri = path.resolve(__dirname, '../fixtures/default.sb2');
const project = readFileToBuffer(projectUri);
const vm = new VirtualMachine();
test('spec', t => {
t.type(vm.deleteSprite, 'function');
t.end();
});
test('default cat', t => {
// Get default cat from .sprite2
// const uri = path.resolve(__dirname, '../fixtures/example_sprite.sprite2');
// const sprite = readFileToBuffer(uri);
vm.attachStorage(makeTestStorage());
// Evaluate playground data and exit
vm.on('playgroundData', e => {
const threads = JSON.parse(e.threads);
t.ok(threads.length === 0);
t.end();
process.nextTick(process.exit);
});
vm.start();
vm.clear();
vm.setCompatibilityMode(false);
vm.setTurboMode(false);
t.doesNotThrow(() => {
vm.loadProject(project).then(() => {
t.equal(vm.runtime.targets.length, 2); // stage and default sprite
const defaultSprite = vm.runtime.targets[1];
// Delete the sprite
const addSpriteBack = vm.deleteSprite(vm.runtime.targets[1].id);
t.equal(vm.runtime.targets.length, 1);
t.type(addSpriteBack, 'function');
addSpriteBack().then(() => {
t.equal(vm.runtime.targets.length, 2);
t.equal(vm.runtime.targets[1].getName(), defaultSprite.getName());
vm.greenFlag();
setTimeout(() => {
vm.getPlaygroundData();
vm.stopAll();
}, 1000);
});
});
});
});