846 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
			
		
		
	
	
			846 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
| @routing @guidance @turn-lanes
 | ||
| Feature: Turn Lane Guidance
 | ||
| 
 | ||
|     Background:
 | ||
|         Given the profile "car"
 | ||
|         Given a grid size of 100 meters
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Anticipate Lane Change for subsequent multi-lane intersections
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward           |
 | ||
|             | ab    | through\|right\|right\|right |
 | ||
|             | bx    |                              |
 | ||
|             | bc    | left\|left\|through          |
 | ||
|             | cd    | through\|right               |
 | ||
|             | cy    |                              |
 | ||
|             | dz    |                              |
 | ||
|             | de    |                              |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route          | turns                                         | lanes                                                                                                             | #      |
 | ||
|             | a,d       | ab,bc,cd,cd    | depart,turn right,turn left,arrive            | ,straight:false right:true right:true right:false,left:true left:true straight:false,                             | 2 hops |
 | ||
|             | a,e       | ab,bc,cd,de,de | depart,turn right,turn left,turn right,arrive | ,straight:false right:false right:true right:false,left:false left:true straight:false,straight:false right:true, | 3 hops |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Anticipate Lane Change for quick same direction turns, staying on the same street
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c
 | ||
|                 |
 | ||
|             e – d – y
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward    | turn:lanes:backward | name |
 | ||
|             | ab    | through\|right\|right |                     | MySt |
 | ||
|             | bx    |                       |                     | XSt  |
 | ||
|             | bc    |                       | left\|right         | MySt |
 | ||
|             | cd    | left\|right           | through\|through    | MySt |
 | ||
|             | de    |                       | left\|left\|through | MySt |
 | ||
|             | dy    |                       |                     | YSt  |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route               | turns                                       | lanes                                                         |
 | ||
|             | a,e       | MySt,MySt,MySt,MySt | depart,continue right,continue right,arrive | ,straight:false right:false right:true,left:false right:true, |
 | ||
|             | e,a       | MySt,MySt,MySt,MySt | depart,continue left,continue left,arrive   | ,left:true left:false straight:false,left:true right:false,   |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Anticipate Lane Change for quick same direction turns, changing between streets
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c
 | ||
|                 |
 | ||
|             e – d – y
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward    | turn:lanes:backward | name |
 | ||
|             | ab    | through\|right\|right |                     | AXSt |
 | ||
|             | bx    |                       |                     | AXSt |
 | ||
|             | bc    |                       | left\|right         | BDSt |
 | ||
|             | cd    | left\|right           | through\|through    | BDSt |
 | ||
|             | de    |                       | left\|left\|through | EYSt |
 | ||
|             | dy    |                       |                     | EYSt |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route               | turns                               | lanes                                                         |
 | ||
|             | a,e       | AXSt,BDSt,EYSt,EYSt | depart,turn right,turn right,arrive | ,straight:false right:false right:true,left:false right:true, |
 | ||
|             | e,a       | EYSt,BDSt,AXSt,AXSt | depart,turn left,turn left,arrive   | ,left:true left:false straight:false,left:true right:false,   |
 | ||
| 
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Anticipate Lane Change for quick turns during a merge
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a
 | ||
|               \
 | ||
|             x – b – c – y
 | ||
|                     |
 | ||
|                     d
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward       | name | highway       | oneway |
 | ||
|             | ab    | slight_left\|slight_left | On   | motorway_link | yes    |
 | ||
|             | xb    |                          | Hwy  | motorway      |        |
 | ||
|             | bc    | through\|slight_right    | Hwy  | motorway      |        |
 | ||
|             | cd    |                          | Off  | motorway_link | yes    |
 | ||
|             | cy    |                          | Hwy  | motorway      |        |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route          | turns                                           | lanes                                                                 |
 | ||
|             | a,d       | On,Hwy,Off,Off | depart,merge slight right,off ramp right,arrive | ,slight left:false slight left:true,straight:false slight right:true, |
 | ||
| 
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Schoenefelder Kreuz
 | ||
|     # https://www.openstreetmap.org/way/264306388#map=16/52.3202/13.5568
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a b – x
 | ||
|                 \       / i
 | ||
|                   c – d
 | ||
|                         \ j
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward                                  | lanes | highway       | oneway | name |
 | ||
|             | ab    | none\|none\|none\|slight_right\|slight_right        |   5   | motorway      |        | abx  |
 | ||
|             | bx    |                                                     |   3   | motorway      |        | abx  |
 | ||
|             | bc    |                                                     |   2   | motorway_link | yes    | bcd  |
 | ||
