Files
opencode/packages/tui/test/keymap.test.tsx
opencode-agent[bot] b4a4ef0b3c refactor(tui): remove legacy keymap layer (#37206)
Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: Dax Raad <d@ironbay.co>
2026-07-16 21:33:15 +00:00

118 lines
3.1 KiB
TypeScript

/** @jsxImportSource @opentui/solid */
import { testRender } from "@opentui/solid"
import { expect, test } from "bun:test"
import { ConfigProvider } from "../src/config"
import { Keymap } from "../src/context/keymap"
import { createTuiResolvedConfig } from "./fixture/tui-runtime"
test("legacy page key aliases compile as page keys", async () => {
let read = () => ({ up: "", down: "" })
function Harness() {
const shortcuts = Keymap.useShortcuts()
Keymap.createLayer(() => ({
commands: [
{ id: "session.page.up", run() {} },
{ id: "session.page.down", run() {} },
],
}))
read = () => ({
up: shortcuts.get("session.page.up") ?? "",
down: shortcuts.get("session.page.down") ?? "",
})
return <box />
}
const app = await testRender(() => (
<ConfigProvider
config={createTuiResolvedConfig({
keybinds: {
messages_page_up: "pgup",
messages_page_down: "pgdown",
},
})}
>
<Keymap.Provider>
<Harness />
</Keymap.Provider>
</ConfigProvider>
))
try {
expect(read()).toEqual({ up: "pgup", down: "pgdn" })
} finally {
app.renderer.destroy()
}
})
test("formats navigation keys as arrows", async () => {
let read = () => ({}) as Record<string, string>
const commands = ["session.parent", "session.child.first", "session.child.previous", "session.child.next"]
function Harness() {
const shortcuts = Keymap.useShortcuts()
Keymap.createLayer(() => ({
commands: commands.map((id) => ({ id, run() {} })),
}))
read = () => Object.fromEntries(commands.map((id) => [id, shortcuts.get(id) ?? ""]))
return <box />
}
const app = await testRender(() => (
<ConfigProvider config={createTuiResolvedConfig()}>
<Keymap.Provider>
<Harness />
</Keymap.Provider>
</ConfigProvider>
))
try {
expect(read()).toEqual({
"session.parent": "↑",
"session.child.first": "↓",
"session.child.previous": "←",
"session.child.next": "→",
})
} finally {
app.renderer.destroy()
}
})
test("global commands stay reachable when the mode changes", async () => {
const calls: string[] = []
let exercise = () => {}
function Harness() {
const keymap = Keymap.use()
Keymap.createLayer(() => ({
mode: "global",
commands: [{ id: "session.list", run: () => void calls.push("global") }],
}))
Keymap.createLayer(() => ({
commands: [{ id: "model.list", run: () => void calls.push("base") }],
}))
exercise = () => {
keymap.dispatch("session.list")
keymap.dispatch("model.list")
const pop = keymap.mode.push("question")
keymap.dispatch("session.list")
keymap.dispatch("model.list")
pop()
}
return <box />
}
const app = await testRender(() => (
<ConfigProvider config={createTuiResolvedConfig()}>
<Keymap.Provider>
<Harness />
</Keymap.Provider>
</ConfigProvider>
))
try {
exercise()
expect(calls).toEqual(["global", "base", "global"])
} finally {
app.renderer.destroy()
}
})