layout.test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { describe, expect, test } from "bun:test"
  2. import { createRoot, createSignal } from "solid-js"
  3. import { createSessionKeyReader, ensureSessionKey, pruneSessionKeys } from "./layout-helpers"
  4. describe("layout session-key helpers", () => {
  5. test("couples touch and scroll seed in order", () => {
  6. const calls: string[] = []
  7. const result = ensureSessionKey(
  8. "dir/a",
  9. (key) => calls.push(`touch:${key}`),
  10. (key) => calls.push(`seed:${key}`),
  11. )
  12. expect(result).toBe("dir/a")
  13. expect(calls).toEqual(["touch:dir/a", "seed:dir/a"])
  14. })
  15. test("reads dynamic accessor keys lazily", () => {
  16. const seen: string[] = []
  17. createRoot((dispose) => {
  18. const [key, setKey] = createSignal("dir/one")
  19. const read = createSessionKeyReader(key, (value) => seen.push(value))
  20. expect(read()).toBe("dir/one")
  21. setKey("dir/two")
  22. expect(read()).toBe("dir/two")
  23. dispose()
  24. })
  25. expect(seen).toEqual(["dir/one", "dir/two"])
  26. })
  27. })
  28. describe("pruneSessionKeys", () => {
  29. test("keeps active key and drops lowest-used keys", () => {
  30. const drop = pruneSessionKeys({
  31. keep: "k4",
  32. max: 3,
  33. used: new Map([
  34. ["k1", 1],
  35. ["k2", 2],
  36. ["k3", 3],
  37. ["k4", 4],
  38. ]),
  39. view: ["k1", "k2", "k4"],
  40. tabs: ["k1", "k3", "k4"],
  41. })
  42. expect(drop).toEqual(["k1"])
  43. expect(drop.includes("k4")).toBe(false)
  44. })
  45. test("does not prune without keep key", () => {
  46. const drop = pruneSessionKeys({
  47. keep: undefined,
  48. max: 1,
  49. used: new Map([
  50. ["k1", 1],
  51. ["k2", 2],
  52. ]),
  53. view: ["k1"],
  54. tabs: ["k2"],
  55. })
  56. expect(drop).toEqual([])
  57. })
  58. })