mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-12 02:18:43 +00:00
Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { createVirtualizer, defaultRangeExtractor } from "@tanstack/solid-virtual"
|
|
import { createRoot, createSignal } from "solid-js"
|
|
import { filterVirtualIndexes } from "@/pages/session/timeline/virtual-items"
|
|
|
|
test("reactive count updates preserve measured row sizes", () => {
|
|
createRoot((dispose) => {
|
|
const [count, setCount] = createSignal(2)
|
|
const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
|
|
get count() {
|
|
return count()
|
|
},
|
|
getScrollElement: () => null,
|
|
estimateSize: () => 60,
|
|
initialRect: { width: 800, height: 600 },
|
|
})
|
|
|
|
expect(virtualizer.getTotalSize()).toBe(120)
|
|
virtualizer.resizeItem(0, 100)
|
|
expect(virtualizer.getTotalSize()).toBe(160)
|
|
|
|
setCount(3)
|
|
|
|
expect(virtualizer.itemSizeCache.get(0)).toBe(100)
|
|
expect(virtualizer.getTotalSize()).toBe(220)
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test("initial rect projects rows before a scroll element connects", () => {
|
|
createRoot((dispose) => {
|
|
const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
|
|
count: 100,
|
|
getScrollElement: () => null,
|
|
estimateSize: () => 28,
|
|
initialRect: { width: 0, height: 600 },
|
|
overscan: 10,
|
|
})
|
|
|
|
expect(virtualizer.getVirtualItems().length).toBeGreaterThan(0)
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test("logical scroll offset includes pending measurement adjustments", () => {
|
|
createRoot((dispose) => {
|
|
const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
|
|
count: 2,
|
|
getScrollElement: () => null,
|
|
estimateSize: () => 60,
|
|
initialOffset: 100,
|
|
initialRect: { width: 800, height: 60 },
|
|
})
|
|
|
|
virtualizer.getTotalSize()
|
|
virtualizer.resizeItem(0, 100)
|
|
|
|
expect(virtualizer.scrollOffset).toBe(100)
|
|
expect(virtualizer.getLogicalScrollOffset()).toBe(140)
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test("stale pinned indexes do not produce missing virtual items after count shrinks", () => {
|
|
createRoot((dispose) => {
|
|
const [count, setCount] = createSignal(2)
|
|
const pinned = [1]
|
|
const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
|
|
get count() {
|
|
return count()
|
|
},
|
|
getScrollElement: () => null,
|
|
estimateSize: () => 60,
|
|
initialRect: { width: 800, height: 600 },
|
|
rangeExtractor: (range) =>
|
|
filterVirtualIndexes([...new Set([...defaultRangeExtractor(range), ...pinned])], range.count),
|
|
})
|
|
|
|
expect(virtualizer.getVirtualItems().map((item) => item.index)).toEqual([0, 1])
|
|
setCount(1)
|
|
expect(virtualizer.getVirtualItems().map((item) => item.index)).toEqual([0])
|
|
expect(() => new Map(virtualizer.getVirtualItems().map((item) => [item.key, item]))).not.toThrow()
|
|
dispose()
|
|
})
|
|
})
|