Files
OpenFrontIO/tests/NameLayer.test.ts
T
evanpelle 66ecbabac2 rename client/graphics → client/hud
The contents (Lit web components for in-game chat, build menu, leaderboard,
attack displays, etc.) are HUD, not graphics — the actual graphics is in
client/render/.
2026-05-18 22:27:23 +02:00

42 lines
1.7 KiB
TypeScript

import { computeAllianceClipPath } from "../src/client/hud/PlayerIcons";
describe("PlayerIcons", () => {
describe("computeAllianceClipPath", () => {
test("returns full visibility (20% top cut) when alliance time is at 100%", () => {
const result = computeAllianceClipPath(1.0);
// topCut = 20 + (1 - 1.0) * 80 * 0.78 = 20 + 0 = 20.00
expect(result).toBe("inset(20.00% -2px 0 -2px)");
});
test("returns maximum cut (82.40% top cut) when alliance time is at 0%", () => {
const result = computeAllianceClipPath(0.0);
// topCut = 20 + (1 - 0.0) * 80 * 0.78 = 20 + 62.4 = 82.40
expect(result).toBe("inset(82.40% -2px 0 -2px)");
});
test("returns 51.20% top cut when alliance time is at 50%", () => {
const result = computeAllianceClipPath(0.5);
// topCut = 20 + (1 - 0.5) * 80 * 0.78 = 20 + 31.2 = 51.20
expect(result).toBe("inset(51.20% -2px 0 -2px)");
});
test("returns 27.80% top cut when alliance time is at 87.5%", () => {
const result = computeAllianceClipPath(0.875);
// topCut = 20 + (1 - 0.875) * 80 * 0.78 = 20 + 7.8 = 27.80
expect(result).toBe("inset(27.80% -2px 0 -2px)");
});
test("returns 74.60% top cut when alliance time is at 12.5%", () => {
const result = computeAllianceClipPath(0.125);
// topCut = 20 + (1 - 0.125) * 80 * 0.78 = 20 + 54.6 = 74.60
expect(result).toBe("inset(74.60% -2px 0 -2px)");
});
test("includes -2px horizontal overscan to prevent subpixel gaps", () => {
const result = computeAllianceClipPath(0.5);
expect(result).toContain("-2px");
expect(result.match(/-2px/g)).toHaveLength(2); // Should appear twice (left and right)
});
});
});