28
28
*/
29
29
public class ShortestPathTreeTest {
30
30
31
+ private static class TimeBasedUTurnCost implements TurnCostProvider {
32
+
33
+ private final int turnMillis ;
34
+
35
+ public TimeBasedUTurnCost (int turnMillis ) {
36
+ this .turnMillis = turnMillis ;
37
+ }
38
+
39
+ @ Override
40
+ public double calcTurnWeight (int inEdge , int viaNode , int outEdge ) {
41
+ return calcTurnMillis (inEdge , viaNode , outEdge ) / 1000.0 ;
42
+ }
43
+
44
+ @ Override
45
+ public long calcTurnMillis (int inEdge , int viaNode , int outEdge ) {
46
+ return inEdge == outEdge ? turnMillis : 0 ;
47
+ }
48
+ }
49
+
31
50
public static final TurnCostProvider FORBIDDEN_UTURNS = new TurnCostProvider () {
32
51
@ Override
33
52
public double calcTurnWeight (int inEdge , int viaNode , int outEdge ) {
@@ -45,6 +64,7 @@ public long calcTurnMillis(int inEdge, int viaNode, int outEdge) {
45
64
private final FlagEncoder carEncoder = encodingManager .getEncoder ("car" );
46
65
private GraphHopperStorage graph ;
47
66
67
+
48
68
@ BeforeEach
49
69
public void setUp () {
50
70
graph = new GraphHopperStorage (new RAMDirectory (), encodingManager , false );
@@ -198,6 +218,76 @@ public void testEdgeBasedWithForbiddenUTurns() {
198
218
);
199
219
}
200
220
221
+ @ Test
222
+ public void testEdgeBasedWithFinitePositiveUTurnCost () {
223
+ TimeBasedUTurnCost turnCost = new TimeBasedUTurnCost (80000 );
224
+ FastestWeighting fastestWeighting = new FastestWeighting (carEncoder , new PMap (), turnCost );
225
+ List <ShortestPathTree .IsoLabel > result = new ArrayList <>();
226
+ ShortestPathTree instance = new ShortestPathTree (graph , fastestWeighting , false , TraversalMode .EDGE_BASED );
227
+ instance .setTimeLimit (Double .MAX_VALUE );
228
+ instance .search (0 , result ::add );
229
+ // Just like with forbidden U-turns, but last thing is I can get out of the dead-end
230
+ assertEquals (countDirectedEdges (graph ) + 1 , result .size ());
231
+ assertAll (
232
+ () -> assertEquals (0 , result .get (0 ).time ),
233
+ () -> assertEquals (9000 , result .get (1 ).time ),
234
+ () -> assertEquals (18000 , result .get (2 ).time ),
235
+ () -> assertEquals (25200 , result .get (3 ).time ),
236
+ () -> assertEquals (27000 , result .get (4 ).time ),
237
+ () -> assertEquals (34200 , result .get (5 ).time ),
238
+ () -> assertEquals (36000 , result .get (6 ).time ),
239
+ () -> assertEquals (50400 , result .get (7 ).time ),
240
+ () -> assertEquals (50400 , result .get (8 ).time ),
241
+ () -> assertEquals (54000 , result .get (9 ).time ),
242
+ () -> assertEquals (55800 , result .get (10 ).time ),
243
+ () -> assertEquals (60300 , result .get (11 ).time ),
244
+ () -> assertEquals (61200 , result .get (12 ).time ),
245
+ () -> assertEquals (61200 , result .get (13 ).time ),
246
+ () -> assertEquals (61200 , result .get (14 ).time ),
247
+ () -> assertEquals (72000 , result .get (15 ).time ),
248
+ () -> assertEquals (81000 , result .get (16 ).time ),
249
+ () -> assertEquals (90000 , result .get (17 ).time ),
250
+ () -> assertEquals (97200 , result .get (18 ).time ),
251
+ () -> assertEquals (126000 , result .get (19 ).time ),
252
+ () -> assertEquals (144800 , result .get (20 ).time )
253
+ );
254
+ }
255
+
256
+ @ Test
257
+ public void testEdgeBasedWithSmallerUTurnCost () {
258
+ TimeBasedUTurnCost turnCost = new TimeBasedUTurnCost (20000 );
259
+ FastestWeighting fastestWeighting = new FastestWeighting (carEncoder , new PMap (), turnCost );
260
+ List <ShortestPathTree .IsoLabel > result = new ArrayList <>();
261
+ ShortestPathTree instance = new ShortestPathTree (graph , fastestWeighting , false , TraversalMode .EDGE_BASED );
262
+ instance .setTimeLimit (Double .MAX_VALUE );
263
+ instance .search (0 , result ::add );
264
+ // Something in between
265
+ assertEquals (countDirectedEdges (graph ) + 1 , result .size ());
266
+ assertAll (
267
+ () -> assertEquals (0 , result .get (0 ).time ),
268
+ () -> assertEquals (9000 , result .get (1 ).time ),
269
+ () -> assertEquals (18000 , result .get (2 ).time ),
270
+ () -> assertEquals (25200 , result .get (3 ).time ),
271
+ () -> assertEquals (27000 , result .get (4 ).time ),
272
+ () -> assertEquals (34200 , result .get (5 ).time ),
273
+ () -> assertEquals (36000 , result .get (6 ).time ),
274
+ () -> assertEquals (50400 , result .get (7 ).time ),
275
+ () -> assertEquals (50400 , result .get (8 ).time ),
276
+ () -> assertEquals (54000 , result .get (9 ).time ),
277
+ () -> assertEquals (55800 , result .get (10 ).time ),
278
+ () -> assertEquals (56000 , result .get (11 ).time ),
279
+ () -> assertEquals (60300 , result .get (12 ).time ),
280
+ () -> assertEquals (61200 , result .get (13 ).time ),
281
+ () -> assertEquals (61200 , result .get (14 ).time ),
282
+ () -> assertEquals (61200 , result .get (15 ).time ),
283
+ () -> assertEquals (72000 , result .get (16 ).time ),
284
+ () -> assertEquals (81000 , result .get (17 ).time ),
285
+ () -> assertEquals (84800 , result .get (18 ).time ),
286
+ () -> assertEquals (97200 , result .get (19 ).time ),
287
+ () -> assertEquals (126000 , result .get (20 ).time )
288
+ );
289
+ }
290
+
201
291
@ Test
202
292
public void testSearchByDistance () {
203
293
List <ShortestPathTree .IsoLabel > result = new ArrayList <>();
0 commit comments