Skip to content

Commit 2058253

Browse files
committed
NAVAND-1073: fix geometry leg index calculation
1 parent 80444d9 commit 2058253

File tree

2 files changed

+91
-21
lines changed

2 files changed

+91
-21
lines changed

libnavigation-core/src/main/java/com/mapbox/navigation/core/routealternatives/AlternativeRouteProgressDataProvider.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.mapbox.navigation.core.routealternatives
22

3+
import com.mapbox.navigation.base.route.NavigationRoute
4+
import com.mapbox.navigation.base.utils.DecodeUtils.stepsGeometryToPoints
35
import com.mapbox.navigation.core.RouteProgressData
46

57
internal object AlternativeRouteProgressDataProvider {
@@ -22,16 +24,28 @@ internal object AlternativeRouteProgressDataProvider {
2224
primaryFork.geometryIndexInRoute - alternativeFork.geometryIndexInRoute
2325
routeGeometryIndex =
2426
primaryRouteProgressData.routeGeometryIndex - routeGeometryIndexDiff
25-
val legGeometryIndexDiff =
26-
primaryFork.geometryIndexInLeg - alternativeFork.geometryIndexInLeg
27-
legGeometryIndex = primaryRouteProgressData.legGeometryIndex?.let {
28-
it - legGeometryIndexDiff
29-
}
27+
legGeometryIndex = routeGeometryIndex -
28+
prevLegsGeometryIndicesCount(alternativeMetadata.navigationRoute, legIndex)
3029
} else {
3130
legIndex = alternativeFork.legIndex
3231
routeGeometryIndex = alternativeFork.geometryIndexInRoute
3332
legGeometryIndex = alternativeFork.geometryIndexInLeg
3433
}
3534
return RouteProgressData(legIndex, routeGeometryIndex, legGeometryIndex)
3635
}
36+
37+
private fun prevLegsGeometryIndicesCount(route: NavigationRoute, currentLegIndex: Int): Int {
38+
var result = 0
39+
val stepsGeometries = route.directionsRoute.stepsGeometryToPoints()
40+
for (legIndex in 0 until currentLegIndex) {
41+
val legGeometries = stepsGeometries.getOrNull(legIndex)
42+
if (legGeometries != null) {
43+
// remove step duplicates (the last point in prev step is the same as the first point in the current step)
44+
result += legGeometries.sumOf { it.size } - legGeometries.size + 1
45+
}
46+
}
47+
// remove leg duplicates (the last point of the last step of prev leg is the same as the first point of the first step in the current leg)
48+
result -= currentLegIndex
49+
return result
50+
}
3751
}

libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/AlternativeRouteProgressDataProviderTest.kt

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
package com.mapbox.navigation.core.routealternatives
22

33
import com.mapbox.geojson.Point
4+
import com.mapbox.navigation.base.utils.DecodeUtils
5+
import com.mapbox.navigation.base.utils.DecodeUtils.stepsGeometryToPoints
46
import com.mapbox.navigation.core.RouteProgressData
7+
import io.mockk.every
58
import io.mockk.mockk
9+
import io.mockk.mockkStatic
10+
import io.mockk.unmockkStatic
11+
import org.junit.After
612
import org.junit.Assert.assertEquals
13+
import org.junit.Before
714
import org.junit.Test
815

