1
1
package com.mapbox.navigation.instrumentation_tests.core
2
2
3
+ import android.content.Context
3
4
import android.location.Location
4
5
import androidx.annotation.IntegerRes
5
6
import com.mapbox.api.directions.v5.DirectionsCriteria
6
7
import com.mapbox.api.directions.v5.models.Closure
8
+ import com.mapbox.api.directions.v5.models.DirectionsResponse
7
9
import com.mapbox.api.directions.v5.models.Incident
8
10
import com.mapbox.api.directions.v5.models.RouteOptions
9
11
import com.mapbox.geojson.Point
@@ -26,6 +28,7 @@ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.roadObjectsO
26
28
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routeProgressUpdates
27
29
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routesUpdates
28
30
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.sdkTest
31
+ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForAlternativesUpdate
29
32
import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForUpdate
30
33
import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler
31
34
import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler
@@ -34,6 +37,8 @@ import com.mapbox.navigation.instrumentation_tests.utils.http.MockRoutingTileEnd
34
37
import com.mapbox.navigation.instrumentation_tests.utils.idling.IdlingPolicyTimeoutRule
35
38
import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule
36
39
import 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
37
42
import com.mapbox.navigation.testing.ui.BaseTest
38
43
import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
39
44
import com.mapbox.navigation.testing.ui.utils.runOnMainSync
@@ -80,6 +85,11 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
80
85
Point .fromLngLat(- 75.525486 , 38.772959 ),
81
86
Point .fromLngLat(- 74.698765 , 39.822911 )
82
87
)
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
+ )
83
93
84
94
private lateinit var failByRequestRouteRefreshResponse: FailByRequestMockRequestHandler
85
95
@@ -424,7 +434,7 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
424
434
R .raw.route_response_route_refresh,
425
435
R .raw.route_response_route_refresh_truncated_first_leg,
426
436
" route_response_route_refresh" ,
427
- acceptedGeometryIndex = 5
437
+ acceptedGeometryIndex = 3
428
438
)
429
439
val routeOptions = generateRouteOptions(twoCoordinates)
430
440
val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
@@ -433,10 +443,10 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
433
443
434
444
mapboxNavigation.setNavigationRoutes(requestedRoutes)
435
445
mapboxNavigation.startTripSession()
436
- // corresponds to currentRouteGeometryIndex = 5
437
- stayOnPosition(38.57622 , - 121.496731 )
446
+ // corresponds to currentRouteGeometryIndex = 3
447
+ stayOnPosition(38.577344 , - 121.496248 )
438
448
mapboxNavigation.routeProgressUpdates()
439
- .filter { it.currentRouteGeometryIndex == 5 }
449
+ .filter { it.currentRouteGeometryIndex == 3 }
440
450
.first()
441
451
val refreshedRoutes = mapboxNavigation.routesUpdates()
442
452
.filter {
@@ -446,10 +456,76 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
446
456
.navigationRoutes
447
457
448
458
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 )
450
460
451
461
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 )
453
529
}
454
530
455
531
@Test
@@ -714,6 +790,27 @@ class RouteRefreshTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.ja
714
790
)
715
791
)
716
792
}
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
+ }
717
814
}
718
815
719
816
private fun NavigationRoute.getSumOfDurationAnnotationsFromLeg (legIndex : Int ): Double =
0 commit comments