Skip to content

Commit 1137d71

Browse files
committed
fix(IllegalStateError): set custom name for instanceof matching
1 parent 148a878 commit 1137d71

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

src/IllegalStateError.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ import { type DeferredPromiseState } from "./DeferredPromise";
33
export class IllegalStateError extends Error {
44
constructor(message: string, public readonly state: DeferredPromiseState) {
55
super(message);
6+
this.name = "IllegalStateError";
67
}
78
}

test/DeferredPromise.test.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import { DeferredPromise } from "../src";
22
import { IllegalStateError } from "../src/IllegalStateError";
33

4+
function extractError<ErrorType extends Error>(fn: () => void): ErrorType {
5+
try {
6+
fn();
7+
} catch (error) {
8+
return error as ErrorType;
9+
}
10+
}
11+
412
describe("Promise-compliance", () => {
513
it('can be listened to with ".then()"', (done) => {
614
expect.assertions(1);
@@ -100,30 +108,46 @@ describe("resolve()", () => {
100108
expect(promise.result).toBe(123);
101109
});
102110

103-
it("throws when resolving an already resolved promise", () => {
111+
it("throws when resolving an already resolved promise", async () => {
104112
const promise = new DeferredPromise<number>();
105113
expect(promise.state).toBe("pending");
114+
106115
promise.resolve(123);
116+
expect(promise.state).toBe("resolved");
107117

108-
expect(() => promise.resolve(456)).toThrow(
109-
new IllegalStateError(
110-
"Cannot resolve a DeferredPromise: illegal state",
111-
"resolved"
112-
)
118+
const stateError = extractError<IllegalStateError>(() => {
119+
promise.resolve(456);
120+
});
121+
122+
// Throws an illegal state error.
123+
expect(stateError).toBeInstanceOf(IllegalStateError);
124+
expect(stateError.message).toBe(
125+
"Cannot resolve a DeferredPromise: illegal state"
113126
);
127+
expect(stateError.state).toBe("resolved");
128+
129+
// The state remains resolved.
130+
expect(promise.state).toBe("resolved");
114131
});
115132

116133
it("throws when resolving an already rejected promise", () => {
117134
const promise = new DeferredPromise<number>().catch(() => {});
118135
expect(promise.state).toBe("pending");
119-
promise.reject();
136+
promise.reject("first reason");
137+
138+
const stateError = extractError<IllegalStateError>(() => {
139+
promise.reject("second reason");
140+
});
120141

121-
expect(() => promise.resolve(123)).toThrow(
122-
new IllegalStateError(
123-
"Cannot resolve a DeferredPromise: illegal state",
124-
"rejected"
125-
)
142+
expect(stateError).toBeInstanceOf(IllegalStateError);
143+
expect(stateError.message).toBe(
144+
"Cannot reject a DeferredPromise: illegal state"
126145
);
146+
expect(stateError.state).toBe("rejected");
147+
148+
// The state remains rejected.
149+
expect(promise.state).toBe("rejected");
150+
expect(promise.rejectionReason).toBe("first reason");
127151
});
128152
});
129153

0 commit comments

Comments
 (0)