From ca2e7d28c45037a08518d954abc8e3e4d3fb738e Mon Sep 17 00:00:00 2001 From: zkldi Date: Wed, 2 Jun 2021 17:51:02 +0100 Subject: [PATCH] full arc tests --- server/pnpm-lock.yaml | 6 +- .../api/arc-ddr/converter.test.ts | 53 ++++++++- .../import-types/api/arc-ddr/converter.ts | 29 +++-- .../import-types/api/arc-ddr/types.ts | 2 +- .../api/arc-sdvx/converter.test.ts | 104 ++++++++++++++++++ .../import-types/api/arc-sdvx/converter.ts | 2 +- server/src/test-utils/mock-db/charts-ddr.json | 3 +- .../src/test-utils/mock-db/charts-sdvx.json | 4 +- .../test-data/kamaitachi/ddr-puty-chart.json | 37 +++++++ .../test-data/kamaitachi/ddr-puty-song.json | 11 ++ .../kamaitachi/sdvx-albida-chart.json | 4 +- 11 files changed, 231 insertions(+), 24 deletions(-) create mode 100644 server/src/lib/score-import/import-types/api/arc-sdvx/converter.test.ts create mode 100644 server/src/test-utils/test-data/kamaitachi/ddr-puty-chart.json create mode 100644 server/src/test-utils/test-data/kamaitachi/ddr-puty-song.json diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml index 6be1f4f9b..860078abe 100644 --- a/server/pnpm-lock.yaml +++ b/server/pnpm-lock.yaml @@ -61,7 +61,7 @@ dependencies: express-session: 1.17.1 fast-json-stable-hash: 1.0.2 fast-xml-parser: 3.19.0 - kamaitachi-common: github.com/zkldi/Kamaitachi-common/d214ecbaf3b371c2074bc8e34347c5011e85ea37 + kamaitachi-common: github.com/zkldi/Kamaitachi-common/5bce2fa9c4916e32c185efea460a3bd292556ae3 mongodb: 3.6.6 monk: 7.3.4 multer: 1.4.2 @@ -4344,8 +4344,8 @@ packages: engines: {node: '>=6'} dev: true - github.com/zkldi/Kamaitachi-common/d214ecbaf3b371c2074bc8e34347c5011e85ea37: - resolution: {tarball: https://codeload.github.com/zkldi/Kamaitachi-common/tar.gz/d214ecbaf3b371c2074bc8e34347c5011e85ea37} + github.com/zkldi/Kamaitachi-common/5bce2fa9c4916e32c185efea460a3bd292556ae3: + resolution: {tarball: https://codeload.github.com/zkldi/Kamaitachi-common/tar.gz/5bce2fa9c4916e32c185efea460a3bd292556ae3} name: kamaitachi-common version: 0.1.0 dependencies: diff --git a/server/src/lib/score-import/import-types/api/arc-ddr/converter.test.ts b/server/src/lib/score-import/import-types/api/arc-ddr/converter.test.ts index e7ae4cdde..33eb98b91 100644 --- a/server/src/lib/score-import/import-types/api/arc-ddr/converter.test.ts +++ b/server/src/lib/score-import/import-types/api/arc-ddr/converter.test.ts @@ -3,13 +3,15 @@ import { CloseAllConnections } from "../../../../../test-utils/close-connections import ResetDBState from "../../../../../test-utils/reset-db-state"; import { GetKTDataJSON } from "../../../../../test-utils/test-data"; import CreateLogCtx from "../../../../logger/logger"; -import { ConvertAPIArcDDR } from "./converter"; +import { ConvertAPIArcDDR, ResolveARCDDRLamp } from "./converter"; import { ARCDDRScore } from "./types"; import deepmerge from "deepmerge"; const logger = CreateLogCtx(__filename); const arcScore = GetKTDataJSON("./api-arc/ddr-score.json") as ARCDDRScore; +const putySong = GetKTDataJSON("./kamaitachi/ddr-puty-song.json") as ARCDDRScore; +const putyChart = GetKTDataJSON("./kamaitachi/ddr-puty-chart.json") as ARCDDRScore; t.test("#ConvertAPIArcDDR", (t) => { t.beforeEach(ResetDBState); @@ -17,10 +19,39 @@ t.test("#ConvertAPIArcDDR", (t) => { t.test("Should convert a valid score", async (t) => { const res = await ConvertAPIArcDDR(arcScore, {}, "api/arc-ddr", logger); - t.strictSame(res, { - song: {}, - chart: {}, - dryScore: {}, + t.hasStrict(res, { + song: putySong, + chart: putyChart, + dryScore: { + comment: null, + game: "ddr", + importType: "api/arc-ddr", + timeAchieved: 1591822550346, + service: "ARC DDR Ace", + scoreData: { + grade: "AAA", + percent: 99.976, + score: 807, + hitData: { + marvelous: 236, + perfect: 24, + great: 0, + good: 0, + boo: 0, + miss: 0, + ok: 17, + ng: 0, + }, + hitMeta: { + fast: 10, + slow: 14, + maxCombo: 260, + exScore: 807, + }, + lamp: "PERFECT FULL COMBO", + }, + scoreMeta: {}, + }, }); t.end(); @@ -63,4 +94,16 @@ t.test("#ConvertAPIArcDDR", (t) => { t.end(); }); +t.test("#ResolveARCDDRLamp", (t) => { + t.equal(ResolveARCDDRLamp("FAIL"), "FAILED"); + t.equal(ResolveARCDDRLamp("CLEAR"), "CLEAR"); + t.equal(ResolveARCDDRLamp("CLEAR_3LIFE"), "LIFE4"); + t.equal(ResolveARCDDRLamp("GOOD_FC"), "FULL COMBO"); + t.equal(ResolveARCDDRLamp("GREAT_FC"), "GREAT FULL COMBO"); + t.equal(ResolveARCDDRLamp("PERFECT_FC"), "PERFECT FULL COMBO"); + t.equal(ResolveARCDDRLamp("MARVELOUS_FC"), "MARVELOUS FULL COMBO"); + + t.end(); +}); + t.teardown(CloseAllConnections); diff --git a/server/src/lib/score-import/import-types/api/arc-ddr/converter.ts b/server/src/lib/score-import/import-types/api/arc-ddr/converter.ts index 31ab317ac..e44e78015 100644 --- a/server/src/lib/score-import/import-types/api/arc-ddr/converter.ts +++ b/server/src/lib/score-import/import-types/api/arc-ddr/converter.ts @@ -31,7 +31,7 @@ const PR_ArcDDRScore: PrudenceSchema = { score: p.isBoundedInteger(0, 1_000_000), ex_score: p.isPositiveInteger, max_combo: p.isPositiveInteger, - judgements: { + judgments: { marvelous: p.isPositiveInteger, perfect: p.isPositiveInteger, great: p.isPositiveInteger, @@ -74,7 +74,7 @@ export const ConvertAPIArcDDR: ConverterFunction = async ( const song = await FindSongOnIDGuaranteed("ddr", chart.songID, logger); - const { grade, percent } = GenericGetGradeAndPercent("ddr", score.ex_score, chart); + const { grade, percent } = GenericGetGradeAndPercent("ddr", score.score, chart); const timeAchieved = ParseDateFromString(score.timestamp); @@ -91,19 +91,20 @@ export const ConvertAPIArcDDR: ConverterFunction = async ( percent, score: score.ex_score, hitData: { - marvelous: score.judgements.marvelous, - perfect: score.judgements.perfect, - great: score.judgements.great, - good: score.judgements.good, - boo: score.judgements.boo, - miss: score.judgements.miss, - ok: score.judgements.ok, - ng: score.judgements.ng, + marvelous: score.judgments.marvelous, + perfect: score.judgments.perfect, + great: score.judgments.great, + good: score.judgments.good, + boo: score.judgments.boo, + miss: score.judgments.miss, + ok: score.judgments.ok, + ng: score.judgments.ng, }, hitMeta: { fast: score.fast, slow: score.slow, maxCombo: score.max_combo, + exScore: score.ex_score, }, lamp, }, @@ -113,7 +114,7 @@ export const ConvertAPIArcDDR: ConverterFunction = async ( return { song, chart, dryScore }; }; -function ResolveARCDDRLamp(lamp: ARCDDRScore["lamp"]): Lamps["ddr:SP" | "ddr:DP"] { +export function ResolveARCDDRLamp(lamp: ARCDDRScore["lamp"]): Lamps["ddr:SP" | "ddr:DP"] { switch (lamp) { case "FAIL": return "FAILED"; @@ -121,11 +122,17 @@ function ResolveARCDDRLamp(lamp: ARCDDRScore["lamp"]): Lamps["ddr:SP" | "ddr:DP" return "CLEAR"; case "CLEAR_3LIFE": return "LIFE4"; + case "GOOD_FC": + return "FULL COMBO"; case "GREAT_FC": return "GREAT FULL COMBO"; case "PERFECT_FC": return "PERFECT FULL COMBO"; + case "MARVELOUS_FC": + return "MARVELOUS FULL COMBO"; } + // failsafe + /* istanbul ignore next */ throw new InvalidScoreFailure(`Invalid lamp ${lamp} - Could not resolve.`); } diff --git a/server/src/lib/score-import/import-types/api/arc-ddr/types.ts b/server/src/lib/score-import/import-types/api/arc-ddr/types.ts index ad19b9a00..dad38d75c 100644 --- a/server/src/lib/score-import/import-types/api/arc-ddr/types.ts +++ b/server/src/lib/score-import/import-types/api/arc-ddr/types.ts @@ -6,7 +6,7 @@ export interface ARCDDRScore { score: integer; ex_score: integer; max_combo: integer; - judgements: { + judgments: { marvelous: integer; perfect: integer; great: integer; diff --git a/server/src/lib/score-import/import-types/api/arc-sdvx/converter.test.ts b/server/src/lib/score-import/import-types/api/arc-sdvx/converter.test.ts new file mode 100644 index 000000000..3b44d96ca --- /dev/null +++ b/server/src/lib/score-import/import-types/api/arc-sdvx/converter.test.ts @@ -0,0 +1,104 @@ +import t from "tap"; +import { CloseAllConnections } from "../../../../../test-utils/close-connections"; +import ResetDBState from "../../../../../test-utils/reset-db-state"; +import { + GetKTDataJSON, + TestingAlbidaADV, + TestingSDVXAlbidaSong, +} from "../../../../../test-utils/test-data"; +import CreateLogCtx from "../../../../logger/logger"; +import { ConvertAPIArcSDVX, ResolveARCSDVXLamp } from "./converter"; +import { ARCSDVXScore } from "./types"; +import deepmerge from "deepmerge"; + +const logger = CreateLogCtx(__filename); + +const arcScore = GetKTDataJSON("./api-arc/sdvx-score.json") as ARCSDVXScore; + +t.test("#ConvertAPIArcSDVX", (t) => { + t.beforeEach(ResetDBState); + + t.test("Should convert a valid score", async (t) => { + const res = await ConvertAPIArcSDVX(arcScore, {}, "api/arc-sdvx", logger); + + t.hasStrict(res, { + song: TestingSDVXAlbidaSong, + chart: TestingAlbidaADV, + dryScore: { + comment: null, + game: "sdvx", + importType: "api/arc-sdvx", + timeAchieved: 1567685885077, + service: "ARC SDVX V", + scoreData: { + grade: "AA", + percent: 93.125, + score: 9312500, + hitData: { + critical: 946, + near: 45, + miss: 49, + }, + hitMeta: { + btnRate: 89.5, + holdRate: 92.5, + laserRate: 96.5, + maxCombo: 184, + }, + lamp: "CLEAR", + }, + scoreMeta: {}, + }, + }); + + t.end(); + }); + + t.test("Should throw on an invalid score", (t) => { + t.rejects( + () => + ConvertAPIArcSDVX( + deepmerge(arcScore, { score: "foo" }), + {}, + "api/arc-sdvx", + logger + ), + { + message: /Invalid ARC Score:/iu, + } as any + ); + + t.end(); + }); + + t.test("Should throw on no chart", (t) => { + t.rejects( + () => + ConvertAPIArcSDVX( + deepmerge(arcScore, { chart_id: "foo" }), + {}, + "api/arc-sdvx", + logger + ), + { + message: /Could not find chart/iu, + } as any + ); + + t.end(); + }); + + t.end(); +}); + +t.test("#ResolveARCSDVXLamp", (t) => { + t.equal(ResolveARCSDVXLamp("PLAY"), "FAILED"); + t.equal(ResolveARCSDVXLamp("CLEAR"), "CLEAR"); + t.equal(ResolveARCSDVXLamp("HC"), "EXCESSIVE CLEAR"); + t.equal(ResolveARCSDVXLamp("UC"), "ULTIMATE CHAIN"); + t.equal(ResolveARCSDVXLamp("PUC"), "PERFECT ULTIMATE CHAIN"); + + t.end(); +}); + +t.teardown(CloseAllConnections); diff --git a/server/src/lib/score-import/import-types/api/arc-sdvx/converter.ts b/server/src/lib/score-import/import-types/api/arc-sdvx/converter.ts index 0317eaeba..3a966e991 100644 --- a/server/src/lib/score-import/import-types/api/arc-sdvx/converter.ts +++ b/server/src/lib/score-import/import-types/api/arc-sdvx/converter.ts @@ -97,7 +97,7 @@ export const ConvertAPIArcSDVX: ConverterFunction = async * ARC has a bug where all sdvx scores are clears no matter what. * This function takes the score and lamp and rederives the lamp. */ -function ResolveARCSDVXLamp(lamp: ARCSDVXScore["lamp"]): Lamps["sdvx:Single"] { +export function ResolveARCSDVXLamp(lamp: ARCSDVXScore["lamp"]): Lamps["sdvx:Single"] { switch (lamp) { case "PLAY": return "FAILED"; diff --git a/server/src/test-utils/mock-db/charts-ddr.json b/server/src/test-utils/mock-db/charts-ddr.json index f5be7bf37..5f6ce7ea9 100644 --- a/server/src/test-utils/mock-db/charts-ddr.json +++ b/server/src/test-utils/mock-db/charts-ddr.json @@ -13,7 +13,8 @@ }, "data": { "inGameID": "puty", - "songHash": "DQlQ1DlPbq900oqdOo8l0d6I1lIOl99l" + "songHash": "DQlQ1DlPbq900oqdOo8l0d6I1lIOl99l", + "arcChartID": "BD_uIVl5USj" }, "isPrimary": true, "versions": [ diff --git a/server/src/test-utils/mock-db/charts-sdvx.json b/server/src/test-utils/mock-db/charts-sdvx.json index 580e862f4..4cbbac926 100644 --- a/server/src/test-utils/mock-db/charts-sdvx.json +++ b/server/src/test-utils/mock-db/charts-sdvx.json @@ -13,7 +13,9 @@ "N-1": false }, "data": { - "inGameID": 1 + "inGameID": 1, + "uscEquiv": null, + "arcChartID": "EOZ7FixCDpv" }, "isPrimary": true, "versions": [ diff --git a/server/src/test-utils/test-data/kamaitachi/ddr-puty-chart.json b/server/src/test-utils/test-data/kamaitachi/ddr-puty-chart.json new file mode 100644 index 000000000..7e3af96ab --- /dev/null +++ b/server/src/test-utils/test-data/kamaitachi/ddr-puty-chart.json @@ -0,0 +1,37 @@ +{ + "rgcID": null, + "chartID": "48024d36bbe76c9fed09c3ffdc19412925d1efd3", + "difficulty": "DIFFICULT", + "songID": 10, + "playtype": "SP", + "levelNum": 6, + "level": "6", + "flags": { + "IN BASE GAME": true, + "N-1": true + }, + "data": { + "inGameID": "puty", + "songHash": "DQlQ1DlPbq900oqdOo8l0d6I1lIOl99l", + "arcChartID": "BD_uIVl5USj" + }, + "isPrimary": true, + "versions": [ + "2", + "3", + "4", + "5", + "max", + "max2", + "extreme", + "snova", + "snova2", + "x", + "x2", + "x3", + "2013", + "2014", + "a", + "a20" + ] +} \ No newline at end of file diff --git a/server/src/test-utils/test-data/kamaitachi/ddr-puty-song.json b/server/src/test-utils/test-data/kamaitachi/ddr-puty-song.json new file mode 100644 index 000000000..efa127330 --- /dev/null +++ b/server/src/test-utils/test-data/kamaitachi/ddr-puty-song.json @@ -0,0 +1,11 @@ +{ + "title": "PUT YOUR FAITH IN ME", + "artist": "UZI-LAY", + "id": 10, + "firstVersion": "2", + "alt-titles": [], + "search-titles": [ + "putyourfaithinme" + ], + "data": {} +} \ No newline at end of file diff --git a/server/src/test-utils/test-data/kamaitachi/sdvx-albida-chart.json b/server/src/test-utils/test-data/kamaitachi/sdvx-albida-chart.json index 8f835bfbb..a06cca42f 100644 --- a/server/src/test-utils/test-data/kamaitachi/sdvx-albida-chart.json +++ b/server/src/test-utils/test-data/kamaitachi/sdvx-albida-chart.json @@ -12,7 +12,9 @@ "N-1": false }, "data": { - "inGameID": 1 + "inGameID": 1, + "uscEquiv": null, + "arcChartID": "EOZ7FixCDpv" }, "isPrimary": true, "versions": [