@@ -2,21 +2,19 @@ package com.zachklipp.compose.backstack
22
33import androidx.compose.foundation.clickable
44import androidx.compose.foundation.text.BasicText
5- import androidx.compose.runtime.Composable
65import androidx.compose.runtime.DisposableEffect
76import androidx.compose.runtime.getValue
87import androidx.compose.runtime.mutableStateListOf
98import androidx.compose.runtime.mutableStateOf
10- import androidx.compose.runtime.saveable.Saver
119import androidx.compose.runtime.saveable.rememberSaveable
12- import androidx.compose.runtime.saveable.rememberSaveableStateHolder
1310import androidx.compose.runtime.setValue
1411import androidx.compose.ui.Modifier
15- import androidx.compose.ui.layout.SubcomposeLayout
1612import androidx.compose.ui.test.assertIsDisplayed
13+ import androidx.compose.ui.test.junit4.AndroidComposeTestRule
1714import androidx.compose.ui.test.junit4.createComposeRule
1815import androidx.compose.ui.test.onNodeWithText
1916import androidx.compose.ui.test.performClick
17+ import androidx.test.ext.junit.rules.ActivityScenarioRule
2018import com.google.common.truth.Truth.assertThat
2119import org.junit.Rule
2220import org.junit.Test
@@ -26,108 +24,29 @@ class BackstackStateTest {
2624 @get:Rule
2725 val compose = createComposeRule()
2826
29- @Test fun is_compose_broken () {
30- var index by mutableStateOf(0 )
31- compose.setContent {
32- val holder = rememberSaveableStateHolder()
33- holder.SaveableStateProvider (index) {
34- SubcomposeLayout { constraints ->
35- val measurable = subcompose(Unit ) {
36- var counter by rememberSaveable { mutableStateOf(0 ) }
37- BasicText (" Counter $index : $counter " , Modifier .clickable { counter++ })
38- }.single()
39-
40- val placeable = measurable.measure(constraints)
41- layout(placeable.width, placeable.height) {
42- placeable.placeRelative(0 , 0 )
43- }
44- }
45- }
46- }
47-
48- // Initial state.
49- compose.onNodeWithText(" Counter 0: 0" ).assertIsDisplayed()
50-
51- // Increment counter and check that it's incremented.
52- compose.onNodeWithText(" Counter" , substring = true ).performClick()
53- compose.onNodeWithText(" Counter 0: 1" ).assertIsDisplayed()
54-
55- // Change the index to reset the counter, but save the old value.
56- index = 1
57- compose.onNodeWithText(" Counter 1: 0" ).assertIsDisplayed()
58-
59- // Revert the index to restore the old counter value.
60- index = 0
61- compose.onNodeWithText(" Counter 0: 1" ).assertIsDisplayed()
62- }
63-
64- @Composable private fun Screen (name : String ) {
65- var counter by rememberSaveable(
66- stateSaver = Saver (
67- save = {
68- println (" OMG saving $it for $name " )
69- it
70- },
71- restore = {
72- println (" OMG restoring $it for $name " )
73- it
74- }
75- )) {
76- println (" OMG initializing counter" )
77- mutableStateOf(0 )
78- }
79- println (" OMG composing counter: $counter " )
80- BasicText (" $name : $counter " , Modifier .clickable {
81- println (" OMG clicked: incrementing counter from $counter " )
82- counter++
83- })
84- }
85-
8627 @Test fun screen_state_is_restored_on_pop () {
8728 val backstack = mutableStateListOf(" one" )
88- println (" OMG ==== 1 ====" )
8929 compose.setContent {
9030 Backstack (backstack, frameController = NoopFrameController ()) {
91- // var counter by rememberSaveable { mutableStateOf(0) }
92- // println("OMG composing counter: $counter")
93- // BasicText("$it: $counter", Modifier.clickable {
94- // println("OMG clicked: incrementing counter from $counter")
95- // counter++
96- // })
97- Screen (it)
31+ var counter by rememberSaveable { mutableStateOf(0 ) }
32+ BasicText (" $it : $counter " , Modifier .clickable { counter++ })
9833 }
9934 }
10035
10136 // Update some state on the first screen.
10237 compose.onNodeWithText(" one: 0" ).assertIsDisplayed().performClick()
103- compose.waitForIdle()
104- println (" OMG ==== 2 ====" )
10538 compose.onNodeWithText(" one: 1" ).assertIsDisplayed()
10639
107- // for (i in 0 until 100) {
108- // Thread.sleep(50)
109- // compose.mainClock.advanceTimeByFrame()
110- // }
111-
11240 // Navigate forward to another screen.
11341 backstack + = " two"
11442 compose.waitForIdle()
11543
116- println (" OMG ==== 3 ====" )
11744 compose.onNodeWithText(" one" , substring = true ).assertDoesNotExist()
11845 compose.onNodeWithText(" two: 0" ).assertIsDisplayed()
11946
12047 // Navigate back.
12148 backstack - = " two"
122- compose.mainClock.advanceTimeByFrame()
123- compose.waitForIdle()
124- compose.mainClock.advanceTimeByFrame()
125- compose.waitForIdle()
126- compose.mainClock.advanceTimeByFrame()
127- compose.waitForIdle()
128- compose.mainClock.advanceTimeByFrame()
12949 compose.waitForIdle()
130- println (" OMG ==== 4 ====" )
13150
13251 // Make sure the state was restored.
13352 compose.onNodeWithText(" one: 1" ).assertIsDisplayed()
0 commit comments