/** Sizes and durations in the words a person reads: pin each ladder's rungs, * because the debug page and the admin screens render these directly. */ import { expect } from "@std/expect"; import { describe, it as test } from "@std/testing/bdd"; import { countLabel, durationWords, formatBytes, formatLimitValue, formatMs, formatSeconds, } from "#shared/format-units.ts"; describe("format-units", () => { test("bytes name the biggest rung they reach, else the bare count", () => { expect(formatBytes(0)).toBe("0B"); expect(formatBytes(999)).toBe("999B"); expect(formatBytes(1024)).toBe("1KB"); expect(formatBytes(1048576)).toBe("1MB"); expect(formatBytes(32 * 1024 * 1024)).toBe("32MB"); }); test("milliseconds climb from seconds through minutes to hours", () => { expect(formatMs(500)).toBe("500ms"); expect(formatMs(1000)).toBe("1s"); expect(formatMs(60 * 1000)).toBe("1min"); expect(formatMs(60 * 60 * 1000)).toBe("1h"); }); test("seconds climb from minutes through hours to days", () => { expect(formatSeconds(59)).toBe("59s"); expect(formatSeconds(60)).toBe("1min"); expect(formatSeconds(3600)).toBe("1h"); expect(formatSeconds(24 * 60 * 60)).toBe("1d"); }); test("a value rounding onto a rung rounds to a whole rung", () => { expect(formatSeconds(90)).toBe("2min"); }); test("a limit value reads its unit's ladder, or the plain count", () => { expect(formatLimitValue(1024, "bytes")).toBe("1KB"); expect(formatLimitValue(3600, "seconds")).toBe("1h"); expect(formatLimitValue(60, "ms")).toBe("60ms"); expect(formatLimitValue(5, "attempts")).toBe("5 attempts"); // A unit that names an inherited Object member is still an unknown unit. expect(formatLimitValue(5, "toString")).toBe("5 toString"); }); test("duration words read whole hours in hours", () => { expect(durationWords(3600)).toBe("an hour"); expect(durationWords(2 * 3600)).toBe("2 hours"); expect(durationWords(24 * 3600)).toBe("24 hours"); }); test("duration words read every other window in minutes or seconds", () => { expect(durationWords(60)).toBe("a minute"); expect(durationWords(15 * 60)).toBe("15 minutes"); expect(durationWords(90 * 60)).toBe("90 minutes"); expect(durationWords(90)).toBe("90 seconds"); }); test("a count label stays singular on one and names every other count", () => { // The restore summary shape: multi-word nouns, several counts in a row. expect(countLabel(1, "SQL statement")).toBe("1 SQL statement"); expect(countLabel(2, "SQL statement")).toBe("2 SQL statements"); expect(countLabel(0, "table")).toBe("0 tables"); // The activity-log shape: a counted choice update. expect(countLabel(1, "listing choice")).toBe("1 listing choice"); expect(countLabel(4, "listing choice")).toBe("4 listing choices"); }); });