|             | cd    | slight_left\|slight_left;slight_right\|slight_right |   3   | motorway_link | yes    | bcd  |
 | ||
|             | di    | slight_left\|slight_right                           |   2   | motorway_link | yes    | di   |
 | ||
|             | dj    |                                                     |   2   | motorway_link | yes    | dj   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route         | turns                                          | lanes                                                                                                                                    |
 | ||
|             | a,i       | abx,bcd,di,di | depart,off ramp right,fork slight left,arrive  | ,none:false none:false none:false slight right:true slight right:true,slight left:true slight left;slight right:true slight right:false, |
 | ||
|             | a,j       | abx,bcd,dj,dj | depart,off ramp right,fork slight right,arrive | ,none:false none:false none:false slight right:true slight right:true,slight left:false slight left;slight right:true slight right:true, |
 | ||
| 
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Kreuz Oranienburg
 | ||
|     # https://www.openstreetmap.org/way/4484007#map=18/52.70439/13.20269
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             i               a
 | ||
|               ' .       . '
 | ||
|             j – – c – b – – x
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward | lanes | highway       | oneway | name |
 | ||
|             | ab    |                    | 1     | motorway_link | yes    | ab   |
 | ||
|             | xb    |                    | 1     | motorway_link | yes    | xbcj |
 | ||
|             | bc    | none\|slight_right | 2     | motorway_link | yes    | xbcj |
 | ||
|             | ci    |                    | 1     | motorway_link | yes    | ci   |
 | ||
|             | cj    |                    | 1     | motorway_link | yes    | xbcj |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route        | turns                           | lanes                           |
 | ||
|             | a,i       | ab,ci,ci     | depart,turn slight right,arrive | ;,none:false slight right:true, |
 | ||
|             | a,j       | ab,xbcj      | depart,arrive                   | ;;none:true slight right:false, |
 | ||
| 
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Lane anticipation for fan-in
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward           | name |
 | ||
|             | ab    | through\|right\|right\|right | abx  |
 | ||
|             | bx    |                              | abx  |
 | ||
|             | bc    | left\|left\|through          | bcy  |
 | ||
|             | cy    |                              | bcy  |
 | ||
|             | cd    | through\|right               | cdz  |
 | ||
|             | dz    |                              | cdz  |
 | ||
|             | de    |                              | de   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route             | turns                                         | lanes                                                                                                             |
 | ||
|             | a,e       | abx,bcy,cdz,de,de | depart,turn right,turn left,turn right,arrive | ,straight:false right:false right:true right:false,left:false left:true straight:false,straight:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Lane anticipation for fan-out
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward           | name |
 | ||
|             | ab    | through\|right               | abx  |
 | ||
|             | bx    |                              | abx  |
 | ||
|             | bc    | left\|left\|through          | bcy  |
 | ||
|             | cy    |                              | bcy  |
 | ||
|             | cd    | through\|right\|right\|right | cdz  |
 | ||
|             | dz    |                              | cdz  |
 | ||
|             | de    |                              | de   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route             | turns                                         | lanes                                                                                                          |
 | ||
|             | a,e       | abx,bcy,cdz,de,de | depart,turn right,turn left,turn right,arrive | ,straight:false right:true,left:true left:true straight:false,straight:false right:true right:true right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Lane anticipation for fan-in followed by fan-out
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward           | name |
 | ||
|             | ab    | through\|right\|right\|right | abx  |
 | ||
|             | bx    |                              | abx  |
 | ||
|             | bc    | left\|left\|through          | bcy  |
 | ||
|             | cy    |                              | bcy  |
 | ||
|             | cd    | through\|right\|right\|right | cdz  |
 | ||
|             | dz    |                              | cdz  |
 | ||
|             | de    |                              | de   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route             | turns                                         | lanes                                                                                                                                 |
 | ||
|             | a,e       | abx,bcy,cdz,de,de | depart,turn right,turn left,turn right,arrive | ,straight:false right:true right:true right:false,left:true left:true straight:false,straight:false right:true right:true right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Lane anticipation for fan-out followed by fan-in
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward  | name |
 | ||
|             | ab    | through\|right      | abx  |
 | ||
|             | bx    |                     | abx  |
 | ||
|             | bc    | left\|left\|through | bcy  |
 | ||
|             | cy    |                     | bcy  |
 | ||
|             | cd    | through\|right      | cdz  |
 | ||
|             | dz    |                     | cdz  |
 | ||
|             | de    |                     | de   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route             | turns                                         | lanes                                                                                     |
 | ||
