From 6c2dd41d94f961c611bfd099b8be2ce8bc464ae2 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 3 Mar 2024 11:09:35 +0200 Subject: [PATCH] SE don't do all Bo5 Closes #1671 --- .../tournament-bracket/core/bestOf.server.ts | 21 +++- .../tournament-bracket/core/bestOf.test.ts | 101 +++++++++++++++++- 2 files changed, 120 insertions(+), 2 deletions(-) diff --git a/app/features/tournament-bracket/core/bestOf.server.ts b/app/features/tournament-bracket/core/bestOf.server.ts index 146b85fab..908191f7e 100644 --- a/app/features/tournament-bracket/core/bestOf.server.ts +++ b/app/features/tournament-bracket/core/bestOf.server.ts @@ -10,7 +10,26 @@ export function resolveBestOfs( return matches.map((match) => [3, match.matchId]); } if (type === "single_elimination") { - return matches.map((match) => [5, match.matchId]); + const maxRoundNumber = Math.max( + ...matches.map((match) => match.roundNumber), + ); + + return matches.map((match) => { + const isTopFour = + match.roundNumber === maxRoundNumber || + match.roundNumber === maxRoundNumber - 1; + + const isFirstTwoRounds = + match.roundNumber === 1 || match.roundNumber === 2; + + const isThirdPlaceMatch = match.groupNumber === 2; + + if (isTopFour || isThirdPlaceMatch || !isFirstTwoRounds) { + return [5, match.matchId]; + } + + return [3, match.matchId]; + }); } // Double Elimination logic diff --git a/app/features/tournament-bracket/core/bestOf.test.ts b/app/features/tournament-bracket/core/bestOf.test.ts index 0c83fd670..1ddaa198c 100644 --- a/app/features/tournament-bracket/core/bestOf.test.ts +++ b/app/features/tournament-bracket/core/bestOf.test.ts @@ -4,7 +4,7 @@ import { resolveBestOfs } from "./bestOf.server"; const ResolveBestOfs = suite("resolveBestOfs()"); -const count = (bestOfs: [bestOf: 3 | 5 | 7, id: number][], target: 5 | 7) => +const count = (bestOfs: [bestOf: 3 | 5 | 7, id: number][], target: 3 | 5 | 7) => bestOfs.reduce((acc, cur) => acc + (cur[0] === target ? 1 : 0), 0); ResolveBestOfs("2 teams", () => { @@ -56,4 +56,103 @@ ResolveBestOfs("8 teams", () => { assert.equal(count(bestOfs, 5), 4); }); +ResolveBestOfs("8 teams (SE)", () => { + const eightTeamsSE = [ + { matchId: 1, roundNumber: 1, groupNumber: 1 }, + { matchId: 2, roundNumber: 1, groupNumber: 1 }, + { matchId: 3, roundNumber: 1, groupNumber: 1 }, + { matchId: 4, roundNumber: 1, groupNumber: 1 }, + { matchId: 5, roundNumber: 2, groupNumber: 1 }, + { matchId: 6, roundNumber: 2, groupNumber: 1 }, + { matchId: 7, roundNumber: 3, groupNumber: 1 }, + ]; + + const bestOfs = resolveBestOfs(eightTeamsSE, "single_elimination"); + + assert.equal(count(bestOfs, 5), 3); + assert.equal(count(bestOfs, 3), 4); +}); + +ResolveBestOfs("8 teams (SE w/ 3rd place match)", () => { + const eightTeamsSE = [ + { matchId: 1, roundNumber: 1, groupNumber: 1 }, + { matchId: 2, roundNumber: 1, groupNumber: 1 }, + { matchId: 3, roundNumber: 1, groupNumber: 1 }, + { matchId: 4, roundNumber: 1, groupNumber: 1 }, + { matchId: 5, roundNumber: 2, groupNumber: 1 }, + { matchId: 6, roundNumber: 2, groupNumber: 1 }, + { matchId: 7, roundNumber: 3, groupNumber: 1 }, + { matchId: 8, roundNumber: 1, groupNumber: 2 }, + ]; + + const bestOfs = resolveBestOfs(eightTeamsSE, "single_elimination"); + + assert.equal(count(bestOfs, 5), 4); +}); + +ResolveBestOfs("16 teams (SE)", () => { + const sixTeenTeamsSE = [ + { matchId: 1, roundNumber: 1, groupNumber: 1 }, + { matchId: 2, roundNumber: 1, groupNumber: 1 }, + { matchId: 3, roundNumber: 1, groupNumber: 1 }, + { matchId: 4, roundNumber: 1, groupNumber: 1 }, + { matchId: 5, roundNumber: 1, groupNumber: 1 }, + { matchId: 6, roundNumber: 1, groupNumber: 1 }, + { matchId: 7, roundNumber: 1, groupNumber: 1 }, + { matchId: 8, roundNumber: 1, groupNumber: 1 }, + { matchId: 9, roundNumber: 2, groupNumber: 1 }, + { matchId: 10, roundNumber: 2, groupNumber: 1 }, + { matchId: 11, roundNumber: 2, groupNumber: 1 }, + { matchId: 12, roundNumber: 2, groupNumber: 1 }, + { matchId: 13, roundNumber: 3, groupNumber: 1 }, + { matchId: 14, roundNumber: 3, groupNumber: 1 }, + { matchId: 15, roundNumber: 4, groupNumber: 1 }, + ]; + + const bestOfs = resolveBestOfs(sixTeenTeamsSE, "single_elimination"); + + assert.equal(count(bestOfs, 5), 3); + assert.equal(count(bestOfs, 3), 12); +}); + +ResolveBestOfs("32 teams (SE)", () => { + const thirtyTwoTeamsSE = [ + { matchId: 1, roundNumber: 1, groupNumber: 1 }, + { matchId: 2, roundNumber: 1, groupNumber: 1 }, + { matchId: 3, roundNumber: 1, groupNumber: 1 }, + { matchId: 4, roundNumber: 1, groupNumber: 1 }, + { matchId: 5, roundNumber: 1, groupNumber: 1 }, + { matchId: 6, roundNumber: 1, groupNumber: 1 }, + { matchId: 7, roundNumber: 1, groupNumber: 1 }, + { matchId: 8, roundNumber: 1, groupNumber: 1 }, + { matchId: 9, roundNumber: 1, groupNumber: 1 }, + { matchId: 10, roundNumber: 1, groupNumber: 1 }, + { matchId: 11, roundNumber: 1, groupNumber: 1 }, + { matchId: 12, roundNumber: 1, groupNumber: 1 }, + { matchId: 13, roundNumber: 1, groupNumber: 1 }, + { matchId: 14, roundNumber: 1, groupNumber: 1 }, + { matchId: 15, roundNumber: 1, groupNumber: 1 }, + { matchId: 16, roundNumber: 1, groupNumber: 1 }, + { matchId: 17, roundNumber: 2, groupNumber: 1 }, + { matchId: 18, roundNumber: 2, groupNumber: 1 }, + { matchId: 19, roundNumber: 2, groupNumber: 1 }, + { matchId: 20, roundNumber: 2, groupNumber: 1 }, + { matchId: 21, roundNumber: 2, groupNumber: 1 }, + { matchId: 22, roundNumber: 2, groupNumber: 1 }, + { matchId: 23, roundNumber: 2, groupNumber: 1 }, + { matchId: 24, roundNumber: 2, groupNumber: 1 }, + { matchId: 25, roundNumber: 3, groupNumber: 1 }, + { matchId: 26, roundNumber: 3, groupNumber: 1 }, + { matchId: 27, roundNumber: 3, groupNumber: 1 }, + { matchId: 28, roundNumber: 3, groupNumber: 1 }, + { matchId: 29, roundNumber: 4, groupNumber: 1 }, + { matchId: 30, roundNumber: 4, groupNumber: 1 }, + { matchId: 31, roundNumber: 5, groupNumber: 1 }, + ]; + + const bestOfs = resolveBestOfs(thirtyTwoTeamsSE, "single_elimination"); + + assert.equal(count(bestOfs, 5), 7); +}); + ResolveBestOfs.run();