From 861e9fcd1e7ba97cc56aadcf78839a77e91e7b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Wed, 10 Feb 2021 13:33:25 +0100 Subject: [PATCH] fixed an issue where remaining waypoints would always return 0 and break reroute handling --- .../core/CoreRerouteTest.kt | 130 ++++++++++++++++++ .../utils/location/MockLocationReplayer.kt | 35 +++++ .../utils/routes/MockRoutesProvider.kt | 2 +- .../raw/reroute_response_dc_very_short.json | 1 + .../routeoptions/MapboxRouteOptionsUpdater.kt | 19 ++- .../MapboxRouteOptionsUpdaterTest.kt | 25 +++- .../internal/MapboxNativeNavigatorImpl.kt | 2 +- .../testing/ui/MockLocationUpdatesRule.kt | 2 +- 8 files changed, 208 insertions(+), 8 deletions(-) create mode 100644 instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/CoreRerouteTest.kt create mode 100644 instrumentation-tests/src/main/res/raw/reroute_response_dc_very_short.json diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/CoreRerouteTest.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/CoreRerouteTest.kt new file mode 100644 index 00000000000..2e16a9e5f82 --- /dev/null +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/CoreRerouteTest.kt @@ -0,0 +1,130 @@ +package com.mapbox.navigation.instrumentation_tests.core + +import androidx.test.espresso.Espresso +import com.mapbox.api.directions.v5.models.RouteOptions +import com.mapbox.geojson.Point +import com.mapbox.navigation.base.internal.extensions.applyDefaultParams +import com.mapbox.navigation.base.options.NavigationOptions +import com.mapbox.navigation.base.trip.model.RouteProgressState +import com.mapbox.navigation.core.MapboxNavigation +import com.mapbox.navigation.core.MapboxNavigationProvider +import com.mapbox.navigation.instrumentation_tests.R +import com.mapbox.navigation.instrumentation_tests.activity.EmptyTestActivity +import com.mapbox.navigation.instrumentation_tests.utils.MapboxNavigationRule +import com.mapbox.navigation.instrumentation_tests.utils.assertions.RouteProgressStateTransitionAssertion +import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRequestHandler +import com.mapbox.navigation.instrumentation_tests.utils.idling.RouteProgressStateIdlingResource +import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule +import com.mapbox.navigation.instrumentation_tests.utils.readRawFileText +import com.mapbox.navigation.instrumentation_tests.utils.routes.MockRoutesProvider +import com.mapbox.navigation.instrumentation_tests.utils.runOnMainSync +import com.mapbox.navigation.testing.ui.BaseTest +import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class CoreRerouteTest : BaseTest(EmptyTestActivity::class.java) { + + @get:Rule + val mapboxNavigationRule = MapboxNavigationRule() + + @get:Rule + val mockLocationReplayerRule = MockLocationReplayerRule(mockLocationUpdatesRule) + + private lateinit var mapboxNavigation: MapboxNavigation + + private lateinit var offRouteIdlingResource: RouteProgressStateIdlingResource + private lateinit var locationTrackingIdlingResource: RouteProgressStateIdlingResource + + @Before + fun setup() { + Espresso.onIdle() + + mapboxNavigation = MapboxNavigationProvider.create( + NavigationOptions.Builder(activity) + .accessToken(getMapboxAccessTokenFromResources(activity)) + .build() + ) + locationTrackingIdlingResource = RouteProgressStateIdlingResource( + mapboxNavigation, + RouteProgressState.LOCATION_TRACKING + ) + offRouteIdlingResource = RouteProgressStateIdlingResource( + mapboxNavigation, + RouteProgressState.OFF_ROUTE + ) + } + + @Test + fun reroute_completes() { + // prepare + val mockRoute = MockRoutesProvider.dc_very_short(activity) + + val originLocation = mockLocationUpdatesRule.generateLocationUpdate { + latitude = mockRoute.routeWaypoints.first().latitude() + longitude = mockRoute.routeWaypoints.first().longitude() + } + + val offRouteLocationUpdate = mockLocationUpdatesRule.generateLocationUpdate { + latitude = originLocation.latitude + 0.002 + longitude = originLocation.longitude + } + + mockWebServerRule.requestHandlers.addAll(mockRoute.mockRequestHandlers) + mockWebServerRule.requestHandlers.add( + MockDirectionsRequestHandler( + profile = "driving", + jsonResponse = readRawFileText(activity, R.raw.reroute_response_dc_very_short), + expectedCoordinates = listOf( + Point.fromLngLat( + offRouteLocationUpdate.longitude, + offRouteLocationUpdate.latitude + ), + mockRoute.routeWaypoints.last() + ) + ) + ) + locationTrackingIdlingResource.register() + + val expectedStates = RouteProgressStateTransitionAssertion(mapboxNavigation) { + optionalState(RouteProgressState.ROUTE_INVALID) + requiredState(RouteProgressState.LOCATION_TRACKING) + requiredState(RouteProgressState.OFF_ROUTE) + optionalState(RouteProgressState.ROUTE_INITIALIZED) + requiredState(RouteProgressState.LOCATION_TRACKING) + } + + // start a route + runOnMainSync { + mockLocationUpdatesRule.pushLocationUpdate(originLocation) + mapboxNavigation.startTripSession() + mapboxNavigation.requestRoutes( + RouteOptions.builder().applyDefaultParams() + .baseUrl(mockWebServerRule.baseUrl) + .accessToken(getMapboxAccessTokenFromResources(activity)) + .coordinates(mockRoute.routeWaypoints).build() + ) + } + + // wait for tracking to start + Espresso.onIdle() + locationTrackingIdlingResource.unregister() + + // push off route location and wait for the off route event + offRouteIdlingResource.register() + runOnMainSync { + mockLocationReplayerRule.loopUpdate(offRouteLocationUpdate, times = 5) + } + Espresso.onIdle() + offRouteIdlingResource.unregister() + + // wait for tracking to start again + locationTrackingIdlingResource.register() + Espresso.onIdle() + locationTrackingIdlingResource.unregister() + + // assert results + expectedStates.assert() + } +} diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/location/MockLocationReplayer.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/location/MockLocationReplayer.kt index a36d69c7d15..c182d1e4c08 100644 --- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/location/MockLocationReplayer.kt +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/location/MockLocationReplayer.kt @@ -6,6 +6,7 @@ import android.os.SystemClock import com.mapbox.api.directions.v5.models.DirectionsRoute import com.mapbox.navigation.core.replay.MapboxReplayer import com.mapbox.navigation.core.replay.history.ReplayEventBase +import com.mapbox.navigation.core.replay.history.ReplayEventLocation import com.mapbox.navigation.core.replay.history.ReplayEventUpdateLocation import com.mapbox.navigation.core.replay.history.ReplayEventsObserver import com.mapbox.navigation.core.replay.route.ReplayRouteMapper @@ -52,6 +53,22 @@ class MockLocationReplayerRule(mockLocationUpdatesRule: MockLocationUpdatesRule) mapboxReplayer?.seekTo(replayEvents.first()) mapboxReplayer?.play() } + + fun loopUpdate(location: Location, times: Int) { + val events: List = + mutableListOf().apply { + repeat(times) { + this.add(location.toReplayEventUpdateLocation(it.toDouble())) + } + } + mapboxReplayer?.run { + stop() + clearEvents() + pushEvents(events) + seekTo(events.first()) + play() + } + } } fun ReplayEventUpdateLocation.toLocation( @@ -70,3 +87,21 @@ fun ReplayEventUpdateLocation.toLocation( return location } + +fun Location.toReplayEventUpdateLocation( + timestamp: Double +): ReplayEventUpdateLocation { + return ReplayEventUpdateLocation( + timestamp, + ReplayEventLocation( + this.longitude, + this.latitude, + this.provider, + this.time.toDouble(), + this.altitude, + this.accuracy.toDouble(), + this.bearing.toDouble(), + this.speed.toDouble() + ) + ) +} diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/routes/MockRoutesProvider.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/routes/MockRoutesProvider.kt index d4c0b99cd8e..d40618e6e0e 100644 --- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/routes/MockRoutesProvider.kt +++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/utils/routes/MockRoutesProvider.kt @@ -25,7 +25,7 @@ object MockRoutesProvider { listOf( MockDirectionsRequestHandler( profile = "driving", - jsonResponse = readRawFileText(context, R.raw.route_response_dc_very_short), + jsonResponse = jsonResponse, expectedCoordinates = coordinates ), MockVoiceRequestHandler( diff --git a/instrumentation-tests/src/main/res/raw/reroute_response_dc_very_short.json b/instrumentation-tests/src/main/res/raw/reroute_response_dc_very_short.json new file mode 100644 index 00000000000..f90ee4a31ac --- /dev/null +++ b/instrumentation-tests/src/main/res/raw/reroute_response_dc_very_short.json @@ -0,0 +1 @@ +{"routes":[{"weight_name":"auto","weight":170.807,"duration":120.945,"distance":581.831,"legs":[{"annotation":{"congestion":["unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown","unknown"],"distance":[26.9,30.5,12.6,13.9,67.8,105.1,1.2,13.8,8.3,3.8,111.3,12.1,12.4,40.4,13.8,7.4,12,6.9,12.8,15.1,36.9,12.6,3.8]},"admins":[{"iso_3166_1_alpha3":"USA","iso_3166_1":"US"}],"weight":170.807,"duration":120.945,"steps":[{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"F Street Northwest"}],"type":"turn","modifier":"right","text":"F Street Northwest"},"distanceAlongGeometry":71.042}],"voiceInstructions":[{"ssmlAnnouncement":"Drive north on 14th Street Northwest. Then Turn right onto F Street Northwest.","announcement":"Drive north on 14th Street Northwest. Then Turn right onto F Street Northwest.","distanceAlongGeometry":71.042}],"intersections":[{"entry":[true],"bearings":[0],"duration":2.95,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":3.614,"geometry_index":0,"location":[-77.03195,38.896721]},{"entry":[true,false],"in":1,"bearings":[0,180],"duration":3.382,"turn_weight":0.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":4.643,"geometry_index":1,"location":[-77.03195,38.896963]},{"bearings":[0,180],"entry":[true,false],"in":1,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"geometry_index":2,"location":[-77.03195,38.897237]}],"maneuver":{"type":"depart","instruction":"Drive north on 14th Street Northwest.","bearing_after":0,"bearing_before":0,"location":[-77.03195,38.896721]},"name":"14th Street Northwest","duration":7.757,"distance":71.042,"driving_side":"right","weight":11.994,"mode":"driving","geometry":"adaeiAz_t|qCcN?cP?aF?"},{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"13th Street Northwest"}],"type":"turn","modifier":"right","text":"13th Street Northwest"},"distanceAlongGeometry":202}],"voiceInstructions":[{"ssmlAnnouncement":"In 700 feet, Turn right onto 13th Street Northwest.","announcement":"In 700 feet, Turn right onto 13th Street Northwest.","distanceAlongGeometry":185.667},{"ssmlAnnouncement":"Turn right onto 13th Street Northwest.","announcement":"Turn right onto 13th Street Northwest.","distanceAlongGeometry":87.111}],"intersections":[{"entry":[true,false],"in":1,"bearings":[90,180],"duration":7.255,"turn_weight":8,"turn_duration":4.105,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":11.859,"geometry_index":3,"location":[-77.03195,38.89735]},{"entry":[true,false],"in":1,"bearings":[90,270],"duration":38.932,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":49.683,"geometry_index":4,"location":[-77.031789,38.89735]},{"bearings":[90,270],"entry":[true,false],"in":1,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"geometry_index":6,"location":[-77.029794,38.897346]}],"maneuver":{"type":"turn","instruction":"Turn right onto F Street Northwest.","modifier":"right","bearing_after":90,"bearing_before":0,"location":[-77.03195,38.89735]},"name":"F Street Northwest","duration":49.569,"distance":202,"driving_side":"right","weight":67.676,"mode":"driving","geometry":"kkbeiAz_t|qC?aI@{o@DyjA?[?}H"},{"bannerInstructions":[{"sub":{"components":[{"active":false,"directions":["left"],"type":"lane","text":""},{"active":false,"directions":["left"],"type":"lane","text":""},{"active_direction":"right","active":true,"directions":["straight","right"],"type":"lane","text":""}],"text":""},"primary":{"components":[{"type":"text","text":"Pennsylvania Avenue Northwest"}],"type":"turn","modifier":"right","text":"Pennsylvania Avenue Northwest"},"distanceAlongGeometry":201}],"voiceInstructions":[{"ssmlAnnouncement":"In 700 feet, Turn right onto Pennsylvania Avenue Northwest.","announcement":"In 700 feet, Turn right onto Pennsylvania Avenue Northwest.","distanceAlongGeometry":184.667},{"ssmlAnnouncement":"Turn right onto Pennsylvania Avenue Northwest. Then, in 400 feet, Your destination will be on the left.","announcement":"Turn right onto Pennsylvania Avenue Northwest. Then, in 400 feet, Your destination will be on the left.","distanceAlongGeometry":123.861}],"intersections":[{"entry":[true,false],"in":1,"bearings":[180,270],"duration":5.621,"turn_weight":8,"turn_duration":4.105,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":0,"weight":9.857,"geometry_index":8,"location":[-77.029621,38.897346]},{"entry":[false,true],"in":0,"bearings":[0,180],"duration":21.796,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":28.147,"geometry_index":9,"location":[-77.029621,38.897271]},{"entry":[false,true],"in":0,"bearings":[0,180],"duration":2.281,"turn_weight":2,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":4.728,"geometry_index":11,"location":[-77.029624,38.896237]},{"entry":[false,true],"in":0,"bearings":[0,196],"duration":3.62,"turn_weight":6,"turn_duration":2.02,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":7.92,"geometry_index":12,"location":[-77.029624,38.896128]},{"entry":[false,true],"in":0,"bearings":[16,181],"duration":5.382,"turn_weight":2,"turn_duration":0.048,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"weight":8.4,"geometry_index":13,"location":[-77.029663,38.896021]},{"bearings":[1,188],"entry":[false,true],"in":0,"turn_weight":2,"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["left"],"valid":false,"active":false},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":true}],"turn_duration":0.012,"mapbox_streets_v8":{"class":"secondary"},"is_urban":true,"admin_index":0,"out":1,"geometry_index":14,"location":[-77.029672,38.895658]}],"maneuver":{"type":"turn","instruction":"Turn right onto 13th Street Northwest.","modifier":"right","bearing_after":180,"bearing_before":90,"location":[-77.029621,38.897346]},"name":"13th Street Northwest","duration":40.578,"distance":201,"driving_side":"right","weight":63.293,"mode":"driving","geometry":"ckbeiAhno|qCtC?bA?n}@DxE?tElAtUPtFj@"},{"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Your destination will be on the left"}],"type":"arrive","modifier":"left","text":"Your destination will be on the left"},"distanceAlongGeometry":107.79},{"primary":{"components":[{"type":"text","text":"Your destination is on the left"}],"type":"arrive","modifier":"left","text":"Your destination is on the left"},"distanceAlongGeometry":79.167}],"voiceInstructions":[{"ssmlAnnouncement":"Your destination is on the left.","announcement":"Your destination is on the left.","distanceAlongGeometry":79.167}],"intersections":[{"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["left"],"valid":false,"active":false},{"indications":["straight","right"],"valid_indication":"right","valid":true,"active":true}],"location":[-77.029694,38.895535],"geometry_index":15,"admin_index":0,"weight":10.043,"is_urban":true,"mapbox_streets_v8":{"class":"primary"},"turn_duration":5.373,"turn_weight":9,"duration":6.242,"bearings":[8,288],"out":1,"in":0,"entry":[false,true]},{"entry":[false,true],"in":0,"bearings":[108,281],"duration":2.387,"turn_duration":0.028,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":2.83,"geometry_index":16,"location":[-77.029775,38.895556]},{"entry":[false,true],"in":0,"bearings":[101,274],"duration":1.614,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":1.937,"geometry_index":18,"location":[-77.029989,38.895589]},{"entry":[false,true],"in":0,"bearings":[94,270],"duration":6.455,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":7.746,"geometry_index":19,"location":[-77.030136,38.895597]},{"entry":[false,true],"in":0,"bearings":[90,269],"duration":5.362,"lanes":[{"indications":["left"],"valid":false,"active":false},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":true},{"indications":["straight"],"valid_indication":"straight","valid":true,"active":false}],"turn_duration":2.019,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"weight":4.095,"geometry_index":21,"location":[-77.030736,38.895595]},{"bearings":[89,269],"entry":[false,true],"in":0,"turn_duration":0.007,"mapbox_streets_v8":{"class":"primary"},"is_urban":true,"admin_index":0,"out":1,"geometry_index":22,"location":[-77.030881,38.895593]}],"maneuver":{"type":"turn","instruction":"Turn right onto Pennsylvania Avenue Northwest.","modifier":"right","bearing_after":288,"bearing_before":188,"location":[-77.029694,38.895535]},"name":"Pennsylvania Avenue Northwest","duration":23.041,"distance":107.79,"driving_side":"right","weight":27.845,"mode":"driving","geometry":"}y~diAzro|qCi@`Do@lGQ|COdH@zI@rYB`H@vA"},{"bannerInstructions":[],"voiceInstructions":[],"intersections":[{"bearings":[89],"entry":[true],"in":0,"admin_index":0,"geometry_index":23,"location":[-77.030925,38.895592]}],"maneuver":{"type":"arrive","instruction":"Your destination is on the left.","modifier":"left","bearing_after":0,"bearing_before":269,"location":[-77.030925,38.895592]},"name":"Pennsylvania Avenue Northwest","duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"o}~diAx_r|qC??"}],"distance":581.831,"summary":"F Street Northwest, 13th Street Northwest"}],"geometry":"adaeiAz_t|qCcN?cP?aF??aI@{o@DyjA?[?}HtC?bA?n}@DxE?tElAtUPtFj@i@`Do@lGQ|COdH@zI@rYB`H@vA","voiceLocale":"en-US"}],"waypoints":[{"distance":3.551,"name":"14th Street Northwest","location":[-77.03195,38.896721]},{"distance":7.719,"name":"Pennsylvania Avenue Northwest","location":[-77.030925,38.895592]}],"code":"Ok","uuid":""} \ No newline at end of file diff --git a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdater.kt b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdater.kt index 44b208b986a..ce07a5a566a 100644 --- a/libnavigation-core/src/main/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdater.kt +++ b/libnavigation-core/src/main/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdater.kt @@ -10,6 +10,7 @@ import com.mapbox.navigation.base.trip.model.RouteProgress import kotlin.math.min private const val DEFAULT_REROUTE_BEARING_TOLERANCE = 90.0 +private const val TAG = "MapboxRouteOptionsProvider" /** * Default implementation of [RouteOptionsUpdater]. @@ -32,8 +33,8 @@ class MapboxRouteOptionsUpdater( if (routeOptions == null || routeProgress == null || location == null) { val msg = "Cannot combine RouteOptions, invalid inputs. routeOptions, " + "routeProgress, and location mustn't be null" - logger?.w( - Tag("MapboxRouteOptionsProvider"), + logger?.e( + Tag(TAG), Message(msg) ) return RouteOptionsUpdater.RouteOptionsResult.Error(Throwable(msg)) @@ -43,6 +44,20 @@ class MapboxRouteOptionsUpdater( val coordinates = routeOptions.coordinates() val remainingWaypoints = routeProgress.remainingWaypoints + if (remainingWaypoints == 0) { + val msg = """ + Reroute failed. There are no remaining waypoints on the route. + routeOptions=$routeOptions + routeProgress=$routeProgress + location=$location + """.trimIndent() + logger?.e( + Tag(TAG), + Message(msg) + ) + return RouteOptionsUpdater.RouteOptionsResult.Error(Throwable(msg)) + } + try { routeProgress.currentLegProgress?.legIndex?.let { index -> optionsBuilder diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdaterTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdaterTest.kt index 9f0c8b3f354..2d8631f1e41 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdaterTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routeoptions/MapboxRouteOptionsUpdaterTest.kt @@ -82,7 +82,9 @@ class MapboxRouteOptionsUpdaterTest { @Test fun new_options_return_with_null_bearings() { val routeOptions = provideRouteOptionsWithCoordinates() - val routeProgress: RouteProgress = mockk(relaxed = true) + val routeProgress: RouteProgress = mockk(relaxed = true) { + every { remainingWaypoints } returns 1 + } val newRouteOptions = routeRefreshAdapter.update(routeOptions, routeProgress, location) @@ -109,7 +111,9 @@ class MapboxRouteOptionsUpdaterTest { @Test fun new_options_return_with_bearing() { val routeOptions = provideRouteOptionsWithCoordinatesAndBearings() - val routeProgress: RouteProgress = mockk(relaxed = true) + val routeProgress: RouteProgress = mockk(relaxed = true) { + every { remainingWaypoints } returns 1 + } val newRouteOptions = routeRefreshAdapter.update(routeOptions, routeProgress, location) @@ -130,6 +134,19 @@ class MapboxRouteOptionsUpdaterTest { assertEquals(expectedBearings, actualBearings) } + @Test + fun new_options_invalid_remaining_points() { + val routeOptions = provideRouteOptionsWithCoordinatesAndBearings() + val routeProgress: RouteProgress = mockk(relaxed = true) { + every { remainingWaypoints } returns 0 + } + + val newRouteOptions = + routeRefreshAdapter.update(routeOptions, routeProgress, location) + + assertTrue(newRouteOptions is RouteOptionsUpdater.RouteOptionsResult.Error) + } + @Test fun no_options_on_invalid_input() { val invalidInput = mutableListOf>() @@ -226,7 +243,9 @@ class MapboxRouteOptionsUpdaterTest { @Test fun bearingOptions() { - val routeProgress: RouteProgress = mockk(relaxed = true) + val routeProgress: RouteProgress = mockk(relaxed = true) { + every { remainingWaypoints } returns routeOptions.coordinates().size - 1 + } val newRouteOptions = routeRefreshAdapter.update(routeOptions, routeProgress, location) diff --git a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt index 04d9af3c826..044c50ba9dd 100644 --- a/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt +++ b/libnavigator/src/main/java/com/mapbox/navigation/navigator/internal/MapboxNativeNavigatorImpl.kt @@ -133,7 +133,7 @@ object MapboxNativeNavigatorImpl : MapboxNativeNavigator { navigatorPredictionMillis ) val status = navigator!!.getStatus(nanos) - val remainingWaypoints = ifNonNull(route?.routeOptions()?.waypointIndicesList()?.size) { + val remainingWaypoints = ifNonNull(route?.routeOptions()?.coordinates()?.size) { it - status.nextWaypointIndex } ?: 0 TripStatus( diff --git a/libtesting-ui/src/main/java/com/mapbox/navigation/testing/ui/MockLocationUpdatesRule.kt b/libtesting-ui/src/main/java/com/mapbox/navigation/testing/ui/MockLocationUpdatesRule.kt index 32ad3189280..ad3ff4c4999 100644 --- a/libtesting-ui/src/main/java/com/mapbox/navigation/testing/ui/MockLocationUpdatesRule.kt +++ b/libtesting-ui/src/main/java/com/mapbox/navigation/testing/ui/MockLocationUpdatesRule.kt @@ -84,7 +84,7 @@ class MockLocationUpdatesRule : ExternalResource() { locationManager.setTestProviderLocation(mockProviderName, location) } - private fun generateLocationUpdate(modifyFn: (Location.() -> Unit)? = null): Location { + fun generateLocationUpdate(modifyFn: (Location.() -> Unit)? = null): Location { val location = Location(mockProviderName) location.time = Date().time location.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()