|             | a,e       | abx,bcy,cdz,de,de | depart,turn right,turn left,turn right,arrive | ,straight:false right:true,left:false left:true straight:false,straight:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Lane anticipation for multiple hops with same number of lanes
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 c – d – z
 | ||
|                 |   |
 | ||
|                 y   e – f
 | ||
|                     |
 | ||
|                     w
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward           | name |
 | ||
|             | ab    | through\|right\|right\|right | abx  |
 | ||
|             | bx    |                              | abx  |
 | ||
|             | bc    | left\|left\|through          | bcy  |
 | ||
|             | cy    |                              | bcy  |
 | ||
|             | cd    | through\|right\|right        | cdz  |
 | ||
|             | dz    |                              | cdz  |
 | ||
|             | de    | left\|through                | dew  |
 | ||
|             | ew    |                              | dew  |
 | ||
|             | ef    |                              | ef   |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route                 | turns                                                   | lanes                                                                                                                                                  |
 | ||
|             | a,f       | abx,bcy,cdz,dew,ef,ef | depart,turn right,turn left,turn right,turn left,arrive | ,straight:false right:true right:false right:false,left:true left:false straight:false,straight:false right:true right:false,left:true straight:false, |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for through, through with lanes
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                          f   g
 | ||
|                         /   /
 | ||
|                a – b – c – d – e
 | ||
|                         \   \
 | ||
|                          h   i
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                     | name | destination | oneway |
 | ||
|                | ab    |                                        | main | One         | yes    |
 | ||
|                | bc    | left\|through\|through\|through\|right | main | One         | yes    |
 | ||
|                | cd    | left\|through\|right                   | main | Two         | yes    |
 | ||
|                | de    |                                        | main | Three       | yes    |
 | ||
|                | cf    |                                        | off  |             | yes    |
 | ||
|                | ch    |                                        | off  |             | yes    |
 | ||
|                | dg    |                                        | off  |             | yes    |
 | ||
|                | di    |                                        | off  |             | yes    |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route     | turns         | destinations | locations | lanes                                                                                                     |
 | ||
|                | a,e       | main,main | depart,arrive | One,Three    | a,e       | ;left:false straight:false straight:true straight:false right:false;left:false straight:true right:false, |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for through and collapse multiple use lanes
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                      e   f   g
 | ||
|                     /   /   /
 | ||
|                a – b – c – d
 | ||
|                     \   \   \
 | ||
|                      h   i   j
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                     | name |
 | ||
|                | ab    | left\|through\|through\|right          | main |
 | ||
|                | bc    | left\|through\|through\|right          | main |
 | ||
|                | cd    | left\|through\|through\|through\|right | main |
 | ||
|                | be    |                                        | off  |
 | ||
|                | bh    |                                        | off  |
 | ||
|                | cf    |                                        | off  |
 | ||
|                | ci    |                                        | off  |
 | ||
|                | dg    |                                        | off  |
 | ||
|                | dj    |                                        | off  |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route     | turns         | lanes                                                                                                   |
 | ||
|                | a,c       | main,main | depart,arrive | ;left:false straight:true straight:true right:false,                                                    |
 | ||
|                | a,d       | main,main | depart,arrive | ;left:false straight:true straight:true right:false;left:false straight:true straight:true right:false, |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for through followed by left/right
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                      f   g   d
 | ||
|                     /   /   /
 | ||
|                a – b – c – x
 | ||
|                     \   \   \
 | ||
|                      h   i   e
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                              | name  |
 | ||
|                | ab    | left\|through\|through\|through\|through\|right | main  |
 | ||
|                | bc    | left\|through\|through\|right                   | main  |
 | ||
|                | cx    | left\|right                                     | main  |
 | ||
|                | xd    |                                                 | left  |
 | ||
|                | xe    |                                                 | right |
 | ||
|                | bf    |                                                 | off   |
 | ||
|                | bh    |                                                 | off   |
 | ||
|                | cg    |                                                 | off   |
 | ||
|                | ci    |                                                 | off   |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route            | turns                           | lanes                                                                                                                                                         |
 | ||
|                | a,d       | main,left,left   | depart,end of road left,arrive  | ;left:false straight:false straight:true straight:false straight:false right:false;left:false straight:true straight:false right:false,left:true right:false, |
 | ||
|                | a,e       | main,right,right | depart,end of road right,arrive | ;left:false straight:false straight:false straight:true straight:false right:false;left:false straight:false straight:true right:false,left:false right:true, |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for through with turn before / after
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                c   g   l
 | ||
|                b d e h i
 | ||
|                a   f   j
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                                           | name  | oneway |
 | ||
|                | ab    | right\|right\|right\|right                                   | ab    | yes    |
 | ||
