Skip to content

Commit

Permalink
Add Deferred tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dpwatrous committed Sep 22, 2023
1 parent bb3f6cf commit 869e972
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 4 deletions.
45 changes: 45 additions & 0 deletions packages/bonito-core/src/util/__tests__/deferred.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Deferred } from "../deferred";

describe("Deferred tests", () => {
test("resolve", () => {
const deferred = new Deferred<string>();

expect(deferred.resolve).toBeDefined();
expect(deferred.reject).toBeDefined();
expect(deferred.done).toBe(false);
expect(deferred.resolved).toBe(false);
expect(deferred.rejected).toBe(false);
expect(deferred.resolvedTo).toBeUndefined();
expect(deferred.rejectedTo).toBeUndefined();
expect(deferred.promise).toBeDefined();

deferred.resolve("Did it!");

expect(deferred.done).toBe(true);
expect(deferred.resolved).toBe(true);
expect(deferred.rejected).toBe(false);
expect(deferred.resolvedTo).toBe("Did it!");
expect(deferred.rejectedTo).toBeUndefined();
});

test("reject", async () => {
const deferred = new Deferred<string>();

deferred.reject("Didn't do it :(");

let caughtRejection = false;
try {
await deferred.promise;
} catch (e) {
caughtRejection = true;
}

expect(caughtRejection).toBe(true);

expect(deferred.done).toBe(true);
expect(deferred.resolved).toBe(false);
expect(deferred.rejected).toBe(true);
expect(deferred.rejectedTo).toBe("Didn't do it :(");
expect(deferred.resolvedTo).toBeUndefined();
});
});
18 changes: 14 additions & 4 deletions packages/bonito-core/src/util/deferred.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,29 @@
* at a later point in time with a function call.
*/
export class Deferred<T = void> {
public promise: Promise<T>;
public done = false;
public resolve!: (result: T) => void;
public reject!: (error: unknown) => void;
promise: Promise<T>;

done = false;
resolved = false;
rejected = false;
resolvedTo?: T;
rejectedTo?: unknown;

resolve!: (result: T) => void;
reject!: (error: unknown) => void;

constructor() {
this.promise = new Promise<T>((resolve, reject) => {
this.reject = (e) => {
this.done = true;
this.rejected = true;
this.rejectedTo = e;
reject(e);
};
this.resolve = (r: T) => {
this.done = true;
this.resolved = true;
this.resolvedTo = r;
resolve(r);
};
});
Expand Down

0 comments on commit 869e972

Please sign in to comment.