94 lines
3.1 KiB
TypeScript
94 lines
3.1 KiB
TypeScript
|
|
import { describe, it, expect } from "vitest";
|
|||
|
|
import { CFP_12, BRACKET_TEMPLATES, getScoringRoundType } from "~/lib/bracket-templates";
|
|||
|
|
|
|||
|
|
describe("CFP_12 Bracket Template", () => {
|
|||
|
|
describe("Template structure", () => {
|
|||
|
|
it("has correct total teams", () => {
|
|||
|
|
expect(CFP_12.totalTeams).toBe(12);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("has 4 rounds", () => {
|
|||
|
|
expect(CFP_12.rounds).toHaveLength(4);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("has correct round names", () => {
|
|||
|
|
expect(CFP_12.rounds[0].name).toBe("First Round");
|
|||
|
|
expect(CFP_12.rounds[1].name).toBe("Quarterfinals");
|
|||
|
|
expect(CFP_12.rounds[2].name).toBe("Semifinals");
|
|||
|
|
expect(CFP_12.rounds[3].name).toBe("National Championship");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("has correct match counts per round", () => {
|
|||
|
|
expect(CFP_12.rounds[0].matchCount).toBe(4); // 8 seeds play, 4 byes
|
|||
|
|
expect(CFP_12.rounds[1].matchCount).toBe(4); // 8 → 4
|
|||
|
|
expect(CFP_12.rounds[2].matchCount).toBe(2); // 4 → 2
|
|||
|
|
expect(CFP_12.rounds[3].matchCount).toBe(1); // 2 → 1
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("has correct round advancement chain", () => {
|
|||
|
|
expect(CFP_12.rounds[0].feedsInto).toBe("Quarterfinals");
|
|||
|
|
expect(CFP_12.rounds[1].feedsInto).toBe("Semifinals");
|
|||
|
|
expect(CFP_12.rounds[2].feedsInto).toBe("National Championship");
|
|||
|
|
expect(CFP_12.rounds[3].feedsInto).toBeNull();
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
describe("Scoring configuration", () => {
|
|||
|
|
it("scoring starts at Quarterfinals", () => {
|
|||
|
|
expect(CFP_12.scoringStartsAtRound).toBe("Quarterfinals");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("First Round is not scoring", () => {
|
|||
|
|
expect(CFP_12.rounds[0].isScoring).toBe(false);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("Quarterfinals is scoring", () => {
|
|||
|
|
expect(CFP_12.rounds[1].isScoring).toBe(true);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("Semifinals is scoring", () => {
|
|||
|
|
expect(CFP_12.rounds[2].isScoring).toBe(true);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("National Championship is scoring", () => {
|
|||
|
|
expect(CFP_12.rounds[3].isScoring).toBe(true);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
describe("Template ID and registry", () => {
|
|||
|
|
it("has id cfp_12", () => {
|
|||
|
|
expect(CFP_12.id).toBe("cfp_12");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("is registered in BRACKET_TEMPLATES", () => {
|
|||
|
|
expect(BRACKET_TEMPLATES["cfp_12"]).toBeDefined();
|
|||
|
|
expect(BRACKET_TEMPLATES["cfp_12"]).toBe(CFP_12);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
describe("getScoringRoundType", () => {
|
|||
|
|
it("classifies Quarterfinals as quarterfinals (losers share 5th–8th)", () => {
|
|||
|
|
expect(getScoringRoundType("Quarterfinals", CFP_12)).toBe("quarterfinals");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("classifies Semifinals as semifinals (losers share 3rd–4th)", () => {
|
|||
|
|
expect(getScoringRoundType("Semifinals", CFP_12)).toBe("semifinals");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("classifies National Championship as finals", () => {
|
|||
|
|
expect(getScoringRoundType("National Championship", CFP_12)).toBe("finals");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it("returns null for First Round (non-scoring)", () => {
|
|||
|
|
expect(getScoringRoundType("First Round", CFP_12)).toBeNull();
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
describe("Total matches", () => {
|
|||
|
|
it("has 11 total matches across all rounds", () => {
|
|||
|
|
const total = CFP_12.rounds.reduce((sum, r) => sum + r.matchCount, 0);
|
|||
|
|
expect(total).toBe(11); // 4 + 4 + 2 + 1
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|