@@ -31,10 +31,12 @@ import androidx.compose.ui.text.input.TextEditingScope
3131import androidx.compose.ui.text.input.TextEditorState
3232import androidx.compose.ui.text.input.TextFieldValue
3333import androidx.compose.ui.unit.Density
34+ import androidx.compose.ui.unit.IntSize
3435import androidx.compose.ui.unit.LayoutDirection
3536import kotlin.coroutines.CoroutineContext
3637import kotlin.coroutines.EmptyCoroutineContext
3738import kotlin.test.Test
39+ import kotlin.test.assertEquals
3840import kotlin.test.assertFalse
3941import kotlin.test.assertTrue
4042import kotlinx.coroutines.CoroutineScope
@@ -154,18 +156,53 @@ class RootNodeOwnerTest {
154156 assertTrue(keyboardShowCalled)
155157 assertTrue(keyboardHideCalled)
156158 }
159+
160+ @Test
161+ fun setSizeOnlyTriggersConstraintChangeWhenValueChanges () = runTest {
162+ var invalidationCount = 0
163+
164+ val owner = RootNodeOwner (
165+ snapshotInvalidationTracker = SnapshotInvalidationTracker {
166+ invalidationCount++
167+ }
168+ )
169+
170+ // Set the initial size
171+ owner.size = IntSize (100 , 100 )
172+ val initialCount = invalidationCount
173+
174+ // Setting the same size should not trigger invalidation
175+ owner.size = IntSize (100 , 100 )
176+
177+ // Count should remain the same
178+ assertEquals(invalidationCount, initialCount)
179+
180+ // Setting a different size should trigger invalidation
181+ owner.size = IntSize (200 , 200 )
182+
183+ // Count should increase
184+ assertTrue(invalidationCount > initialCount)
185+ val afterChangeCount = invalidationCount
186+
187+ // Setting the same size again should not trigger another invalidation
188+ owner.size = IntSize (200 , 200 )
189+
190+ // Count should remain the same
191+ assertEquals(invalidationCount, afterChangeCount)
192+ }
157193}
158194
159195private fun RootNodeOwner (
160196 coroutineContext : CoroutineContext = EmptyCoroutineContext ,
161197 platformContext : PlatformContext = PlatformContext .Empty (),
198+ snapshotInvalidationTracker : SnapshotInvalidationTracker = SnapshotInvalidationTracker {},
162199) = RootNodeOwner (
163200 density = Density (1f ),
164201 layoutDirection = LayoutDirection .Ltr ,
165202 size = null ,
166203 coroutineContext = coroutineContext,
167204 platformContext = platformContext,
168- snapshotInvalidationTracker = SnapshotInvalidationTracker {} ,
205+ snapshotInvalidationTracker = snapshotInvalidationTracker ,
169206 inputHandler = ComposeSceneInputHandler (
170207 prepareForPointerInputEvent = {},
171208 processPointerInputEvent = { PointerEventResult (false ) },
0 commit comments