2
0

theme-store.test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { expect, test } from "bun:test"
  2. import { Log } from "../../../src/util/log"
  3. Log.init({ print: false })
  4. const { DEFAULT_THEMES, allThemes, addTheme, hasTheme, resolveTheme } = await import(
  5. "../../../src/cli/cmd/tui/context/theme"
  6. )
  7. test("addTheme writes into module theme store", () => {
  8. const name = `plugin-theme-${Date.now()}`
  9. expect(addTheme(name, DEFAULT_THEMES.opencode)).toBe(true)
  10. expect(allThemes()[name]).toBeDefined()
  11. })
  12. test("addTheme keeps first theme for duplicate names", () => {
  13. const name = `plugin-theme-keep-${Date.now()}`
  14. const one = structuredClone(DEFAULT_THEMES.opencode)
  15. const two = structuredClone(DEFAULT_THEMES.opencode)
  16. one.theme.primary = "#101010"
  17. two.theme.primary = "#fefefe"
  18. expect(addTheme(name, one)).toBe(true)
  19. expect(addTheme(name, two)).toBe(false)
  20. expect(allThemes()[name]).toBeDefined()
  21. expect(allThemes()[name]!.theme.primary).toBe("#101010")
  22. })
  23. test("addTheme ignores entries without a theme object", () => {
  24. const name = `plugin-theme-invalid-${Date.now()}`
  25. expect(addTheme(name, { defs: { a: "#ffffff" } })).toBe(false)
  26. expect(allThemes()[name]).toBeUndefined()
  27. })
  28. test("hasTheme checks theme presence", () => {
  29. const name = `plugin-theme-has-${Date.now()}`
  30. expect(hasTheme(name)).toBe(false)
  31. expect(addTheme(name, DEFAULT_THEMES.opencode)).toBe(true)
  32. expect(hasTheme(name)).toBe(true)
  33. })
  34. test("resolveTheme rejects circular color refs", () => {
  35. const item = structuredClone(DEFAULT_THEMES.opencode)
  36. item.defs = {
  37. ...(item.defs ?? {}),
  38. one: "two",
  39. two: "one",
  40. }
  41. item.theme.primary = "one"
  42. expect(() => resolveTheme(item, "dark")).toThrow("Circular color reference")
  43. })