* Added approach on the opposite side of the road. * Additional test and docs coverage for opposite approach --------- Co-authored-by: Aleksandrs Saveljevs <Aleksandrs.Saveljevs@gmail.com>
		
			
				
	
	
		
			663 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
			
		
		
	
	
			663 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
| @routing @approach @testbot
 | |
| Feature: Approach parameter
 | |
| 
 | |
|     Background:
 | |
|         Given a grid size of 10 meters
 | |
| 
 | |
|     Scenario: Start End same approach, option unrestricted for Start and End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: Start End same approach, option unrestricted for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route    |
 | |
|             | s    | e  | unrestricted curb | ab,bc,bc |
 | |
| 
 | |
|     Scenario: Start End same approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route |
 | |
|             | s    | e  | unrestricted opposite | ab,bc |
 | |
| 
 | |
|     Scenario: Start End same approach, option opposite for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route    |
 | |
|             | s    | e  | opposite curb         | ab,bc,bc |
 | |
| 
 | |
|     Scenario: Start End different approach, option unrestricted for Start and End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: Start End different approach, option unrestricted for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb | ab,bc |
 | |
| 
 | |
|     Scenario: Start End different approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route    |
 | |
|             | s    | e  | unrestricted opposite | ab,bc,bc |
 | |
| 
 | |
|     Scenario: Start End different approach, option curb for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                e
 | |
|             a------b------c-----------d
 | |
|                               s
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
|             | cd    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches    | route       |
 | |
|             | s    | e  | curb opposite | cd,cd,ab,ab |
 | |
| 
 | |
| 
 | |
|     ###############
 | |
|     # Oneway Test #
 | |
|     ###############
 | |
| 
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End same approach, option unrestricted for Start and End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End same approach, option unrestricted for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End same approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route |
 | |
|             | s    | e  | unrestricted opposite | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End same approach, option opposite for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches    | route |
 | |
|             | s    | e  | opposite curb | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and curb for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route |
 | |
|             | s    | e  | unrestricted opposite | ab,bc |
 | |
| 
 | |
|     Scenario: Test on oneway segment, Start End different approach, option curb for Start and opposite for End
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | oneway |
 | |
|             | ab    | yes    |
 | |
|             | bc    | yes    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches    | route |
 | |
|             | s    | e  | curb opposite | ab,bc |
 | |
| 
 | |
|     ##############
 | |
|     # UTurn Test #
 | |
|     ##############
 | |
| 
 | |
|     Scenario: UTurn test, router can't found a route because uturn unauthorized on the segment selected
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         And the relations
 | |
|             | type        | way:from | way:to | node:via | restriction |
 | |
|             | restriction | bc       | bc     | c        | no_u_turn   |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb |       |
 | |
| 
 | |
|     Scenario: UTurn test, router can find a route because uturn authorized to reach opposite side
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                e        s
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         And the relations
 | |
|             | type        | way:from | way:to | node:via | restriction |
 | |
|             | restriction | bc       | bc     | c        | no_u_turn   |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches    | route     |
 | |
|             | s    | e  | curb opposite | bc,ab,ab  |
 | |
| 
 | |
| 
 | |
|     Scenario: UTurn test, router can find a route because he can use the roundabout
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                              h
 | |
|                s        e  /   \
 | |
|             a------b------c     g
 | |
|                            \   /
 | |
|                              f
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes | junction   |
 | |
|             | ab    |            |
 | |
|             | bc    |            |
 | |
|             | cfghc | roundabout |
 | |
| 
 | |
|         And the relations
 | |
|             | type        | way:from | way:to | node:via | restriction |
 | |
|             | restriction | bc       | bc     | c        | no_u_turn   |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches         | route    |
 | |
|             | s    | e  | unrestricted curb  | ab,bc,bc |
 | |
|             | s    | e  | opposite curb      | ab,bc,bc |
 | |
| 
 | |
| 
 | |
|     Scenario: Start End same approach, option unrestricted for Start and curb for End, left-hand driving
 | |
|         Given the profile file
 | |
|         """
 | |
|         local functions = require('testbot')
 | |
|         local testbot_process_way = functions.process_way
 | |
|         functions.process_way = function(profile, way, result)
 | |
|           testbot_process_way(profile, way, result)
 | |
|           result.is_left_hand_driving = true
 | |
|         end
 | |
|         return functions
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb | ab,bc |
 | |
| 
 | |
|     Scenario: Start End same approach, option unrestricted for Start and opposite for End, left-hand driving
 | |
|         Given the profile file
 | |
|         """
 | |
|         local functions = require('testbot')
 | |
|         local testbot_process_way = functions.process_way
 | |
|         functions.process_way = function(profile, way, result)
 | |
|           testbot_process_way(profile, way, result)
 | |
|           result.is_left_hand_driving = true
 | |
|         end
 | |
|         return functions
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route    |
 | |
|             | s    | e  | unrestricted opposite | ab,bc,bc |
 | |
