import { expect, test, vi } from "vitest" import { ExpirationManager } from "#Source/timer/index.ts" test("RemainingManager getRemaining only returns seconds for active expirations", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha" | "beta" | "gamma">({ enableRemainingManager: false, }) expirationManager.upsertExpiration("alpha", Date.now() + 2_500) expirationManager.upsertExpiration("beta", Date.now() - 1) expirationManager.upsertExpiration("gamma", Date.now() + 2_500) expirationManager.removeExpiration("gamma") expect(expirationManager.remainingManager.getRemaining("alpha")).toBe(3) expect(expirationManager.remainingManager.getRemaining("beta")).toBeUndefined() expect(expirationManager.remainingManager.getRemaining("gamma")).toBeUndefined() expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager getRemainingSnapshot only includes active expirations", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha" | "beta" | "gamma">({ enableRemainingManager: false, }) expirationManager.upsertExpiration("alpha", Date.now() + 1_500) expirationManager.upsertExpiration("beta", Date.now() - 1) expirationManager.upsertExpiration("gamma", Date.now() + 1_500) expirationManager.removeExpiration("gamma") expect(expirationManager.remainingManager.getRemainingSnapshot()).toEqual({ alpha: 2 }) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager emit only publishes changed snapshots", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: false, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 2_500) expirationManager.remainingManager.emit() vi.advanceTimersByTime(1_000) expirationManager.remainingManager.emit() expect(remainingSnapshots).toEqual([{ alpha: 3 }, { alpha: 2 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager start enables interval-driven updates", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: false, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 2_500) vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 3 }]) expirationManager.remainingManager.start() vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 3 }, { alpha: 1 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager stop disables interval-driven updates", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: true, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 3_500) vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 4 }, { alpha: 3 }]) expirationManager.remainingManager.stop() vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 4 }, { alpha: 3 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager pause suspends interval-driven updates", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: true, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 3_500) vi.advanceTimersByTime(1_000) expirationManager.remainingManager.pause() vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 4 }, { alpha: 3 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager resume restarts interval-driven updates after pause", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: true, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 3_500) expirationManager.remainingManager.pause() vi.advanceTimersByTime(1_000) expirationManager.remainingManager.resume() vi.advanceTimersByTime(1_000) expect(remainingSnapshots).toEqual([{ alpha: 4 }, { alpha: 2 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("RemainingManager terminate stops future emissions", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0)) try { const expirationManager = new ExpirationManager<"alpha">({ enableRemainingManager: true, }) const remainingSnapshots: Array<{ alpha?: number | undefined }> = [] expirationManager.remainingManager.event.subscribe("remaining", (remaining): void => { remainingSnapshots.push({ ...remaining }) }) expirationManager.upsertExpiration("alpha", Date.now() + 3_500) expirationManager.remainingManager.terminate() vi.advanceTimersByTime(2_000) expirationManager.remainingManager.emit() expect(remainingSnapshots).toEqual([{ alpha: 4 }]) expirationManager.terminate() } finally { vi.clearAllTimers() vi.useRealTimers() } })