full arc tests

This commit is contained in:
zkldi
2021-06-02 17:51:02 +01:00
parent 5815eb86e9
commit ca2e7d28c4
11 changed files with 231 additions and 24 deletions
+3 -3
View File
@@ -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:
@@ -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);
@@ -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<unknown, EmptyObject> = 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<unknown, EmptyObject> = 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<unknown, EmptyObject> = 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.`);
}
@@ -6,7 +6,7 @@ export interface ARCDDRScore {
score: integer;
ex_score: integer;
max_combo: integer;
judgements: {
judgments: {
marvelous: integer;
perfect: integer;
great: integer;
@@ -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);
@@ -97,7 +97,7 @@ export const ConvertAPIArcSDVX: ConverterFunction<unknown, EmptyObject> = 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";
@@ -13,7 +13,8 @@
},
"data": {
"inGameID": "puty",
"songHash": "DQlQ1DlPbq900oqdOo8l0d6I1lIOl99l"
"songHash": "DQlQ1DlPbq900oqdOo8l0d6I1lIOl99l",
"arcChartID": "BD_uIVl5USj"
},
"isPrimary": true,
"versions": [
@@ -13,7 +13,9 @@
"N-1": false
},
"data": {
"inGameID": 1
"inGameID": 1,
"uscEquiv": null,
"arcChartID": "EOZ7FixCDpv"
},
"isPrimary": true,
"versions": [
@@ -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"
]
}
@@ -0,0 +1,11 @@
{
"title": "PUT YOUR FAITH IN ME",
"artist": "UZI-LAY",
"id": 10,
"firstVersion": "2",
"alt-titles": [],
"search-titles": [
"putyourfaithinme"
],
"data": {}
}
@@ -12,7 +12,9 @@
"N-1": false
},
"data": {
"inGameID": 1
"inGameID": 1,
"uscEquiv": null,
"arcChartID": "EOZ7FixCDpv"
},
"isPrimary": true,
"versions": [