import { describe, expect, it } from "vitest"; import { BOSS_HAZARD_VFX, bossHazardVfxProfile, bossHazardVfxSeed } from "./bossHazardVisuals"; import type { CircleHazardKind } from "./types"; const HAZARD_KINDS: readonly CircleHazardKind[] = [ "venom_pool", "skyfall", "quake", "lava_pool", "stinger_eruption", "hourglass", "tidal_burst", "soul_rift", "crownfall", "royal_shockwave", ]; describe("boss hazard visuals", () => { it("defines a bounded effect profile for every circular hazard kind", () => { expect(Object.keys(BOSS_HAZARD_VFX).sort()).toEqual([...HAZARD_KINDS].sort()); for (const kind of HAZARD_KINDS) { const profile = bossHazardVfxProfile(kind); expect(profile.particleCount).toBeGreaterThanOrEqual(6); expect(profile.particleCount).toBeLessThanOrEqual(9); expect(profile.height).toBeGreaterThan(0); expect(profile.warningColor).not.toBe(profile.highlightColor); } }); it("uses shape and motion, not color alone, to distinguish common attacks", () => { expect(bossHazardVfxProfile("venom_pool")).toMatchObject({ motion: "bubble", shape: "orb" }); expect(bossHazardVfxProfile("stinger_eruption")).toMatchObject({ motion: "spike", shape: "spike" }); expect(bossHazardVfxProfile("royal_shockwave")).toMatchObject({ motion: "shockwave", shape: "crystal" }); expect(bossHazardVfxProfile("soul_rift")).toMatchObject({ motion: "orbit", shape: "orb" }); }); it("creates stable normalized seeds without runtime randomness", () => { expect(bossHazardVfxSeed("meteor-12")).toBe(bossHazardVfxSeed("meteor-12")); expect(bossHazardVfxSeed("meteor-12")).not.toBe(bossHazardVfxSeed("meteor-13")); expect(bossHazardVfxSeed("meteor-12")).toBeGreaterThanOrEqual(0); expect(bossHazardVfxSeed("meteor-12")).toBeLessThanOrEqual(1); }); });