| 
 | |
| 
 | |
|     #######################
 | |
|     # Left-side countries #
 | |
|     #######################
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End same approach, option unrestricted for Start and End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s        e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End same approach, option unrestricted for Start and curb for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s       e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route |
 | |
|             | s    | e  | unrestricted curb | ab,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End same approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s       e
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches             | route    |
 | |
|             | s    | e  | unrestricted opposite  | ab,bc,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End same approach, option opposite for Start and curb for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                e      s
 | |
|             a------b------c
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches     | route    |
 | |
|             | s    | e  | opposite curb  | bc,ab,ab |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                         e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches                | route |
 | |
|             | s    | e  | unrestricted unrestricted | ab,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and curb for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                       e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches        | route    |
 | |
|             | s    | e  | unrestricted curb | ab,bc,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and opposite for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                       e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches            | route |
 | |
|             | s    | e  | unrestricted opposite | ab,bc |
 | |
| 
 | |
|     Scenario: [Left-hand-side] Start End different approach, option curb for Start and opposite for End
 | |
|         Given the profile file "car" initialized with
 | |
|         """
 | |
|         profile.properties.left_hand_driving = true
 | |
|         """
 | |
|         And the node map
 | |
|             """
 | |
|                s
 | |
|             a------b------c
 | |
|                       e
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | approaches       | route |
 | |
|             | s    | e  | curb opposite    | ab,bc |
 | |
| 
 | |
| 
 | |
| 
 | |
|     Scenario: Routes with more than two waypoints - uturns allowed
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                2                 1
 | |
|             a------b------c-----------d
 | |
|                    |
 | |
|                3   |             4
 | |
|             e------f------g-----------h
 | |
|             |
 | |
|             |
 | |
|             i
 | |
| 
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
|             | cd    |
 | |
|             | bf    |
 | |
|             | ef    |
 | |
|             | fg    |
 | |
|             | gh    |
 | |
|             | ei    |
 | |
| 
 | |
|         And the query options
 | |
|             | continue_straight | false |
 | |
| 
 | |
|         When I route I should get
 | |
|             | waypoints | approaches                                  | locations             | #                                                   |
 | |
|             | 1,2,3,4   | curb curb curb curb                         | _,_,_,a,b,f,_,_,i,h,_ | 1,2,2,a,b,f,3,3,i,h,4 (Only u-turn at end of roads) |
 | |
|             | 1,2,3,4   | curb unrestricted unrestricted curb         | _,_,_,b,f,_,_,h,_     | 1,2,2,b,f,3,3,h,4     (Can u-turn at 2 and 3)       |
 | |
|             | 1,2,3,4   | opposite opposite opposite opposite         | _,d,a,_,_,b,f,i,_,_,_ | 1,d,a,2,2,b,f,i,3,3,4 (Only u-turn at end of roads) |
 | |
|             | 1,2,3,4   | opposite unrestricted unrestricted opposite | _,d,_,_,b,f,_,_,_     | 1,d,2,2,b,f,3,3,4     (Can u-turn at 2 and 3)       |
 | |
| 
 | |
| 
 | |
|     Scenario: Routes with more than two waypoints - uturns forbidden
 | |
|         Given the profile "testbot"
 | |
|         And the node map
 | |
|             """
 | |
|                2                 1
 | |
|             a------b------c-----------d
 | |
|                    |
 | |
|                3   |             4
 | |
|             e------f------g-----------h
 | |
|             |
 | |
|             |
 | |
|             i
 | |
| 
 | |
|             """
 | |
| 
 | |
|         And the ways
 | |
|             | nodes |
 | |
|             | ab    |
 | |
|             | bc    |
 | |
|             | cd    |
 | |
|             | bf    |
 | |
|             | ef    |
 | |
|             | fg    |
 | |
|             | gh    |
 | |
|             | ei    |
 | |
| 
 | |
|         And the query options
 | |
|             | continue_straight | true |
 | |
| 
 | |
|         When I route I should get
 | |
|             | waypoints | approaches                                  |  locations            | #                                                   |
 | |
|             | 1,2,3,4   | curb curb curb curb                         | _,_,_,a,b,f,_,_,i,h,_ | 1,2,2,a,b,f,3,3,i,h,4 (Only u-turn at end of roads) |
 | |
|             | 1,2,3,4   | curb opposite opposite curb                 | _,a,_,_,b,f,i,_,_,h,_ | 1,a,2,2,b,f,i,3,3,h,4 (switches stops with u-turns) |
 | |
|             | 1,2,3,4   | opposite opposite opposite opposite         | _,d,a,_,_,b,f,i,_,_,_ | 1,d,a,2,2,b,f,i,3,3,4 (Only u-turn at end of roads) |
 | |
|             | 1,2,3,4   | opposite curb curb opposite                 | _,d,_,_,a,b,f,_,_,i,_ | 1,d,2,2,a,b,f,3,3,i,4 (switches stops with u-turns) |
 |