import { describe, expect, it } from "vitest"; import type { TimedCombatEffect } from "./combatStore"; import { formatTimedEffectTimer, timedEffectExpiresAt, timedEffectRemainingMs, } from "./timedEffectDisplay"; function effect(overrides: Partial = {}): TimedCombatEffect { return { id: "priest-shadow-word-pain:1", kind: "dot", sourceAbilityId: "priest-shadow-word-pain", sourceActorId: "__player__", targetId: "mob-1", coefficient: 0.28, remainingTicks: 6, intervalMs: 3_000, nextTickAt: 4_000, ...overrides, }; } describe("timed effect display", () => { it("keeps a stable expiry as periodic ticks are consumed", () => { const initial = effect(); const afterTick = effect({ remainingTicks: 5, nextTickAt: 7_000 }); expect(timedEffectExpiresAt(initial)).toBe(19_000); expect(timedEffectExpiresAt(afterTick)).toBe(19_000); expect(timedEffectRemainingMs(afterTick, 7_500)).toBe(11_500); }); it("formats compact countdown labels", () => { expect(formatTimedEffectTimer(65_001)).toBe("1:06"); expect(formatTimedEffectTimer(10_001)).toBe("11"); expect(formatTimedEffectTimer(9_940)).toBe("9.9"); expect(formatTimedEffectTimer(-50)).toBe("0.0"); }); });