@@ -9,6 +9,7 @@ import com.mapbox.api.directions.v5.models.DirectionsResponse
99import com.mapbox.api.directions.v5.models.Incident
1010import com.mapbox.api.directions.v5.models.RouteOptions
1111import com.mapbox.geojson.Point
12+ import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
1213import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
1314import com.mapbox.navigation.base.options.NavigationOptions
1415import com.mapbox.navigation.base.options.RoutingTilesOptions
@@ -59,6 +60,7 @@ import java.net.URI
5960import java.util.concurrent.TimeUnit
6061import kotlin.math.absoluteValue
6162
63+ @OptIn(ExperimentalPreviewMapboxNavigationAPI ::class )
6264class RouteRefreshTest : BaseTest <EmptyTestActivity >(EmptyTestActivity : :class.java) {
6365
6466 @get:Rule
@@ -528,6 +530,73 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
528530 assertEquals(187.126 , refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
529531 }
530532
533+ @Test
534+ fun route_refresh_updates_annotations_for_new_alternative_with_more_legs () =
535+ sdkTest {
536+ setupMockRequestHandlers(
537+ multilegCoordinates,
538+ R .raw.route_response_single_route_multileg,
539+ R .raw.route_response_single_route_multileg_refreshed,
540+ " route_response_single_route_multileg" ,
541+ acceptedGeometryIndex = 70
542+ )
543+ mockWebServerRule.requestHandlers.add(
544+ FailByRequestMockRequestHandler (
545+ MockDirectionsRefreshHandler (
546+ " route_response_single_route_multileg_alternative" ,
547+ readRawFileText(
548+ activity,
549+ R .raw.route_response_single_route_multileg_alternative_refreshed
550+ ),
551+ acceptedGeometryIndex = 11
552+ )
553+ )
554+ )
555+ val routeOptions = generateRouteOptions(multilegCoordinates)
556+ val alternativeRoutes = mapboxNavigation.requestRoutes(routeOptions)
557+ .getSuccessfulResultOrThrowException()
558+ .routes
559+ // alternative which was requested on the second leg of the original route,
560+ // so the alternative has only one leg while the original route has two
561+ val primaryRoute = alternativeForMultileg(activity).toNavigationRoutes().first()
562+
563+ // corresponds to currentRouteGeometryIndex = 70 for alternative route and 11 for the primary route
564+ mockLocationUpdatesRule.pushLocationUpdate(
565+ mockLocationUpdatesRule.generateLocationUpdate {
566+ latitude = 38.581798
567+ longitude = - 121.476146
568+ }
569+ )
570+
571+ mapboxNavigation.setNavigationRoutes(listOf (primaryRoute) + alternativeRoutes, initialLegIndex = 0 )
572+ mapboxNavigation.startTripSession()
573+
574+ mapboxNavigation.routeProgressUpdates()
575+ .filter {
576+ it.currentRouteGeometryIndex == 11
577+ }
578+ .first()
579+
580+ val refreshedRoutes = mapboxNavigation.routesUpdates()
581+ .filter {
582+ it.reason == ROUTES_UPDATE_REASON_REFRESH
583+ }
584+ .first()
585+ .navigationRoutes
586+
587+ assertEquals(
588+ alternativeRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ),
589+ refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ),
590+ 0.0001
591+ )
592+
593+ assertEquals(201.673 , alternativeRoutes[0 ].getSumOfDurationAnnotationsFromLeg(1 ), 0.0001 )
594+ assertEquals(202.881 , refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(1 ), 0.0001 )
595+
596+ assertEquals(194.3 , primaryRoute.getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
597+ assertEquals(187.126 , refreshedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
598+ }
599+
531600 @Test
532601 fun expect_route_refresh_to_update_annotations_incidents_and_closures_for_truncated_next_leg () =
533602 sdkTest {
0 commit comments