@@ -9,9 +9,14 @@ import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
99import com.mapbox.navigation.base.internal.utils.internalWaypoints
1010import com.mapbox.navigation.base.options.NavigationOptions
1111import com.mapbox.navigation.base.options.RoutingTilesOptions
12+ import com.mapbox.navigation.base.route.LegWaypoint
1213import com.mapbox.navigation.base.route.NavigationRoute
14+ import com.mapbox.navigation.base.trip.model.RouteLegProgress
15+ import com.mapbox.navigation.base.trip.model.RouteProgress
1316import com.mapbox.navigation.core.MapboxNavigation
1417import com.mapbox.navigation.core.MapboxNavigationProvider
18+ import com.mapbox.navigation.core.arrival.ArrivalObserver
19+ import com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResult
1520import com.mapbox.navigation.instrumentation_tests.R
1621import com.mapbox.navigation.instrumentation_tests.activity.EmptyTestActivity
1722import com.mapbox.navigation.instrumentation_tests.utils.ApproximateCoordinates
@@ -22,16 +27,24 @@ import com.mapbox.navigation.instrumentation_tests.utils.toApproximateCoordinate
2227import com.mapbox.navigation.testing.ui.BaseTest
2328import com.mapbox.navigation.testing.ui.utils.MapboxNavigationRule
2429import com.mapbox.navigation.testing.ui.utils.coroutines.getSuccessfulResultOrThrowException
30+ import com.mapbox.navigation.testing.ui.utils.coroutines.navigateNextRouteLeg
2531import com.mapbox.navigation.testing.ui.utils.coroutines.requestRoutes
2632import com.mapbox.navigation.testing.ui.utils.coroutines.sdkTest
33+ import com.mapbox.navigation.testing.ui.utils.coroutines.setNavigationRoutesAndWaitForUpdate
2734import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
2835import com.mapbox.navigation.testing.ui.utils.runOnMainSync
36+ import kotlinx.coroutines.delay
37+ import kotlinx.coroutines.flow.filter
38+ import kotlinx.coroutines.flow.take
39+ import kotlinx.coroutines.flow.toList
40+ import kotlinx.coroutines.withTimeout
2941import org.junit.Assert.assertEquals
3042import org.junit.Assert.assertNull
3143import org.junit.Before
3244import org.junit.Rule
3345import org.junit.Test
3446import java.net.URI
47+ import kotlin.math.abs
3548
3649class WaypointsTest : BaseTest <EmptyTestActivity >(EmptyTestActivity : :class.java) {
3750
@@ -145,6 +158,146 @@ class WaypointsTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::class.java)
145158 checkWaypointsPerRoute(expectedSecondNonEvWaypointsNamesAndLocations, routes[1 ])
146159 }
147160
161+ @Test
162+ fun leg_destination_non_ev_route () = sdkTest {
163+ val coordinates = listOf (
164+ Point .fromLngLat(140.025878 , 35.660315 ),
165+ Point .fromLngLat(140.02985194436837 , 35.6621859075361 ),
166+ Point .fromLngLat(140.0277017481984 , 35.65792632910045 ),
167+ Point .fromLngLat(140.03887765416835 , 35.66023142441715 ),
168+ Point .fromLngLat(140.0231453915486 , 35.667495318461164 ),
169+ Point .fromLngLat(140.03969561587877 , 35.67009382118668 ),
170+ )
171+ addResponseHandler(R .raw.route_response_with_many_waypoints, coordinates)
172+ stayOnPosition(coordinates[0 ], 270f )
173+ mapboxNavigation.startTripSession()
174+ mapboxNavigation.flowLocationMatcherResult().filter {
175+ abs(it.enhancedLocation.latitude - coordinates[0 ].latitude()) < 0.01 &&
176+ abs(it.enhancedLocation.longitude - coordinates[0 ].longitude()) < 0.01
177+ }.take(3 ).toList()
178+ val routes = mapboxNavigation.requestRoutes(
179+ generateRouteOptions(coordinates, electric = false , waypointsPerRoute = false )
180+ .toBuilder()
181+ .waypointIndicesList(listOf (0 , 1 , 3 , 5 ))
182+ .build()
183+ )
184+ .getSuccessfulResultOrThrowException()
185+ .routes
186+
187+ mapboxNavigation.setNavigationRoutesAndWaitForUpdate(routes)
188+
189+ val nextWaypoints = mutableListOf<LegWaypoint ?>()
190+ mapboxNavigation.registerArrivalObserver(object : ArrivalObserver {
191+ override fun onWaypointArrival (routeProgress : RouteProgress ) {
192+ nextWaypoints.add(routeProgress.currentLegProgress?.legDestination)
193+ }
194+
195+ override fun onNextRouteLegStart (routeLegProgress : RouteLegProgress ) {
196+ }
197+
198+ override fun onFinalDestinationArrival (routeProgress : RouteProgress ) {
199+ }
200+ })
201+ stayOnPosition(coordinates[1 ], 90f )
202+ nextWaypoints.waitUntilHasSize(1 )
203+ var legWaypoint = nextWaypoints[0 ]!!
204+
205+ checkLocation(coordinates[1 ], legWaypoint.location)
206+ assertEquals(LegWaypoint .REGULAR , legWaypoint.type)
207+
208+ mapboxNavigation.navigateNextRouteLeg()
209+ stayOnPosition(coordinates[2 ], 270f )
210+ delay(1000 )
211+ assertEquals(1 , nextWaypoints.size)
212+
213+ stayOnPosition(coordinates[3 ], 180f )
214+ nextWaypoints.waitUntilHasSize(2 )
215+ legWaypoint = nextWaypoints[1 ]!!
216+ checkLocation(coordinates[3 ], legWaypoint.location)
217+ assertEquals(LegWaypoint .REGULAR , legWaypoint.type)
218+
219+ mapboxNavigation.navigateNextRouteLeg()
220+ stayOnPosition(coordinates[4 ], 45f )
221+ delay(1000 )
222+ assertEquals(2 , nextWaypoints.size)
223+ }
224+
225+ @Test
226+ fun leg_destination_ev_route () = sdkTest {
227+ val coordinates = listOf (
228+ Point .fromLngLat(48.39023 , 11.063842 ),
229+ Point .fromLngLat(49.164725 , 10.340713 )
230+ )
231+ addResponseHandler(R .raw.ev_route_response_for_refresh_with_2_waypoints, coordinates)
232+ stayOnPosition(coordinates[0 ])
233+ mapboxNavigation.startTripSession()
234+ mapboxNavigation.flowLocationMatcherResult().filter {
235+ abs(it.enhancedLocation.latitude - coordinates[0 ].latitude()) < 0.01 &&
236+ abs(it.enhancedLocation.longitude - coordinates[0 ].longitude()) < 0.01
237+ }.take(3 ).toList()
238+ val routes = requestRoutes(coordinates, electric = true , waypointsPerRoute = false )
239+
240+ mapboxNavigation.setNavigationRoutesAndWaitForUpdate(routes)
241+
242+ val nextWaypoints = mutableListOf<LegWaypoint ?>()
243+ mapboxNavigation.registerArrivalObserver(object : ArrivalObserver {
244+ override fun onWaypointArrival (routeProgress : RouteProgress ) {
245+ nextWaypoints.add(routeProgress.currentLegProgress?.legDestination)
246+ }
247+
248+ override fun onNextRouteLegStart (routeLegProgress : RouteLegProgress ) {
249+ }
250+
251+ override fun onFinalDestinationArrival (routeProgress : RouteProgress ) {
252+ }
253+ })
254+ stayOnPosition(routes[0 ].directionsResponse.waypoints()!! [1 ].location(), 315f )
255+ nextWaypoints.waitUntilHasSize(1 )
256+ var legWaypoint = nextWaypoints[0 ]!!
257+
258+ checkLocation(
259+ routes[0 ].directionsResponse.waypoints()!! [1 ].location(),
260+ legWaypoint.location
261+ )
262+ assertEquals(LegWaypoint .EV_CHARGING_ADDED , legWaypoint.type)
263+
264+ mapboxNavigation.navigateNextRouteLeg()
265+ stayOnPosition(routes[0 ].directionsResponse.waypoints()!! [2 ].location(), 0f )
266+ nextWaypoints.waitUntilHasSize(2 )
267+ legWaypoint = nextWaypoints[1 ]!!
268+
269+ checkLocation(
270+ routes[0 ].directionsResponse.waypoints()!! [2 ].location(),
271+ legWaypoint.location
272+ )
273+ assertEquals(LegWaypoint .EV_CHARGING_ADDED , legWaypoint.type)
274+ }
275+
276+ private fun checkLocation (expected : Point , actual : Point ) {
277+ assertEquals(expected.latitude(), actual.latitude(), 0.00001 )
278+ assertEquals(expected.longitude(), actual.longitude(), 0.00001 )
279+ }
280+
281+ private suspend fun List <* >.waitUntilHasSize (size : Int ) {
282+ val list = this
283+ withTimeout(10000 ) {
284+ while (list.size < size) {
285+ delay(50 )
286+ }
287+ }
288+ }
289+
290+ private fun stayOnPosition (point : Point , bearing : Float = 0f) {
291+ mockLocationReplayerRule.loopUpdate(
292+ mockLocationUpdatesRule.generateLocationUpdate {
293+ latitude = point.latitude()
294+ longitude = point.longitude()
295+ this .bearing = bearing
296+ },
297+ 100
298+ )
299+ }
300+
148301 private suspend fun requestRoutes (
149302 coordinates : List <Point >,
150303 electric : Boolean ,
0 commit comments