parallel-es
Version:
Simple parallelization for EcmaScript
169 lines (139 loc) • 5.61 kB
text/typescript
import {WorkerTask} from "../../../src/common/task/worker-task";
import {ITaskDefinition} from "../../../src/common/task/task-definition";
import {functionId} from "../../../src/common/function/function-id";
describe("WorkerTask", function () {
let workerTask: WorkerTask<number>;
const taskDefinition: ITaskDefinition = {
main: {
______serializedFunctionCall: true,
functionId: functionId("test", 2),
parameters: [5, 10]
},
usedFunctionIds: [functionId("test", 2)]
};
beforeEach(function () {
workerTask = new WorkerTask<number>(taskDefinition);
});
describe("isCanceled", function () {
it("is false by default", function () {
expect(workerTask.isCanceled).toBe(false);
});
it("is true if if the task has been resolved", function () {
// arrange
workerTask.cancel();
// act
workerTask.resolve(10);
// assert
expect(workerTask.isCanceled).toBe(true);
});
it("is true if if the task has been resolved as canceled", function () {
// arrange
workerTask.cancel();
// act
workerTask.resolveCancelled();
// assert
expect(workerTask.isCanceled).toBe(true);
});
});
describe("isCancellationRequested", function () {
it("is false by default", function () {
expect(workerTask.isCancellationRequested).toBe(false);
});
it("is true if the user requested cancellation", function () {
// act
workerTask.cancel();
// assert
expect(workerTask.isCancellationRequested).toBe(true);
});
});
describe("resolve", function () {
it("triggers the then handlers", function (done) {
// arrange
const handler = jasmine.createSpy("thenHandler");
workerTask.then(handler);
// act
workerTask.resolve(10);
workerTask.then(function () {
// assert
expect(handler).toHaveBeenCalledWith(10);
done();
}, done.fail);
});
it("triggers the catch handlers if the task has been canceled in the meantime", function (done) {
// arrange
const catchHandler = jasmine.createSpy("catchHandler");
workerTask.catch(catchHandler);
workerTask.cancel();
// act
workerTask.resolve(10);
workerTask.then(() => done.fail("Then handler called, but catch handler should have been called"), function () {
// assert
expect(catchHandler).toHaveBeenCalledWith("Task has been canceled");
expect(workerTask.isCanceled).toBe(true);
done();
});
});
});
describe("resolveCanceled", function () {
it("triggers the catch handlers when the task is resolved canceled", function (done) {
// arrange
const catchHandler = jasmine.createSpy("catchHandler");
workerTask.catch(catchHandler);
workerTask.cancel();
// act
workerTask.resolveCancelled();
workerTask.then(() => done.fail("Then handler called, but catch handler should have been called"), function () {
// assert
expect(catchHandler).toHaveBeenCalledWith("Task has been canceled");
done();
});
});
it("marks the task as cancelled", function (done) {
const catchHandler = jasmine.createSpy("catchHandler");
workerTask.catch(catchHandler);
workerTask.cancel();
// act
workerTask.resolveCancelled();
workerTask.then(() => done.fail("Then handler called, but catch handler should have been called"), function () {
// assert
expect(workerTask.isCanceled).toBe(true);
done();
});
});
});
describe("reject", function () {
it("triggers the catch handlers", function (done) {
// arrange
const catchHandler = jasmine.createSpy("catchHandler");
workerTask.catch(catchHandler);
workerTask.cancel();
// act
workerTask.reject("Error");
workerTask.then(() => done.fail("Then handler called, but catch handler should have been called"), function () {
// assert
expect(catchHandler).toHaveBeenCalledWith("Error");
done();
});
});
});
describe("catch", function () {
let doneFn: DoneFn;
let unhandledRejctionHandler: () => void;
beforeEach(function () {
unhandledRejctionHandler = function () {
doneFn.fail("Promise has rejection handler and therefore global unrejected handler should not be called");
};
window.addEventListener("unhandledrejection", unhandledRejctionHandler);
});
afterEach(function () {
window.removeEventListener("unhandledrejection", unhandledRejctionHandler);
});
it("does not trigger 'unhandled exception in promise' if catch handler is registered", function (done) {
// arrange
doneFn = done;
workerTask.catch(() => done());
// act
workerTask.reject("Error occurred");
});
});
});