From de19bcaddcfedc788b7207e4c3f170d84d51ec11 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Tue, 16 May 2023 01:16:21 +0300 Subject: [PATCH] Fix best of calculation for low number of teams --- .../tournament-bracket/core/bestOf.server.ts | 9 ++- .../tournament-bracket/core/bestOf.test.ts | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/features/tournament-bracket/core/bestOf.test.ts diff --git a/app/features/tournament-bracket/core/bestOf.server.ts b/app/features/tournament-bracket/core/bestOf.server.ts index 3fb49926e..4552749b7 100644 --- a/app/features/tournament-bracket/core/bestOf.server.ts +++ b/app/features/tournament-bracket/core/bestOf.server.ts @@ -8,6 +8,12 @@ export function resolveBestOfs( // 3 is default const result: [bestOf: 5 | 7, id: number][] = []; + // special case: only 2 teams + if (matches.length === 1) { + result.push([7, matches[0]!.matchId]); + return result; + } + /// Best of 7 // 1) Grand Finals @@ -45,7 +51,8 @@ export function resolveBestOfs( ); const losersFinals = matches.filter( - (match) => match.roundNumber === maxLosersRoundNumber + (match) => + match.roundNumber === maxLosersRoundNumber && match.groupNumber === 2 ); invariant(losersFinals.length === 1, "losersFinals must be 1"); diff --git a/app/features/tournament-bracket/core/bestOf.test.ts b/app/features/tournament-bracket/core/bestOf.test.ts new file mode 100644 index 000000000..995096ed5 --- /dev/null +++ b/app/features/tournament-bracket/core/bestOf.test.ts @@ -0,0 +1,61 @@ +import { suite } from "uvu"; +import * as assert from "uvu/assert"; +import { resolveBestOfs } from "./bestOf.server"; + +const ResolveBestOfs = suite("resolveBestOfs()"); + +const count = (bestOfs: [bestOf: 5 | 7, id: number][], target: 5 | 7) => + bestOfs.reduce((acc, cur) => acc + (cur[0] === target ? 1 : 0), 0); + +ResolveBestOfs("2 teams", () => { + const matches = [{ matchId: 1, roundNumber: 1, groupNumber: 1 }]; + + const bestOfs = resolveBestOfs(matches); + + assert.equal(count(bestOfs, 5), 0); + assert.equal(count(bestOfs, 7), 1); +}); + +ResolveBestOfs("4 teams", () => { + const matches = [ + { matchId: 1, roundNumber: 1, groupNumber: 1 }, + { matchId: 2, roundNumber: 1, groupNumber: 1 }, + { matchId: 3, roundNumber: 2, groupNumber: 1 }, + { matchId: 4, roundNumber: 1, groupNumber: 2 }, + { matchId: 5, roundNumber: 2, groupNumber: 2 }, + { matchId: 6, roundNumber: 1, groupNumber: 3 }, + { matchId: 7, roundNumber: 2, groupNumber: 3 }, + ]; + + const bestOfs = resolveBestOfs(matches); + + assert.equal(count(bestOfs, 5), 1); + assert.equal(count(bestOfs, 7), 2); +}); + +ResolveBestOfs("8 teams", () => { + const matches = [ + { 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 }, + { matchId: 9, roundNumber: 1, groupNumber: 2 }, + { matchId: 10, roundNumber: 2, groupNumber: 2 }, + { matchId: 11, roundNumber: 2, groupNumber: 2 }, + { matchId: 12, roundNumber: 3, groupNumber: 2 }, + { matchId: 13, roundNumber: 4, groupNumber: 2 }, + { matchId: 14, roundNumber: 1, groupNumber: 3 }, + { matchId: 15, roundNumber: 2, groupNumber: 3 }, + ]; + + const bestOfs = resolveBestOfs(matches); + + assert.equal(count(bestOfs, 5), 2); + assert.equal(count(bestOfs, 7), 2); +}); + +ResolveBestOfs.run();