sendou.ink/app/features/comp-analyzer/core/special-weapon-range.test.ts
2026-07-01 19:48:47 +03:00

58 lines
1.8 KiB
TypeScript

import { describe, expect, test } from "vitest";
import {
BIG_BUBBLER_ID,
BOOYAH_BOMB_ID,
CRAB_TANK_ID,
SPLATTERCOLOR_SCREEN_ID,
specialWeaponIds,
TRIZOOKA_ID,
WAVE_BREAKER_ID,
} from "~/modules/in-game-lists/weapon-ids";
import { getSpecialWeaponRange } from "./special-weapon-range";
describe("special weapon range", () => {
test("computes a projectile range for Trizooka", () => {
const result = getSpecialWeaponRange(TRIZOOKA_ID);
expect(result?.rangeType).toBe("projectile");
expect(result?.range).toBeGreaterThan(0);
});
test("Crab Tank reaches further than Trizooka", () => {
const crab = getSpecialWeaponRange(CRAB_TANK_ID);
const trizooka = getSpecialWeaponRange(TRIZOOKA_ID);
expect(crab!.range).toBeGreaterThan(trizooka!.range);
});
test("throws-and-bursts specials expose a throw range plus explosion blast", () => {
const booyah = getSpecialWeaponRange(BOOYAH_BOMB_ID);
expect(booyah?.rangeType).toBe("projectile");
expect(booyah?.range).toBeGreaterThan(0);
expect(booyah?.blastRadius).toBeGreaterThan(0);
});
test("returns the effect radius for area specials", () => {
const waveBreaker = getSpecialWeaponRange(WAVE_BREAKER_ID);
expect(waveBreaker?.rangeType).toBe("radius");
expect(waveBreaker?.range).toBeGreaterThan(0);
});
test("returns null for global / utility specials without a meaningful circle", () => {
expect(getSpecialWeaponRange(BIG_BUBBLER_ID)).toBeNull();
expect(getSpecialWeaponRange(SPLATTERCOLOR_SCREEN_ID)).toBeNull();
});
test("every special is either unsupported or has a positive finite range", () => {
for (const id of specialWeaponIds) {
const result = getSpecialWeaponRange(id);
if (result === null) continue;
expect(Number.isFinite(result.range)).toBe(true);
expect(result.range).toBeGreaterThan(0);
}
});
});