Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions packages/shared/src/orchestrationTiming.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { describe, expect, it } from "vite-plus/test";

import { formatDuration } from "./orchestrationTiming.ts";

describe("formatDuration", () => {
it("formats sub-second and second durations", () => {
expect(formatDuration(0)).toBe("1ms");
expect(formatDuration(250)).toBe("250ms");
expect(formatDuration(1_500)).toBe("1.5s");
expect(formatDuration(12_000)).toBe("12s");
});

it("rolls a sub-minute duration up to 1m instead of 60s", () => {
// Math.round(59_500 / 1_000) === 60, which must render as "1m", not "60s",
// matching the >= 60_000 branch (formatDuration(60_000) === "1m").
expect(formatDuration(59_499)).toBe("59s");
expect(formatDuration(59_500)).toBe("1m");
expect(formatDuration(60_000)).toBe("1m");
});

it("formats minute durations", () => {
expect(formatDuration(90_000)).toBe("1m 30s");
expect(formatDuration(120_000)).toBe("2m");
});

it("guards against invalid input", () => {
expect(formatDuration(-1)).toBe("0ms");
expect(formatDuration(Number.NaN)).toBe("0ms");
});
});
7 changes: 6 additions & 1 deletion packages/shared/src/orchestrationTiming.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ export function formatDuration(durationMs: number): string {
if (!Number.isFinite(durationMs) || durationMs < 0) return "0ms";
if (durationMs < 1_000) return `${Math.max(1, Math.round(durationMs))}ms`;
if (durationMs < 10_000) return `${(durationMs / 1_000).toFixed(1)}s`;
if (durationMs < 60_000) return `${Math.round(durationMs / 1_000)}s`;
if (durationMs < 60_000) {
// Rounding can land on 60 (e.g. 59_500ms); roll that up to "1m" instead of
// rendering "60s", matching the seconds === 60 guard in the branch below.
const seconds = Math.round(durationMs / 1_000);
return seconds === 60 ? "1m" : `${seconds}s`;
}
const minutes = Math.floor(durationMs / 60_000);
const seconds = Math.round((durationMs % 60_000) / 1_000);
if (seconds === 0) return `${minutes}m`;
Expand Down
Loading