@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.systemBarsPadding
2525import androidx.compose.foundation.pager.HorizontalPager
2626import androidx.compose.foundation.pager.rememberPagerState
2727import androidx.compose.runtime.Composable
28+ import androidx.compose.runtime.LaunchedEffect
2829import androidx.compose.runtime.MutableIntState
2930import androidx.compose.runtime.mutableIntStateOf
3031import androidx.compose.ui.Modifier
@@ -55,38 +56,36 @@ internal abstract class UIKitNavigationSwipeBackTest(
5556) {
5657 @Test
5758 fun testSwipeRightOnPagerDoesNotPopController () = runUIKitInstrumentedTest {
58- val currentPage = mutableIntStateOf(0 )
59+ val initialPage = 0
60+ val currentPage = mutableIntStateOf(initialPage)
5961
6062 setNavigationControllerContent {
6163 TestContent (currentPage = currentPage)
6264 }
6365
64- delay(10 )
65-
6666 findNodeWithTag(" pager" ).swipeRight()
6767
68- delay( 500 )
68+ waitForIdle( )
6969
7070 assertEquals(2 , navigationController.viewControllers.size)
7171 assertNotNull(findNodeWithTagOrNull(" pager" ))
72- assertEquals(0 , currentPage.value)
72+ assertEquals(initialPage , currentPage.value)
7373 }
7474
7575 @Test
7676 fun testSwipeLeftOnPagerChangesPage () = runUIKitInstrumentedTest {
77- val currentPage = mutableIntStateOf(0 )
77+ val initialPage = 0
78+ val currentPage = mutableIntStateOf(initialPage)
7879
7980 setNavigationControllerContent {
8081 TestContent (currentPage = currentPage)
8182 }
8283
83- delay(10 )
84-
8584 findNodeWithTag(" pager" ).swipeLeft()
8685
8786 waitForIdle()
8887
89- assertEquals(1 , currentPage.value)
88+ assertEquals(initialPage + 1 , currentPage.value)
9089 assertEquals(2 , navigationController.viewControllers.size)
9190 }
9291
@@ -99,8 +98,6 @@ internal abstract class UIKitNavigationSwipeBackTest(
9998 TestContent (currentPage = currentPage)
10099 }
101100
102- delay(10 )
103-
104101 findNodeWithTag(" outsideBox" ).swipeLeft()
105102
106103 assertEquals(initialPage, currentPage.value)
@@ -113,16 +110,14 @@ internal abstract class UIKitNavigationSwipeBackTest(
113110 TestContent (currentPage = mutableIntStateOf(1 ))
114111 }
115112
116- delay(10 )
117-
118113 swipeRightFromEdge()
119114
120- // wait for pop animation to finish
121- delay(500 )
115+ waitUntil(" Waiting for view controller to be popped" ) {
116+ navigationController.viewControllers.size == 1
117+ }
122118
123119 assertNull(findNodeWithTagOrNull(" pager" ))
124120 assertNull(findNodeWithTagOrNull(" outsideBox" ))
125- assertEquals(1 , navigationController.viewControllers.size)
126121 }
127122
128123 @Test
@@ -137,15 +132,12 @@ internal abstract class UIKitNavigationSwipeBackTest(
137132 TestContent (currentPage = currentPage)
138133 }
139134
140- delay(10 )
141-
142135 findNodeWithTag(" outsideBox" ).swipe(
143136 fromPosition = { center() },
144137 toPosition = { rightCenter() },
145138 )
146139
147- // wait for pop animation to finish if any
148- delay(500 )
140+ waitForIdle()
149141
150142 assertNotNull(findNodeWithTagOrNull(" pager" ))
151143 assertNotNull(findNodeWithTagOrNull(" outsideBox" ))
@@ -164,16 +156,14 @@ internal abstract class UIKitNavigationSwipeBackTest(
164156 TestContent (currentPage = currentPage)
165157 }
166158
167- delay(10 )
168-
169159 findNodeWithTag(" outsideBox" ).swipeRight()
170160
171- // wait for pop animation to finish
172- delay(500 )
161+ waitUntil(" Waiting for view controller to be popped" ) {
162+ navigationController.viewControllers.size == 1
163+ }
173164
174165 assertNull(findNodeWithTagOrNull(" pager" ))
175166 assertNull(findNodeWithTagOrNull(" outsideBox" ))
176- assertEquals(1 , navigationController.viewControllers.size)
177167 }
178168
179169 @Test
@@ -188,16 +178,14 @@ internal abstract class UIKitNavigationSwipeBackTest(
188178 TestContent (currentPage = currentPage)
189179 }
190180
191- delay(10 )
192-
193181 swipeRightFromEdge()
194182
195- // wait for pop animation to finish
196- delay(500 )
183+ waitUntil(" Waiting for view controller to be popped" ) {
184+ navigationController.viewControllers.size == 1
185+ }
197186
198187 assertNull(findNodeWithTagOrNull(" pager" ))
199188 assertNull(findNodeWithTagOrNull(" outsideBox" ))
200- assertEquals(1 , navigationController.viewControllers.size)
201189 }
202190
203191 @Test
@@ -212,19 +200,17 @@ internal abstract class UIKitNavigationSwipeBackTest(
212200 TestContent (currentPage = currentPage)
213201 }
214202
215- delay(10 )
216-
217203 findNodeWithTag(" outsideBox" ).swipe(
218204 fromPosition = { center() },
219205 toPosition = { rightCenter() },
220206 )
221207
222- // wait for pop animation to finish
223- delay(500 )
208+ waitUntil(" Waiting for view controller to be popped" ) {
209+ navigationController.viewControllers.size == 1
210+ }
224211
225212 assertNull(findNodeWithTagOrNull(" pager" ))
226213 assertNull(findNodeWithTagOrNull(" outsideBox" ))
227- assertEquals(1 , navigationController.viewControllers.size)
228214 }
229215
230216 private val UIKitInstrumentedTest .navigationController: UINavigationController get() {
@@ -233,12 +219,17 @@ internal abstract class UIKitNavigationSwipeBackTest(
233219
234220 private fun UIKitInstrumentedTest.setNavigationControllerContent (
235221 content : @Composable () -> Unit = {}
236- ) = setupWindow {
237- val firstViewController = UIViewController ()
238- val secondViewController = createRootViewController(content = content)
222+ ) {
223+ val composeViewController = createViewControllerHostingCompose(content = content)
224+
225+ setupWindow {
226+ UINavigationController ().also {
227+ it.setViewControllers(listOf (UIViewController (), composeViewController), false )
228+ }
229+ }
239230
240- UINavigationController (). also {
241- it.setViewControllers( listOf (firstViewController, secondViewController), false )
231+ waitUntil {
232+ composeViewController.view.window != null
242233 }
243234 }
244235
@@ -260,6 +251,10 @@ private fun TestContent(
260251 val pagerColors = listOf (Color .Red , Color .Green , Color .Blue )
261252 val pagerState = rememberPagerState(initialPage = currentPage.value) { 3 }
262253
254+ LaunchedEffect (pagerState.currentPage) {
255+ currentPage.value = pagerState.currentPage
256+ }
257+
263258 Column (
264259 modifier = Modifier
265260 .fillMaxSize()
0 commit comments