From 981b0a5bedcb75f865578434bfde0a4af59cbad9 Mon Sep 17 00:00:00 2001 From: Mateus Boergeson Date: Sat, 29 Aug 2026 14:26:26 +0200 Subject: [PATCH 1/3] fix(monkey-power): clear the shake reset timeout before dropping its id --- frontend/src/ts/elements/monkey-power.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/elements/monkey-power.ts b/frontend/src/ts/elements/monkey-power.ts index 71d2bd9a9064..2ed28050e1af 100644 --- a/frontend/src/ts/elements/monkey-power.ts +++ b/frontend/src/ts/elements/monkey-power.ts @@ -170,9 +170,9 @@ function render(): void { export function reset(immediate = false): void { if (!isSafeNumber(ctx.resetTimeOut)) return; + clearTimeout(ctx.resetTimeOut); delete ctx.resetTimeOut; - clearTimeout(ctx.resetTimeOut); body.setStyle({ transition: "all .25s, transform 0.8s", transform: "translate(0,0)", From 97acf06d456cb248f15239d887060a1596d72c4c Mon Sep 17 00:00:00 2001 From: Mateus Boergeson Date: Sat, 29 Aug 2026 14:26:37 +0200 Subject: [PATCH 2/3] fix(monkey-power): pad spark colors to two hex digits --- frontend/src/ts/elements/monkey-power.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/elements/monkey-power.ts b/frontend/src/ts/elements/monkey-power.ts index 2ed28050e1af..0b9519107c93 100644 --- a/frontend/src/ts/elements/monkey-power.ts +++ b/frontend/src/ts/elements/monkey-power.ts @@ -196,10 +196,11 @@ function startRender(): void { } function randomColor(): string { - const r = Math.floor(Math.random() * 256).toString(16); - const g = Math.floor(Math.random() * 256).toString(16); - const b = Math.floor(Math.random() * 256).toString(16); - return `#${r}${g}${b}`; + const hex = (): string => + Math.floor(Math.random() * 256) + .toString(16) + .padStart(2, "0"); + return `#${hex()}${hex()}${hex()}`; } /** @@ -252,3 +253,5 @@ export async function addPower(good = true, extra = false): Promise { startRender(); }); } + +export const __testing = { randomColor }; From 6600741080ff094329d95cf3f9870faae4278983 Mon Sep 17 00:00:00 2001 From: Mateus Boergeson Date: Sat, 29 Aug 2026 14:26:54 +0200 Subject: [PATCH 3/3] test(monkey-power): cover reset and randomColor --- .../__tests__/elements/monkey-power.spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frontend/__tests__/elements/monkey-power.spec.ts diff --git a/frontend/__tests__/elements/monkey-power.spec.ts b/frontend/__tests__/elements/monkey-power.spec.ts new file mode 100644 index 000000000000..85a25d49cdbc --- /dev/null +++ b/frontend/__tests__/elements/monkey-power.spec.ts @@ -0,0 +1,36 @@ +import { describe, it, expect, vi, afterEach } from "vitest"; +import * as MonkeyPower from "../../src/ts/elements/monkey-power"; + +vi.mock("../../src/ts/config/store", () => ({ + Config: { monkeyPowerLevel: "3", blindMode: false }, +})); +vi.mock("../../src/ts/legacy-states/slow-timer", () => ({ + get: () => false, +})); +vi.mock("../../src/ts/states/theme", () => ({ + getTheme: () => ({ caret: "#fff", error: "#f00" }), +})); +vi.mock("../../src/ts/utils/debounced-animation-frame", () => ({ + requestDebouncedAnimationFrame: (_id: string, cb: () => void) => cb(), +})); + +describe("monkey-power", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("reset cancels the pending shake reset", async () => { + vi.spyOn(globalThis, "setTimeout").mockReturnValue( + 42 as unknown as NodeJS.Timeout, + ); + const clear = vi.spyOn(globalThis, "clearTimeout"); + await MonkeyPower.addPower(); + MonkeyPower.reset(); + expect(clear).toHaveBeenCalledWith(42); + }); + + it("randomColor pads every channel", () => { + vi.spyOn(Math, "random").mockReturnValue(0); + expect(MonkeyPower.__testing.randomColor()).toBe("#000000"); + }); +});