Files
NetMesh/domain/terminalSettings.test.ts
zhaolei 3c72efcb7f
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
[Init] Initial commit - NetMesh terminal manager
2026-09-13 18:24:01 +08:00

286 lines
11 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { normalizeTerminalSettings } from "./models";
test("normalizeTerminalSettings disables cursor line highlight by default", () => {
assert.equal(normalizeTerminalSettings().highlightCursorLine, false);
});
test("normalizeTerminalSettings defaults disconnected sessions to a terminal notice", () => {
assert.equal(normalizeTerminalSettings().disconnectedNoticeMode, "terminal");
});
test("normalizeTerminalSettings preserves supported disconnected notice modes", () => {
assert.equal(
normalizeTerminalSettings({ disconnectedNoticeMode: "terminal" }).disconnectedNoticeMode,
"terminal",
);
assert.equal(
normalizeTerminalSettings({ disconnectedNoticeMode: "dialog" }).disconnectedNoticeMode,
"dialog",
);
});
test("normalizeTerminalSettings rejects unsupported disconnected notice modes", () => {
assert.equal(
normalizeTerminalSettings({ disconnectedNoticeMode: "toast" as never }).disconnectedNoticeMode,
"terminal",
);
});
test("normalizeTerminalSettings preserves enabled cursor line highlight", () => {
assert.equal(normalizeTerminalSettings({ highlightCursorLine: true }).highlightCursorLine, true);
});
test("normalizeTerminalSettings disables prompt line breaks by default", () => {
const settings = normalizeTerminalSettings();
assert.equal(settings.forcePromptNewLine, false);
});
test("normalizeTerminalSettings defaults password prompt assist to hint", () => {
assert.equal(normalizeTerminalSettings().passwordPromptAssist, "hint");
});
test("normalizeTerminalSettings preserves password prompt assist modes", () => {
assert.equal(normalizeTerminalSettings({ passwordPromptAssist: "off" }).passwordPromptAssist, "off");
assert.equal(normalizeTerminalSettings({ passwordPromptAssist: "hint" }).passwordPromptAssist, "hint");
assert.equal(normalizeTerminalSettings({ passwordPromptAssist: "picker" }).passwordPromptAssist, "picker");
});
test("normalizeTerminalSettings falls back for unsupported password prompt assist modes", () => {
assert.equal(
normalizeTerminalSettings({ passwordPromptAssist: "legacy" as never }).passwordPromptAssist,
"hint",
);
});
test("normalizeTerminalSettings defaults autocomplete history scope to host", () => {
assert.equal(normalizeTerminalSettings().autocompleteHistoryScope, "host");
});
test("normalizeTerminalSettings preserves autocomplete history scope", () => {
assert.equal(
normalizeTerminalSettings({ autocompleteHistoryScope: "global" }).autocompleteHistoryScope,
"global",
);
assert.equal(
normalizeTerminalSettings({ autocompleteHistoryScope: "host" }).autocompleteHistoryScope,
"host",
);
});
test("normalizeTerminalSettings falls back for unsupported autocomplete history scope", () => {
assert.equal(
normalizeTerminalSettings({ autocompleteHistoryScope: "legacy" as never }).autocompleteHistoryScope,
"host",
);
});
test("normalizeTerminalSettings enables Shift+Enter newline by default", () => {
const settings = normalizeTerminalSettings();
assert.equal(settings.shiftEnterNewlineEnabled, true);
assert.equal(settings.shiftEnterNewlineText, "\\n");
});
test("normalizeTerminalSettings disables Kitty keyboard protocol by default", () => {
assert.equal(normalizeTerminalSettings().kittyKeyboardProtocolEnabled, false);
assert.equal(
normalizeTerminalSettings({ kittyKeyboardProtocolEnabled: true }).kittyKeyboardProtocolEnabled,
true,
);
});
test("normalizeTerminalSettings preserves Shift+Enter text", () => {
assert.equal(
normalizeTerminalSettings({ shiftEnterNewlineText: " \\\\\\n" }).shiftEnterNewlineText,
" \\\\\\n",
);
});
test("normalizeTerminalSettings falls back when Shift+Enter text is not a string", () => {
assert.equal(
normalizeTerminalSettings({ shiftEnterNewlineText: null as never }).shiftEnterNewlineText,
"\\n",
);
});
test("normalizeTerminalSettings defaults startupCommandDelayMs to 600", () => {
assert.equal(normalizeTerminalSettings().startupCommandDelayMs, 600);
});
test("normalizeTerminalSettings defaults dynamic tab titles to agent mode", () => {
assert.equal(normalizeTerminalSettings().dynamicTabTitleMode, "agent");
});
test("normalizeTerminalSettings preserves supported dynamic tab title modes", () => {
assert.equal(normalizeTerminalSettings({ dynamicTabTitleMode: "off" }).dynamicTabTitleMode, "off");
assert.equal(normalizeTerminalSettings({ dynamicTabTitleMode: "agent" }).dynamicTabTitleMode, "agent");
assert.equal(normalizeTerminalSettings({ dynamicTabTitleMode: "all" }).dynamicTabTitleMode, "all");
});
test("normalizeTerminalSettings falls back for unsupported dynamic tab title modes", () => {
assert.equal(
normalizeTerminalSettings({ dynamicTabTitleMode: "legacy" as never }).dynamicTabTitleMode,
"agent",
);
});
test("normalizeTerminalSettings enables OSC desktop notifications by default", () => {
assert.equal(normalizeTerminalSettings().oscNotifications, "always");
});
test("normalizeTerminalSettings preserves supported OSC notification modes", () => {
assert.equal(normalizeTerminalSettings({ oscNotifications: "off" }).oscNotifications, "off");
assert.equal(normalizeTerminalSettings({ oscNotifications: "unfocused" }).oscNotifications, "unfocused");
assert.equal(normalizeTerminalSettings({ oscNotifications: "always" }).oscNotifications, "always");
});
test("normalizeTerminalSettings falls back for unsupported OSC notification modes", () => {
assert.equal(
normalizeTerminalSettings({ oscNotifications: "legacy" as never }).oscNotifications,
"always",
);
});
test("normalizeTerminalSettings enables font smoothing by default", () => {
assert.equal(normalizeTerminalSettings().fontSmoothing, true);
});
test("normalizeTerminalSettings enables terminal auto-close by default", () => {
assert.equal(normalizeTerminalSettings().autoCloseOnExit, true);
});
test("normalizeTerminalSettings preserves disabled terminal auto-close", () => {
assert.equal(normalizeTerminalSettings({ autoCloseOnExit: false }).autoCloseOnExit, false);
});
test("normalizeTerminalSettings disables SSH auto reconnect by default", () => {
assert.equal(normalizeTerminalSettings().sshAutoReconnectEnabled, false);
});
test("normalizeTerminalSettings preserves explicit SSH auto reconnect settings", () => {
assert.equal(normalizeTerminalSettings({ sshAutoReconnectEnabled: true }).sshAutoReconnectEnabled, true);
assert.equal(normalizeTerminalSettings({ sshAutoReconnectEnabled: false }).sshAutoReconnectEnabled, false);
});
test("normalizeTerminalSettings shows the host information bar by default", () => {
assert.equal(normalizeTerminalSettings().showHostInfoBar, true);
});
test("normalizeTerminalSettings preserves a hidden host information bar", () => {
assert.equal(normalizeTerminalSettings({ showHostInfoBar: false }).showHostInfoBar, false);
});
test("normalizeTerminalSettings defaults host info bar title mode to address", () => {
assert.equal(normalizeTerminalSettings().hostInfoBarTitleMode, "address");
});
test("normalizeTerminalSettings preserves supported host info bar title modes", () => {
assert.equal(normalizeTerminalSettings({ hostInfoBarTitleMode: "label" }).hostInfoBarTitleMode, "label");
assert.equal(normalizeTerminalSettings({ hostInfoBarTitleMode: "address" }).hostInfoBarTitleMode, "address");
});
test("normalizeTerminalSettings falls back for unsupported host info bar title modes", () => {
assert.equal(
normalizeTerminalSettings({ hostInfoBarTitleMode: "both" as never }).hostInfoBarTitleMode,
"address",
);
});
test("normalizeTerminalSettings disables hibernate for hidden tabs by default", () => {
assert.equal(normalizeTerminalSettings().hibernateHiddenTabs, false);
assert.equal(normalizeTerminalSettings().hibernateHiddenTabsDelaySec, 5);
});
test("normalizeTerminalSettings clamps hibernate delay seconds", () => {
assert.equal(normalizeTerminalSettings({ hibernateHiddenTabsDelaySec: 120 }).hibernateHiddenTabsDelaySec, 120);
assert.equal(normalizeTerminalSettings({ hibernateHiddenTabsDelaySec: 2 }).hibernateHiddenTabsDelaySec, 5);
});
test("normalizeTerminalSettings preserves disabled font smoothing", () => {
assert.equal(normalizeTerminalSettings({ fontSmoothing: false }).fontSmoothing, false);
});
test("normalizeTerminalSettings preserves a provided startupCommandDelayMs", () => {
assert.equal(normalizeTerminalSettings({ startupCommandDelayMs: 0 }).startupCommandDelayMs, 0);
assert.equal(normalizeTerminalSettings({ startupCommandDelayMs: 1500 }).startupCommandDelayMs, 1500);
});
test("normalizeTerminalSettings defaults localShellArgs to an empty array", () => {
assert.deepEqual(normalizeTerminalSettings().localShellArgs, []);
});
test("normalizeTerminalSettings preserves provided localShellArgs", () => {
assert.deepEqual(
normalizeTerminalSettings({ localShellArgs: ["--login", "-i"] }).localShellArgs,
["--login", "-i"],
);
});
test("normalizeTerminalSettings defaults middle-click behavior to paste", () => {
const settings = normalizeTerminalSettings();
assert.equal(settings.middleClickBehavior, "paste");
assert.equal(settings.middleClickPaste, true);
});
test("normalizeTerminalSettings enables normalizeTextOnCopy by default", () => {
assert.equal(normalizeTerminalSettings().normalizeTextOnCopy, true);
assert.equal(normalizeTerminalSettings({ normalizeTextOnCopy: false }).normalizeTextOnCopy, false);
});
test("normalizeTerminalSettings defaults word separators to xterm-compatible boundaries", () => {
assert.equal(normalizeTerminalSettings().wordSeparators, " ()[]{}'\"");
});
test("normalizeTerminalSettings preserves custom word separators", () => {
const custom = " ()[]{}'\"=,:";
assert.equal(normalizeTerminalSettings({ wordSeparators: custom }).wordSeparators, custom);
});
test("normalizeTerminalSettings falls back when word separators are not a string", () => {
assert.equal(
normalizeTerminalSettings({ wordSeparators: null as never }).wordSeparators,
" ()[]{}'\"",
);
});
test("normalizeTerminalSettings migrates disabled legacy middle-click paste", () => {
const settings = normalizeTerminalSettings({ middleClickPaste: false });
assert.equal(settings.middleClickBehavior, "disabled");
assert.equal(settings.middleClickPaste, false);
});
test("normalizeTerminalSettings prefers explicit middle-click behavior over legacy paste flag", () => {
const settings = normalizeTerminalSettings({
middleClickBehavior: "context-menu",
middleClickPaste: true,
});
assert.equal(settings.middleClickBehavior, "context-menu");
assert.equal(settings.middleClickPaste, false);
});
test("normalizeTerminalSettings migrates legacy autocompleteMaxSuggestions default 8 to 50", () => {
assert.equal(
normalizeTerminalSettings({ autocompleteMaxSuggestions: 8 }).autocompleteMaxSuggestions,
50,
);
});
test("normalizeTerminalSettings preserves intentional custom autocompleteMaxSuggestions", () => {
assert.equal(
normalizeTerminalSettings({ autocompleteMaxSuggestions: 6 }).autocompleteMaxSuggestions,
6,
);
assert.equal(
normalizeTerminalSettings({ autocompleteMaxSuggestions: 20 }).autocompleteMaxSuggestions,
20,
);
});