Initial commit of 001code-html Scratch frontend project.
Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
82
scratch-vm/test/unit/dispatch.js
Normal file
82
scratch-vm/test/unit/dispatch.js
Normal file
@@ -0,0 +1,82 @@
|
||||
const DispatchTestService = require('../fixtures/dispatch-test-service');
|
||||
const Worker = require('tiny-worker');
|
||||
|
||||
const dispatch = require('../../src/dispatch/central-dispatch');
|
||||
const path = require('path');
|
||||
const test = require('tap').test;
|
||||
|
||||
|
||||
// By default Central Dispatch works with the Worker class built into the browser. Tell it to use TinyWorker instead.
|
||||
dispatch.workerClass = Worker;
|
||||
|
||||
const runServiceTest = function (serviceName, t) {
|
||||
const promises = [];
|
||||
|
||||
promises.push(dispatch.call(serviceName, 'returnFortyTwo')
|
||||
.then(
|
||||
x => t.equal(x, 42),
|
||||
e => t.fail(e)
|
||||
));
|
||||
|
||||
promises.push(dispatch.call(serviceName, 'doubleArgument', 9)
|
||||
.then(
|
||||
x => t.equal(x, 18),
|
||||
e => t.fail(e)
|
||||
));
|
||||
|
||||
promises.push(dispatch.call(serviceName, 'doubleArgument', 123)
|
||||
.then(
|
||||
x => t.equal(x, 246),
|
||||
e => t.fail(e)
|
||||
));
|
||||
|
||||
// I tried using `t.rejects` here but ran into https://github.com/tapjs/node-tap/issues/384
|
||||
promises.push(dispatch.call(serviceName, 'throwException')
|
||||
.then(
|
||||
() => t.fail('exception was not propagated as expected'),
|
||||
() => t.pass('exception was propagated as expected')
|
||||
));
|
||||
|
||||
return Promise.all(promises);
|
||||
};
|
||||
|
||||
test('local', t => {
|
||||
dispatch.setService('LocalDispatchTest', new DispatchTestService())
|
||||
.catch(e => t.fail(e));
|
||||
|
||||
return runServiceTest('LocalDispatchTest', t);
|
||||
});
|
||||
|
||||
test('remote', t => {
|
||||
const fixturesDir = path.resolve(__dirname, '../fixtures');
|
||||
const shimPath = path.resolve(fixturesDir, 'dispatch-test-worker-shim.js');
|
||||
const worker = new Worker(shimPath, null, {cwd: fixturesDir});
|
||||
dispatch.addWorker(worker);
|
||||
|
||||
const waitForWorker = new Promise(resolve => {
|
||||
dispatch.setService('test', {onWorkerReady: resolve})
|
||||
.catch(e => t.fail(e));
|
||||
});
|
||||
|
||||
return waitForWorker
|
||||
.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);
|
||||
|
||||
t.throws(() => dispatch.callSync('SyncDispatchTest', 'throwException'),
|
||||
new Error('This is a test exception thrown by DispatchTest'));
|
||||
|
||||
t.end();
|
||||
});
|
||||
Reference in New Issue
Block a user