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"); + }); +}); diff --git a/frontend/src/ts/elements/monkey-power.ts b/frontend/src/ts/elements/monkey-power.ts index 71d2bd9a9064..0b9519107c93 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)", @@ -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 };