| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { describe, expect, test } from "bun:test"
- import { createRoot } from "solid-js"
- import { createKeybindSettingsController } from "../src/components/settings-keybinds"
- function setup(overrides: Record<string, string> = {}) {
- const changes: [string, string][] = []
- const suppression: boolean[] = []
- const notifications: { title: string; description?: string }[] = []
- let resets = 0
- let controller: ReturnType<typeof createKeybindSettingsController>
- const dispose = createRoot((dispose) => {
- controller = createKeybindSettingsController(
- {
- command: {
- catalog: [
- { id: "session.alpha", title: "Alpha", keybind: "mod+a" },
- { id: "session.beta", title: "Beta", keybind: "mod+b" },
- ],
- options: [],
- keybinds: (enabled) => suppression.push(enabled),
- },
- settings: {
- current: { keybinds: overrides },
- keybinds: {
- get: (id) => overrides[id],
- set: (id, value) => {
- overrides[id] = value
- changes.push([id, value])
- },
- resetAll: () => {
- resets++
- },
- },
- },
- notify: (toast) => notifications.push(toast),
- },
- {
- locale: () => "en",
- t: (key, params) => {
- if (params) return `${key}:${Object.values(params).join("|")}`
- if (key === "common.key.alt") return "Alt"
- return String(key)
- },
- },
- )
- return dispose
- })
- return {
- controller: controller!,
- changes,
- suppression,
- notifications,
- resets: () => resets,
- dispose,
- }
- }
- function modKey(key: string) {
- const mac = /(Mac|iPod|iPhone|iPad)/.test(navigator.platform)
- return new KeyboardEvent("keydown", { key, ctrlKey: !mac, metaKey: mac, bubbles: true, cancelable: true })
- }
- describe("keybind settings controller", () => {
- test("derives the catalog, effective bindings, and filtered groups", () => {
- const state = setup({ "session.beta": "alt+k" })
- expect(state.controller.catalog.title("session.alpha")).toBe("Alpha")
- expect(state.controller.catalog.keybind("session.beta")).toBe("Alt+K")
- expect(state.controller.catalog.filtered("alt k").get("Session")).toEqual(["session.beta"])
- expect(state.controller.settings.hasOverrides()).toBe(true)
- state.dispose()
- })
- test("captures bindings, rejects conflicts, and restores command handling", () => {
- const state = setup()
- state.controller.capture.toggle("session.beta")
- document.dispatchEvent(modKey("a"))
- expect(state.changes).toEqual([])
- expect(state.notifications).toHaveLength(1)
- expect(state.controller.capture.active()).toBe("session.beta")
- document.dispatchEvent(modKey("x"))
- expect(state.changes).toEqual([["session.beta", "mod+x"]])
- expect(state.suppression).toEqual([false, true])
- expect(state.controller.capture.active()).toBeNull()
- state.controller.capture.toggle("session.alpha")
- state.dispose()
- expect(state.suppression).toEqual([false, true, false, true])
- document.dispatchEvent(modKey("z"))
- expect(state.changes).toEqual([["session.beta", "mod+x"]])
- })
- test("resets persisted overrides and reports success", () => {
- const state = setup({ "session.alpha": "none" })
- state.controller.settings.reset()
- expect(state.resets()).toBe(1)
- expect(state.notifications[0]?.title).toBe("settings.shortcuts.reset.toast.title")
- state.dispose()
- })
- })
|