runa/vscode/test/refresh.test.ts

54 lines
1.6 KiB
TypeScript
Raw Normal View History

import assert from "node:assert/strict";
import test from "node:test";
import { RefreshQueue } from "../src/refresh";
test("refreshes coalesce bursts and rerun after in-flight invalidation", async (t) => {
const reads: (() => void)[] = [];
const queue = new RefreshQueue(
() =>
new Promise<void>((resolve) => {
reads.push(resolve);
}),
(error) => {
throw error;
},
);
t.after(() => queue.dispose());
for (let i = 0; i < 100; i++) queue.invalidate();
await waitFor(() => reads.length === 1);
for (let i = 0; i < 100; i++) queue.invalidate();
assert.equal(reads.length, 1);
reads[0]?.();
await waitFor(() => reads.length === 2);
reads[1]?.();
await new Promise((resolve) => setTimeout(resolve, 60));
assert.equal(reads.length, 2);
});
test("disposed sessions never run queued refreshes and errors are reported", async () => {
let calls = 0;
const errors: unknown[] = [];
const queue = new RefreshQueue(
async () => {
calls++;
throw new Error("refresh failed");
},
(error) => errors.push(error),
);
queue.invalidate();
await waitFor(() => errors.length === 1);
assert.equal(calls, 1);
queue.invalidate();
queue.dispose();
await new Promise((resolve) => setTimeout(resolve, 60));
assert.equal(calls, 1);
});
async function waitFor(condition: () => boolean): Promise<void> {
const deadline = Date.now() + 2000;
while (!condition()) {
if (Date.now() > deadline) throw new Error("Refresh queue did not make progress");
await new Promise((resolve) => setTimeout(resolve, 5));
}
}