87 lines
2.4 KiB
TypeScript
87 lines
2.4 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { visibleWidth } from "@mariozechner/pi-tui";
|
|
import { ASK_HELP_CLOSE_HINT, ASK_KEYMAPS } from "../src/constants/keymaps.ts";
|
|
import { AskSettingsModal } from "../src/ui/settings-modal.ts";
|
|
|
|
const noop = () => {
|
|
// Test callback intentionally does nothing.
|
|
};
|
|
|
|
function plainTheme() {
|
|
return {
|
|
fg(_color: string, text: string) {
|
|
return text;
|
|
},
|
|
bg(_color: string, text: string) {
|
|
return text;
|
|
},
|
|
};
|
|
}
|
|
|
|
test("settings modal renders compactly on phone-width screens", () => {
|
|
const modal = new AskSettingsModal(plainTheme(), noop);
|
|
const lines = modal.render(28);
|
|
|
|
assert(lines.length > ASK_KEYMAPS.length + 4);
|
|
assert(lines.every((line) => visibleWidth(line) <= 28));
|
|
assert(lines.join("\n").includes("@eko24ive/pi-ask"));
|
|
assert(lines.slice(-3, -1).join(" ").includes("Esc, Ctrl+C, or ?"));
|
|
assert(lines[1]?.includes("Keymaps"));
|
|
assert.equal(lines[2], "│ │");
|
|
assert(lines.includes("│ ? │"));
|
|
assert(lines.includes("│ Show this menu │"));
|
|
assert.equal(lines[0]?.includes("├"), false);
|
|
});
|
|
|
|
test("settings modal keeps context rows on wider screens", () => {
|
|
const modal = new AskSettingsModal(plainTheme(), noop);
|
|
const lines = modal.render(72);
|
|
|
|
assert(lines.length > ASK_KEYMAPS.length + 4);
|
|
assert(lines.join("\n").includes("Main flow"));
|
|
assert(lines.at(-2)?.includes(ASK_HELP_CLOSE_HINT));
|
|
});
|
|
|
|
test("settings modal switches tabs and closes from configured shortcuts", () => {
|
|
let closed = 0;
|
|
const modal = new AskSettingsModal(plainTheme(), () => {
|
|
closed += 1;
|
|
});
|
|
|
|
modal.handleInput("\t");
|
|
assert(
|
|
modal.render(72).join("\n").includes("Behaviour settings coming soon.")
|
|
);
|
|
assert(modal.render(72).join("\n").includes("Behaviour"));
|
|
|
|
modal.handleInput("\u001b[Z");
|
|
assert.equal(
|
|
modal.render(72).join("\n").includes("Behaviour settings coming soon."),
|
|
false
|
|
);
|
|
|
|
for (const input of ["?", "\u001b", "\u0003"]) {
|
|
const closable = new AskSettingsModal(plainTheme(), () => {
|
|
closed += 1;
|
|
});
|
|
closable.handleInput(input);
|
|
}
|
|
|
|
assert.equal(closed, 3);
|
|
});
|
|
|
|
test("settings modal ignores enter and closes idempotently on dispose", () => {
|
|
let closed = 0;
|
|
const modal = new AskSettingsModal(plainTheme(), () => {
|
|
closed += 1;
|
|
});
|
|
|
|
modal.handleInput("\r");
|
|
assert.equal(closed, 0);
|
|
|
|
modal.dispose();
|
|
modal.dispose();
|
|
assert.equal(closed, 1);
|
|
});
|