Files
healer-man/src/game/wow335ShamanImprovedShieldsRuntime.test.ts
T
2026-10-02 10:38:12 -04:00

56 lines
2.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { abilityAtLevel } from "./abilityCatalog";
import { WOW335_ABILITIES_BY_CLASS } from "./wow335AbilityCatalog";
import {
wow335ShamanImprovedShieldOrbAmount,
wow335ShamanImprovedShieldOrbBonusPercent,
} from "./wow335ShamanImprovedShieldsRuntime";
function shieldProc(name: string, suffix: string) {
const ability = WOW335_ABILITIES_BY_CLASS.shaman.find((candidate) => candidate.name === name);
expect(ability, `Shaman ${name}`).toBeDefined();
const ranked = abilityAtLevel(ability!, 80);
const proc = ranked.effects
.filter((effect) => effect.kind === "apply-aura")
.flatMap((effect) => effect.aura.procs ?? [])
.find((candidate) => candidate.id.endsWith(suffix));
expect(proc, `${name} ${suffix} proc`).toBeDefined();
return proc!;
}
describe("WoW Shaman Improved Shields orb bonuses", () => {
it.each([
["lightning-shield", false, [0, 20, 40, 60]],
["lightning-shield", true, [0, 10, 20, 30]],
["earth-shield", false, [0, 5, 10, 15]],
["earth-shield", true, [0, 5, 10, 15]],
] as const)("uses generated %s rank bonuses against playerTarget=%s", (kind, isPlayerTarget, expected) => {
expect([0, 1, 2, 3].map((rank) => (
wow335ShamanImprovedShieldOrbBonusPercent(kind, rank, isPlayerTarget)
))).toEqual(expected);
});
it("scales the local Lightning Shield damage and Earth Shield healing proc payloads", () => {
const lightning = shieldProc("Lightning Shield", ":lightning-shield");
const earth = shieldProc("Earth Shield", ":earth-shield");
expect(lightning.action.kind).toBe("damage");
expect(earth.action.kind).toBe("heal");
if (lightning.action.kind !== "damage" || earth.action.kind !== "heal") return;
expect(wow335ShamanImprovedShieldOrbAmount(lightning.action.amount, "lightning-shield", 3))
.toBe(Math.round(lightning.action.amount * 1.6));
expect(wow335ShamanImprovedShieldOrbAmount(lightning.action.amount, "lightning-shield", 3, true))
.toBe(Math.round(lightning.action.amount * 1.3));
expect(wow335ShamanImprovedShieldOrbAmount(earth.action.amount, "earth-shield", 3))
.toBe(Math.round(earth.action.amount * 1.15));
});
it("treats missing/invalid ranks and invalid amounts safely", () => {
expect(wow335ShamanImprovedShieldOrbBonusPercent("lightning-shield", Number.NaN)).toBe(0);
expect(wow335ShamanImprovedShieldOrbBonusPercent("earth-shield", Number.POSITIVE_INFINITY)).toBe(0);
expect(wow335ShamanImprovedShieldOrbBonusPercent("lightning-shield", 99)).toBe(60);
expect(wow335ShamanImprovedShieldOrbAmount(100, "earth-shield", -1)).toBe(100);
expect(wow335ShamanImprovedShieldOrbAmount(Number.NaN, "earth-shield", 3)).toBe(0);
});
});