Skip to content

Commit 11ecba5

Browse files
committed
Adds (failing) DecorativeViewFactory double update test
1 parent 757aa20 commit 11ecba5

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

workflow-ui/core-android/src/androidTest/java/com/squareup/workflow1/ui/DecorativeViewFactoryTest.kt

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,80 @@ internal class DecorativeViewFactoryTest {
101101
)
102102
}
103103

104+
// https://github.com/square/workflow-kotlin/issues/597
105+
@Test fun double_wrapping_only_calls_showRendering_once() {
106+
val events = mutableListOf<String>()
107+
108+
val innerViewFactory = object : ViewFactory<InnerRendering> {
109+
override val type = InnerRendering::class
110+
override fun buildView(
111+
initialRendering: InnerRendering,
112+
initialViewEnvironment: ViewEnvironment,
113+
contextForNewView: Context,
114+
container: ViewGroup?
115+
): View = InnerView(contextForNewView).apply {
116+
bindShowRendering(initialRendering, initialViewEnvironment) { rendering, _ ->
117+
events += "inner showRendering $rendering"
118+
}
119+
}
120+
}
121+
122+
val envString = object : ViewEnvironmentKey<String>(String::class) {
123+
override val default: String get() = "Not set"
124+
}
125+
126+
val outerViewFactory = DecorativeViewFactory(
127+
type = OuterRendering::class,
128+
map = { outer, env ->
129+
val enhancedEnv = env + (envString to "Outer Updated environment")
130+
Pair(outer.wrapped, enhancedEnv)
131+
},
132+
initializeView = {
133+
val outerRendering = getRendering<OuterRendering>()
134+
events += "outer initializeView $outerRendering ${environment!![envString]}"
135+
showFirstRendering()
136+
events += "exit outer initializeView"
137+
}
138+
)
139+
140+
val wayOutViewFactory = DecorativeViewFactory(
141+
type = WayOutRendering::class,
142+
map = { wayOut, env ->
143+
val enhancedEnv = env + (envString to "Way Out Updated environment")
144+
Pair(wayOut.wrapped, enhancedEnv)
145+
},
146+
initializeView = {
147+
val wayOutRendering = getRendering<WayOutRendering>()
148+
events += "way out initializeView $wayOutRendering ${environment!![envString]}"
149+
showFirstRendering()
150+
events += "exit way out initializeView"
151+
}
152+
)
153+
val viewRegistry = ViewRegistry(innerViewFactory, outerViewFactory, wayOutViewFactory)
154+
val viewEnvironment = ViewEnvironment(mapOf(ViewRegistry to viewRegistry))
155+
156+
viewRegistry.buildView(
157+
WayOutRendering("way out", OuterRendering("outer", InnerRendering("inner"))),
158+
viewEnvironment,
159+
instrumentation.context
160+
)
161+
162+
assertThat(events).containsExactly(
163+
"way out initializeView " +
164+
"WayOutRendering(wayOutData=way out, wrapped=" +
165+
"OuterRendering(outerData=outer, wrapped=" +
166+
"InnerRendering(innerData=inner))) " +
167+
"Way Out Updated environment",
168+
"outer initializeView " +
169+
"OuterRendering(outerData=outer, wrapped=" +
170+
"InnerRendering(innerData=inner)) " +
171+
"Outer Updated environment",
172+
"inner showRendering InnerRendering(innerData=inner)",
173+
"exit outer initializeView",
174+
"exit way out initializeView"
175+
)
176+
}
177+
104178
@Test fun subsequent_showRendering_calls_wrapped_showRendering() {
105179
val events = mutableListOf<String>()
106180

@@ -148,6 +222,10 @@ internal class DecorativeViewFactoryTest {
148222
val outerData: String,
149223
val wrapped: InnerRendering
150224
)
225+
private data class WayOutRendering(
226+
val wayOutData: String,
227+
val wrapped: OuterRendering
228+
)
151229

152230
private class InnerView(context: Context) : View(context)
153231
}

0 commit comments

Comments
 (0)