mirror of
https://github.com/zkldi/Tachi.git
synced 2026-10-11 16:58:25 +03:00
full arc tests
This commit is contained in:
Generated
+3
-3
@@ -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": [
|
||||
|
||||
Reference in New Issue
Block a user