@pyreon/virtual 0.24.4 → 0.24.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -8
- package/src/index.ts +0 -32
- package/src/manifest.ts +0 -129
- package/src/tests/manifest-snapshot.test.ts +0 -87
- package/src/tests/virtual-comprehensive.test.tsx +0 -564
- package/src/tests/virtual.test.tsx +0 -612
- package/src/use-virtualizer.ts +0 -119
- package/src/use-window-virtualizer.ts +0 -101
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
import { signal } from '@pyreon/reactivity'
|
|
2
|
-
import { mount } from '@pyreon/runtime-dom'
|
|
3
|
-
import { useVirtualizer, useWindowVirtualizer } from '../index'
|
|
4
|
-
|
|
5
|
-
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
function mountWith<T>(fn: () => T): { result: T; unmount: () => void } {
|
|
8
|
-
let result: T | undefined
|
|
9
|
-
const el = document.createElement('div')
|
|
10
|
-
document.body.appendChild(el)
|
|
11
|
-
const Wrapper = () => {
|
|
12
|
-
result = fn()
|
|
13
|
-
return null
|
|
14
|
-
}
|
|
15
|
-
const unmount = mount(<Wrapper />, el)
|
|
16
|
-
return {
|
|
17
|
-
result: result!,
|
|
18
|
-
unmount: () => {
|
|
19
|
-
unmount()
|
|
20
|
-
el.remove()
|
|
21
|
-
},
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function createScrollContainer(height = 200): HTMLDivElement {
|
|
26
|
-
const container = document.createElement('div')
|
|
27
|
-
Object.defineProperty(container, 'offsetHeight', { value: height })
|
|
28
|
-
Object.defineProperty(container, 'offsetWidth', { value: 300 })
|
|
29
|
-
Object.defineProperty(container, 'scrollHeight', { value: 10000 })
|
|
30
|
-
Object.defineProperty(container, 'clientHeight', { value: height })
|
|
31
|
-
document.body.appendChild(container)
|
|
32
|
-
return container
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// ─── useVirtualizer — virtualItems signal ──────────────────────────────────
|
|
36
|
-
|
|
37
|
-
describe('useVirtualizer — virtualItems signal', () => {
|
|
38
|
-
it('returns a signal that holds an array of VirtualItem', () => {
|
|
39
|
-
const container = createScrollContainer()
|
|
40
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
41
|
-
useVirtualizer(() => ({
|
|
42
|
-
count: 100,
|
|
43
|
-
getScrollElement: () => container,
|
|
44
|
-
estimateSize: () => 50,
|
|
45
|
-
})),
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
const items = virt.virtualItems()
|
|
49
|
-
expect(Array.isArray(items)).toBe(true)
|
|
50
|
-
expect(items.length).toBeGreaterThan(0)
|
|
51
|
-
unmount()
|
|
52
|
-
container.remove()
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('virtual items have index, start, end, size, key properties', () => {
|
|
56
|
-
const container = createScrollContainer()
|
|
57
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
58
|
-
useVirtualizer(() => ({
|
|
59
|
-
count: 100,
|
|
60
|
-
getScrollElement: () => container,
|
|
61
|
-
estimateSize: () => 50,
|
|
62
|
-
})),
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
const items = virt.virtualItems()
|
|
66
|
-
expect(items.length).toBeGreaterThan(0)
|
|
67
|
-
const first = items[0]!
|
|
68
|
-
expect(typeof first.index).toBe('number')
|
|
69
|
-
expect(typeof first.start).toBe('number')
|
|
70
|
-
expect(typeof first.end).toBe('number')
|
|
71
|
-
expect(typeof first.size).toBe('number')
|
|
72
|
-
expect(first.key).toBeDefined()
|
|
73
|
-
unmount()
|
|
74
|
-
container.remove()
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('first item starts at index 0', () => {
|
|
78
|
-
const container = createScrollContainer()
|
|
79
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
80
|
-
useVirtualizer(() => ({
|
|
81
|
-
count: 100,
|
|
82
|
-
getScrollElement: () => container,
|
|
83
|
-
estimateSize: () => 50,
|
|
84
|
-
})),
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
expect(virt.virtualItems()[0]!.index).toBe(0)
|
|
88
|
-
unmount()
|
|
89
|
-
container.remove()
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
// ─── useVirtualizer — totalSize signal ─────────────────────────────────────
|
|
94
|
-
|
|
95
|
-
describe('useVirtualizer — totalSize signal', () => {
|
|
96
|
-
it('returns count * estimateSize for uniform items', () => {
|
|
97
|
-
const container = createScrollContainer()
|
|
98
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
99
|
-
useVirtualizer(() => ({
|
|
100
|
-
count: 100,
|
|
101
|
-
getScrollElement: () => container,
|
|
102
|
-
estimateSize: () => 50,
|
|
103
|
-
})),
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
expect(virt.totalSize()).toBe(5000) // 100 * 50
|
|
107
|
-
unmount()
|
|
108
|
-
container.remove()
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
it('includes padding in totalSize', () => {
|
|
112
|
-
const container = createScrollContainer()
|
|
113
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
114
|
-
useVirtualizer(() => ({
|
|
115
|
-
count: 10,
|
|
116
|
-
getScrollElement: () => container,
|
|
117
|
-
estimateSize: () => 50,
|
|
118
|
-
paddingStart: 20,
|
|
119
|
-
paddingEnd: 30,
|
|
120
|
-
})),
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
expect(virt.totalSize()).toBe(550) // 10*50 + 20 + 30
|
|
124
|
-
unmount()
|
|
125
|
-
container.remove()
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
it('includes gaps in totalSize', () => {
|
|
129
|
-
const container = createScrollContainer()
|
|
130
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
131
|
-
useVirtualizer(() => ({
|
|
132
|
-
count: 10,
|
|
133
|
-
getScrollElement: () => container,
|
|
134
|
-
estimateSize: () => 50,
|
|
135
|
-
gap: 10,
|
|
136
|
-
})),
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
expect(virt.totalSize()).toBe(590) // 10*50 + 9*10
|
|
140
|
-
unmount()
|
|
141
|
-
container.remove()
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
it('returns 0 when count is 0', () => {
|
|
145
|
-
const container = createScrollContainer()
|
|
146
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
147
|
-
useVirtualizer(() => ({
|
|
148
|
-
count: 0,
|
|
149
|
-
getScrollElement: () => container,
|
|
150
|
-
estimateSize: () => 50,
|
|
151
|
-
})),
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
expect(virt.totalSize()).toBe(0)
|
|
155
|
-
unmount()
|
|
156
|
-
container.remove()
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
// ─── useVirtualizer — count changes update virtualItems ────────────────────
|
|
161
|
-
|
|
162
|
-
describe('useVirtualizer — count changes update virtualItems', () => {
|
|
163
|
-
it('increasing count increases totalSize', () => {
|
|
164
|
-
const container = createScrollContainer()
|
|
165
|
-
const count = signal(100)
|
|
166
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
167
|
-
useVirtualizer(() => ({
|
|
168
|
-
count: count(),
|
|
169
|
-
getScrollElement: () => container,
|
|
170
|
-
estimateSize: () => 50,
|
|
171
|
-
})),
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
expect(virt.totalSize()).toBe(5000)
|
|
175
|
-
|
|
176
|
-
count.set(200)
|
|
177
|
-
expect(virt.totalSize()).toBe(10000)
|
|
178
|
-
|
|
179
|
-
count.set(50)
|
|
180
|
-
expect(virt.totalSize()).toBe(2500)
|
|
181
|
-
unmount()
|
|
182
|
-
container.remove()
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('setting count to 0 empties virtualItems', () => {
|
|
186
|
-
const container = createScrollContainer()
|
|
187
|
-
const count = signal(100)
|
|
188
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
189
|
-
useVirtualizer(() => ({
|
|
190
|
-
count: count(),
|
|
191
|
-
getScrollElement: () => container,
|
|
192
|
-
estimateSize: () => 50,
|
|
193
|
-
})),
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
expect(virt.virtualItems().length).toBeGreaterThan(0)
|
|
197
|
-
|
|
198
|
-
count.set(0)
|
|
199
|
-
expect(virt.virtualItems()).toHaveLength(0)
|
|
200
|
-
expect(virt.totalSize()).toBe(0)
|
|
201
|
-
unmount()
|
|
202
|
-
container.remove()
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
it('growing count from 0 creates virtualItems', () => {
|
|
206
|
-
const container = createScrollContainer()
|
|
207
|
-
const count = signal(0)
|
|
208
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
209
|
-
useVirtualizer(() => ({
|
|
210
|
-
count: count(),
|
|
211
|
-
getScrollElement: () => container,
|
|
212
|
-
estimateSize: () => 50,
|
|
213
|
-
})),
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
expect(virt.virtualItems()).toHaveLength(0)
|
|
217
|
-
|
|
218
|
-
count.set(100)
|
|
219
|
-
expect(virt.virtualItems().length).toBeGreaterThan(0)
|
|
220
|
-
expect(virt.totalSize()).toBe(5000)
|
|
221
|
-
unmount()
|
|
222
|
-
container.remove()
|
|
223
|
-
})
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
// ─── useVirtualizer — estimateSize callback ────────────────────────────────
|
|
227
|
-
|
|
228
|
-
describe('useVirtualizer — estimateSize callback', () => {
|
|
229
|
-
it('uses the provided estimateSize for totalSize calculation', () => {
|
|
230
|
-
const container = createScrollContainer()
|
|
231
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
232
|
-
useVirtualizer(() => ({
|
|
233
|
-
count: 10,
|
|
234
|
-
getScrollElement: () => container,
|
|
235
|
-
estimateSize: () => 100,
|
|
236
|
-
})),
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
expect(virt.totalSize()).toBe(1000) // 10 * 100
|
|
240
|
-
unmount()
|
|
241
|
-
container.remove()
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
it('reactive estimateSize updates totalSize after measure()', () => {
|
|
245
|
-
const container = createScrollContainer()
|
|
246
|
-
const itemSize = signal(50)
|
|
247
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
248
|
-
useVirtualizer(() => ({
|
|
249
|
-
count: 100,
|
|
250
|
-
getScrollElement: () => container,
|
|
251
|
-
estimateSize: () => itemSize(),
|
|
252
|
-
})),
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
expect(virt.totalSize()).toBe(5000)
|
|
256
|
-
|
|
257
|
-
itemSize.set(100)
|
|
258
|
-
virt.instance.measure()
|
|
259
|
-
expect(virt.totalSize()).toBe(10000)
|
|
260
|
-
unmount()
|
|
261
|
-
container.remove()
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
it('small estimateSize produces more visible items', () => {
|
|
265
|
-
const container = createScrollContainer(200)
|
|
266
|
-
const { result: small, unmount: u1 } = mountWith(() =>
|
|
267
|
-
useVirtualizer(() => ({
|
|
268
|
-
count: 1000,
|
|
269
|
-
getScrollElement: () => container,
|
|
270
|
-
estimateSize: () => 20,
|
|
271
|
-
overscan: 0,
|
|
272
|
-
})),
|
|
273
|
-
)
|
|
274
|
-
|
|
275
|
-
const { result: large, unmount: u2 } = mountWith(() =>
|
|
276
|
-
useVirtualizer(() => ({
|
|
277
|
-
count: 1000,
|
|
278
|
-
getScrollElement: () => container,
|
|
279
|
-
estimateSize: () => 100,
|
|
280
|
-
overscan: 0,
|
|
281
|
-
})),
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
// Smaller items = more items visible in same container
|
|
285
|
-
expect(small.virtualItems().length).toBeGreaterThanOrEqual(large.virtualItems().length)
|
|
286
|
-
u1()
|
|
287
|
-
u2()
|
|
288
|
-
container.remove()
|
|
289
|
-
})
|
|
290
|
-
})
|
|
291
|
-
|
|
292
|
-
// ─── useVirtualizer — additional options ───────────────────────────────────
|
|
293
|
-
|
|
294
|
-
describe('useVirtualizer — additional options', () => {
|
|
295
|
-
it('overscan controls extra items rendered', () => {
|
|
296
|
-
const container = createScrollContainer(200)
|
|
297
|
-
const { result: noOverscan, unmount: u1 } = mountWith(() =>
|
|
298
|
-
useVirtualizer(() => ({
|
|
299
|
-
count: 1000,
|
|
300
|
-
getScrollElement: () => container,
|
|
301
|
-
estimateSize: () => 35,
|
|
302
|
-
overscan: 0,
|
|
303
|
-
})),
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
const { result: withOverscan, unmount: u2 } = mountWith(() =>
|
|
307
|
-
useVirtualizer(() => ({
|
|
308
|
-
count: 1000,
|
|
309
|
-
getScrollElement: () => container,
|
|
310
|
-
estimateSize: () => 35,
|
|
311
|
-
overscan: 10,
|
|
312
|
-
})),
|
|
313
|
-
)
|
|
314
|
-
|
|
315
|
-
expect(withOverscan.virtualItems().length).toBeGreaterThanOrEqual(
|
|
316
|
-
noOverscan.virtualItems().length,
|
|
317
|
-
)
|
|
318
|
-
u1()
|
|
319
|
-
u2()
|
|
320
|
-
container.remove()
|
|
321
|
-
})
|
|
322
|
-
|
|
323
|
-
it('horizontal mode works', () => {
|
|
324
|
-
const container = createScrollContainer()
|
|
325
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
326
|
-
useVirtualizer(() => ({
|
|
327
|
-
count: 100,
|
|
328
|
-
getScrollElement: () => container,
|
|
329
|
-
estimateSize: () => 100,
|
|
330
|
-
horizontal: true,
|
|
331
|
-
})),
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
expect(virt.totalSize()).toBe(10000)
|
|
335
|
-
expect(virt.virtualItems().length).toBeGreaterThan(0)
|
|
336
|
-
unmount()
|
|
337
|
-
container.remove()
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
it('enabled: false produces empty output', () => {
|
|
341
|
-
const container = createScrollContainer()
|
|
342
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
343
|
-
useVirtualizer(() => ({
|
|
344
|
-
count: 100,
|
|
345
|
-
getScrollElement: () => container,
|
|
346
|
-
estimateSize: () => 50,
|
|
347
|
-
enabled: false,
|
|
348
|
-
})),
|
|
349
|
-
)
|
|
350
|
-
|
|
351
|
-
expect(virt.virtualItems()).toHaveLength(0)
|
|
352
|
-
expect(virt.totalSize()).toBe(0)
|
|
353
|
-
unmount()
|
|
354
|
-
container.remove()
|
|
355
|
-
})
|
|
356
|
-
|
|
357
|
-
it('isScrolling starts as false', () => {
|
|
358
|
-
const container = createScrollContainer()
|
|
359
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
360
|
-
useVirtualizer(() => ({
|
|
361
|
-
count: 100,
|
|
362
|
-
getScrollElement: () => container,
|
|
363
|
-
estimateSize: () => 50,
|
|
364
|
-
})),
|
|
365
|
-
)
|
|
366
|
-
|
|
367
|
-
expect(virt.isScrolling()).toBe(false)
|
|
368
|
-
unmount()
|
|
369
|
-
container.remove()
|
|
370
|
-
})
|
|
371
|
-
|
|
372
|
-
it('exposes instance with scrollToIndex and scrollToOffset', () => {
|
|
373
|
-
const container = createScrollContainer()
|
|
374
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
375
|
-
useVirtualizer(() => ({
|
|
376
|
-
count: 100,
|
|
377
|
-
getScrollElement: () => container,
|
|
378
|
-
estimateSize: () => 50,
|
|
379
|
-
})),
|
|
380
|
-
)
|
|
381
|
-
|
|
382
|
-
expect(typeof virt.instance.scrollToIndex).toBe('function')
|
|
383
|
-
expect(typeof virt.instance.scrollToOffset).toBe('function')
|
|
384
|
-
expect(typeof virt.instance.measureElement).toBe('function')
|
|
385
|
-
unmount()
|
|
386
|
-
container.remove()
|
|
387
|
-
})
|
|
388
|
-
})
|
|
389
|
-
|
|
390
|
-
// ─── useWindowVirtualizer ──────────────────────────────────────────────────
|
|
391
|
-
|
|
392
|
-
describe('useWindowVirtualizer — comprehensive', () => {
|
|
393
|
-
beforeEach(() => {
|
|
394
|
-
Object.defineProperty(window, 'innerHeight', {
|
|
395
|
-
value: 768,
|
|
396
|
-
writable: true,
|
|
397
|
-
configurable: true,
|
|
398
|
-
})
|
|
399
|
-
Object.defineProperty(window, 'innerWidth', {
|
|
400
|
-
value: 1024,
|
|
401
|
-
writable: true,
|
|
402
|
-
configurable: true,
|
|
403
|
-
})
|
|
404
|
-
Object.defineProperty(window, 'scrollY', {
|
|
405
|
-
value: 0,
|
|
406
|
-
writable: true,
|
|
407
|
-
configurable: true,
|
|
408
|
-
})
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
it('returns virtualItems, totalSize, isScrolling signals', () => {
|
|
412
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
413
|
-
useWindowVirtualizer(() => ({
|
|
414
|
-
count: 1000,
|
|
415
|
-
estimateSize: () => 35,
|
|
416
|
-
})),
|
|
417
|
-
)
|
|
418
|
-
|
|
419
|
-
expect(typeof virt.virtualItems).toBe('function')
|
|
420
|
-
expect(typeof virt.totalSize).toBe('function')
|
|
421
|
-
expect(typeof virt.isScrolling).toBe('function')
|
|
422
|
-
expect(Array.isArray(virt.virtualItems())).toBe(true)
|
|
423
|
-
expect(typeof virt.totalSize()).toBe('number')
|
|
424
|
-
expect(typeof virt.isScrolling()).toBe('boolean')
|
|
425
|
-
unmount()
|
|
426
|
-
})
|
|
427
|
-
|
|
428
|
-
it('totalSize equals count * estimateSize', () => {
|
|
429
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
430
|
-
useWindowVirtualizer(() => ({
|
|
431
|
-
count: 100,
|
|
432
|
-
estimateSize: () => 50,
|
|
433
|
-
})),
|
|
434
|
-
)
|
|
435
|
-
|
|
436
|
-
expect(virt.totalSize()).toBe(5000)
|
|
437
|
-
unmount()
|
|
438
|
-
})
|
|
439
|
-
|
|
440
|
-
it('reactive count updates totalSize', () => {
|
|
441
|
-
const count = signal(100)
|
|
442
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
443
|
-
useWindowVirtualizer(() => ({
|
|
444
|
-
count: count(),
|
|
445
|
-
estimateSize: () => 50,
|
|
446
|
-
})),
|
|
447
|
-
)
|
|
448
|
-
|
|
449
|
-
expect(virt.totalSize()).toBe(5000)
|
|
450
|
-
|
|
451
|
-
count.set(200)
|
|
452
|
-
expect(virt.totalSize()).toBe(10000)
|
|
453
|
-
|
|
454
|
-
count.set(0)
|
|
455
|
-
expect(virt.totalSize()).toBe(0)
|
|
456
|
-
unmount()
|
|
457
|
-
})
|
|
458
|
-
|
|
459
|
-
it('reactive estimateSize updates totalSize after measure()', () => {
|
|
460
|
-
const size = signal(50)
|
|
461
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
462
|
-
useWindowVirtualizer(() => ({
|
|
463
|
-
count: 100,
|
|
464
|
-
estimateSize: () => size(),
|
|
465
|
-
})),
|
|
466
|
-
)
|
|
467
|
-
|
|
468
|
-
expect(virt.totalSize()).toBe(5000)
|
|
469
|
-
|
|
470
|
-
size.set(100)
|
|
471
|
-
virt.instance.measure()
|
|
472
|
-
expect(virt.totalSize()).toBe(10000)
|
|
473
|
-
unmount()
|
|
474
|
-
})
|
|
475
|
-
|
|
476
|
-
it('SSR-safe — handles missing document/window', () => {
|
|
477
|
-
const origDoc = globalThis.document
|
|
478
|
-
const origWin = globalThis.window
|
|
479
|
-
try {
|
|
480
|
-
// @ts-expect-error — temporarily remove globals
|
|
481
|
-
delete globalThis.document
|
|
482
|
-
// @ts-expect-error
|
|
483
|
-
delete globalThis.window
|
|
484
|
-
|
|
485
|
-
const { totalSize } = useWindowVirtualizer(() => ({
|
|
486
|
-
count: 100,
|
|
487
|
-
estimateSize: () => 50,
|
|
488
|
-
}))
|
|
489
|
-
|
|
490
|
-
expect(totalSize()).toBeGreaterThanOrEqual(0)
|
|
491
|
-
} finally {
|
|
492
|
-
globalThis.document = origDoc
|
|
493
|
-
globalThis.window = origWin
|
|
494
|
-
}
|
|
495
|
-
})
|
|
496
|
-
|
|
497
|
-
it('gap affects totalSize', () => {
|
|
498
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
499
|
-
useWindowVirtualizer(() => ({
|
|
500
|
-
count: 10,
|
|
501
|
-
estimateSize: () => 50,
|
|
502
|
-
gap: 10,
|
|
503
|
-
})),
|
|
504
|
-
)
|
|
505
|
-
|
|
506
|
-
expect(virt.totalSize()).toBe(590) // 10*50 + 9*10
|
|
507
|
-
unmount()
|
|
508
|
-
})
|
|
509
|
-
|
|
510
|
-
it('enabled: false produces empty output', () => {
|
|
511
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
512
|
-
useWindowVirtualizer(() => ({
|
|
513
|
-
count: 100,
|
|
514
|
-
estimateSize: () => 50,
|
|
515
|
-
enabled: false,
|
|
516
|
-
})),
|
|
517
|
-
)
|
|
518
|
-
|
|
519
|
-
expect(virt.virtualItems()).toHaveLength(0)
|
|
520
|
-
expect(virt.totalSize()).toBe(0)
|
|
521
|
-
unmount()
|
|
522
|
-
})
|
|
523
|
-
|
|
524
|
-
it('onChange callback is forwarded', () => {
|
|
525
|
-
const spy = vi.fn()
|
|
526
|
-
const { result: virt, unmount } = mountWith(() =>
|
|
527
|
-
useWindowVirtualizer(() => ({
|
|
528
|
-
count: 100,
|
|
529
|
-
estimateSize: () => 50,
|
|
530
|
-
onChange: spy,
|
|
531
|
-
})),
|
|
532
|
-
)
|
|
533
|
-
|
|
534
|
-
const onChange = virt.instance.options.onChange
|
|
535
|
-
if (onChange) {
|
|
536
|
-
onChange(virt.instance, false)
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
expect(spy).toHaveBeenCalled()
|
|
540
|
-
unmount()
|
|
541
|
-
})
|
|
542
|
-
|
|
543
|
-
it('overscan controls extra rendered items', () => {
|
|
544
|
-
const { result: small, unmount: u1 } = mountWith(() =>
|
|
545
|
-
useWindowVirtualizer(() => ({
|
|
546
|
-
count: 1000,
|
|
547
|
-
estimateSize: () => 35,
|
|
548
|
-
overscan: 0,
|
|
549
|
-
})),
|
|
550
|
-
)
|
|
551
|
-
|
|
552
|
-
const { result: large, unmount: u2 } = mountWith(() =>
|
|
553
|
-
useWindowVirtualizer(() => ({
|
|
554
|
-
count: 1000,
|
|
555
|
-
estimateSize: () => 35,
|
|
556
|
-
overscan: 10,
|
|
557
|
-
})),
|
|
558
|
-
)
|
|
559
|
-
|
|
560
|
-
expect(large.virtualItems().length).toBeGreaterThanOrEqual(small.virtualItems().length)
|
|
561
|
-
u1()
|
|
562
|
-
u2()
|
|
563
|
-
})
|
|
564
|
-
})
|