portfolio/packages/portal/spec/portal.spec.js
2018-03-28 14:18:17 -05:00

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();
});
});
});