forked from vim-fall/deno-fall-std
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpreviewer_test.ts
134 lines (126 loc) · 4.68 KB
/
previewer_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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import { assertEquals } from "@std/assert";
import { type AssertTrue, assertType, type IsExact } from "@std/testing/types";
import { DenopsStub } from "@denops/test/stub";
import type { DetailUnit } from "./item.ts";
import {
composePreviewers,
definePreviewer,
type Previewer,
type PreviewParams,
} from "./previewer.ts";
Deno.test("definePreviewer", async (t) => {
await t.step("without type contraint", () => {
const previewer = definePreviewer((_denops, params) => {
type _ = AssertTrue<IsExact<typeof params, PreviewParams<DetailUnit>>>;
});
assertType<IsExact<typeof previewer, Previewer<DetailUnit>>>(true);
});
await t.step("with type contraint", () => {
type C = { a: string };
const previewer = definePreviewer<C>((_denops, params) => {
type _ = AssertTrue<IsExact<typeof params, PreviewParams<C>>>;
});
assertType<IsExact<typeof previewer, Previewer<C>>>(true);
});
});
Deno.test("composePreviewers", async (t) => {
await t.step("with bear previewers", async (t) => {
await t.step(
"previewers are applied in order and terminate on success",
async () => {
const results: string[] = [];
const previewer1 = definePreviewer(() => {
results.push("previewer1");
return { content: ["Hello world"] };
});
const previewer2 = definePreviewer(() => {
results.push("previewer2");
});
const previewer3 = definePreviewer(() => {
results.push("previewer3");
return { content: ["Goodbye world"] };
});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
const denops = new DenopsStub();
const params = {
item: {
id: 0,
value: "123",
detail: {},
},
};
const item = await previewer.preview(denops, params, {});
assertEquals(results, ["previewer2", "previewer1"]);
assertEquals(item, {
content: ["Hello world"],
});
},
);
await t.step("without type constraint", () => {
const previewer1 = definePreviewer(() => {});
const previewer2 = definePreviewer(() => {});
const previewer3 = definePreviewer(() => {});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
assertType<IsExact<typeof previewer, Previewer<DetailUnit>>>(true);
});
await t.step("with type constraint", () => {
type C = { a: string };
const previewer1 = definePreviewer<C>(() => {});
const previewer2 = definePreviewer<C>(() => {});
const previewer3 = definePreviewer<C>(() => {});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
assertType<IsExact<typeof previewer, Previewer<C>>>(true);
});
});
await t.step("with derivable previewers", async (t) => {
await t.step(
"previewers are applied in order and terminate on success",
async () => {
const results: string[] = [];
const previewer1 = () =>
definePreviewer(() => {
results.push("previewer1");
return { content: ["Hello world"] };
});
const previewer2 = () =>
definePreviewer(() => {
results.push("previewer2");
});
const previewer3 = () =>
definePreviewer(() => {
results.push("previewer3");
return { content: ["Goodbye world"] };
});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
const denops = new DenopsStub();
const params = {
item: {
id: 0,
value: "123",
detail: {},
},
};
const item = await previewer.preview(denops, params, {});
assertEquals(results, ["previewer2", "previewer1"]);
assertEquals(item, {
content: ["Hello world"],
});
},
);
await t.step("without type constraint", () => {
const previewer1 = () => definePreviewer(() => {});
const previewer2 = () => definePreviewer(() => {});
const previewer3 = () => definePreviewer(() => {});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
assertType<IsExact<typeof previewer, Previewer<DetailUnit>>>(true);
});
await t.step("with type constraint", () => {
type C = { a: string };
const previewer1 = () => definePreviewer<C>(() => {});
const previewer2 = () => definePreviewer<C>(() => {});
const previewer3 = () => definePreviewer<C>(() => {});
const previewer = composePreviewers(previewer2, previewer1, previewer3);
assertType<IsExact<typeof previewer, Previewer<C>>>(true);
});
});
});