sendou.ink/app/features/build-stats/build-stats-utils.test.ts
Kalle cfa0d4dd0d
Build stats / popular builds (#1307)
* Add abilityPoints migration

* Initial stats

* Build stats UI

* Add TODO

* Update css file name

* Popular builds page
2023-03-11 14:05:08 +02:00

151 lines
3.6 KiB
TypeScript

import { suite } from "uvu";
import * as assert from "uvu/assert";
import {
abilityPointCountsToAverages,
popularBuilds,
} from "./build-stats-utils";
const AbilityPointCountsToAverages = suite("abilityPointCountsToAverages()");
const PopularBuilds = suite("popularBuilds()");
const commonAbilities = [
{
ability: "QR" as const,
abilityPointsSum: 57,
},
{
ability: "SJ" as const,
abilityPointsSum: 10,
},
{
ability: "CB" as const,
abilityPointsSum: 10,
},
{
ability: "T" as const,
abilityPointsSum: 10,
},
{
ability: "SS" as const,
abilityPointsSum: 27,
},
];
const allAbilities = [
...commonAbilities,
{ ability: "BRU" as const, abilityPointsSum: 57 },
];
AbilityPointCountsToAverages("calculates build count", () => {
const { weaponBuildsCount } = abilityPointCountsToAverages({
allAbilities,
weaponAbilities: commonAbilities,
});
assert.is(weaponBuildsCount, 2);
});
AbilityPointCountsToAverages("calculates average ap (main only)", () => {
const { mainOnlyAbilities } = abilityPointCountsToAverages({
allAbilities,
weaponAbilities: commonAbilities,
});
assert.is(
mainOnlyAbilities.find((a) => a.name === "T")?.percentage.weapon,
50
);
});
AbilityPointCountsToAverages("calculates average ap (stackable)", () => {
const { stackableAbilities } = abilityPointCountsToAverages({
allAbilities,
weaponAbilities: commonAbilities,
});
assert.is(
stackableAbilities.find((a) => a.name === "SS")?.apAverage.weapon,
13.5
);
});
AbilityPointCountsToAverages("calculates average ap for all builds", () => {
const { mainOnlyAbilities } = abilityPointCountsToAverages({
allAbilities,
weaponAbilities: commonAbilities,
});
assert.is(
mainOnlyAbilities.find((a) => a.name === "T")?.percentage.all,
33.33
);
});
PopularBuilds("calculates popular build", () => {
const builds = popularBuilds([
...new Array(10).fill(null).map(() => ({
abilities: [{ ability: "QR" as const, abilityPoints: 57 }],
})),
{
abilities: [{ ability: "BRU" as const, abilityPoints: 57 }],
},
]);
assert.is(builds.length, 1);
assert.is(builds[0]!.count, 10);
assert.is(builds[0]!.abilities[0]!.ability, "QR");
});
PopularBuilds("calculates second most popular build (sorted by count)", () => {
const builds = popularBuilds([
...new Array(10).fill(null).map(() => ({
abilities: [{ ability: "QR" as const, abilityPoints: 57 }],
})),
...new Array(3).fill(null).map(() => ({
abilities: [{ ability: "SS" as const, abilityPoints: 57 }],
})),
...new Array(5).fill(null).map(() => ({
abilities: [{ ability: "SSU" as const, abilityPoints: 57 }],
})),
]);
assert.is(builds.length, 3);
assert.is(builds[1]!.abilities[0]!.ability, "SSU");
});
PopularBuilds("sums up abilities", () => {
const builds = popularBuilds([
{ abilities: [{ ability: "QR" as const, abilityPoints: 57 }] },
{
abilities: [
{ ability: "QR" as const, abilityPoints: 10 },
{ ability: "QR" as const, abilityPoints: 47 },
],
},
]);
assert.is(builds.length, 1);
});
PopularBuilds("sorts abilities", () => {
const builds = popularBuilds([
{
abilities: [
{ ability: "QR" as const, abilityPoints: 10 },
{ ability: "SS" as const, abilityPoints: 47 },
],
},
{
abilities: [
{ ability: "QR" as const, abilityPoints: 10 },
{ ability: "SS" as const, abilityPoints: 47 },
],
},
]);
assert.is(builds[0]!.abilities[1]!.ability, "QR");
});
AbilityPointCountsToAverages.run();
PopularBuilds.run();