@@ -1393,7 +1393,6 @@ class RenderWorkflowInTest {
1393
1393
trigger.asWorker()
1394
1394
) {
1395
1395
action(" " ) {
1396
- state = it
1397
1396
setOutput(it)
1398
1397
}
1399
1398
}
@@ -1403,10 +1402,9 @@ class RenderWorkflowInTest {
1403
1402
val workflow = Workflow .stateful<String , String , String >(
1404
1403
initialState = " unchanging state" ,
1405
1404
render = { renderState ->
1406
- renderChild(childWorkflow) { childOutput ->
1405
+ renderChild(childWorkflow) { _ ->
1407
1406
action(" childHandler" ) {
1408
1407
childHandlerActionExecuted++
1409
- state = childOutput
1410
1408
}
1411
1409
}
1412
1410
runningWorker(
@@ -1632,6 +1630,90 @@ class RenderWorkflowInTest {
1632
1630
}
1633
1631
}
1634
1632
1633
+ @Test
1634
+ fun for_conflate_and_render_only_when_state_changed_we_do_not_conflate_stacked_actions_into_one_rendering_if_previous_rendering_changed () {
1635
+ runtimeTestRunner.runParametrizedTest(
1636
+ paramSource = runtimeOptions
1637
+ .filter {
1638
+ it.first.contains(CONFLATE_STALE_RENDERINGS ) &&
1639
+ it.first.contains(RENDER_ONLY_WHEN_STATE_CHANGES )
1640
+ },
1641
+ before = ::setup,
1642
+ ) { (runtimeConfig: RuntimeConfig , workflowTracer: WorkflowTracer ? , dispatcher: TestDispatcher ) ->
1643
+ runTest(dispatcher) {
1644
+ check(runtimeConfig.contains(CONFLATE_STALE_RENDERINGS ))
1645
+ check(runtimeConfig.contains(RENDER_ONLY_WHEN_STATE_CHANGES ))
1646
+
1647
+ var childHandlerActionExecuted = false
1648
+ val trigger = MutableSharedFlow <String >()
1649
+ val emitted = mutableListOf<String >()
1650
+
1651
+ val childWorkflow = Workflow .stateful<String , String , String >(
1652
+ initialState = " unchanging state" ,
1653
+ render = { renderState ->
1654
+ runningWorker(
1655
+ trigger.asWorker()
1656
+ ) {
1657
+ action(" " ) {
1658
+ state = it
1659
+ setOutput(it)
1660
+ }
1661
+ }
1662
+ renderState
1663
+ }
1664
+ )
1665
+ val workflow = Workflow .stateful<String , String , String >(
1666
+ initialState = " unchanging state" ,
1667
+ render = { renderState ->
1668
+ renderChild(childWorkflow) { childOutput ->
1669
+ action(" childHandler" ) {
1670
+ childHandlerActionExecuted = true
1671
+ state = " $childOutput +update"
1672
+ }
1673
+ }
1674
+ runningWorker(
1675
+ trigger.asWorker()
1676
+ ) {
1677
+ action(" " ) {
1678
+ // no state change now!
1679
+ }
1680
+ }
1681
+ renderState
1682
+ }
1683
+ )
1684
+ val props = MutableStateFlow (Unit )
1685
+ val renderings = renderWorkflowIn(
1686
+ workflow = workflow,
1687
+ scope = backgroundScope,
1688
+ props = props,
1689
+ runtimeConfig = runtimeConfig,
1690
+ workflowTracer = workflowTracer,
1691
+ ) { }
1692
+
1693
+ val collectionJob = launch {
1694
+ // Collect this unconfined so we can get all the renderings faster than actions can
1695
+ // be processed.
1696
+ renderings.collect {
1697
+ emitted + = it.rendering
1698
+ }
1699
+ }
1700
+ advanceIfStandard(dispatcher)
1701
+
1702
+ launch {
1703
+ trigger.emit(" changed state" )
1704
+ }
1705
+ advanceIfStandard(dispatcher)
1706
+
1707
+ collectionJob.cancel()
1708
+
1709
+ // 2 renderings.
1710
+ assertEquals(2 , emitted.size)
1711
+ assertEquals(" changed state+update" , emitted.last())
1712
+ assertTrue(childHandlerActionExecuted)
1713
+ }
1714
+ }
1715
+ }
1716
+
1635
1717
private class ExpectedException : RuntimeException ()
1636
1718
1637
1719
private fun <T1 , T2 > cartesianProduct (
0 commit comments