|                | cb    | left\|left\|left\|left                                       | cb    | yes    |
 | ||
|                | bd    |                                                              | bdehi |        |
 | ||
|                | de    | left\|left\|through\|through\|through\|through\|right\|right | bdehi |        |
 | ||
|                | ef    |                                                              | ef    |        |
 | ||
|                | eg    |                                                              | eg    |        |
 | ||
|                | eh    |                                                              | bdehi |        |
 | ||
|                | hi    | left\|left\|right\|right                                     | bdehi |        |
 | ||
|                | ij    |                                                              | ij    |        |
 | ||
|                | il    |                                                              | il    |        |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route          | turns                                      | lanes                                                                                                                                                                                               | #           |
 | ||
|                | a,f       | ab,bdehi,ef,ef | depart,turn right,turn right,arrive        | ,right:false right:false right:true right:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true,                                             |             |
 | ||
|                | a,g       | ab,bdehi,eg,eg | depart,turn right,turn left,arrive         | ,right:true right:true right:false right:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false,                                             |             |
 | ||
|                | a,j       | ab,bdehi,ij,ij | depart,turn right,end of road right,arrive | ,right:true right:true right:false right:false;left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true, |             |
 | ||
|                | a,l       | ab,bdehi,il,il | depart,turn right,end of road left,arrive  | ,right:false right:false right:true right:true;left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false, | not perfect |
 | ||
|                | c,g       | cb,bdehi,eg,eg | depart,turn left,turn left,arrive          | ,left:true left:true left:false left:false,left:true left:true straight:false straight:false straight:false straight:false right:false right:false,                                                 |             |
 | ||
|                | c,f       | cb,bdehi,ef,ef | depart,turn left,turn right,arrive         | ,left:false left:false left:true left:true,left:false left:false straight:false straight:false straight:false straight:false right:true right:true,                                                 |             |
 | ||
|                | c,l       | cb,bdehi,il,il | depart,turn left,end of road left,arrive   | ,left:false left:false left:true left:true;left:false left:false straight:true straight:true straight:false straight:false right:false right:false,left:true left:true right:false right:false,     |             |
 | ||
|                | c,j       | cb,bdehi,ij,ij | depart,turn left,end of road right,arrive  | ,left:true left:true left:false left:false;left:false left:false straight:false straight:false straight:true straight:true right:false right:false,left:false left:false right:true right:true,     | not perfect |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for turns with through before and after
 | ||
|            Given a grid size of 10 meters
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                a – b – q       s   h – i
 | ||
|                      \       /   /
 | ||
|                        e – f – g
 | ||
|                      /       \   \
 | ||
|                c – d – r       t   j – k
 | ||
| 
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                              | name | highway | oneway |
 | ||
|                | ab    | through\|right\|right\|right                    | top  | primary | yes    |
 | ||
|                | be    |                                                 | top  | primary | yes    |
 | ||
|                | bq    |                                                 | off  | primary | yes    |
 | ||
|                | ef    | left\|through\|through\|through\|through\|right | main | primary | yes    |
 | ||
|                | fg    | left\|left\|right\|right                        | main | primary | yes    |
 | ||
|                | fs    |                                                 | off  | primary | yes    |
 | ||
|                | ft    |                                                 | off  | primary | yes    |
 | ||
|                | gh    |                                                 | top  | primary | yes    |
 | ||
|                | hi    |                                                 | top  | primary | yes    |
 | ||
|                | cd    | left\|left\|left\|through                       | bot  | primary | yes    |
 | ||
|                | de    |                                                 | bot  | primary | yes    |
 | ||
|                | dr    |                                                 | off  | primary | yes    |
 | ||
|                | gj    |                                                 | bot  | primary | yes    |
 | ||
|                | jk    |                                                 | bot  | primary | yes    |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route            | turns                                | lanes                                                                                                                                                                           |
 | ||
|                | a,i       | top,main,top,top | depart,turn right,turn left,arrive   | ,straight:false right:true right:true right:true;;left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false, |
 | ||
|                | a,k       | top,main,bot,bot | depart,turn right,turn right,arrive  | ,straight:false right:true right:true right:true;;left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true, |
 | ||
|                | c,i       | bot,main,top,top | depart,turn left,turn left,arrive    | ,left:true left:true left:true straight:false;;left:false straight:true straight:true straight:false straight:false right:false,left:true left:true right:false right:false,    |
 | ||
|                | c,k       | bot,main,bot,bot | depart,turn left,turn right,arrive   | ,left:true left:true left:true straight:false;;left:false straight:false straight:false straight:true straight:true right:false,left:false left:false right:true right:true,    |
 | ||
