diff --git a/rekotlin-router/src/main/java/org/rekotlinrouter/Routable.kt b/rekotlin-router/src/main/java/org/rekotlinrouter/Routable.kt index bfd72b9..636452a 100644 --- a/rekotlin-router/src/main/java/org/rekotlinrouter/Routable.kt +++ b/rekotlin-router/src/main/java/org/rekotlinrouter/Routable.kt @@ -5,6 +5,14 @@ typealias RoutingCompletionHandler = () -> Unit typealias RouteElementIdentifier = String typealias Route = List +fun Route.copyRoutes(): Route { + val copiedRoutes = arrayListOf() + this.forEach { route -> + copiedRoutes.add(route) + } + return copiedRoutes +} + interface Routable { diff --git a/rekotlin-router/src/main/java/org/rekotlinrouter/Router.kt b/rekotlin-router/src/main/java/org/rekotlinrouter/Router.kt index 5ca5811..c324fa0 100644 --- a/rekotlin-router/src/main/java/org/rekotlinrouter/Router.kt +++ b/rekotlin-router/src/main/java/org/rekotlinrouter/Router.kt @@ -39,7 +39,7 @@ class Router(var store: Store, routingActions.forEach { routingAction -> routingSerailActionHandler(routingAction, state) } - lastNavigationState = state.copy() + lastNavigationState = state.copy(state.route.copyRoutes()) } } diff --git a/rekotlin-router/src/test/java/org/rekotlinrouter/ReKotlinRouterUnitTests.kt b/rekotlin-router/src/test/java/org/rekotlinrouter/ReKotlinRouterUnitTests.kt index b1a5395..680e493 100644 --- a/rekotlin-router/src/test/java/org/rekotlinrouter/ReKotlinRouterUnitTests.kt +++ b/rekotlin-router/src/test/java/org/rekotlinrouter/ReKotlinRouterUnitTests.kt @@ -274,4 +274,60 @@ internal class ReKotlinRouterUnitTests { assertThat(action2Correct).isTrue() assertThat(routingActions.count()).isEqualTo(2) } + + @Test + //@DisplayName("calculates transitions from an empty route to a multi segment route on when same route list object is modified") + fun test_transition_from_empty_to_multi_segment_route_one_by_one() { + + // Given + var lastRoute: Route = arrayListOf() + val newRoute = arrayListOf(mainActivityIdentifier) + + // When + val routingActionsOld = Router.routingActionsForTransitionFrom(lastRoute, newRoute) + //how copy works + //lastRoute = newRoute + + //deep copy + lastRoute = newRoute.copyRoutes() + newRoute.add(statsActivityIdentifier) + + val routingActions = Router.routingActionsForTransitionFrom(lastRoute, newRoute) + + // Then + var action1Correct = false + var action2Correct = false + + routingActionsOld.forEach { routingAction -> + when (routingAction) { + is push -> { + if (routingAction.responsibleRoutableIndex == 0 && routingAction.segmentToBePushed == mainActivityIdentifier) { + action1Correct = true + } + } + } + } + + routingActions.forEach { routingAction -> + when (routingAction) { + is push -> { + if (routingAction.responsibleRoutableIndex == 1 && routingAction.segmentToBePushed == statsActivityIdentifier) { + action2Correct = true + } + } + } + } + assertThat(action1Correct).isTrue() + assertThat(action2Correct).isTrue() + assertThat(routingActionsOld.count()).isEqualTo(1) + assertThat(routingActions.count()).isEqualTo(1) + } + + @Test + fun test_copy_routes(){ + val route = arrayListOf(mainActivityIdentifier,statsActivityIdentifier) + val copiedRoutes = route.copyRoutes() + assertThat(copiedRoutes.count()).isEqualTo(route.count()) + assertThat(copiedRoutes[0]).isEqualTo(route[0]) + } }