-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreservator_test.ts
88 lines (81 loc) · 2.64 KB
/
reservator_test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { assertEquals, assertRejects, assertThrows } from "@std/assert";
import { promiseState } from "@lambdalisue/async";
import { Reservator } from "./reservator.ts";
import { AlreadyReservedError, NoReservationError } from "./errors.ts";
Deno.test("Reservator", async (t) => {
await t.step(
"`reserve()` returns a promise that is resolved by `resolve()`",
async () => {
const reservator = new Reservator();
const promise = reservator.reserve("key");
assertEquals(await promiseState(promise), "pending");
reservator.resolve("key", "value");
assertEquals(await promiseState(promise), "fulfilled");
assertEquals(await promise, "value");
},
);
await t.step(
"`reserve()` returns a promise that is rejected by `reject()`",
async () => {
const reservator = new Reservator();
const promise = reservator.reserve("key");
assertEquals(await promiseState(promise), "pending");
reservator.reject("key", new Error("reason"));
assertEquals(await promiseState(promise), "rejected");
assertRejects(() => promise, Error, "reason");
},
);
await t.step(
"`reserve()` throws `AlreadyReservedError` when called twice with the same key",
() => {
const reservator = new Reservator();
reservator.reserve("key");
assertThrows(() => reservator.reserve("key"), AlreadyReservedError);
},
);
await t.step(
"`resolve()` throws `NoReservationError` when called prior to `reserve()`",
() => {
const reservator = new Reservator();
assertThrows(
() => reservator.resolve("key", "value"),
NoReservationError,
);
},
);
await t.step(
"`reject()` throws `NoReservationError` when called prior to `reserve()`",
() => {
const reservator = new Reservator();
assertThrows(
() => reservator.reject("key", new Error("reason")),
NoReservationError,
);
},
);
await t.step(
"`size` returns the number of unique reservations",
() => {
const reservator = new Reservator();
assertEquals(reservator.size, 0);
reservator.reserve("key1");
assertEquals(reservator.size, 1);
reservator.reserve("key2");
assertEquals(reservator.size, 2);
reservator.reserve("key3");
assertEquals(reservator.size, 3);
},
);
await t.step(
"`clear()` clears all reservations",
() => {
const reservator = new Reservator();
reservator.reserve("key1");
reservator.reserve("key2");
reservator.reserve("key3");
assertEquals(reservator.size, 3);
reservator.clear();
assertEquals(reservator.size, 0);
},
);
});