import { describe, expect, it } from "vite-plus/test";import type { ResolvedKeybindingsConfig } from "@t3tools/contracts"; import { buildKeybindingRows, buildKeybindingCommandOptions, buildWhenVariableOptions, commandLabel, keybindingConflictLabels, keybindingFromKeyboardEvent, parseWhenExpressionDraft, shortcutToKeybindingInput, unknownWhenVariables, whenAstToExpression,} from "./KeybindingsSettings.logic"; describe("KeybindingsSettings.logic", () => { it("builds searchable rows with readable key and when values", () => { const rows = buildKeybindingRows( [ { command: "terminal.toggle", shortcut: { key: "j", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: false, }, whenAst: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, ] satisfies ResolvedKeybindingsConfig, "terminal", ); expect(rows).toEqual([ expect.objectContaining({ command: "terminal.toggle", key: "mod+j", when: "!terminalFocus", defaultKey: "mod+j", defaultWhen: "", source: "Custom", }), ]); }); it("captures platform-specific mod shortcuts", () => { expect( keybindingFromKeyboardEvent( { key: "K", metaKey: true, ctrlKey: false, altKey: false, shiftKey: true }, "MacIntel", ), ).toBe("mod+shift+k"); expect( keybindingFromKeyboardEvent( { key: "K", metaKey: false, ctrlKey: true, altKey: false, shiftKey: true }, "Win32", ), ).toBe("mod+shift+k"); }); it("serializes shortcuts and when expressions for upserts", () => { expect( shortcutToKeybindingInput({ key: " ", modKey: true, metaKey: false, ctrlKey: false, altKey: true, shiftKey: false, }), ).toBe("mod+alt+space"); expect( whenAstToExpression({ type: "and", left: { type: "identifier", name: "editorFocus" }, right: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }), ).toBe("editorFocus && !terminalFocus"); expect(parseWhenExpressionDraft("editorFocus && (!terminalFocus || modelPickerOpen)")).toEqual({ ok: true, value: { type: "and", left: { type: "identifier", name: "editorFocus" }, right: { type: "or", left: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, right: { type: "identifier", name: "modelPickerOpen" }, }, }, }); expect(parseWhenExpressionDraft("editorFocus &&")).toEqual({ ok: false, message: "Use variables with !, &&, ||, and parentheses.", }); expect(parseWhenExpressionDraft("!(terminalFocus || modelPickerOpen)")).toEqual({ ok: true, value: { type: "not", node: { type: "or", left: { type: "identifier", name: "terminalFocus" }, right: { type: "identifier", name: "modelPickerOpen" }, }, }, }); }); it("formats static and project script command labels", () => { expect(commandLabel("commandPalette.toggle")).toBe("Command Palette: Toggle"); expect(commandLabel("script.setup-db.run")).toBe("Run Script: Setup Db"); }); it("builds known when variable options from defaults without frontend labels", () => { const options = buildWhenVariableOptions(); expect(options).toEqual( expect.arrayContaining(["terminalFocus", "terminalOpen", "modelPickerOpen", "true", "false"]), ); expect(options).not.toContain("customModeActive"); }); it("builds command options from defaults and resolved project bindings", () => { const options = buildKeybindingCommandOptions([ { command: "script.setup-db.run", shortcut: { key: "r", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: false, }, }, ] satisfies ResolvedKeybindingsConfig); expect(options).toEqual(expect.arrayContaining(["chat.new", "script.setup-db.run"])); }); it("reports unknown when variables without rejecting parseable expressions", () => { const parsed = parseWhenExpressionDraft("!terminalFocus && terminalFoc"); expect(parsed.ok).toBe(true); expect(unknownWhenVariables(parsed.ok ? parsed.value : undefined)).toEqual(["terminalFoc"]); }); it("marks each default shortcut for multi-binding commands as default", () => { const rows = buildKeybindingRows( [ { command: "chat.new", shortcut: { key: "n", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: false, }, whenAst: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, { command: "chat.new", shortcut: { key: "o", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: true, }, whenAst: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, ] satisfies ResolvedKeybindingsConfig, "", ); expect(rows.map((row) => row.source)).toEqual(["Default", "Default"]); }); it("reports conflicting shortcuts that share an active when context", () => { const rows = buildKeybindingRows( [ { command: "chat.new", shortcut: { key: "n", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: false, }, whenAst: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, { command: "chat.newLocal", shortcut: { key: "n", modKey: true, metaKey: false, ctrlKey: false, altKey: false, shiftKey: false, }, whenAst: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, ] satisfies ResolvedKeybindingsConfig, "", ); expect(rows[0]?.conflicts).toEqual(["Chat: New Local"]); expect( keybindingConflictLabels(rows, { rowId: rows[0]?.id ?? "", key: "mod+n", when: "", }), ).toEqual(["Chat: New Local"]); });});
import { describe, expect, it } from "vite-plus/test";
import type { ResolvedKeybindingsConfig } from "@t3tools/contracts";
import {
buildKeybindingRows,
buildKeybindingCommandOptions,
buildWhenVariableOptions,
commandLabel,
keybindingConflictLabels,
keybindingFromKeyboardEvent,
parseWhenExpressionDraft,
shortcutToKeybindingInput,
unknownWhenVariables,
whenAstToExpression,
} from "./KeybindingsSettings.logic";
describe("KeybindingsSettings.logic", () => {
it("builds searchable rows with readable key and when values", () => {
const rows = buildKeybindingRows(
[
{
command: "terminal.toggle",
shortcut: {
key: "j",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false,
},
whenAst: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
},
] satisfies ResolvedKeybindingsConfig,
"terminal",
);
expect(rows).toEqual([
expect.objectContaining({
command: "terminal.toggle",
key: "mod+j",
when: "!terminalFocus",
defaultKey: "mod+j",
defaultWhen: "",
source: "Custom",
}),
]);
});
it("captures platform-specific mod shortcuts", () => {
expect(
keybindingFromKeyboardEvent(
{ key: "K", metaKey: true, ctrlKey: false, altKey: false, shiftKey: true },
"MacIntel",
),
).toBe("mod+shift+k");
expect(
keybindingFromKeyboardEvent(
{ key: "K", metaKey: false, ctrlKey: true, altKey: false, shiftKey: true },
"Win32",
),
).toBe("mod+shift+k");
});
it("serializes shortcuts and when expressions for upserts", () => {
expect(
shortcutToKeybindingInput({
key: " ",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: true,
shiftKey: false,
}),
).toBe("mod+alt+space");
expect(
whenAstToExpression({
type: "and",
left: { type: "identifier", name: "editorFocus" },
right: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
}),
).toBe("editorFocus && !terminalFocus");
expect(parseWhenExpressionDraft("editorFocus && (!terminalFocus || modelPickerOpen)")).toEqual({
ok: true,
value: {
type: "and",
left: { type: "identifier", name: "editorFocus" },
right: {
type: "or",
left: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
right: { type: "identifier", name: "modelPickerOpen" },
},
},
});
expect(parseWhenExpressionDraft("editorFocus &&")).toEqual({
ok: false,
message: "Use variables with !, &&, ||, and parentheses.",
});
expect(parseWhenExpressionDraft("!(terminalFocus || modelPickerOpen)")).toEqual({
ok: true,
value: {
type: "not",
node: {
type: "or",
left: { type: "identifier", name: "terminalFocus" },
right: { type: "identifier", name: "modelPickerOpen" },
},
},
});
});
it("formats static and project script command labels", () => {
expect(commandLabel("commandPalette.toggle")).toBe("Command Palette: Toggle");
expect(commandLabel("script.setup-db.run")).toBe("Run Script: Setup Db");
});
it("builds known when variable options from defaults without frontend labels", () => {
const options = buildWhenVariableOptions();
expect(options).toEqual(
expect.arrayContaining(["terminalFocus", "terminalOpen", "modelPickerOpen", "true", "false"]),
);
expect(options).not.toContain("customModeActive");
});
it("builds command options from defaults and resolved project bindings", () => {
const options = buildKeybindingCommandOptions([
{
command: "script.setup-db.run",
shortcut: {
key: "r",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false,
},
},
] satisfies ResolvedKeybindingsConfig);
expect(options).toEqual(expect.arrayContaining(["chat.new", "script.setup-db.run"]));
});
it("reports unknown when variables without rejecting parseable expressions", () => {
const parsed = parseWhenExpressionDraft("!terminalFocus && terminalFoc");
expect(parsed.ok).toBe(true);
expect(unknownWhenVariables(parsed.ok ? parsed.value : undefined)).toEqual(["terminalFoc"]);
});
it("marks each default shortcut for multi-binding commands as default", () => {
const rows = buildKeybindingRows(
[
{
command: "chat.new",
shortcut: {
key: "n",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false,
},
whenAst: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
},
{
command: "chat.new",
shortcut: {
key: "o",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: true,
},
whenAst: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
},
] satisfies ResolvedKeybindingsConfig,
"",
);
expect(rows.map((row) => row.source)).toEqual(["Default", "Default"]);
});
it("reports conflicting shortcuts that share an active when context", () => {
const rows = buildKeybindingRows(
[
{
command: "chat.new",
shortcut: {
key: "n",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false,
},
whenAst: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
},
{
command: "chat.newLocal",
shortcut: {
key: "n",
modKey: true,
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false,
},
whenAst: {
type: "not",
node: { type: "identifier", name: "terminalFocus" },
},
},
] satisfies ResolvedKeybindingsConfig,
"",
);
expect(rows[0]?.conflicts).toEqual(["Chat: New Local"]);
expect(
keybindingConflictLabels(rows, {
rowId: rows[0]?.id ?? "",
key: "mod+n",
when: "",
}),
).toEqual(["Chat: New Local"]);
});
});