impr: save pbs for numbers mode separately (notreallystatic, miodec) (#4946)

This commit is contained in:
Sachin Kumar 2024-02-22 19:37:42 +05:30 committed by GitHub
parent 3e591635e5
commit 1429c2ca8c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 110 additions and 13 deletions

View file

@ -32,4 +32,81 @@ describe("Pb Utils", () => {
expect(result).toBe(expected);
});
});
describe("checkAndUpdatePb", () => {
it("should update personal best", () => {
const userPbs: SharedTypes.PersonalBests = {
time: {},
words: {},
custom: {},
quote: {},
zen: {},
};
const result = {
difficulty: "normal",
language: "english",
punctuation: false,
lazyMode: false,
acc: 100,
consistency: 100,
rawWpm: 100,
wpm: 110,
numbers: false,
mode: "time",
mode2: "15",
} as unknown as SharedTypes.Result<SharedTypes.Config.Mode>;
const run = pb.checkAndUpdatePb(userPbs, undefined, result);
expect(run.isPb).toBe(true);
expect(run.personalBests?.["time"]?.["15"]?.[0]).not.toBe(undefined);
});
it("should not override default pb when saving numbers test", () => {
const userPbs: SharedTypes.PersonalBests = {
time: {
"15": [
{
acc: 100,
consistency: 100,
difficulty: "normal",
lazyMode: false,
language: "english",
numbers: false,
punctuation: false,
raw: 100,
timestamp: 0,
wpm: 100,
},
],
},
words: {},
custom: {},
quote: {},
zen: {},
};
const result = {
difficulty: "normal",
language: "english",
punctuation: false,
lazyMode: false,
acc: 100,
consistency: 100,
rawWpm: 100,
wpm: 110,
numbers: true,
mode: "time",
mode2: "15",
} as unknown as SharedTypes.Result<SharedTypes.Config.Mode>;
const run = pb.checkAndUpdatePb(userPbs, undefined, result);
expect(run.isPb).toBe(true);
expect(run.personalBests?.["time"]?.["15"]).toEqual(
expect.arrayContaining([
expect.objectContaining({ numbers: false, wpm: 100 }),
expect.objectContaining({ numbers: true, wpm: 110 }),
])
);
});
});
});

View file

@ -73,19 +73,28 @@ function matchesPersonalBest(
result.difficulty === undefined ||
result.language === undefined ||
result.punctuation === undefined ||
result.lazyMode === undefined
result.lazyMode === undefined ||
result.numbers === undefined
) {
throw new Error("Missing result data (matchesPersonalBest)");
}
const sameLazyMode =
result.lazyMode === personalBest.lazyMode ||
(!result.lazyMode && !personalBest.lazyMode);
const samePunctuation = result.punctuation === personalBest.punctuation;
(result.lazyMode ?? false) === (personalBest.lazyMode ?? false);
const samePunctuation =
(result.punctuation ?? false) === (personalBest.punctuation ?? false);
const sameDifficulty = result.difficulty === personalBest.difficulty;
const sameLanguage = result.language === personalBest.language;
const sameNumbers =
(result.numbers ?? false) === (personalBest.numbers ?? false);
return sameLazyMode && samePunctuation && sameDifficulty && sameLanguage;
return (
sameLazyMode &&
samePunctuation &&
sameDifficulty &&
sameLanguage &&
sameNumbers
);
}
function updatePersonalBest(
@ -104,7 +113,8 @@ function updatePersonalBest(
result.acc === undefined ||
result.consistency === undefined ||
result.rawWpm === undefined ||
result.wpm === undefined
result.wpm === undefined ||
result.numbers === undefined
) {
throw new Error("Missing result data (updatePersonalBest)");
}
@ -117,6 +127,7 @@ function updatePersonalBest(
personalBest.consistency = result.consistency;
personalBest.raw = result.rawWpm;
personalBest.wpm = result.wpm;
personalBest.numbers = result.numbers;
personalBest.timestamp = Date.now();
return true;
@ -131,7 +142,8 @@ function buildPersonalBest(result: Result): SharedTypes.PersonalBest {
result.acc === undefined ||
result.consistency === undefined ||
result.rawWpm === undefined ||
result.wpm === undefined
result.wpm === undefined ||
result.numbers === undefined
) {
throw new Error("Missing result data (buildPersonalBest)");
}
@ -144,6 +156,7 @@ function buildPersonalBest(result: Result): SharedTypes.PersonalBest {
punctuation: result.punctuation,
raw: result.rawWpm,
wpm: result.wpm,
numbers: result.numbers,
timestamp: Date.now(),
};
}

View file

@ -256,6 +256,7 @@
<td>difficulty</td>
<td>language</td>
<td>punctuation</td>
<td>numbers</td>
<td>lazy mode</td>
<td>date</td>
</tr>

View file

@ -692,7 +692,7 @@
.title {
color: var(--text-color);
}
min-width: 50rem;
width: 100%;
max-height: calc(100vh - 10rem);
overflow-y: scroll;
table {

View file

@ -648,6 +648,7 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
mode: M,
mode2: SharedTypes.Config.Mode2<M>,
punctuation: boolean,
numbers: boolean,
language: string,
difficulty: SharedTypes.Config.Difficulty,
lazyMode: boolean,
@ -683,10 +684,11 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
] as unknown as SharedTypes.PersonalBest[]
).forEach((pb) => {
if (
pb.punctuation === punctuation &&
(pb.punctuation ?? false) === punctuation &&
(pb.numbers ?? false) === numbers &&
pb.difficulty === difficulty &&
pb.language === language &&
(pb.lazyMode === lazyMode || (pb.lazyMode === undefined && !lazyMode))
(pb.lazyMode ?? false) === lazyMode
) {
found = true;
pb.wpm = wpm;
@ -713,6 +715,7 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
raw,
timestamp: Date.now(),
consistency,
numbers,
});
}
}

View file

@ -73,6 +73,7 @@ function update(mode: SharedTypes.Config.Mode): void {
<td>${pb.difficulty}</td>
<td>${pb.language ? getLanguageDisplayString(pb.language) : "-"}</td>
<td>${pb.punctuation ? '<i class="fas fa-check"></i>' : ""}</td>
<td>${pb.numbers ? '<i class="fas fa-check"></i>' : ""}</td>
<td>${pb.lazyMode ? '<i class="fas fa-check"></i>' : ""}</td>
<td>${dateText}</td>
</tr>

View file

@ -1250,6 +1250,7 @@ async function saveResult(
Config.mode,
completedEvent.mode2,
Config.punctuation,
Config.numbers,
Config.language,
Config.difficulty,
Config.lazyMode,

View file

@ -112,11 +112,12 @@ declare namespace SharedTypes {
interface PersonalBest {
acc: number;
consistency: number;
consistency?: number;
difficulty: SharedTypes.Config.Difficulty;
lazyMode: boolean;
lazyMode?: boolean;
language: string;
punctuation: boolean;
punctuation?: boolean;
numbers?: boolean;
raw: number;
wpm: number;
timestamp: number;