916
class AlternativeRouteProgressDataProviderTest {
1017

18+
@Before
19+
fun setUp() {
20+
mockkStatic(DecodeUtils::class)
21+
}
22+
23+
@After
24+
fun tearDown() {
25+
unmockkStatic(DecodeUtils::class)
26+
}
27+
1128
@Test
1229
fun `fork passed`() {
1330
val primaryRouteGeometryIndex = 200
@@ -18,7 +35,8 @@ class AlternativeRouteProgressDataProviderTest {
1835
primaryForkLegGeometryIndex = 80,
1936
alternativeForkLegIndex = 3,
2037
alternativeForkRouteGeometryIndex = 90,
21-
alternativeForkLegGeometryIndex = 40
38+
alternativeForkLegGeometryIndex = 40,
39+
emptyList()
2240
)
2341
val expected = RouteProgressData(3, 90, 40)
2442

@@ -40,7 +58,8 @@ class AlternativeRouteProgressDataProviderTest {
4058
primaryForkLegGeometryIndex = 40,
4159
alternativeForkLegIndex = 5,
4260
alternativeForkRouteGeometryIndex = 130,
43-
alternativeForkLegGeometryIndex = 80
61+
alternativeForkLegGeometryIndex = 80,
62+
emptyList()
4463
)
4564
val expected = RouteProgressData(5, 130, 80)
4665

@@ -62,7 +81,8 @@ class AlternativeRouteProgressDataProviderTest {
6281
primaryForkLegGeometryIndex = 80,
6382
alternativeForkLegIndex = 3,
6483
alternativeForkRouteGeometryIndex = 90,
65-
alternativeForkLegGeometryIndex = 40
84+
alternativeForkLegGeometryIndex = 40,
85+
emptyList()
6686
)
6787
val expected = RouteProgressData(3, 90, 40)
6888

@@ -83,9 +103,16 @@ class AlternativeRouteProgressDataProviderTest {
83103
primaryForkLegGeometryIndex = 80,
84104
alternativeForkLegIndex = 5,
85105
alternativeForkRouteGeometryIndex = 250,
86-
alternativeForkLegGeometryIndex = 80
106+
alternativeForkLegGeometryIndex = 70,
107+
listOf(
108+
listOf(List(10) { mockk() }, List(7) { mockk() }, List(15) { mockk() }),
109+
listOf(List(23) { mockk() }),
110+
listOf(List(32) { mockk() }, List(19) { mockk() }),
111+
listOf(List(14) { mockk() }, List(23) { mockk() }), // 135 points for legs #0-#3
112+
listOf(List(8) { mockk() }),
113+
)
87114
)
88-
val expected = primaryRouteProgressData
115+
val expected = RouteProgressData(4, 200, 65)
89116

90117
val actual = AlternativeRouteProgressDataProvider.getRouteProgressData(
91118
primaryRouteProgressData,
@@ -97,17 +124,22 @@ class AlternativeRouteProgressDataProviderTest {
97124

98125
@Test
99126
fun `before fork, alternative starts after the primary route on the first leg`() {
100-
// primary leg and route indices diff is 165
101127
val primaryRouteProgressData = RouteProgressData(4, 200, 35)
102128
val alternativeMetadata = alternativeRouteMetadata(
103129
primaryForkLegIndex = 5,
104130
primaryForkRouteGeometryIndex = 250,
105131
primaryForkLegGeometryIndex = 85,
106132
alternativeForkLegIndex = 5,
107133
alternativeForkRouteGeometryIndex = 220,
108-
alternativeForkLegGeometryIndex = 59
109-
)
110-
val expected = RouteProgressData(4, 170, 9)
134+
alternativeForkLegGeometryIndex = 86,
135+
listOf(
136+
listOf(List(10) { mockk() }, List(7) { mockk() }, List(15) { mockk() }),
137+
listOf(List(23) { mockk() }),
138+
listOf(List(32) { mockk() }, List(19) { mockk() }),
139+
listOf(List(14) { mockk() }, List(23) { mockk() }), // 135 points for legs #0-#3
140+
listOf(List(8) { mockk() }),
141+
) )
142+
val expected = RouteProgressData(4, 170, 35)
111143

112144
val actual = AlternativeRouteProgressDataProvider.getRouteProgressData(
113145
primaryRouteProgressData,
@@ -119,17 +151,23 @@ class AlternativeRouteProgressDataProviderTest {
119151

120152
@Test
121153
fun `before fork, alternative starts after the primary route on the second leg`() {
122-
// primary leg and route indices diff is 165
123154
val primaryRouteProgressData = RouteProgressData(4, 200, 35)
124155
val alternativeMetadata = alternativeRouteMetadata(
125156
primaryForkLegIndex = 5,
126157
primaryForkRouteGeometryIndex = 250,
127158
primaryForkLegGeometryIndex = 85,
128159
alternativeForkLegIndex = 3,
129160
alternativeForkRouteGeometryIndex = 220,
130-
alternativeForkLegGeometryIndex = 59
161+
alternativeForkLegGeometryIndex = 81,
162+
listOf(
163+
listOf(List(10) { mockk() }, List(7) { mockk() }, List(15) { mockk() }),
164+
listOf(List(23) { mockk() }), // 135 points for legs #0-#1
165+
listOf(List(32) { mockk() }, List(19) { mockk() }),
166+
listOf(List(14) { mockk() }, List(23) { mockk() }),
167+
listOf(List(8) { mockk() }),
168+
)
131169
)
132-
val expected = RouteProgressData(2, 170, 9)
170+
val expected = RouteProgressData(2, 170, 119)
133171

134172
val actual = AlternativeRouteProgressDataProvider.getRouteProgressData(
135173
primaryRouteProgressData,
@@ -149,7 +187,13 @@ class AlternativeRouteProgressDataProviderTest {
149187
primaryForkLegGeometryIndex = 110,
150188
alternativeForkLegIndex = 0,
151189
alternativeForkRouteGeometryIndex = 90,
152-
alternativeForkLegGeometryIndex = 90
190+
alternativeForkLegGeometryIndex = 20,
191+
listOf(
192+
listOf(List(10) { mockk() }, List(7) { mockk() }, List(15) { mockk() }),
193+
listOf(List(23) { mockk() }),
194+
listOf(List(32) { mockk() }, List(19) { mockk() }),
195+
listOf(List(14) { mockk() }, List(23) { mockk() }),
196+
)
153197
)
154198
val expected = RouteProgressData(0, 40, 40)
155199

@@ -171,9 +215,16 @@ class AlternativeRouteProgressDataProviderTest {
171215
primaryForkLegGeometryIndex = 90,
172216
alternativeForkLegIndex = 4,
173217
alternativeForkRouteGeometryIndex = 250,
174-
alternativeForkLegGeometryIndex = 110
218+
alternativeForkLegGeometryIndex = 10,
219+
listOf(
220+
listOf(List(10) { mockk() }, List(7) { mockk() }, List(15) { mockk() }),
221+
listOf(List(23) { mockk() }),
222+
listOf(List(32) { mockk() }, List(19) { mockk() }),
223+
listOf(List(14) { mockk() }, List(23) { mockk() }), // 135 points for legs #0-#3
224+
listOf(List(8) { mockk() }),
225+
)
175226
)
176-
val expected = RouteProgressData(4, 200, 60)
227+
val expected = RouteProgressData(4, 200, 65)
177228

178229
val actual = AlternativeRouteProgressDataProvider.getRouteProgressData(
179230
primaryRouteProgressData,
@@ -190,9 +241,14 @@ class AlternativeRouteProgressDataProviderTest {
190241
alternativeForkLegIndex: Int,
191242
alternativeForkRouteGeometryIndex: Int,
192243
alternativeForkLegGeometryIndex: Int,
244+
stepsGeometries: List<List<List<Point>>>
193245
): AlternativeRouteMetadata {
194246
return AlternativeRouteMetadata(
195-
mockk(),
247+
mockk {
248+
every { directionsRoute } returns mockk {
249+
every { stepsGeometryToPoints() } returns stepsGeometries
250+
}
251+
},
196252
AlternativeRouteIntersection(
197253
Point.fromLngLat(1.1, 2.2),
198254
alternativeForkRouteGeometryIndex,

0 commit comments

Comments
 (0)