solid-virtual.test.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { expect, test } from "bun:test"
  2. import { createVirtualizer, defaultRangeExtractor } from "@tanstack/solid-virtual"
  3. import { createRoot, createSignal } from "solid-js"
  4. import { filterVirtualIndexes } from "@/pages/session/timeline/virtual-items"
  5. test("reactive count updates preserve measured row sizes", () => {
  6. createRoot((dispose) => {
  7. const [count, setCount] = createSignal(2)
  8. const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
  9. get count() {
  10. return count()
  11. },
  12. getScrollElement: () => null,
  13. estimateSize: () => 60,
  14. initialRect: { width: 800, height: 600 },
  15. })
  16. expect(virtualizer.getTotalSize()).toBe(120)
  17. virtualizer.resizeItem(0, 100)
  18. expect(virtualizer.getTotalSize()).toBe(160)
  19. setCount(3)
  20. expect(virtualizer.itemSizeCache.get(0)).toBe(100)
  21. expect(virtualizer.getTotalSize()).toBe(220)
  22. dispose()
  23. })
  24. })
  25. test("logical scroll offset includes pending measurement adjustments", () => {
  26. createRoot((dispose) => {
  27. const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
  28. count: 2,
  29. getScrollElement: () => null,
  30. estimateSize: () => 60,
  31. initialOffset: 100,
  32. initialRect: { width: 800, height: 60 },
  33. })
  34. virtualizer.getTotalSize()
  35. virtualizer.resizeItem(0, 100)
  36. expect(virtualizer.scrollOffset).toBe(100)
  37. expect(virtualizer.getLogicalScrollOffset()).toBe(140)
  38. dispose()
  39. })
  40. })
  41. test("stale pinned indexes do not produce missing virtual items after count shrinks", () => {
  42. createRoot((dispose) => {
  43. const [count, setCount] = createSignal(2)
  44. const pinned = [1]
  45. const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
  46. get count() {
  47. return count()
  48. },
  49. getScrollElement: () => null,
  50. estimateSize: () => 60,
  51. initialRect: { width: 800, height: 600 },
  52. rangeExtractor: (range) =>
  53. filterVirtualIndexes([...new Set([...defaultRangeExtractor(range), ...pinned])], range.count),
  54. })
  55. expect(virtualizer.getVirtualItems().map((item) => item.index)).toEqual([0, 1])
  56. setCount(1)
  57. expect(virtualizer.getVirtualItems().map((item) => item.index)).toEqual([0])
  58. expect(() => new Map(virtualizer.getVirtualItems().map((item) => [item.key, item]))).not.toThrow()
  59. dispose()
  60. })
  61. })