83 lines
3.5 KiB
TypeScript
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"
|
|
);
|
|
});
|
|
});
|