11import { act , render , screen } from "@testing-library/react" ;
2+ import { assert } from "../../utils/assert" ;
23import { createRef , useLayoutEffect } from "react" ;
34import { beforeEach , describe , expect , test , vi } from "vitest" ;
45import { EMPTY_OBJECT } from "../../../src/constants" ;
56import {
67 disableForCurrentTest ,
7- updateMockResizeObserver
8+ setDefaultElementSize ,
9+ setElementSize ,
10+ setElementSizeFunction
811} from "../../utils/test/mockResizeObserver" ;
912import { List } from "./List" ;
1013import { type ListImperativeAPI , type RowComponentProps } from "./types" ;
@@ -33,7 +36,7 @@ describe("List", () => {
3336 beforeEach ( ( ) => {
3437 RowComponent . mockReset ( ) ;
3538
36- updateMockResizeObserver ( new DOMRect ( 0 , 0 , 50 , 100 ) ) ;
39+ setDefaultElementSize ( { height : 100 , width : 50 } ) ;
3740
3841 mountedRows = new Map ( ) ;
3942 } ) ;
@@ -55,7 +58,7 @@ describe("List", () => {
5558 test ( "should render enough rows to fill the available height" , ( ) => {
5659 const onResize = vi . fn ( ) ;
5760
58- render (
61+ const { container } = render (
5962 < List
6063 onResize = { onResize }
6164 overscanCount = { 0 }
@@ -84,7 +87,14 @@ describe("List", () => {
8487 ) ;
8588
8689 act ( ( ) => {
87- updateMockResizeObserver ( new DOMRect ( 0 , 0 , 50 , 75 ) ) ;
90+ const listElement = container . querySelector < HTMLElement > ( '[role="list"]' ) ;
91+ assert ( listElement !== null ) ;
92+
93+ setElementSize ( {
94+ element : listElement ,
95+ height : 75 ,
96+ width : 50
97+ } ) ;
8898 } ) ;
8999
90100 items = screen . queryAllByRole ( "listitem" ) ;
@@ -106,7 +116,7 @@ describe("List", () => {
106116 } ) ;
107117
108118 test ( "should render enough rows to fill the available height with overscan" , ( ) => {
109- render (
119+ const { container } = render (
110120 < List
111121 overscanCount = { 2 }
112122 rowCount = { 100 }
@@ -122,7 +132,14 @@ describe("List", () => {
122132 expect ( items [ 5 ] ) . toHaveTextContent ( "Row 5" ) ;
123133
124134 act ( ( ) => {
125- updateMockResizeObserver ( new DOMRect ( 0 , 0 , 50 , 75 ) ) ;
135+ const listElement = container . querySelector < HTMLElement > ( '[role="list"]' ) ;
136+ assert ( listElement !== null ) ;
137+
138+ setElementSize ( {
139+ element : listElement ,
140+ height : 75 ,
141+ width : 50
142+ } ) ;
126143 } ) ;
127144
128145 items = screen . queryAllByRole ( "listitem" ) ;
@@ -538,6 +555,30 @@ describe("List", () => {
538555
539556 expect ( container . querySelectorAll ( '[role="listitem"]' ) ) . toHaveLength ( 4 ) ;
540557 } ) ;
558+
559+ // Most dynamic size tests are in useVirtualizer
560+ test ( "type: dynamic (lazily measured)" , ( ) => {
561+ setElementSizeFunction ( ( element ) => {
562+ const attribute = element . getAttribute ( "data-react-window-index" ) ;
563+ if ( attribute !== null ) {
564+ const index = parseInt ( attribute ) ;
565+ if ( ! Number . isNaN ( index ) ) {
566+ return new DOMRect ( 0 , 0 , 100 , ( index + 1 ) * 5 ) ;
567+ }
568+ }
569+ } ) ;
570+
571+ const { container } = render (
572+ < List
573+ overscanCount = { 0 }
574+ rowCount = { 50 }
575+ rowComponent = { RowComponent }
576+ rowProps = { EMPTY_OBJECT }
577+ />
578+ ) ;
579+
580+ expect ( container . querySelectorAll ( '[role="listitem"]' ) ) . toHaveLength ( 6 ) ;
581+ } ) ;
541582 } ) ;
542583
543584 describe ( "edge cases" , ( ) => {
0 commit comments