11package com.mapbox.navigation.instrumentation_tests.core
22
3+ import android.content.Context
34import android.location.Location
45import androidx.annotation.IntegerRes
56import com.mapbox.api.directions.v5.DirectionsCriteria
67import com.mapbox.api.directions.v5.models.Closure
8+ import com.mapbox.api.directions.v5.models.DirectionsResponse
79import com.mapbox.api.directions.v5.models.Incident
810import com.mapbox.api.directions.v5.models.RouteOptions
911import com.mapbox.geojson.Point
@@ -26,6 +28,7 @@ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.roadObjectsO
2628import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routeProgressUpdates
2729import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routesUpdates
2830import com.mapbox.navigation.instrumentation_tests.utils.coroutines.sdkTest
31+ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForAlternativesUpdate
2932import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForUpdate
3033import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler
3134import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler
@@ -34,6 +37,8 @@ import com.mapbox.navigation.instrumentation_tests.utils.http.MockRoutingTileEnd
3437import com.mapbox.navigation.instrumentation_tests.utils.idling.IdlingPolicyTimeoutRule
3538import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule
3639import com.mapbox.navigation.instrumentation_tests.utils.readRawFileText
40+ import com.mapbox.navigation.instrumentation_tests.utils.routes.MockRoute
41+ import com.mapbox.navigation.instrumentation_tests.utils.routes.RoutesProvider.toNavigationRoutes
3742import com.mapbox.navigation.testing.ui.BaseTest
3843import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
3944import com.mapbox.navigation.testing.ui.utils.runOnMainSync
@@ -80,6 +85,11 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
8085 Point .fromLngLat(- 75.525486 , 38.772959 ),
8186 Point .fromLngLat(- 74.698765 , 39.822911 )
8287 )
88+ private val multilegCoordinates = listOf (
89+ Point .fromLngLat(38.577764 , - 121.496066 ),
90+ Point .fromLngLat(38.576795 , - 121.480256 ),
91+ Point .fromLngLat(38.582195 , - 121.468458 )
92+ )
8393
8494 private lateinit var failByRequestRouteRefreshResponse: FailByRequestMockRequestHandler
8595
@@ -424,7 +434,7 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
424434 R .raw.route_response_route_refresh,
425435 R .raw.route_response_route_refresh_truncated_first_leg,
426436 " route_response_route_refresh" ,
427- acceptedGeometryIndex = 5
437+ acceptedGeometryIndex = 3
428438 )
429439 val routeOptions = generateRouteOptions(twoCoordinates)
430440 val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
@@ -433,10 +443,10 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
433443
434444 mapboxNavigation.setNavigationRoutes(requestedRoutes)
435445 mapboxNavigation.startTripSession()
436- // corresponds to currentRouteGeometryIndex = 5
437- stayOnPosition(38.57622 , - 121.496731 )
446+ // corresponds to currentRouteGeometryIndex = 3
447+ stayOnPosition(38.577344 , - 121.496248 )
438448 mapboxNavigation.routeProgressUpdates()
439- .filter { it.currentRouteGeometryIndex == 5 }
449+ .filter { it.currentRouteGeometryIndex == 3 }
440450 .first()
441451 val refreshedRoutes = mapboxNavigation.routesUpdates()
442452 .filter {
@@ -446,10 +456,76 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
446456 .navigationRoutes
447457
448458 assertEquals(224.224 , requestedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
449- assertEquals(169.582 , refreshedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
459+ assertEquals(172.175 , refreshedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
450460
451461 assertEquals(227.918 , requestedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
452- assertEquals(234.024 , refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
462+ assertEquals(235.641 , refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
463+ }
464+
465+ @Test
466+ fun route_refresh_updates_annotations_for_new_alternative_with_different_number_of_legs () =
467+ sdkTest {
468+ setupMockRequestHandlers(
469+ multilegCoordinates,
470+ R .raw.route_response_single_route_multileg,
471+ R .raw.route_response_single_route_multileg_refreshed,
472+ " route_response_single_route_multileg" ,
473+ acceptedGeometryIndex = 70
474+ )
475+ mockWebServerRule.requestHandlers.add(
476+ FailByRequestMockRequestHandler (
477+ MockDirectionsRefreshHandler (
478+ " route_response_single_route_multileg_alternative" ,
479+ readRawFileText(
480+ activity,
481+ R .raw.route_response_single_route_multileg_alternative_refreshed
482+ ),
483+ acceptedGeometryIndex = 11
484+ )
485+ )
486+ )
487+ val routeOptions = generateRouteOptions(multilegCoordinates)
488+ val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
489+ .getSuccessfulResultOrThrowException()
490+ .routes
491+ // alternative which was requested on the second leg of the original route,
492+ // so the alternative has only one leg while the original route has two
493+ val alternativeRoute = alternativeForMultileg(activity).toNavigationRoutes().first()
494+
495+ mapboxNavigation.setNavigationRoutes(requestedRoutes, initialLegIndex = 1 )
496+ mapboxNavigation.startTripSession()
497+
498+ // corresponds to currentRouteGeometryIndex = 70 for primary route and 11 for alternative route
499+ stayOnPosition(38.581798 , - 121.476146 )
500+ mapboxNavigation.routeProgressUpdates()
501+ .filter {
502+ it.currentRouteGeometryIndex == 70
503+ }
504+ .first()
505+
506+ mapboxNavigation.setNavigationRoutesAndWaitForAlternativesUpdate(
507+ requestedRoutes + alternativeRoute,
508+ initialLegIndex = 1
509+ )
510+
511+ val refreshedRoutes = mapboxNavigation.routesUpdates()
512+ .filter {
513+ it.reason == ROUTES_UPDATE_REASON_REFRESH
514+ }
515+ .first()
516+ .navigationRoutes
517+
518+ assertEquals(
519+ requestedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ),
520+ refreshedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(0 ),
521+ 0.0001
522+ )
523+
524+ assertEquals(201.673 , requestedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(1 ), 0.0001 )
525+ assertEquals(202.881 , refreshedRoutes[0 ].getSumOfDurationAnnotationsFromLeg(1 ), 0.0001 )
526+
527+ assertEquals(194.3 , alternativeRoute.getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
528+ assertEquals(187.126 , refreshedRoutes[1 ].getSumOfDurationAnnotationsFromLeg(0 ), 0.0001 )
453529 }
454530
455531 @Test
@@ -714,6 +790,27 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
714790 )
715791 )
716792 }
793+
794+ private fun alternativeForMultileg (context : Context ): MockRoute {
795+ val jsonResponse = readRawFileText(context, R .raw.route_response_single_route_multileg_alternative)
796+ val coordinates = listOf (
797+ Point .fromLngLat(38.577427 , - 121.478077 ),
798+ Point .fromLngLat(38.582195 , - 121.468458 )
799+ )
800+ return MockRoute (
801+ jsonResponse,
802+ DirectionsResponse .fromJson(jsonResponse),
803+ listOf (
804+ MockDirectionsRequestHandler (
805+ profile = DirectionsCriteria .PROFILE_DRIVING_TRAFFIC ,
806+ jsonResponse = jsonResponse,
807+ expectedCoordinates = coordinates
808+ )
809+ ),
810+ coordinates,
811+ emptyList()
812+ )
813+ }
717814}
718815
719816private fun NavigationRoute.getSumOfDurationAnnotationsFromLeg (legIndex : Int ): Double =
0 commit comments