| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | import { Queue } from "../src/queue";describe("Queue", () => {  const calls: any[] = [];  const createJobFactory =    <T>(      // for purpose of this test, Error object will become a rejection value      resolutionOrRejectionValue: T,      ms = 1,    ) =>    () => {      return new Promise<T>((resolve, reject) => {        setTimeout(() => {          if (resolutionOrRejectionValue instanceof Error) {            reject(resolutionOrRejectionValue);          } else {            resolve(resolutionOrRejectionValue);          }        }, ms);      }).then((x) => {        calls.push(x);        return x;      });    };  beforeEach(() => {    calls.length = 0;  });  it("should await and resolve values in order of enqueueing", async () => {    const queue = new Queue();    const p1 = queue.push(createJobFactory("A", 50));    const p2 = queue.push(createJobFactory("B"));    const p3 = queue.push(createJobFactory("C"));    expect(await p3).toBe("C");    expect(await p2).toBe("B");    expect(await p1).toBe("A");    expect(calls).toEqual(["A", "B", "C"]);  });  it("should reject a job if it throws, and not affect other jobs", async () => {    const queue = new Queue();    const err = new Error("B");    queue.push(createJobFactory("A", 50));    const p2 = queue.push(createJobFactory(err));    const p3 = queue.push(createJobFactory("C"));    const p2err = p2.catch((err) => err);    await p3;    expect(await p2err).toBe(err);    expect(calls).toEqual(["A", "C"]);  });});
 |