| 
 | ||
|        @anticipate
 | ||
|        Scenario: Anticipate Lanes for turn between throughs
 | ||
|            Given the node map
 | ||
|                """
 | ||
|                    q
 | ||
|                    |
 | ||
|                a – b – c – s
 | ||
|                    |   |
 | ||
|                    r   d – t
 | ||
|                        |
 | ||
|                        e
 | ||
|                """
 | ||
| 
 | ||
|            And the ways
 | ||
|                | nodes | turn:lanes:forward                                       | name |
 | ||
|                | ab    | left\|through\|through\|through\|through\|through\|right | main |
 | ||
|                | bq    |                                                          | off  |
 | ||
|                | br    |                                                          | off  |
 | ||
|                | bc    | through\|through\|right\|right\|right                    | main |
 | ||
|                | cs    |                                                          | off  |
 | ||
|                | cd    | left\|through\|through                                   | main |
 | ||
|                | de    |                                                          | main |
 | ||
|                | dt    |                                                          | off  |
 | ||
| 
 | ||
|           When I route I should get
 | ||
|                | waypoints | route          | turns                        | lanes                                                                                                                                                                                                    |
 | ||
|                | a,e       | main,main,main | depart,continue right,arrive | ;left:false straight:false straight:false straight:false straight:true straight:true right:false,straight:false straight:false right:false right:true right:true;left:false straight:true straight:true, |
 | ||
| 
 | ||
|     @anticipate @todo @2661
 | ||
|     Scenario: Anticipate with lanes in roundabout: roundabouts as the unit of anticipation
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                  /e\
 | ||
|             a – b   d – f
 | ||
|                  \c/
 | ||
|                   |
 | ||
|                  /g\
 | ||
|             k – h   j – l
 | ||
|                  \i/
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward                       | highway | junction   | #   |
 | ||
|             | ab    | slight_right\|slight_right\|slight_right | primary |            |     |
 | ||
|             | bc    | slight_left\|slight_right\|slight_right  | primary | roundabout | top |
 | ||
|             | cd    |                                          | primary | roundabout | top |
 | ||
|             | de    |                                          | primary | roundabout | top |
 | ||
|             | eb    |                                          | primary | roundabout | top |
 | ||
|             | df    |                                          | primary |            |     |
 | ||
|             | cg    | slight_right\|slight_right               | primary |            |     |
 | ||
|             | gh    | slight_left\|slight_right                | primary | roundabout | bot |
 | ||
|             | hi    |                                          | primary | roundabout | bot |
 | ||
|             | ij    | slight_left\|slight_right                | primary | roundabout | bot |
 | ||
|             | jg    |                                          | primary | roundabout | bot |
 | ||
|             | hk    |                                          | primary |            |     |
 | ||
|             | jl    |                                          | primary |            |     |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | #           | waypoints | route       | turns                                             | lanes                                                                                          |
 | ||
|             | right-right | a,k       | ab,cg,hk,hk | depart,roundabout-exit-1,roundabout-exit-1,arrive | ,slight right:false slight right:false slight right:true,slight right:false slight right:true, |
 | ||
|             | right-left  | a,l       | ab,cg,jl,jl | depart,roundabout-exit-1,roundabout-exit-2,arrive | ,slight right:false slight right:false slight right:true,slight right:false slight right:true, |
 | ||
|             | todo exits  | a,f       | ab,df,df    | depart,roundabout-exit-2,arrive                   | ,slight right:false slight right:false slight right:true,                                      |
 | ||
|             | todo exits  | a,e       | ab,bc,eb    | depart,roundabout-exit-undefined,arrive           | ,slight right:true slight right:true slight right:true,                                        |
 | ||
| 
 | ||
|     @anticipate @todo
 | ||
|     Scenario: Roundabout with lanes only tagged on exit
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                  /e\
 | ||
|             a – b   d – f
 | ||
|                  \c/
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward                     | highway | junction   |
 | ||
|             | ab    |                                        | primary |            |
 | ||
|             | bc    |                                        | primary | roundabout |
 | ||
|             | cd    | slight_left\|slight_left\|slight_right | primary | roundabout |
 | ||
|             | de    |                                        | primary | roundabout |
 | ||
|             | eb    |                                        | primary | roundabout |
 | ||
|             | df    |                                        | primary |            |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route    | turns                           | lanes | intersection_lanes |
 | ||
|             | a,f       | ab,df,df | depart,roundabout-exit-1,arrive | ,, | |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: No Lanes for Roundabouts, see #2626
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                 a
 | ||
|                 |
 | ||
|                /b\
 | ||
