From 1d0f095ad7b27487562ec949d93323fc1e462a05 Mon Sep 17 00:00:00 2001 From: spacemeowx2 Date: Fri, 28 Oct 2022 21:32:54 +0800 Subject: [PATCH] test: add RankTracker test --- src/RankTracker.test.ts | 128 +++++++++++++++++++++++++++++++++++++++- src/RankTracker.ts | 4 +- 2 files changed, 127 insertions(+), 5 deletions(-) diff --git a/src/RankTracker.test.ts b/src/RankTracker.test.ts index 4d99fa0..91c23c4 100644 --- a/src/RankTracker.test.ts +++ b/src/RankTracker.test.ts @@ -1,7 +1,129 @@ import { RankTracker } from "./RankTracker.ts"; import { assertEquals } from "../dev_deps.ts"; +import { BattleListNode } from "./types.ts"; +import { base64 } from "../deps.ts"; +import { gameId } from "./utils.ts"; -Deno.test("RankTracker", () => { - const tracker = new RankTracker(); - assertEquals(tracker, new RankTracker()); +const INIT_STATE = { + gameId: await gameId(genId(0)), + rank: "B-", + rankPoint: 100, +}; + +class TestRankTracker extends RankTracker { + testGet() { + const { state, deltaMap } = this; + return { + state, + deltaMap, + }; + } +} + +function genId(id: number): string { + return base64.encode( + `VsHistoryDetail-asdf:asdf:20220101T${ + id.toString().padStart(6, "0") + }_------------------------------------`, + ); +} + +function genOpenWins( + { startId, count, udemae }: { + startId: number; + count: number; + udemae: string; + }, +) { + const result: BattleListNode[] = []; + let id = startId; + + for (let i = 0; i < count; i++) { + result.push({ + id: genId(id), + udemae, + judgement: "WIN", + bankaraMatch: { + earnedUdemaePoint: 8, + }, + nextHistoryDetail: null, + previousHistoryDetail: null, + }); + id += 1; + } + + return result; +} + +Deno.test("RankTracker", async () => { + const tracker = new TestRankTracker(INIT_STATE); + assertEquals(tracker.testGet(), { + state: INIT_STATE, + deltaMap: new Map(), + }); + + const finalState = await tracker.updateState([{ + bankaraMatchChallenge: null, + historyDetails: { + nodes: [...genOpenWins({ + startId: 0, + count: 19, + udemae: "B-", + })].reverse(), + }, + }]); + + assertEquals(tracker.testGet().state, INIT_STATE); + + assertEquals(finalState, { + gameId: await gameId(genId(18)), + rank: "B-", + rankPoint: 244, + }); + + assertEquals(await tracker.getRankStateById(genId(1)), { + gameId: await gameId(genId(1)), + rank: "B-", + rankPoint: 108, + }); + + assertEquals(await tracker.getRankStateById(genId(17)), { + gameId: await gameId(genId(17)), + rank: "B-", + rankPoint: 236, + }); + + tracker.setState(finalState); + + assertEquals(tracker.testGet().state, finalState); + + // history goes too far + const finalState2 = await tracker.updateState([{ + bankaraMatchChallenge: null, + historyDetails: { + nodes: [...genOpenWins({ + startId: 30, + count: 1, + udemae: "B-", + })].reverse(), + }, + }]); + assertEquals(finalState2, undefined); + + await tracker.updateState([{ + bankaraMatchChallenge: null, + historyDetails: { + nodes: [...genOpenWins({ + startId: 0, + count: 30, + udemae: "B-", + })].reverse(), + }, + }]); + + assertEquals(await tracker.getRankStateById(genId(29)), { + gameId: await gameId(genId(29)), + rank: "B-", + rankPoint: 332, + }); }); diff --git a/src/RankTracker.ts b/src/RankTracker.ts index f537d8c..9b7ed95 100644 --- a/src/RankTracker.ts +++ b/src/RankTracker.ts @@ -143,9 +143,9 @@ const battleTime = (id: string) => { */ export class RankTracker { // key: privous game id - deltaMap: Map = new Map(); + protected deltaMap: Map = new Map(); - constructor(private state: RankState | undefined) {} + constructor(protected state: RankState | undefined) {} async getRankStateById(id: string): Promise { if (!this.state) {