runtime-adapters.test.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { describe, expect, test } from "bun:test"
  2. import {
  3. disposeIfDisposable,
  4. getHoveredLinkText,
  5. getSpeechRecognitionCtor,
  6. hasSetOption,
  7. isDisposable,
  8. setOptionIfSupported,
  9. } from "./runtime-adapters"
  10. describe("runtime adapters", () => {
  11. test("detects and disposes disposable values", () => {
  12. let count = 0
  13. const value = {
  14. dispose: () => {
  15. count += 1
  16. },
  17. }
  18. expect(isDisposable(value)).toBe(true)
  19. disposeIfDisposable(value)
  20. expect(count).toBe(1)
  21. })
  22. test("ignores non-disposable values", () => {
  23. expect(isDisposable({ dispose: "nope" })).toBe(false)
  24. expect(() => disposeIfDisposable({ dispose: "nope" })).not.toThrow()
  25. })
  26. test("sets options only when setter exists", () => {
  27. const calls: Array<[string, unknown]> = []
  28. const value = {
  29. setOption: (key: string, next: unknown) => {
  30. calls.push([key, next])
  31. },
  32. }
  33. expect(hasSetOption(value)).toBe(true)
  34. setOptionIfSupported(value, "fontFamily", "Berkeley Mono")
  35. expect(calls).toEqual([["fontFamily", "Berkeley Mono"]])
  36. expect(() => setOptionIfSupported({}, "fontFamily", "Berkeley Mono")).not.toThrow()
  37. })
  38. test("reads hovered link text safely", () => {
  39. expect(getHoveredLinkText({ currentHoveredLink: { text: "https://example.com" } })).toBe("https://example.com")
  40. expect(getHoveredLinkText({ currentHoveredLink: { text: 1 } })).toBeUndefined()
  41. expect(getHoveredLinkText(null)).toBeUndefined()
  42. })
  43. test("resolves speech recognition constructor with webkit precedence", () => {
  44. // oxlint-disable-next-line no-extraneous-class
  45. class SpeechCtor {}
  46. // oxlint-disable-next-line no-extraneous-class
  47. class WebkitCtor {}
  48. const ctor = getSpeechRecognitionCtor({
  49. SpeechRecognition: SpeechCtor,
  50. webkitSpeechRecognition: WebkitCtor,
  51. })
  52. expect(ctor).toBe(WebkitCtor)
  53. })
  54. test("returns undefined when no valid speech constructor exists", () => {
  55. expect(getSpeechRecognitionCtor({ SpeechRecognition: "nope" })).toBeUndefined()
  56. expect(getSpeechRecognitionCtor(undefined)).toBeUndefined()
  57. })
  58. })