@@ -136,6 +136,25 @@ describe('overflowManager', () => {
136136 } ) ;
137137 } ) ;
138138
139+ it ( 'should re-dispatch when the overflow menu is attached while observing' , ( ) => {
140+ const onUpdateOverflow = jest . fn ( ) ;
141+ const manager = createOverflowManager ( createObserveOptions ( { onUpdateOverflow } ) ) ;
142+ const container = createContainer ( 100 ) ;
143+ const itemA = createElementWithSize ( 'button' , 60 ) ;
144+ const itemB = createElementWithSize ( 'button' , 60 ) ;
145+
146+ manager . addItem ( { element : itemA , id : 'a' , priority : 1 } ) ;
147+ manager . addItem ( { element : itemB , id : 'b' , priority : 0 } ) ;
148+ manager . observe ( container ) ;
149+ manager . forceUpdate ( ) ;
150+ onUpdateOverflow . mockClear ( ) ;
151+
152+ const menu = createElementWithSize ( 'button' , 30 ) ;
153+ manager . addOverflowMenu ( menu ) ;
154+
155+ expect ( onUpdateOverflow ) . toHaveBeenCalled ( ) ;
156+ } ) ;
157+
139158 it ( 'should remove items through removeItem' , ( ) => {
140159 const manager = createOverflowManager ( createObserveOptions ( ) ) ;
141160 const container = createContainer ( 100 ) ;
@@ -156,4 +175,52 @@ describe('overflowManager', () => {
156175 invisibleItemCount : 0 ,
157176 } ) ;
158177 } ) ;
178+
179+ it ( 'resolves overflow synchronously when observed with forceUpdate and the container is measured' , ( ) => {
180+ const manager = createOverflowManager ( createObserveOptions ( ) ) ;
181+ const container = createContainer ( 100 ) ;
182+ const itemA = createElementWithSize ( 'button' , 60 ) ;
183+ const itemB = createElementWithSize ( 'button' , 60 ) ;
184+ const menu = createElementWithSize ( 'button' , 30 ) ;
185+
186+ manager . addItem ( { element : itemA , id : 'a' , priority : 1 } ) ;
187+ manager . addItem ( { element : itemB , id : 'b' , priority : 0 } ) ;
188+ manager . addOverflowMenu ( menu ) ;
189+
190+ // No manual forceUpdate(); observing with forceUpdate resolves overflow on its own.
191+ manager . observe ( container , { forceUpdate : true } ) ;
192+
193+ expect ( getVisibleIds ( manager ) ) . toEqual ( [ 'a' ] ) ;
194+ expect ( getInvisibleIds ( manager ) ) . toEqual ( [ 'b' ] ) ;
195+ } ) ;
196+
197+ it ( 'does not resolve overflow on observe when forceUpdate is not requested' , ( ) => {
198+ const manager = createOverflowManager ( createObserveOptions ( ) ) ;
199+ const container = createContainer ( 100 ) ;
200+ const itemA = createElementWithSize ( 'button' , 60 ) ;
201+ const itemB = createElementWithSize ( 'button' , 60 ) ;
202+
203+ manager . addItem ( { element : itemA , id : 'a' , priority : 1 } ) ;
204+ manager . addItem ( { element : itemB , id : 'b' , priority : 0 } ) ;
205+
206+ manager . observe ( container ) ;
207+
208+ // Nothing has been computed yet (the ResizeObserver is mocked to a noop).
209+ expect ( manager . getSnapshot ( ) . itemVisibility ) . toEqual ( { } ) ;
210+ } ) ;
211+
212+ it ( 'does not resolve overflow on observe with forceUpdate when the container is not measured' , ( ) => {
213+ const manager = createOverflowManager ( createObserveOptions ( ) ) ;
214+ const container = createContainer ( 0 ) ;
215+ const itemA = createElementWithSize ( 'button' , 60 ) ;
216+ const itemB = createElementWithSize ( 'button' , 60 ) ;
217+
218+ manager . addItem ( { element : itemA , id : 'a' , priority : 1 } ) ;
219+ manager . addItem ( { element : itemB , id : 'b' , priority : 0 } ) ;
220+
221+ // Degenerate 0 size — the guard skips the force so nothing collapses.
222+ manager . observe ( container , { forceUpdate : true } ) ;
223+
224+ expect ( manager . getSnapshot ( ) . itemVisibility ) . toEqual ( { } ) ;
225+ } ) ;
159226} ) ;
0 commit comments