41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { TimedCombatEffect } from "./combatStore";
|
|
import {
|
|
formatTimedEffectTimer,
|
|
timedEffectExpiresAt,
|
|
timedEffectRemainingMs,
|
|
} from "./timedEffectDisplay";
|
|
|
|
function effect(overrides: Partial<TimedCombatEffect> = {}): 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");
|
|
});
|
|
});
|