|               c   g – h
 | ||
|              /|   |
 | ||
|             | d   f
 | ||
|             |/ \e/ \
 | ||
|             x     \ y
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward         | highway | junction   |
 | ||
|             | ab    | slight_right\|slight_right | primary |            |
 | ||
|             | bc    |                            | primary | roundabout |
 | ||
|             | cd    |                            | primary | roundabout |
 | ||
|             | de    |                            | primary | roundabout |
 | ||
|             | ef    |                            | primary | roundabout |
 | ||
|             | fg    | through\|slight_right      | primary | roundabout |
 | ||
|             | gb    |                            | primary | roundabout |
 | ||
|             | gh    |                            | primary |            |
 | ||
|             | cx    |                            | primary |            |
 | ||
|             | dx    |                            | primary |            |
 | ||
|             | ey    |                            | primary |            |
 | ||
|             | fy    |                            | primary |            |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route    | turns                           | lanes    |
 | ||
|             | a,h       | ab,gh,gh | depart,roundabout-exit-5,arrive |  ,;;;;;, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: No Lanes for Roundabouts, see #2626
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                  /a\
 | ||
|             x – b   d – y
 | ||
|                  \c/
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward         | highway | junction   | name       |
 | ||
|             | xb    | slight_right\|slight_right | primary |            | xb         |
 | ||
|             | dy    |                            | primary |            | dy         |
 | ||
|             | ab    |                            | primary | roundabout | roundabout |
 | ||
|             | bc    |                            | primary | roundabout | roundabout |
 | ||
|             | cd    | left\|slight_right         | primary | roundabout | roundabout |
 | ||
|             | da    |                            | primary | roundabout | roundabout |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route                    | turns                                   | lanes |
 | ||
|             | x,y       | xb,dy,dy                 | depart,roundabout-exit-1,arrive         | ,;,   |
 | ||
|             | x,c       | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,,    |
 | ||
|             | x,a       | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,;,   |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: No Lanes for Roundabouts, see #2626
 | ||
|         Given the profile file "car" initialized with
 | ||
|         """
 | ||
|         profile.left_hand_driving = true
 | ||
|         """
 | ||
|         And the node map
 | ||
