import { describe, expect, test } from "bun:test" import { disposeIfDisposable, getHoveredLinkText, getSpeechRecognitionCtor, hasSetOption, isDisposable, setOptionIfSupported, } from "./runtime-adapters" describe("runtime adapters", () => { test("detects and disposes disposable values", () => { let count = 0 const value = { dispose: () => { count += 1 }, } expect(isDisposable(value)).toBe(true) disposeIfDisposable(value) expect(count).toBe(1) }) test("ignores non-disposable values", () => { expect(isDisposable({ dispose: "nope" })).toBe(false) expect(() => disposeIfDisposable({ dispose: "nope" })).not.toThrow() }) test("sets options only when setter exists", () => { const calls: Array<[string, unknown]> = [] const value = { setOption: (key: string, next: unknown) => { calls.push([key, next]) }, } expect(hasSetOption(value)).toBe(true) setOptionIfSupported(value, "fontFamily", "Berkeley Mono") expect(calls).toEqual([["fontFamily", "Berkeley Mono"]]) expect(() => setOptionIfSupported({}, "fontFamily", "Berkeley Mono")).not.toThrow() }) test("reads hovered link text safely", () => { expect(getHoveredLinkText({ currentHoveredLink: { text: "https://example.com" } })).toBe("https://example.com") expect(getHoveredLinkText({ currentHoveredLink: { text: 1 } })).toBeUndefined() expect(getHoveredLinkText(null)).toBeUndefined() }) test("resolves speech recognition constructor with webkit precedence", () => { class SpeechCtor {} class WebkitCtor {} const ctor = getSpeechRecognitionCtor({ SpeechRecognition: SpeechCtor, webkitSpeechRecognition: WebkitCtor, }) expect(ctor).toBe(WebkitCtor) }) test("returns undefined when no valid speech constructor exists", () => { expect(getSpeechRecognitionCtor({ SpeechRecognition: "nope" })).toBeUndefined() expect(getSpeechRecognitionCtor(undefined)).toBeUndefined() }) })