110 lines
2.0 KiB
JavaScript
110 lines
2.0 KiB
JavaScript
import { WorkerPortal } from '../src/index.js';
|
|
|
|
function FakeWorkerPair() {
|
|
let cbA = null;
|
|
let cbB = null;
|
|
|
|
const objA = {
|
|
postMessage: data => {
|
|
cbB({ data: data });
|
|
},
|
|
addEventListener: (eventName, fn) => {
|
|
cbA = (...r) => {
|
|
fn(...r);
|
|
};
|
|
},
|
|
removeEventListener: (eventName, fn) => {
|
|
cbA = null;
|
|
}
|
|
};
|
|
|
|
const objB = {
|
|
postMessage: data => {
|
|
cbA({ data: data });
|
|
},
|
|
addEventListener: (eventName, fn) => {
|
|
cbB = (...r) => {
|
|
fn(...r);
|
|
};
|
|
},
|
|
removeEventListener: (eventName, fn) => {
|
|
cbB = null;
|
|
}
|
|
};
|
|
|
|
return [objA, objB];
|
|
}
|
|
|
|
describe('Workers ', () => {
|
|
it('can call and respond equally', done => {
|
|
const [a, b] = FakeWorkerPair();
|
|
let masterApi, slaveApi;
|
|
|
|
return Promise.all([
|
|
WorkerPortal(
|
|
{
|
|
slaveAdd: (a, b) => a + b,
|
|
math: {
|
|
multiply: (a, b) => a * b,
|
|
lib: {
|
|
pow: (a, b) => Math.pow(a, b)
|
|
}
|
|
}
|
|
},
|
|
a,
|
|
true
|
|
),
|
|
WorkerPortal(
|
|
{
|
|
masterSubtract: (a, b) => a - b
|
|
},
|
|
b,
|
|
false
|
|
)
|
|
])
|
|
.then(([slave, master]) => {
|
|
masterApi = master;
|
|
slaveApi = slave;
|
|
|
|
expect(Object.keys(masterApi)).toEqual([
|
|
'__init',
|
|
'__cleanupSlave',
|
|
'slaveAdd',
|
|
'math',
|
|
'_cleanup'
|
|
]);
|
|
expect(Object.keys(masterApi.math)).toEqual(['multiply', 'lib']);
|
|
expect(Object.keys(slaveApi)).toEqual(['masterSubtract']);
|
|
|
|
return Promise.all([
|
|
slaveApi.masterSubtract(9, 2),
|
|
masterApi.slaveAdd(9, 2),
|
|
masterApi.math.multiply(9, 2),
|
|
masterApi.math.lib.pow(9, 2)
|
|
]);
|
|
})
|
|
.then(results => {
|
|
expect(results).toEqual([7, 11, 18, 81]);
|
|
|
|
return Promise.all([masterApi.slaveAdd(5, 2), slaveApi.masterSubtract(2, 2)]);
|
|
})
|
|
.then(results => {
|
|
expect(results).toEqual([7, 0]);
|
|
return masterApi._cleanup();
|
|
})
|
|
.catch(e => {
|
|
fail(e);
|
|
})
|
|
.then(() => {
|
|
return masterApi.slaveAdd(9, 2);
|
|
})
|
|
.then(e => {
|
|
fail('Expected rejection');
|
|
})
|
|
.catch(e => {
|
|
expect(e.message).toBe('Portal disabled');
|
|
done();
|
|
});
|
|
});
|
|
});
|