/* Copyright 2026 Lotus Guild SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ import { beforeEach, describe, expect, it } from "vitest"; import { MAX_REMEMBERED, getRememberedVolume, rememberVolume, } from "./lotusVolumeMemory"; describe("lotusVolumeMemory", () => { beforeEach(() => localStorage.clear()); it("defaults to 1 and remembers a set volume", () => { expect(getRememberedVolume("@bob:x")).toBe(1); rememberVolume("@bob:x", 0.4); expect(getRememberedVolume("@bob:x")).toBe(0.4); }); it("forgets the entry when set back to 1", () => { rememberVolume("@bob:x", 0.4); rememberVolume("@bob:x", 1); expect(getRememberedVolume("@bob:x")).toBe(1); expect(localStorage.getItem("lotus-per-user-volume")).toBe("{}"); }); it("keeps only the most recently set entries", () => { for (let i = 0; i < MAX_REMEMBERED + 5; i++) rememberVolume(`@u${i}:x`, 0.5); expect(getRememberedVolume("@u0:x")).toBe(1); expect(getRememberedVolume("@u4:x")).toBe(1); expect(getRememberedVolume("@u5:x")).toBe(0.5); expect(getRememberedVolume(`@u${MAX_REMEMBERED + 4}:x`)).toBe(0.5); }); it("re-setting an old entry makes it recent", () => { for (let i = 0; i < MAX_REMEMBERED; i++) rememberVolume(`@u${i}:x`, 0.5); rememberVolume("@u0:x", 0.7); rememberVolume("@new:x", 0.3); expect(getRememberedVolume("@u0:x")).toBe(0.7); expect(getRememberedVolume("@u1:x")).toBe(1); }); it("ignores junk in storage and invalid volumes", () => { localStorage.setItem( "lotus-per-user-volume", JSON.stringify({ "@a:x": "loud", "@b:x": 0.2 }), ); expect(getRememberedVolume("@a:x")).toBe(1); expect(getRememberedVolume("@b:x")).toBe(0.2); rememberVolume("@c:x", Number.NaN); expect(getRememberedVolume("@c:x")).toBe(1); localStorage.setItem("lotus-per-user-volume", "not json"); expect(getRememberedVolume("@b:x")).toBe(1); }); });