* Show tied ranks with T prefix across standings and Discord notifications, fixes #197 - Add buildTiedRankChecker() utility to standings-display.ts; replaces four copies of inline rank-count logic spread across components, the league home route, and the Discord service - Prefix shared ranks with "T" (e.g. "T3") in StandingsTable (league panel), StandingsTable (full standings), the league home preview, and Discord webhook notifications - Add useMemo wrapping in StandingsTable components so tie detection does not recompute on every render - Fix compareTeamsForRanking to round total points to hundredths before comparing, preventing floating-point noise from producing spurious non-ties in the standings Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix discord test to expect escaped period in rank display Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
import { buildTiedRankChecker, getDisplayRank } from "../standings-display";
|
|
|
|
describe("buildTiedRankChecker", () => {
|
|
it("returns false for a rank held by only one team", () => {
|
|
const isTied = buildTiedRankChecker([1, 2, 3]);
|
|
expect(isTied(1)).toBe(false);
|
|
expect(isTied(2)).toBe(false);
|
|
expect(isTied(3)).toBe(false);
|
|
});
|
|
|
|
it("returns true for a rank shared by two or more teams", () => {
|
|
const isTied = buildTiedRankChecker([1, 3, 3, 5]);
|
|
expect(isTied(3)).toBe(true);
|
|
});
|
|
|
|
it("returns false for a rank not present in the list", () => {
|
|
const isTied = buildTiedRankChecker([1, 2]);
|
|
expect(isTied(99)).toBe(false);
|
|
});
|
|
|
|
it("handles all teams tied at rank 1", () => {
|
|
const isTied = buildTiedRankChecker([1, 1, 1]);
|
|
expect(isTied(1)).toBe(true);
|
|
});
|
|
|
|
it("handles an empty list without throwing", () => {
|
|
const isTied = buildTiedRankChecker([]);
|
|
expect(isTied(1)).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("getDisplayRank", () => {
|
|
describe("when the team has a standing", () => {
|
|
it("returns the numeric rank regardless of how many other teams have standings", () => {
|
|
expect(getDisplayRank({ currentRank: 1 }, 5)).toBe(1);
|
|
expect(getDisplayRank({ currentRank: 3 }, 5)).toBe(3);
|
|
});
|
|
|
|
it("returns rank 1 when the team is first", () => {
|
|
expect(getDisplayRank({ currentRank: 1 }, 1)).toBe(1);
|
|
});
|
|
});
|
|
|
|
describe("when the team has no standing and no teams have been scored yet", () => {
|
|
it("returns T1 — all teams are genuinely tied at zero", () => {
|
|
expect(getDisplayRank(undefined, 0)).toBe("T1");
|
|
});
|
|
});
|
|
|
|
describe("when the team has no standing but other teams have been scored", () => {
|
|
it("returns T{n+1} where n is the number of teams with standings", () => {
|
|
// 1 team has a standing → unranked teams are tied for 2nd
|
|
expect(getDisplayRank(undefined, 1)).toBe("T2");
|
|
|
|
// 3 teams have standings → unranked teams are tied for 4th
|
|
expect(getDisplayRank(undefined, 3)).toBe("T4");
|
|
|
|
// 9 teams have standings → unranked team is tied for 10th
|
|
expect(getDisplayRank(undefined, 9)).toBe("T10");
|
|
});
|
|
|
|
it("never shows T1 when any other team has a standing", () => {
|
|
// Would be wrong to show T1 here — that team isn't first
|
|
expect(getDisplayRank(undefined, 1)).not.toBe("T1");
|
|
expect(getDisplayRank(undefined, 5)).not.toBe("T1");
|
|
});
|
|
});
|
|
});
|