/** @jsxImportSource @opentui/solid */ import { createDefaultOpenTuiKeymap } from "@opentui/keymap/opentui" import { testRender, useRenderer } from "@opentui/solid" import { expect, test } from "bun:test" import { createSignal, onCleanup, type JSX } from "solid-js" import { ConfigProvider } from "../../src/config" import { ThemeProvider } from "../../src/context/theme" import { OpencodeKeymapProvider, registerOpencodeKeymap } from "../../src/keymap" import { DialogProvider } from "../../src/ui/dialog" import { DialogSelect } from "../../src/ui/dialog-select" import { ToastProvider } from "../../src/ui/toast" import { TestTuiContexts } from "../fixture/tui-environment" import { createTuiResolvedConfig } from "../fixture/tui-runtime" async function mountDialogSelect(content: () => JSX.Element) { const config = createTuiResolvedConfig() function Harness() { const renderer = useRenderer() const keymap = createDefaultOpenTuiKeymap(renderer) const off = registerOpencodeKeymap(keymap, renderer, config) onCleanup(off) return ( Promise.resolve({}) }}> {content()} ) } const app = await testRender(() => , { width: 80, height: 20 }) app.renderer.start() return app } test("distinguishes loading, unfiltered empty, and filtered no-match states", async () => { const [loading, setLoading] = createSignal(true) const app = await mountDialogSelect(() => ( Could not load skills} /> )) try { await app.waitForFrame((frame) => frame.includes("Loading...")) setLoading(false) await app.waitForFrame((frame) => frame.includes("Could not load skills")) await app.mockInput.typeText("missing") await app.waitForFrame((frame) => frame.includes("No matching results")) expect(app.captureCharFrame()).not.toContain("Could not load skills") } finally { app.renderer.destroy() } }) test("uses a generic fallback for an unfiltered empty list", async () => { const app = await mountDialogSelect(() => ) try { await app.waitForFrame((frame) => frame.includes("No items")) } finally { app.renderer.destroy() } })