29 lines
1.1 KiB
TypeScript
29 lines
1.1 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { formatTimeline, resetTimeline, startSpan, timed, timeline, timelineTotals } from "../src/index.ts";
|
|
|
|
test("timed records a span even when the operation throws", async () => {
|
|
resetTimeline();
|
|
await assert.rejects(() => timed("boom", async () => { throw new Error("nope"); }));
|
|
const spans = timeline();
|
|
assert.equal(spans.length, 1);
|
|
assert.equal(spans[0]?.label, "boom");
|
|
});
|
|
|
|
test("totals aggregate by label, slowest first", async () => {
|
|
resetTimeline();
|
|
startSpan("fast")();
|
|
const slow = startSpan("slow");
|
|
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
slow();
|
|
startSpan("slow")();
|
|
const totals = timelineTotals();
|
|
assert.equal(totals[0]?.label, "slow");
|
|
assert.equal(totals[0]?.calls, 2);
|
|
// Timers can fire a millisecond early, so assert ordering and that time was
|
|
// recorded — not an exact threshold.
|
|
assert.ok(totals[0]!.totalMs > 0, JSON.stringify(totals));
|
|
assert.ok(totals[0]!.totalMs >= (totals[1]?.totalMs ?? 0), JSON.stringify(totals));
|
|
assert.match(formatTimeline(), /slow/);
|
|
});
|