import { describe, expect, it } from "vitest"; import type { ForeshadowWindowView, OutlineChapterView, } from "@/lib/api/types"; import { groupByVolume, isCloseWindow, windowBadgeLabel, } from "./outline"; const ch = (over: Partial): OutlineChapterView => ({ no: 1, volume: 1, beats: [], foreshadow_windows: [], ...over, }); const win = ( over: Partial, ): ForeshadowWindowView => ({ code: "F-012", ...over }); describe("groupByVolume", () => { it("groups by volume and sorts volumes and chapters ascending", () => { const groups = groupByVolume([ ch({ no: 127, volume: 3 }), ch({ no: 12, volume: 1 }), ch({ no: 126, volume: 3 }), ]); expect(groups.map((g) => g.volume)).toEqual([1, 3]); expect(groups[1]?.chapters.map((c) => c.no)).toEqual([126, 127]); }); it("handles undefined", () => { expect(groupByVolume(undefined)).toEqual([]); }); }); describe("windowBadgeLabel", () => { it("renders a range, half-open, or bare badge", () => { expect( windowBadgeLabel(win({ expected_close_from: 40, expected_close_to: 60 })), ).toBe("⚑ F-012 (40-60)"); expect(windowBadgeLabel(win({ expected_close_to: 60 }))).toBe( "⚑ F-012 (≤60)", ); expect(windowBadgeLabel(win({ expected_close_from: 40 }))).toBe( "⚑ F-012 (≥40)", ); expect(windowBadgeLabel(win({}))).toBe("⚑ F-012"); }); }); describe("isCloseWindow", () => { it("is true when chapter no is inside the recovery window", () => { const w = win({ expected_close_from: 40, expected_close_to: 60 }); expect(isCloseWindow(ch({ no: 50 }), w)).toBe(true); expect(isCloseWindow(ch({ no: 61 }), w)).toBe(false); expect(isCloseWindow(ch({ no: 50 }), win({}))).toBe(false); }); });