Files
remoteconn-gitea/apps/miniprogram/pages/terminal/terminalKeyEncoder.test.ts
2026-03-21 18:57:10 +08:00

83 lines
3.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
const {
TERMINAL_TOUCH_ACTION_BUTTONS,
TERMINAL_TOUCH_DIRECTION_KEYS,
encodeTerminalKey,
encodeTerminalPaste,
normalizeTerminalKeyModes
} = require("./terminalKeyEncoder.js");
describe("terminalKeyEncoder", () => {
it("方向键和 Home/End 会按 application cursor mode 切换编码", () => {
expect(encodeTerminalKey("up", { applicationCursorKeys: false })).toBe("\u001b[A");
expect(encodeTerminalKey("up", { applicationCursorKeys: true })).toBe("\u001bOA");
expect(encodeTerminalKey("home", { applicationCursorKeys: false })).toBe("\u001b[H");
expect(encodeTerminalKey("home", { applicationCursorKeys: true })).toBe("\u001bOH");
});
it("常用编辑键和 Ctrl 组合会编码成 VT 控制序列", () => {
expect(encodeTerminalKey("esc")).toBe("\u001b");
expect(encodeTerminalKey("backspace")).toBe("\u007f");
expect(encodeTerminalKey("delete")).toBe("\u001b[3~");
expect(encodeTerminalKey("insert")).toBe("\u001b[2~");
expect(encodeTerminalKey("pageup")).toBe("\u001b[5~");
expect(encodeTerminalKey("ctrla")).toBe("\u0001");
expect(encodeTerminalKey("ctrlc")).toBe("\u0003");
expect(encodeTerminalKey("ctrle")).toBe("\u0005");
expect(encodeTerminalKey("ctrlw")).toBe("\u0017");
expect(encodeTerminalKey("ctrlz")).toBe("\u001a");
});
it("Alt/Meta 组合会编码为 ESC 前缀加基础键序列", () => {
expect(encodeTerminalKey("alt-a")).toBe("\u001ba");
expect(encodeTerminalKey("meta-z")).toBe("\u001bz");
expect(encodeTerminalKey("alt-up", { applicationCursorKeys: false })).toBe("\u001b\u001b[A");
expect(encodeTerminalKey("meta-home", { applicationCursorKeys: true })).toBe("\u001b\u001bOH");
});
it("Shift 修饰键会编码常用的反向 tab 和方向键序列", () => {
expect(encodeTerminalKey("tab", undefined, { shift: true })).toBe("\u001b[Z");
expect(encodeTerminalKey("up", undefined, { shift: true })).toBe("\u001b[1;2A");
expect(encodeTerminalKey("right", undefined, { shift: true })).toBe("\u001b[1;2C");
expect(encodeTerminalKey("delete", undefined, { shift: true })).toBe("\u001b[3;2~");
});
it("开启 bracketed paste 后,粘贴文本会自动包裹 2004 序列", () => {
expect(encodeTerminalPaste("hello", { bracketedPasteMode: false })).toBe("hello");
expect(encodeTerminalPaste("hello", { bracketedPasteMode: true })).toBe("\u001b[200~hello\u001b[201~");
});
it("模式位归一化会补齐默认值", () => {
expect(normalizeTerminalKeyModes({ applicationCursorKeys: true })).toEqual({
applicationCursorKeys: true,
applicationKeypad: false,
bracketedPasteMode: false
});
});
it("触屏键盘区配置符合 SH 精简集", () => {
expect(TERMINAL_TOUCH_DIRECTION_KEYS.map((item) => item.key)).toEqual(["up", "left", "down", "right"]);
expect(TERMINAL_TOUCH_ACTION_BUTTONS.map((item) => item.key)).toEqual([
"enter",
"home",
"shift",
"backspace",
"paste",
"esc",
"ctrlc",
"tab"
]);
expect(TERMINAL_TOUCH_ACTION_BUTTONS.find((item) => item.key === "paste")?.action).toBe("paste");
expect(TERMINAL_TOUCH_ACTION_BUTTONS.find((item) => item.key === "backspace")?.icon).toBe(
"/assets/icons/backspace.svg"
);
expect(TERMINAL_TOUCH_ACTION_BUTTONS.find((item) => item.key === "shift")?.icon).toBe(
"/assets/icons/shift.svg"
);
expect(TERMINAL_TOUCH_ACTION_BUTTONS.find((item) => item.key === "home")?.icon).toBe(
"/assets/icons/home.svg"
);
});
});