diff --git a/CHANGELOG.md b/CHANGELOG.md index 62e92ce3c97..49f0770ac4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Mapbox welcomes participation and contributions from everyone. - Fixed the issue with incorrect geometry indices for `RouteLeg#incidents` and `RouteLeg#closures` after refresh. [#6364](https://github.com/mapbox/mapbox-navigation-android/pull/6364) - Improved alternatives id robustness by adding new alternatives to existing instead of replacing them during `MapboxNavigation#requestAlternativeRoutes`. [#6373](https://github.com/mapbox/mapbox-navigation-android/pull/6373) - Improved stop detector for auto profile. [#6373](https://github.com/mapbox/mapbox-navigation-android/pull/6373) +- Fixed an issue where `NavigationRoute#upcomingRoadObjects` was not refreshed. This issue did not impact the deprecated `RoadObjectsOnRouteObserver`. [#6378](https://github.com/mapbox/mapbox-navigation-android/pull/6378) ## Mapbox Navigation SDK 2.8.0-rc.2 - 16 September, 2022 ### Changelog diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/RouteRefreshTest.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/RouteRefreshTest.kt index d9c2ad01e8c..e04b5ebc72a 100644 --- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/RouteRefreshTest.kt +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/RouteRefreshTest.kt @@ -139,10 +139,10 @@ class RouteRefreshTest : BaseTest(EmptyTestActivity::class.ja val initialRoutes = routeUpdates[0] val refreshedRoutes = routeUpdates[1] - mapboxNavigation.routeProgressUpdates() + val routeProgress = mapboxNavigation.routeProgressUpdates() .filter { routeProgress -> isRefreshedRouteDistance(routeProgress) } .first() - mapboxNavigation.roadObjectsOnRoute() + val roadObjectsFromObserver = mapboxNavigation.roadObjectsOnRoute() .filter { upcomingRoadObjects -> upcomingRoadObjects.size == 2 && upcomingRoadObjects.map { it.roadObject.id } @@ -150,6 +150,11 @@ class RouteRefreshTest : BaseTest(EmptyTestActivity::class.ja } .first() + assertEquals(roadObjectsFromObserver, refreshedRoutes.first().upcomingRoadObjects) + assertEquals( + routeProgress.navigationRoute.upcomingRoadObjects, + refreshedRoutes.first().upcomingRoadObjects + ) assertEquals( "the test works only with 2 routes", 2, diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/coroutines/Adapters.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/coroutines/Adapters.kt index 7adba7d64a2..c60800b143d 100644 --- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/coroutines/Adapters.kt +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/coroutines/Adapters.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalCoroutinesApi::class) + package com.mapbox.navigation.instrumentation_tests.utils.coroutines import com.mapbox.api.directions.v5.models.BannerInstructions @@ -20,6 +22,7 @@ import com.mapbox.navigation.core.trip.session.BannerInstructionsObserver import com.mapbox.navigation.core.trip.session.RoadObjectsOnRouteObserver import com.mapbox.navigation.core.trip.session.RouteProgressObserver import com.mapbox.navigation.core.trip.session.VoiceInstructionsObserver +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/route/NavigationRouteEx.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/route/NavigationRouteEx.kt index abe7496b020..13d458d1810 100644 --- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/route/NavigationRouteEx.kt +++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/route/NavigationRouteEx.kt @@ -119,6 +119,13 @@ fun NavigationRoute.updateDirectionsRouteOnly( return copy(directionsResponse = refreshedResponse) } +/** + * Used to rebuild any [NavigationRoute] fields that are backed by a native peer, which might've been refreshed. + * + * At the moment, all fields are `val`s, so a simple re-instantiation is enough. + */ +fun NavigationRoute.refreshNativePeer(): NavigationRoute = copy() + /** * Internal API used for testing purposes. Needed to avoid calling native parser from unit tests. */ diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt index 46421b98e40..8c30315c0d3 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/MapboxNavigation.kt @@ -880,7 +880,7 @@ class MapboxNavigation @VisibleForTesting internal constructor( processedRoute.route.routeId == passedRoute.id } } - directionsSession.setRoutes(routes, setRoutesInfo) + directionsSession.setRoutes(processedRoutes.routes, setRoutesInfo) routesSetResult = ExpectedFactory.createValue( RoutesSetSuccess( ignoredAlternatives.associate { @@ -930,7 +930,7 @@ class MapboxNavigation @VisibleForTesting internal constructor( return tripSession.setRoutes(routes, setRoutesInfo).apply { if (this is NativeSetRouteValue) { routeAlternativesController.processAlternativesMetadata( - routes, + this.routes, nativeAlternatives ) } diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt index 423a6a1e8f2..09db864c8d1 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/MapboxTripSession.kt @@ -8,6 +8,7 @@ import com.mapbox.api.directions.v5.models.VoiceInstructions import com.mapbox.navigation.base.ExperimentalMapboxNavigationAPI import com.mapbox.navigation.base.internal.factory.RoadFactory import com.mapbox.navigation.base.internal.factory.TripNotificationStateFactory.buildTripNotificationState +import com.mapbox.navigation.base.internal.route.refreshNativePeer import com.mapbox.navigation.base.route.NavigationRoute import com.mapbox.navigation.base.trip.model.RouteLegProgress import com.mapbox.navigation.base.trip.model.RouteProgress @@ -90,16 +91,30 @@ internal class MapboxTripSession( } is SetAlternativeRoutesInfo -> { NativeSetRouteValue( + routes = routes, nativeAlternatives = navigator.setAlternativeRoutes(routes.drop(1)) ) } is SetRefreshedRoutesInfo -> { if (routes.isNotEmpty()) { val primaryRoute = routes.first() - navigator.refreshRoute(primaryRoute).onValue { - this@MapboxTripSession.primaryRoute = routes.first() - roadObjects = primaryRoute.upcomingRoadObjects - }.fold({ NativeSetRouteError(it) }, { NativeSetRouteValue(it) }).also { + navigator.refreshRoute(primaryRoute).fold( + { NativeSetRouteError(it) }, + { value -> + val refreshedPrimaryRoute = primaryRoute.refreshNativePeer() + this@MapboxTripSession.primaryRoute = refreshedPrimaryRoute + roadObjects = refreshedPrimaryRoute.upcomingRoadObjects + val refreshedRoutes = routes + .drop(1) + .toMutableList().apply { + add(0, refreshedPrimaryRoute) + } + NativeSetRouteValue( + routes = refreshedRoutes, + nativeAlternatives = value + ) + } + ).also { logD( "routes update (route IDs: ${routes.map { it.id }}) - refresh finished", LOG_CATEGORY @@ -144,7 +159,7 @@ internal class MapboxTripSession( routeProgress = null }.mapValue { it.alternatives - }.fold({ NativeSetRouteError(it) }, { NativeSetRouteValue(it) }).also { + }.fold({ NativeSetRouteError(it) }, { NativeSetRouteValue(routes, it) }).also { logD( "native routes update (route IDs: ${routes.map { it.id }}) - finished", LOG_CATEGORY diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/NativeSetRouteResult.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/NativeSetRouteResult.kt index 3e5435f52d2..5fea3425d9b 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/NativeSetRouteResult.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/trip/session/NativeSetRouteResult.kt @@ -1,5 +1,6 @@ package com.mapbox.navigation.core.trip.session +import com.mapbox.navigation.base.route.NavigationRoute import com.mapbox.navigator.RouteAlternative /** @@ -13,11 +14,12 @@ internal sealed class NativeSetRouteResult * @param nativeAlternatives Set routes. */ internal class NativeSetRouteValue( + val routes: List, val nativeAlternatives: List ) : NativeSetRouteResult() { override fun toString(): String { - return "NativeSetRouteValue(nativeAlternatives=$nativeAlternatives)" + return "NativeSetRouteValue(routes=$routes, nativeAlternatives=$nativeAlternatives)" } override fun equals(other: Any?): Boolean { @@ -26,13 +28,16 @@ internal class NativeSetRouteValue( other as NativeSetRouteValue + if (routes != other.routes) return false if (nativeAlternatives != other.nativeAlternatives) return false return true } override fun hashCode(): Int { - return nativeAlternatives.hashCode() + var result = routes.hashCode() + result = 31 * result + nativeAlternatives.hashCode() + return result } } diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationBaseTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationBaseTest.kt index 8fea2ce61fc..aa18767eac7 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationBaseTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationBaseTest.kt @@ -290,9 +290,12 @@ internal open class MapboxNavigationBaseTest { ) } returns tripSession every { tripSession.getRouteProgress() } returns routeProgress - coEvery { tripSession.setRoutes(any(), any()) } returns NativeSetRouteValue( - nativeAlternatives = emptyList() - ) + coEvery { tripSession.setRoutes(any(), any()) } answers { + NativeSetRouteValue( + routes = firstArg(), + nativeAlternatives = emptyList() + ) + } } private fun mockDirectionSession() { diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesCallbackTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesCallbackTest.kt index 89eb0bb5ace..8d099e75ffa 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesCallbackTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesCallbackTest.kt @@ -53,6 +53,7 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) } returns NativeSetRouteValue( + routes, listOf( routeAlternativeWithId(alternativeId1), routeAlternativeWithId(alternativeId2), @@ -78,7 +79,7 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(routes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex, callback) @@ -121,7 +122,7 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_CLEAN_UP, initialLegIndex), ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(routes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex, callback) @@ -142,7 +143,7 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(routes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex, callback) @@ -170,6 +171,7 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) } returns NativeSetRouteValue( + routes, listOf(routeAlternativeWithId("bad id 1"), routeAlternativeWithId("bad id 2")) ) @@ -198,7 +200,10 @@ internal class MapboxNavigationSetNavigationRoutesCallbackTest : MapboxNavigatio routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(listOf(routeAlternativeWithId(alternativeId2))) + } returns NativeSetRouteValue( + routes, + listOf(routeAlternativeWithId(alternativeId2)) + ) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex, callback) diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesHistoryRecordingTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesHistoryRecordingTest.kt index 88e49865e64..baad452b638 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesHistoryRecordingTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationSetNavigationRoutesHistoryRecordingTest.kt @@ -35,7 +35,7 @@ internal class MapboxNavigationSetNavigationRoutesHistoryRecordingTest : routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(routes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex) @@ -69,7 +69,7 @@ internal class MapboxNavigationSetNavigationRoutesHistoryRecordingTest : routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(routes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex) diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt index e7c4cbb7de9..f3973b639e1 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/MapboxNavigationTest.kt @@ -455,7 +455,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { } coEvery { tripSession.setRoutes(any(), any()) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(newRoutes, emptyList()) createMapboxNavigation() mapboxNavigation.setRerouteController(navigationRerouteController) @@ -513,7 +513,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { } coEvery { tripSession.setRoutes(any(), any()) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(newRoutes, emptyList()) createMapboxNavigation() mapboxNavigation.setRerouteController(oldController) @@ -563,7 +563,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { } coEvery { tripSession.setRoutes(any(), any()) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(emptyList(), emptyList()) createMapboxNavigation() mapboxNavigation.setRerouteController(oldController) @@ -825,12 +825,14 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { fun `setRoute pushes the route to the directions session`() = coroutineRule.runBlockingTest { createMapboxNavigation() val route: NavigationRoute = mockk() + val processedRoute: NavigationRoute = mockk() val routeOptions = createRouteOptions() every { route.routeOptions } returns routeOptions every { route.directionsRoute.geometry() } returns "geometry" every { route.directionsRoute.legs() } returns emptyList() val routes = listOf(route) + val processedRoutes = listOf(processedRoute) val initialLegIndex = 2 coEvery { @@ -838,12 +840,13 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) - } returns NativeSetRouteValue(emptyList()) + } returns NativeSetRouteValue(processedRoutes, emptyList()) mapboxNavigation.setNavigationRoutes(routes, initialLegIndex) verify(exactly = 1) { directionsSession.setRoutes( - routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) + processedRoutes, + BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, initialLegIndex) ) } } @@ -879,16 +882,22 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { coroutineRule.runBlockingTest { createMapboxNavigation() - val routes = emptyList() + val route: DirectionsRoute = createDirectionsRoute(requestUuid = "test1") + val processedRoute: NavigationRoute = mockk() + val routes = listOf(route) + val processedRoutes = listOf(processedRoute) val initialLegIndex = 2 coEvery { tripSession.setRoutes(any(), any()) - } returns NativeSetRouteValue(listOf(mockk())) + } returns NativeSetRouteValue(processedRoutes, listOf(mockk())) mapboxNavigation.setRoutes(routes, initialLegIndex) verify(exactly = 1) { - directionsSession.setRoutes(any(), match { it.legIndex == initialLegIndex }) + directionsSession.setRoutes( + processedRoutes, + match { it.legIndex == initialLegIndex } + ) } } @@ -1237,11 +1246,11 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { val shortRoutes = listOf(mockk()) coEvery { tripSession.setRoutes(longRoutes, any()) } coAnswers { delay(100L) - NativeSetRouteValue(emptyList()) + NativeSetRouteValue(longRoutes, emptyList()) } coEvery { tripSession.setRoutes(shortRoutes, any()) } coAnswers { delay(50L) - NativeSetRouteValue(emptyList()) + NativeSetRouteValue(shortRoutes, emptyList()) } pauseDispatcher { @@ -1283,7 +1292,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { ) } coEvery { tripSession.setRoutes(second, any()) } coAnswers { - NativeSetRouteValue(emptyList()) + NativeSetRouteValue(second, emptyList()) } val routesUpdates = mutableListOf() @@ -1312,7 +1321,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { val shortRoutes = listOf(mockk()) coEvery { tripSession.setRoutes(shortRoutes, any()) } coAnswers { delay(50L) - NativeSetRouteValue(emptyList()) + NativeSetRouteValue(shortRoutes, emptyList()) } pauseDispatcher { @@ -1326,13 +1335,14 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { coroutineRule.runBlockingTest { createMapboxNavigation() val routes = listOf(mockk()) + val processedRoutes = listOf(mockk()) val nativeAlternatives = listOf(mockk()) coEvery { tripSession.setRoutes( routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, 0) ) - } returns NativeSetRouteValue(nativeAlternatives) + } returns NativeSetRouteValue(processedRoutes, nativeAlternatives) mapboxNavigation.setNavigationRoutes(routes) @@ -1342,10 +1352,13 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { routes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, 0) ) - routeAlternativesController.processAlternativesMetadata(routes, nativeAlternatives) + routeAlternativesController.processAlternativesMetadata( + processedRoutes, + nativeAlternatives + ) routeAlternativesController.resumeUpdates() directionsSession.setRoutes( - routes, + processedRoutes, BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, 0) ) } @@ -1403,7 +1416,7 @@ internal class MapboxNavigationTest : MapboxNavigationBaseTest() { ) } coAnswers { delay(100) - NativeSetRouteValue(emptyList()) + NativeSetRouteValue(routes, emptyList()) } every { directionsSession.setRoutes(any(), any()) } answers { every { directionsSession.routes } returns firstArg() diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt index 4cccb508d8e..3d63a47b202 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/trip/session/MapboxTripSessionTest.kt @@ -8,6 +8,7 @@ import com.mapbox.api.directions.v5.models.VoiceInstructions import com.mapbox.bindgen.ExpectedFactory import com.mapbox.navigation.base.internal.CurrentIndicesFactory import com.mapbox.navigation.base.internal.factory.RoadObjectFactory +import com.mapbox.navigation.base.internal.route.refreshNativePeer import com.mapbox.navigation.base.options.NavigationOptions import com.mapbox.navigation.base.route.NavigationRoute import com.mapbox.navigation.base.trip.model.RouteProgress @@ -663,6 +664,7 @@ class MapboxTripSessionTest { ) assertEquals(nativeAlternatives, (result as NativeSetRouteValue).nativeAlternatives) + assertEquals(routes + alternative, result.routes) } @Test @@ -683,6 +685,7 @@ class MapboxTripSessionTest { ) assertEquals(nativeAlternatives, (result as NativeSetRouteValue).nativeAlternatives) + assertEquals(routes + alternative, result.routes) } @Test @@ -699,6 +702,7 @@ class MapboxTripSessionTest { ) assertTrue((result as NativeSetRouteValue).nativeAlternatives.isEmpty()) + assertEquals(emptyList(), result.routes) } @Test @@ -719,6 +723,7 @@ class MapboxTripSessionTest { ) assertEquals(nativeAlternatives, (result as NativeSetRouteValue).nativeAlternatives) + assertEquals(routes + alternative, result.routes) } @Test @@ -729,6 +734,15 @@ class MapboxTripSessionTest { navigator.refreshRoute(any()) } returns ExpectedFactory.createValue(mockAlternativesMetadata) + val refreshedRoutes = routes.map { + mockk(relaxed = true) { + every { id } returns "abc#0" + } + } + routes.forEachIndexed { i, route -> + every { route.refreshNativePeer() } returns refreshedRoutes[i] + } + tripSession.start(true) val result = tripSession.setRoutes( routes, @@ -739,6 +753,11 @@ class MapboxTripSessionTest { mockAlternativesMetadata, (result as NativeSetRouteValue).nativeAlternatives ) + + result.routes.forEachIndexed { i, route -> + assertTrue(route === refreshedRoutes[i]) + } + assertEquals(tripSession.primaryRoute, refreshedRoutes.first()) } @Test @@ -943,19 +962,28 @@ class MapboxTripSessionTest { coroutineRule.runBlockingTest { val roadObjectsObserver: RoadObjectsOnRouteObserver = mockk(relaxUnitFun = true) val roadObjects: List = listOf(mockk()) + val refreshedRoadObjects: List = listOf(mockk()) + val initialRoute = mockNavigationRoute(roadObjects = roadObjects) + val refreshedRoute = mockNavigationRoute(roadObjects = roadObjects) + every { + refreshedRoute.refreshNativePeer() + } returns mockNavigationRoute(roadObjects = refreshedRoadObjects) tripSession = buildTripSession() tripSession.registerRoadObjectsOnRouteObserver(roadObjectsObserver) tripSession.setRoutes( - listOf(mockNavigationRoute(roadObjects = roadObjects)), + listOf(initialRoute), BasicSetRoutesInfo(RoutesExtra.ROUTES_UPDATE_REASON_NEW, 0) ) tripSession.setRoutes( - listOf(mockNavigationRoute(roadObjects = roadObjects)), + listOf(refreshedRoute), SetRefreshedRoutesInfo(CurrentIndicesFactory.createIndices(0, 0, null)), ) - verify(exactly = 2) { roadObjectsObserver.onNewRoadObjectsOnTheRoute(any()) } + verifyOrder { + roadObjectsObserver.onNewRoadObjectsOnTheRoute(roadObjects) + roadObjectsObserver.onNewRoadObjectsOnTheRoute(refreshedRoadObjects) + } } @Test