@@ -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