import { expect, test } from "vitest" import { MinHeap } from "#Source/timer/index.ts" test("MinHeap size returns the current node count", () => { const heap = new MinHeap<"alpha" | "beta">() expect(heap.size()).toBe(0) heap.push({ name: "alpha", endAt: 3 }) heap.push({ name: "beta", endAt: 1 }) expect(heap.size()).toBe(2) }) test("MinHeap peek returns the smallest endAt without removing it", () => { const heap = new MinHeap<"alpha" | "beta" | "gamma">() expect(heap.peek()).toBeUndefined() heap.push({ name: "alpha", endAt: 5 }) heap.push({ name: "beta", endAt: 2 }) heap.push({ name: "gamma", endAt: 4 }) expect(heap.peek()).toEqual({ name: "beta", endAt: 2 }) expect(heap.size()).toBe(3) }) test("MinHeap push maintains heap order for later reads", () => { const heap = new MinHeap<"alpha" | "beta" | "gamma">() heap.push({ name: "alpha", endAt: 7 }) heap.push({ name: "beta", endAt: 3 }) heap.push({ name: "gamma", endAt: 5 }) expect(heap.peek()).toEqual({ name: "beta", endAt: 3 }) expect(heap.pop()).toEqual({ name: "beta", endAt: 3 }) expect(heap.pop()).toEqual({ name: "gamma", endAt: 5 }) expect(heap.pop()).toEqual({ name: "alpha", endAt: 7 }) }) test("MinHeap remove deletes the named node and keeps the remaining order valid", () => { const heap = new MinHeap<"alpha" | "beta" | "gamma" | "delta" | "missing">() heap.push({ name: "alpha", endAt: 7 }) heap.push({ name: "beta", endAt: 3 }) heap.push({ name: "gamma", endAt: 5 }) heap.push({ name: "delta", endAt: 1 }) heap.remove("beta") heap.remove("missing") expect(heap.pop()).toEqual({ name: "delta", endAt: 1 }) expect(heap.pop()).toEqual({ name: "gamma", endAt: 5 }) expect(heap.pop()).toEqual({ name: "alpha", endAt: 7 }) }) test("MinHeap pop removes and returns nodes in ascending endAt order", () => { const heap = new MinHeap<"alpha" | "beta" | "gamma">() expect(heap.pop()).toBeUndefined() heap.push({ name: "alpha", endAt: 4 }) heap.push({ name: "beta", endAt: 2 }) heap.push({ name: "gamma", endAt: 6 }) expect(heap.pop()).toEqual({ name: "beta", endAt: 2 }) expect(heap.pop()).toEqual({ name: "alpha", endAt: 4 }) expect(heap.pop()).toEqual({ name: "gamma", endAt: 6 }) expect(heap.pop()).toBeUndefined() })