|             """
 | ||
|                   a
 | ||
|                   |
 | ||
|                  /b\
 | ||
|             h – c   g
 | ||
|                 |   |\
 | ||
|                 d   f |
 | ||
|                / \e/ \|
 | ||
|               x /     y
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward         | highway | junction   |
 | ||
|             | ab    | slight_left\|slight_left   | primary |            |
 | ||
|             | bg    |                            | primary | roundabout |
 | ||
|             | gf    |                            | primary | roundabout |
 | ||
|             | fe    |                            | primary | roundabout |
 | ||
|             | ed    |                            | primary | roundabout |
 | ||
|             | dc    | slight_left                | primary | roundabout |
 | ||
|             | cb    |                            | primary | roundabout |
 | ||
|             | ch    |                            | primary |            |
 | ||
|             | ex    |                            | primary |            |
 | ||
|             | dx    |                            | primary |            |
 | ||
|             | gy    |                            | primary |            |
 | ||
|             | fy    |                            | primary |            |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route      | turns                           | lanes      |
 | ||
|             | a,h       | ab,ch,ch   | depart,roundabout-exit-5,arrive | ,;;;;;,    |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: No Lanes for Roundabouts, see #2626
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                  /a\
 | ||
|             x – b   d – y
 | ||
|                 |   |
 | ||
|                 |   |
 | ||
|                  | |
 | ||
|                  | |
 | ||
|                  \ /
 | ||
|                   c
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward         | highway | junction   | name       |
 | ||
|             | xb    | slight_right\|slight_right | primary |            | xb         |
 | ||
|             | dy    |                            | primary |            | dy         |
 | ||
|             | ab    |                            | primary | roundabout | roundabout |
 | ||
|             | bc    |                            | primary | roundabout | roundabout |
 | ||
|             | cd    | left\|slight_right         | primary | roundabout | roundabout |
 | ||
|             | da    |                            | primary | roundabout | roundabout |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route                    | turns                                   | lanes |
 | ||
|             | x,y       | xb,dy,dy                 | depart,roundabout-exit-1,arrive         | ,;,   |
 | ||
|             | x,c       | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,,    |
 | ||
|             | x,a       | xb,roundabout,roundabout | depart,roundabout-exit-undefined,arrive | ,;,   |
 | ||
| 
 | ||
|     @anticipate @todo @2032
 | ||
|     Scenario: No Lanes for Roundabouts, see #2626
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b –x
 | ||
|                 |
 | ||
|                /c\
 | ||
|               d   f – g – z
 | ||
|                \e/    |
 | ||
|                 |     h
 | ||
|                 y
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward                                  | highway | junction   | name  |
 | ||
|             | ab    | through\|right\|right\|right\|right                 | primary |            | abx   |
 | ||
|             | bx    |                                                     | primary |            | abx   |
 | ||
|             | bc    | right\|right\|right\|right                          | primary |            | bc    |
 | ||
|             | cd    |                                                     | primary | roundabout | cdefc |
 | ||
|             | de    | slight_left\|slight_left\|slight_left\|slight_right | primary | roundabout | cdefc |
 | ||
|             | ef    | left\|slight_right\|slight_right                    | primary | roundabout | cdefc |
 | ||
|             | fc    |                                                     | primary | roundabout | cdefc |
 | ||
|             | ey    |                                                     | primary |            | ey    |
 | ||
|             | fg    | through\|right                                      | primary |            | fg    |
 | ||
|             | gz    |                                                     | primary |            | gz    |
 | ||
|             | gh    |                                                     | primary |            | gh    |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route           | turns                                            | lanes                                                                                      |
 | ||
|             | a,h       | abx,bc,fg,gh,gh | depart,turn right,cdefc-exit-2,turn right,arrive | ,straight:false right:false right:false right:false right:true,,straight:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Anticipate none tags
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             c       g       l
 | ||
|             b – d – e – h - i
 | ||
|             a       f       j
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward       | highway   | name |
 | ||
|             | ab    | none\|none\|right\|right | primary   | abc  |
 | ||
|             | bc    |                          | primary   | abc  |
 | ||
|             | bd    |                          | primary   | bdeh |
 | ||
|             | de    | left\|none\|none\|right  | primary   | bdeh |
 | ||
|             | eh    |                          | primary   | bdeh |
 | ||
|             | ef    |                          | primary   | feg  |
 | ||
|             | eg    |                          | primary   | feg  |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route            | turns                               | lanes                                                                                      |
 | ||
|             | a,g       | abc,bdeh,feg,feg | depart,turn right,turn left,arrive  | ,none:false none:false right:true right:false,left:true none:false none:false right:false, |
 | ||
|             | a,f       | abc,bdeh,feg,feg | depart,turn right,turn right,arrive | ,none:false none:false right:false right:true,left:false none:false none:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Triple Right keeping Left
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                   a – b – i
 | ||
|                       |
 | ||
|             f – e – g |
 | ||
|                 |     |
 | ||
|                 |     |
 | ||
|             j – d – – c
 | ||
|                       |
 | ||
|                       h
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward | highway   | name   |
 | ||
|             | abi   | \|\|right\|right   | primary   | start  |
 | ||
|             | bch   | \|\|right\|right   | primary   | first  |
 | ||
|             | cdj   | \|\|right\|right   | primary   | second |
 | ||
|             | de    | left\|right\|right | secondary | third  |
 | ||
|             | feg   |                    | tertiary  | fourth |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route                                  | turns                                                     | lanes                                                                                                                                                                      |
 | ||
|             | a,f       | start,first,second,third,fourth,fourth | depart,turn right,turn right,turn right,turn left,arrive  | ,none:false none:false right:true right:false,none:false none:false right:true right:false,none:false none:false right:true right:false,left:true right:false right:false, |
 | ||
|             | a,g       | start,first,second,third,fourth,fourth | depart,turn right,turn right,turn right,turn right,arrive | ,none:false none:false right:true right:true,none:false none:false right:true right:true,none:false none:false right:true right:true,left:false right:true right:true,     |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Tripple Left keeping Right
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             i – b – a
 | ||
|                 |
 | ||
|                 | g – e – f
 | ||
|                 |     |
 | ||
|                 |     |
 | ||
|                 c – – d – j
 | ||
|                 |
 | ||
|                 h
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward | highway   | name   |
 | ||
|             | abi   | left\|left\|\|     | primary   | start  |
 | ||
|             | bch   | left\|left\|\|     | primary   | first  |
 | ||
|             | cdj   | left\|left\|\|     | primary   | second |
 | ||
|             | de    | left\|left\|right  | secondary | third  |
 | ||
|             | feg   |                    | tertiary  | fourth |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route                                  | turns                                                  | lanes                                                                                                                                                               |
 | ||
|             | a,f       | start,first,second,third,fourth,fourth | depart,turn left,turn left,turn left,turn right,arrive | ,left:false left:true none:false none:false,left:false left:true none:false none:false,left:false left:true none:false none:false,left:false left:false right:true, |
 | ||
|             | a,g       | start,first,second,third,fourth,fourth | depart,turn left,turn left,turn left,turn left,arrive  | ,left:true left:true none:false none:false,left:true left:true none:false none:false,left:true left:true none:false none:false,left:true left:true right:false,     |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Complex lane scenarios scale threshold for triggering Lane Anticipation
 | ||
|         Given the node map
 | ||
|             """
 | ||
