From 30c9b7fd849bb4e7e19e7b655f63d70f5f00db1c Mon Sep 17 00:00:00 2001 From: Karishma Chadha Date: Fri, 22 Mar 2019 12:13:37 -0400 Subject: [PATCH] Add tests and update core example to handle stage being undefined. --- src/blocks/scratch3_core_example.js | 3 +- test/integration/internal-extension.js | 61 +++++++++++++++++++------- test/unit/dispatch.js | 21 +++++++++ 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/src/blocks/scratch3_core_example.js b/src/blocks/scratch3_core_example.js index b53d0b111..7781bf25a 100644 --- a/src/blocks/scratch3_core_example.js +++ b/src/blocks/scratch3_core_example.js @@ -36,7 +36,8 @@ class Scratch3CoreExample { * @returns {string} The name of the first target in the project. */ exampleOpcode () { - return this.runtime.getTargetForStage().getName(); + const stage = this.runtime.getTargetForStage(); + return stage ? stage.getName() : 'no stage yet'; } } diff --git a/test/integration/internal-extension.js b/test/integration/internal-extension.js index 570fce3cb..476981c05 100644 --- a/test/integration/internal-extension.js +++ b/test/integration/internal-extension.js @@ -4,6 +4,9 @@ const Worker = require('tiny-worker'); const dispatch = require('../../src/dispatch/central-dispatch'); const VirtualMachine = require('../../src/virtual-machine'); +const Sprite = require('../../src/sprites/sprite'); +const RenderedTarget = require('../../src/sprites/rendered-target'); + // By default Central Dispatch works with the Worker class built into the browser. Tell it to use TinyWorker instead. dispatch.workerClass = Worker; @@ -52,23 +55,49 @@ test('internal extension', t => { t.ok(extension.status.constructorCalled); t.notOk(extension.status.getInfoCalled); - return vm.extensionManager._registerInternalExtension(extension).then(() => { - t.ok(extension.status.getInfoCalled); + vm.extensionManager._registerInternalExtension(extension); + t.ok(extension.status.getInfoCalled); - const func = vm.runtime.getOpcodeFunction('testInternalExtension_go'); - t.type(func, 'function'); + const func = vm.runtime.getOpcodeFunction('testInternalExtension_go'); + t.type(func, 'function'); - t.notOk(extension.status.goCalled); - func(); - t.ok(extension.status.goCalled); + t.notOk(extension.status.goCalled); + func(); + t.ok(extension.status.goCalled); - // There should be 2 menus - one is an array, one is the function to call. - t.equal(vm.runtime._blockInfo[0].menus.length, 2); - // First menu has 3 items. - t.equal( - vm.runtime._blockInfo[0].menus[0].json.args0[0].options.length, 3); - // Second menu is a dynamic menu and therefore should be a function. - t.type( - vm.runtime._blockInfo[0].menus[1].json.args0[0].options, 'function'); - }); + // There should be 2 menus - one is an array, one is the function to call. + t.equal(vm.runtime._blockInfo[0].menus.length, 2); + // First menu has 3 items. + t.equal( + vm.runtime._blockInfo[0].menus[0].json.args0[0].options.length, 3); + // Second menu is a dynamic menu and therefore should be a function. + t.type( + vm.runtime._blockInfo[0].menus[1].json.args0[0].options, 'function'); + + t.end(); +}); + +test('load sync', t => { + const vm = new VirtualMachine(); + vm.extensionManager.loadExtensionIdSync('coreExample'); + t.ok(vm.extensionManager.isExtensionLoaded('coreExample')); + + t.equal(vm.runtime._blockInfo.length, 1); + t.equal(vm.runtime._blockInfo[0].blocks.length, 1); + t.type(vm.runtime._blockInfo[0].blocks[0].info, 'object'); + t.equal(vm.runtime._blockInfo[0].blocks[0].info.opcode, 'exampleOpcode'); + t.equal(vm.runtime._blockInfo[0].blocks[0].info.blockType, 'reporter'); + + // Test the opcode function + t.equal(vm.runtime._blockInfo[0].blocks[0].info.func(), 'no stage yet'); + + const sprite = new Sprite(null, vm.runtime); + sprite.name = 'Stage'; + const stage = new RenderedTarget(sprite, vm.runtime); + stage.isStage = true; + vm.runtime.targets = [stage]; + + t.equal(vm.runtime._blockInfo[0].blocks[0].info.func(), 'Stage'); + + t.end(); }); diff --git a/test/unit/dispatch.js b/test/unit/dispatch.js index 92ed58f0d..f3b944072 100644 --- a/test/unit/dispatch.js +++ b/test/unit/dispatch.js @@ -62,3 +62,24 @@ test('remote', t => { .then(() => runServiceTest('RemoteDispatchTest', t), e => t.fail(e)) .then(() => dispatch._remoteCall(worker, 'dispatch', 'terminate'), e => t.fail(e)); }); + +test('local, sync', t => { + dispatch.setServiceSync('SyncDispatchTest', new DispatchTestService()); + + const a = dispatch.callSync('SyncDispatchTest', 'returnFortyTwo'); + t.equal(a, 42); + + const b = dispatch.callSync('SyncDispatchTest', 'doubleArgument', 9); + t.equal(b, 18); + + const c = dispatch.callSync('SyncDispatchTest', 'doubleArgument', 123); + t.equal(c, 246); + + try { + dispatch.callSync('SyncDispatchTest', 'throwException'); + } catch (e) { + t.equal(e.message, 'This is a test exception thrown by DispatchTest'); + } + + t.end(); +});