@@ -172,9 +172,6 @@ describe("test InfiniteGrid", () => {
172172
173173 const children = toArray ( igContainer . children ) ;
174174
175- ig ?. getItems ( ) . forEach ( itm => {
176- console . log ( itm . cssRect , itm . mountState , itm . updateState ) ;
177- } )
178175 // Then
179176 expect ( e . startCursor ) . to . be . equals ( 0 ) ;
180177 expect ( e . endCursor ) . to . be . equals ( 1 ) ;
@@ -422,19 +419,18 @@ describe("test InfiniteGrid", () => {
422419 ig ! . append ( [ 0 , 1 , 2 , 3 , 4 ] . map ( ( child ) => {
423420 return {
424421 groupKey : Math . floor ( child / 5 ) ,
425- key : child ,
426- html : `<div style="height: 200px;">${ child } </div>` ,
422+ key : ` ${ child } ` ,
423+ html : `<div style="height: 200px;width: 2px; ">${ child } </div>` ,
427424 } ;
428425 } ) ) ;
429426
430427 await waitEvent ( ig ! , "renderComplete" ) ;
431428
432-
433429 ig ! . prepend ( [ 5 , 6 , 7 , 8 , 9 ] . map ( ( child ) => {
434430 return {
435431 groupKey : Math . floor ( child / 5 ) ,
436432 key : child ,
437- html : `<div style="height: 200px;">${ child } </div>` ,
433+ html : `<div style="height: 200px;width: 2px; ">${ child } </div>` ,
438434 } ;
439435 } ) ) ;
440436
@@ -448,9 +444,8 @@ describe("test InfiniteGrid", () => {
448444 expect ( ig ! . getVisibleGroups ( ) . map ( ( group ) => group . groupKey ) ) . to . be . deep . equals ( [ 1 , 0 ] ) ;
449445 expect ( ig ! . getScrollContainerElement ( ) . scrollTop ) . to . be . equals ( 1000 ) ;
450446 expect ( children . length ) . to . be . equals ( 10 ) ;
451-
452447 children . forEach ( ( child , i ) => {
453- expect ( child . style . top ) . to . be . equals ( `${ i * 200 } px` ) ;
448+ expect ( child . style . top ) . to . be . equals ( `${ i * 200 } px` , `Index ${ i } Error` ) ;
454449 } ) ;
455450 } ) ;
456451 it ( "should check if item can be inserted in the center" , async ( ) => {
@@ -1280,7 +1275,7 @@ describe("test InfiniteGrid", () => {
12801275 await waitEvent ( ig ! , "renderComplete" ) ;
12811276 // 500 ~ 1000
12821277 // 300 / 100 100 [100 / 300 / 300 / 300] / 300 / 300
1283-
1278+
12841279
12851280 // Then
12861281 expect ( ig ! . getScrollContainerElement ( ) . scrollTop ) . to . be . equals ( 500 ) ;
@@ -1589,6 +1584,111 @@ describe("test InfiniteGrid", () => {
15891584 } ) ;
15901585 } ) ;
15911586 } ) ;
1587+ describe ( "test scroll offset" , ( ) => {
1588+ beforeEach ( ( ) => {
1589+ container ! . innerHTML = `
1590+ <div class="wrapper" style="width: 100%; height: 500px;">
1591+ </div>
1592+ ` ;
1593+ const wrapper = container ! . querySelector < HTMLElement > ( ".wrapper" ) ! ;
1594+ ig = new InfiniteGrid < InfiniteGridOptions > ( wrapper , {
1595+ gridConstructor : SampleGrid ,
1596+ container : true ,
1597+ threshold : 0 ,
1598+ } ) ;
1599+ } ) ;
1600+ it ( `should check if scroll position is corrected when size, pos, window size is changed (startCursor = 0)` , async ( ) => {
1601+ // Given
1602+ ig ! . syncItems ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 ] . map ( ( child ) => {
1603+ return {
1604+ groupKey : Math . floor ( child / 3 ) ,
1605+ key : `key${ child } ` ,
1606+ html : `<div style="height: 100px;width: 100%; ">${ child } </div>` ,
1607+ } ;
1608+ } ) ) ;
1609+
1610+ // 커서를 전체로 지정하여 모든 아이템의 사이즈를 계산
1611+ ig ! . setCursors ( 0 , 5 ) ;
1612+ await waitEvent ( ig ! , "renderComplete" ) ;
1613+
1614+ // 현재 스크롤 위치에 따른 보이는 아이템 자동 변경: change cursor (0, 2)
1615+ await waitEvent ( ig ! , "renderComplete" ) ;
1616+
1617+
1618+ // top 100, center 350
1619+ // 브라우저간의 오차로 인한 테스트가 필요
1620+ ig ! . getScrollContainerElement ( ) . scrollTop = 100 ;
1621+
1622+ // 스크롤 이동에 따른 보이는 아이템 자동 변경: change cursor (0, 3)
1623+ await waitEvent ( ig ! , "renderComplete" ) ;
1624+ // 300 + 50 => 700 (offset: 350)
1625+
1626+
1627+ // When
1628+ ig ! . getItems ( ) . forEach ( ( item ) => {
1629+ item . element ! . style . height = "200px" ;
1630+ } ) ;
1631+
1632+ // 스크롤 위치는 변경 되지 않는다.
1633+ ig ! . renderItems ( { useResize : true } ) ;
1634+ await waitEvent ( ig ! , "renderComplete" ) ;
1635+
1636+
1637+ // Then
1638+ const correctedPos = ig ! . getScrollContainerElement ( ) . scrollTop ;
1639+ expect ( correctedPos ) . to . be . equals ( 450 ) ;
1640+ expect ( ig ! . getStartCursor ( ) ) . to . be . equals ( 0 ) ;
1641+ expect ( ig ! . getEndCursor ( ) ) . to . be . equals ( 1 ) ;
1642+ } ) ;
1643+ it ( `should check if scroll position is corrected when size, pos, window size is changed (startCursor > 0)` , async ( ) => {
1644+ // Given
1645+ ig ! . syncItems ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 ] . map ( ( child ) => {
1646+ return {
1647+ groupKey : Math . floor ( child / 3 ) ,
1648+ key : `key${ child } ` ,
1649+ html : `<div style="height: 100px;width: 100%;">${ child } </div>` ,
1650+ } ;
1651+ } ) ) ;
1652+
1653+ // 커서를 전체로 지정하여 모든 아이템의 사이즈를 계산
1654+ ig ! . setCursors ( 0 , 5 ) ;
1655+ await waitEvent ( ig ! , "renderComplete" ) ;
1656+
1657+ // 현재 스크롤 위치에 따른 보이는 아이템 자동 변경: change cursor (0, 2)
1658+ await waitEvent ( ig ! , "renderComplete" ) ;
1659+
1660+
1661+ // top: 750, center 1000
1662+ ig ! . getScrollContainerElement ( ) . scrollTop = 750 ;
1663+
1664+ // 스크롤 이동에 따른 보이는 아이템 자동 변경: change cursor (2, 4)
1665+ await waitEvent ( ig ! , "renderComplete" ) ;
1666+ const prevStartCursor = ig ! . getStartCursor ( ) ;
1667+ const prevEndCursor = ig ! . getEndCursor ( ) ;
1668+
1669+
1670+
1671+ // When
1672+ ig ! . getItems ( ) . forEach ( ( item ) => {
1673+ item . element ! . style . height = "200px" ;
1674+ } ) ;
1675+ // 600 + 300 + 50 => 600 + 700 (offset: 350)
1676+
1677+
1678+ // 스크롤 위치는 변경 되지 않는다.
1679+ // 450만큼 스크롤 차이가 발생
1680+ ig ! . renderItems ( { useResize : true } ) ;
1681+ await waitEvent ( ig ! , "renderComplete" ) ;
1682+
1683+ // Then
1684+ expect ( prevStartCursor ) . to . be . equals ( 2 ) ;
1685+ expect ( prevEndCursor ) . to . be . equals ( 4 ) ;
1686+ const correctedPos = ig ! . getScrollContainerElement ( ) . scrollTop ;
1687+ expect ( correctedPos ) . to . be . equals ( 1100 ) ;
1688+ expect ( ig ! . getStartCursor ( ) ) . to . be . equals ( 2 ) ;
1689+ expect ( ig ! . getEndCursor ( ) ) . to . be . equals ( 3 ) ;
1690+ } ) ;
1691+ } ) ;
15921692 describe ( "test ResizeObserver" , ( ) => {
15931693 it ( `should check if renderComplete does trigger when useResizeObserver is enabled and container's size is changed` , async ( ) => {
15941694 // Given
@@ -1770,9 +1870,8 @@ describe("test InfiniteGrid", () => {
17701870 return {
17711871 groupKey : Math . floor ( child / 3 ) ,
17721872 key : `key${ child } ` ,
1773- html : `<div style="height: ${ 100 + child * 10 } px;width: 100%;" ${
1774- child === 7 ? `data-grid-not-equal-size="true"` : ""
1775- } >${ child } </div>`,
1873+ html : `<div style="height: ${ 100 + child * 10 } px;width: 100%;" ${ child === 7 ? `data-grid-not-equal-size="true"` : ""
1874+ } >${ child } </div>`,
17761875 } ;
17771876 } ) ) ;
17781877
0 commit comments