|             a – b – x
 | ||
|                 |
 | ||
|                 |
 | ||
|                 |
 | ||
|                 c
 | ||
|                 |
 | ||
|             e – d – y
 | ||
|             """
 | ||
|         # With a grid size of 20m the duration is ~20s but our default threshold for Lane Anticipation is 15s.
 | ||
|         # The additional lanes left and right of the turn scale the threshold up so that Lane Anticipation still triggers.
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | turn:lanes:forward             | name |
 | ||
|             | ab    | through\|through\|right\|right | MySt |
 | ||
|             | bx    |                                | XSt  |
 | ||
|             | bc    |                                | MySt |
 | ||
|             | cd    | left\|right                    | MySt |
 | ||
|             | de    |                                | MySt |
 | ||
|             | dy    |                                | YSt  |
 | ||
| 
 | ||
|        When I route I should get
 | ||
|             | waypoints | route               | turns                                       | lanes                                                                        |
 | ||
|             | a,e       | MySt,MySt,MySt,MySt | depart,continue right,continue right,arrive | ,straight:false straight:false right:false right:true,left:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Don't Overdo It
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                   q     r     s     t     u   v
 | ||
|             a - - b - - c - - d - - e - - f - g - h - i
 | ||
|                   p     o     n     m     l   k   j
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | name | turn:lanes:forward | oneway |
 | ||
|             | ab    | road | left\|\|\|         | yes    |
 | ||
|             | bc    | road | left\|\|\|         | yes    |
 | ||
|             | cd    | road | left\|\|\|         | yes    |
 | ||
|             | de    | road | left\|\|\|         | yes    |
 | ||
|             | ef    | road | left\|\|\|         | yes    |
 | ||
|             | fg    | road | left\|\|\|         | yes    |
 | ||
|             | gh    | road | \|\|right          | yes    |
 | ||
|             | hi    | road |                    | yes    |
 | ||
|             | qbp   | 1st  |                    | no     |
 | ||
|             | rco   | 2nd  |                    | no     |
 | ||
|             | sdn   | 3rd  |                    | no     |
 | ||
|             | tem   | 4th  |                    | no     |
 | ||
|             | ufl   | 5th  |                    | no     |
 | ||
|             | vgk   | 6th  |                    | no     |
 | ||
|             | hj    | 7th  |                    | no     |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route        | turns                    | locations | lanes                                                                                                                                                                                                                                                                                        |
 | ||
|             | a,i       | road,road    | depart,arrive            | a,i       | ;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:false;none:true none:true right:false,     |
 | ||
|             | a,j       | road,7th,7th | depart,turn right,arrive | a,h,j     | ;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:true none:true none:true;left:false none:false none:false none:true;left:false none:false none:false none:true,none:false none:false right:true, |
 | ||
| 
 | ||
|     @anticipate
 | ||
|     Scenario: Oak St, Franklin St
 | ||
|         Given a grid size of 10 meters
 | ||
|         Given the node map
 | ||
|             """
 | ||
|                    g
 | ||
|                    .     . f
 | ||
|                  . d `
 | ||
|             e `    .
 | ||
|                    .
 | ||
|                    .
 | ||
|                    .     . c
 | ||
|                  . b `
 | ||
|             a `
 | ||
| 
 | ||
|             """
 | ||
| 
 | ||
|         And the ways
 | ||
|             | nodes | name        | turn:lanes                                  | oneway | highway   |
 | ||
|             | ab    | Oak St      | left\|left\|left                            | yes    | secondary |
 | ||
|             | cb    | Oak St      | right                                       | yes    | tertiary  |
 | ||
|             | bd    | Franklin St | left;through\|through\|through;right\|right | yes    | secondary |
 | ||
|             | dg    | Franklin St |                                             | yes    | secondary |
 | ||
|             | edf   | Fell St     |                                             |        | secondary |
 | ||
| 
 | ||
|         When I route I should get
 | ||
|             | waypoints | route                              | turns                               | lanes                                                                                              |
 | ||
|             | a,f       | Oak St,Franklin St,Fell St,Fell St | depart,turn left,turn right,arrive  | ,left:false left:true left:true,straight;left:false straight:false straight;right:true right:true, |
 |