@@ -6,7 +6,6 @@ import { render } from '@testing-library/react';
66
77import { useVirtual } from '../index' ;
88
9- // Mock the vendor react-virtual to avoid ES module issues
109jest . mock ( '../../../vendor/react-virtual' , ( ) => ( {
1110 useVirtual : jest . fn ( ) ,
1211} ) ) ;
@@ -129,4 +128,94 @@ describe('useVirtual', () => {
129128 // totalSize = 160 - (3 items * 1 overlap) - 60 (firstItemSize) + 2 = 99
130129 expect ( capturedResult ! . totalSize ) . toBe ( 99 ) ;
131130 } ) ;
131+
132+ test ( 'calculates item positions without itemOverlap=0' , ( ) => {
133+ const items : TestItem [ ] = [ { id : '1' } , { id : '2' } , { id : '3' } ] ;
134+
135+ mockUseVirtual . mockReturnValue ( {
136+ virtualItems : [
137+ { index : 0 , size : 50 , start : 0 , end : 50 , measureRef : mockMeasureRef } ,
138+ { index : 1 , size : 50 , start : 50 , end : 100 , measureRef : mockMeasureRef } ,
139+ { index : 2 , size : 50 , start : 100 , end : 150 , measureRef : mockMeasureRef } ,
140+ ] ,
141+ totalSize : 150 ,
142+ scrollToIndex : mockScrollToIndex ,
143+ } ) ;
144+
145+ let capturedResult : ReturnType < typeof useVirtual < TestItem > > | null = null ;
146+ render ( < TestComponent items = { items } onResult = { result => ( capturedResult = result ) } /> ) ;
147+
148+ expect ( capturedResult ! . virtualItems [ 0 ] . start ) . toBe ( 0 ) ;
149+ expect ( capturedResult ! . virtualItems [ 1 ] . start ) . toBe ( 50 ) ;
150+ expect ( capturedResult ! . virtualItems [ 2 ] . start ) . toBe ( 100 ) ;
151+ } ) ;
152+
153+ test ( 'calculates item positions with itemOverlap=1' , ( ) => {
154+ const items : TestItem [ ] = [ { id : '1' } , { id : '2' } , { id : '3' } ] ;
155+
156+ mockUseVirtual . mockReturnValue ( {
157+ virtualItems : [
158+ { index : 0 , size : 50 , start : 0 , end : 50 , measureRef : mockMeasureRef } ,
159+ { index : 1 , size : 50 , start : 50 , end : 100 , measureRef : mockMeasureRef } ,
160+ { index : 2 , size : 50 , start : 100 , end : 150 , measureRef : mockMeasureRef } ,
161+ ] ,
162+ totalSize : 150 ,
163+ scrollToIndex : mockScrollToIndex ,
164+ } ) ;
165+
166+ let capturedResult : ReturnType < typeof useVirtual < TestItem > > | null = null ;
167+ render ( < TestComponent items = { items } itemOverlap = { 1 } onResult = { result => ( capturedResult = result ) } /> ) ;
168+
169+ expect ( capturedResult ! . virtualItems [ 0 ] . start ) . toBe ( 0 ) ;
170+ expect ( capturedResult ! . virtualItems [ 1 ] . start ) . toBe ( 49 ) ;
171+ expect ( capturedResult ! . virtualItems [ 2 ] . start ) . toBe ( 98 ) ;
172+ } ) ;
173+
174+ test ( 'calculates item positions with sticky first item and itemOverlap=0' , ( ) => {
175+ const items : TestItem [ ] = [ { id : '1' } , { id : '2' } , { id : '3' } ] ;
176+
177+ mockUseVirtual . mockReturnValue ( {
178+ virtualItems : [
179+ { index : 0 , size : 60 , start : 0 , end : 60 , measureRef : mockMeasureRef } ,
180+ { index : 1 , size : 50 , start : 60 , end : 110 , measureRef : mockMeasureRef } ,
181+ { index : 2 , size : 50 , start : 110 , end : 160 , measureRef : mockMeasureRef } ,
182+ ] ,
183+ totalSize : 160 ,
184+ scrollToIndex : mockScrollToIndex ,
185+ } ) ;
186+
187+ let capturedResult : ReturnType < typeof useVirtual < TestItem > > | null = null ;
188+ render ( < TestComponent items = { items } firstItemSticky = { true } onResult = { result => ( capturedResult = result ) } /> ) ;
189+
190+ expect ( capturedResult ! . virtualItems [ 1 ] . start ) . toBe ( 62 ) ;
191+ expect ( capturedResult ! . virtualItems [ 2 ] . start ) . toBe ( 112 ) ;
192+ } ) ;
193+
194+ test ( 'calculates item positions with sticky first item and itemOverlap=1' , ( ) => {
195+ const items : TestItem [ ] = [ { id : '1' } , { id : '2' } , { id : '3' } ] ;
196+
197+ mockUseVirtual . mockReturnValue ( {
198+ virtualItems : [
199+ { index : 0 , size : 60 , start : 0 , end : 60 , measureRef : mockMeasureRef } ,
200+ { index : 1 , size : 50 , start : 60 , end : 110 , measureRef : mockMeasureRef } ,
201+ { index : 2 , size : 50 , start : 110 , end : 160 , measureRef : mockMeasureRef } ,
202+ ] ,
203+ totalSize : 160 ,
204+ scrollToIndex : mockScrollToIndex ,
205+ } ) ;
206+
207+ let capturedResult : ReturnType < typeof useVirtual < TestItem > > | null = null ;
208+ render (
209+ < TestComponent
210+ items = { items }
211+ firstItemSticky = { true }
212+ itemOverlap = { 1 }
213+ onResult = { result => ( capturedResult = result ) }
214+ />
215+ ) ;
216+
217+ expect ( capturedResult ! . virtualItems [ 0 ] . start ) . toBe ( 1 ) ;
218+ expect ( capturedResult ! . virtualItems [ 1 ] . start ) . toBe ( 61 ) ;
219+ expect ( capturedResult ! . virtualItems [ 2 ] . start ) . toBe ( 110 ) ;
220+ } ) ;
132221} ) ;
0 commit comments