brackt/app/models/__tests__/bracket-templates.test.ts
2026-05-08 12:29:39 -07:00

201 lines
7.9 KiB
TypeScript

import { describe, it, expect } from "vitest";
import {
SIMPLE_4,
SIMPLE_8,
SIMPLE_16,
SIMPLE_32,
COLLEGE_HOCKEY_16,
NCAA_68,
NFL_14,
getBracketTemplate,
getScoringRoundType,
} from "~/lib/bracket-templates";
describe("Bracket Templates", () => {
describe("Template Structure", () => {
it("SIMPLE_4 has correct structure", () => {
expect(SIMPLE_4.id).toBe("simple_4");
expect(SIMPLE_4.totalTeams).toBe(4);
expect(SIMPLE_4.rounds).toHaveLength(2);
expect(SIMPLE_4.scoringStartsAtRound).toBe("Semifinals");
expect(SIMPLE_4.rounds.every((r) => r.isScoring)).toBe(true);
});
it("SIMPLE_8 has correct structure", () => {
expect(SIMPLE_8.id).toBe("simple_8");
expect(SIMPLE_8.totalTeams).toBe(8);
expect(SIMPLE_8.rounds).toHaveLength(3);
expect(SIMPLE_8.scoringStartsAtRound).toBe("Quarterfinals");
expect(SIMPLE_8.rounds.every((r) => r.isScoring)).toBe(true);
});
it("SIMPLE_16 has correct structure", () => {
expect(SIMPLE_16.id).toBe("simple_16");
expect(SIMPLE_16.totalTeams).toBe(16);
expect(SIMPLE_16.rounds).toHaveLength(4);
expect(SIMPLE_16.scoringStartsAtRound).toBe("Quarterfinals");
// First round doesn't score
expect(SIMPLE_16.rounds[0].isScoring).toBe(false);
expect(SIMPLE_16.rounds[0].name).toBe("Round of 16");
// Quarterfinals and beyond score
expect(SIMPLE_16.rounds[1].isScoring).toBe(true);
expect(SIMPLE_16.rounds[2].isScoring).toBe(true);
expect(SIMPLE_16.rounds[3].isScoring).toBe(true);
});
it("COLLEGE_HOCKEY_16 has correct structure", () => {
expect(COLLEGE_HOCKEY_16.id).toBe("college_hockey_16");
expect(COLLEGE_HOCKEY_16.totalTeams).toBe(16);
expect(COLLEGE_HOCKEY_16.rounds).toHaveLength(4);
expect(COLLEGE_HOCKEY_16.scoringStartsAtRound).toBe("Regional Finals");
expect(COLLEGE_HOCKEY_16.rounds[0].name).toBe("Regional Semifinals");
expect(COLLEGE_HOCKEY_16.rounds[0].isScoring).toBe(false);
expect(COLLEGE_HOCKEY_16.rounds[1].name).toBe("Regional Finals");
expect(COLLEGE_HOCKEY_16.rounds[1].isScoring).toBe(true);
expect(COLLEGE_HOCKEY_16.rounds[2].name).toBe("Frozen Four Semifinals");
expect(COLLEGE_HOCKEY_16.rounds[2].isScoring).toBe(true);
expect(COLLEGE_HOCKEY_16.rounds[3].name).toBe("National Championship");
expect(COLLEGE_HOCKEY_16.rounds[3].isScoring).toBe(true);
});
it("SIMPLE_32 has correct structure", () => {
expect(SIMPLE_32.id).toBe("simple_32");
expect(SIMPLE_32.totalTeams).toBe(32);
expect(SIMPLE_32.rounds).toHaveLength(5);
expect(SIMPLE_32.scoringStartsAtRound).toBe("Quarterfinals");
// First two rounds don't score
expect(SIMPLE_32.rounds[0].isScoring).toBe(false);
expect(SIMPLE_32.rounds[1].isScoring).toBe(false);
// Quarterfinals and beyond score
expect(SIMPLE_32.rounds[2].isScoring).toBe(true);
expect(SIMPLE_32.rounds[3].isScoring).toBe(true);
expect(SIMPLE_32.rounds[4].isScoring).toBe(true);
});
it("NCAA_68 has correct structure", () => {
expect(NCAA_68.id).toBe("ncaa_68");
expect(NCAA_68.totalTeams).toBe(68);
expect(NCAA_68.rounds).toHaveLength(7);
expect(NCAA_68.scoringStartsAtRound).toBe("Elite Eight");
// First Four through Sweet Sixteen don't score
expect(NCAA_68.rounds[0].name).toBe("First Four");
expect(NCAA_68.rounds[0].isScoring).toBe(false);
expect(NCAA_68.rounds[1].name).toBe("Round of 64");
expect(NCAA_68.rounds[1].isScoring).toBe(false);
expect(NCAA_68.rounds[2].name).toBe("Round of 32");
expect(NCAA_68.rounds[2].isScoring).toBe(false);
expect(NCAA_68.rounds[3].name).toBe("Sweet Sixteen");
expect(NCAA_68.rounds[3].isScoring).toBe(false);
// Elite Eight and beyond score
expect(NCAA_68.rounds[4].name).toBe("Elite Eight");
expect(NCAA_68.rounds[4].isScoring).toBe(true);
expect(NCAA_68.rounds[5].name).toBe("Final Four");
expect(NCAA_68.rounds[5].isScoring).toBe(true);
expect(NCAA_68.rounds[6].name).toBe("Championship");
expect(NCAA_68.rounds[6].isScoring).toBe(true);
});
it("NFL_14 has correct structure", () => {
expect(NFL_14.id).toBe("nfl_14");
expect(NFL_14.totalTeams).toBe(14);
expect(NFL_14.rounds).toHaveLength(4);
expect(NFL_14.scoringStartsAtRound).toBe("Divisional");
// Wild Card doesn't score
expect(NFL_14.rounds[0].name).toBe("Wild Card");
expect(NFL_14.rounds[0].isScoring).toBe(false);
// Divisional and beyond score
expect(NFL_14.rounds[1].name).toBe("Divisional");
expect(NFL_14.rounds[1].isScoring).toBe(true);
expect(NFL_14.rounds[2].isScoring).toBe(true);
expect(NFL_14.rounds[3].isScoring).toBe(true);
});
});
describe("Round Advancement", () => {
it("rounds correctly feed into next rounds", () => {
// 8-team bracket
expect(SIMPLE_8.rounds[0].feedsInto).toBe("Semifinals");
expect(SIMPLE_8.rounds[1].feedsInto).toBe("Finals");
expect(SIMPLE_8.rounds[2].feedsInto).toBe(null);
// NCAA bracket
expect(NCAA_68.rounds[0].feedsInto).toBe("Round of 64");
expect(NCAA_68.rounds[1].feedsInto).toBe("Round of 32");
expect(NCAA_68.rounds[2].feedsInto).toBe("Sweet Sixteen");
expect(NCAA_68.rounds[3].feedsInto).toBe("Elite Eight");
expect(NCAA_68.rounds[4].feedsInto).toBe("Final Four");
expect(NCAA_68.rounds[5].feedsInto).toBe("Championship");
expect(NCAA_68.rounds[6].feedsInto).toBe(null);
});
});
describe("Match Counts", () => {
it("calculates correct match counts for each round", () => {
// 16-team bracket
expect(SIMPLE_16.rounds[0].matchCount).toBe(8); // Round of 16
expect(SIMPLE_16.rounds[1].matchCount).toBe(4); // QF
expect(SIMPLE_16.rounds[2].matchCount).toBe(2); // SF
expect(SIMPLE_16.rounds[3].matchCount).toBe(1); // Finals
// NCAA bracket
expect(NCAA_68.rounds[0].matchCount).toBe(4); // First Four
expect(NCAA_68.rounds[1].matchCount).toBe(32); // Round of 64
expect(NCAA_68.rounds[2].matchCount).toBe(16); // Round of 32
expect(NCAA_68.rounds[3].matchCount).toBe(8); // Sweet Sixteen
expect(NCAA_68.rounds[4].matchCount).toBe(4); // Elite Eight
expect(NCAA_68.rounds[5].matchCount).toBe(2); // Final Four
expect(NCAA_68.rounds[6].matchCount).toBe(1); // Championship
});
});
describe("getBracketTemplate", () => {
it("returns correct template by id", () => {
expect(getBracketTemplate("simple_4")).toBe(SIMPLE_4);
expect(getBracketTemplate("simple_8")).toBe(SIMPLE_8);
expect(getBracketTemplate("simple_16")).toBe(SIMPLE_16);
expect(getBracketTemplate("college_hockey_16")).toBe(COLLEGE_HOCKEY_16);
expect(getBracketTemplate("ncaa_68")).toBe(NCAA_68);
});
it("returns undefined for invalid id", () => {
expect(getBracketTemplate("invalid")).toBeUndefined();
});
});
describe("getScoringRoundType", () => {
it("identifies quarterfinals (4 matches)", () => {
const type = getScoringRoundType("Quarterfinals", SIMPLE_8);
expect(type).toBe("quarterfinals");
});
it("identifies semifinals (2 matches)", () => {
const type = getScoringRoundType("Semifinals", SIMPLE_8);
expect(type).toBe("semifinals");
});
it("identifies finals (1 match)", () => {
const type = getScoringRoundType("Finals", SIMPLE_8);
expect(type).toBe("finals");
});
it("returns null for non-scoring rounds", () => {
const type = getScoringRoundType("Round of 16", SIMPLE_16);
expect(type).toBe(null);
});
it("works with NCAA template", () => {
expect(getScoringRoundType("Elite Eight", NCAA_68)).toBe("quarterfinals");
expect(getScoringRoundType("Final Four", NCAA_68)).toBe("semifinals");
expect(getScoringRoundType("Championship", NCAA_68)).toBe("finals");
expect(getScoringRoundType("Sweet Sixteen", NCAA_68)).toBe(null);
});
});
});