/** @jsxImportSource @opentui/solid */ import { testRender } from "@opentui/solid" import { expect, test } from "bun:test" import { Schema } from "effect" import { resolve, ConfigProvider, Info, useConfig, type Interface } from "../src/config" test("validates mini replay settings", () => { const decode = Schema.decodeUnknownSync(Info) expect(decode({ mini: { replay: false, replay_limit: 50 } })).toEqual({ mini: { replay: false, replay_limit: 50 }, }) expect(() => decode({ mini: { replay_limit: 0 } })).toThrow() expect(() => decode({ mini: { replay_limit: 1.5 } })).toThrow() }) test("validates the session tabs setting", () => { const decode = Schema.decodeUnknownSync(Info) expect(decode({ tabs: { enabled: true } })).toEqual({ tabs: { enabled: true } }) expect(() => decode({ tabs: { enabled: "on" } })).toThrow() }) test("resolves nested config and keybind defaults", () => { const config = resolve( { keybinds: { leader: "ctrl+o" }, leader: { timeout: 500 }, scroll: { speed: 2, acceleration: true }, diffs: { view: "split" }, debug: { devtools: true }, }, { terminalSuspend: true }, ) expect(config.leader.timeout).toBe(500) expect(config.keybinds.get("leader")?.[0]?.key).toBe("ctrl+o") expect(config.scroll).toEqual({ speed: 2, acceleration: true }) expect(config.diffs).toEqual({ view: "split" }) expect(config.debug).toEqual({ devtools: true }) }) test("provides config and its host interface", async () => { const config = resolve({}, { terminalSuspend: true }) let current = {} const service: Interface = { get: async () => current, update: async (update) => { const draft: Record = { ...current } update(draft) current = draft return draft }, } let context: ReturnType | undefined function Consumer() { context = useConfig() return {`${context.data.mouse ? "mouse" : "none"} ${context.data.keybinds.get("leader")?.[0]?.key}`} } const app = await testRender(() => ( )) try { await app.renderOnce() expect(app.captureCharFrame()).toContain("mouse ctrl+x") if (!context) throw new Error("Config context was not provided") await context.update((draft) => { draft.mouse = false draft.keybinds = { leader: "ctrl+o" } }) await app.renderOnce() expect(app.captureCharFrame()).toContain("none ctrl+o") } finally { app.renderer.destroy() } })