233 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Gherkin
		
	
	
	
	
	
| Feature: Profile API version 1
 | |
| 
 | |
|     Background:
 | |
|         Given a grid size of 100 meters
 | |
| 
 | |
|     Scenario: Basic profile function calls and property values
 | |
|         Given the profile file
 | |
|            """
 | |
|           api_version = 1
 | |
| 
 | |
|           -- set profile properties
 | |
|           properties.max_speed_for_map_matching      = 180/3.6
 | |
|           properties.use_turn_restrictions           = true
 | |
|           properties.continue_straight_at_waypoint   = true
 | |
|           properties.weight_name                     = 'test_version1'
 | |
|           properties.weight_precision                = 2
 | |
| 
 | |
|           assert(properties.max_turn_weight == 327.67)
 | |
| 
 | |
|           function node_function (node, result)
 | |
|             print(node, result)
 | |
|             print ('node_function ' .. node:id())
 | |
|           end
 | |
| 
 | |
|           function way_function(way, result)
 | |
|             result.name = way:get_value_by_key('name')
 | |
|             result.weight = 10
 | |
|             result.forward_mode = mode.driving
 | |
|             result.backward_mode = mode.driving
 | |
|             result.forward_speed = 36
 | |
|             result.backward_speed = 36
 | |
|             print ('way_function ' .. way:id() .. ' ' .. result.name)
 | |
|           end
 | |
| 
 | |
|           function turn_function (turn)
 | |
|             print('turn_function', turn.angle, turn.turn_type, turn.direction_modifier, turn.has_traffic_light)
 | |
|             turn.weight = turn.angle == 0 and 0 or 4.2
 | |
|             turn.duration = turn.weight
 | |
|           end
 | |
| 
 | |
|           function segment_function (segment)
 | |
|               print ('segment_function ' .. segment.source.lon .. ' ' .. segment.source.lat)
 | |
|           end
 | |
|           """
 | |
|         And the node map
 | |
|            """
 | |
|                a
 | |
|               bcd
 | |
|                e
 | |
|            """
 | |
|         And the ways
 | |
|             | nodes  |
 | |
|             | ac     |
 | |
|             | cb     |
 | |
|             | cd     |
 | |
|             | ce     |
 | |
|         And the data has been saved to disk
 | |
| 
 | |
|         When I run "osrm-extract --profile {profile_file} {osm_file}"
 | |
|         Then it should exit successfully
 | |
|         And stdout should contain "node_function"
 | |
|         And stdout should contain "way_function"
 | |
|         And stdout should contain "turn_function"
 | |
|         And stdout should contain "segment_function"
 | |
| 
 | |
|         When I route I should get
 | |
|            | from | to | route    | time  |
 | |
|            | a    | b  | ac,cb,cb | 19.2s |
 | |
|            | a    | d  | ac,cd,cd | 19.2s |
 | |
|            | a    | e  | ac,ce    | 20s   |
 | |
| 
 | |
|     Scenario: Basic profile function calls and property values
 | |
|         Given the profile file
 | |
|            """
 | |
|           api_version = 1
 | |
| 
 | |
|           -- set profile properties
 | |
|           properties.max_speed_for_map_matching      = 180/3.6
 | |
|           properties.use_turn_restrictions           = true
 | |
|           properties.continue_straight_at_waypoint   = true
 | |
|           properties.weight_name                     = 'test_version1'
 | |
|           properties.weight_precision                = 2
 | |
| 
 | |
|           assert(properties.max_turn_weight == 327.67)
 | |
| 
 | |
|           function node_function (node, result)
 | |
|             print(node, result)
 | |
|             print ('node_function ' .. node:id())
 | |
|           end
 | |
| 
 | |
|           function way_function(way, result)
 | |
|             result.name = way:get_value_by_key('name')
 | |
|             result.weight = 10
 | |
|             result.forward_mode = mode.driving
 | |
|             result.backward_mode = mode.driving
 | |
|             result.forward_speed = 36
 | |
|             result.backward_speed = 36
 | |
|             print ('way_function ' .. way:id() .. ' ' .. result.name)
 | |
|           end
 | |
| 
 | |
|           function turn_function (turn)
 | |
|             print('turn_function', turn.angle, turn.turn_type, turn.direction_modifier, turn.has_traffic_light)
 | |
|             turn.weight = turn.angle == 0 and 0 or 4.2
 | |
|             turn.duration = turn.weight
 | |
|           end
 | |
| 
 | |
|           function segment_function (segment)
 | |
|               print ('segment_function ' .. segment.source.lon .. ' ' .. segment.source.lat)
 | |
|           end
 | |
|           """
 | |
|         And the node map
 | |
|            """
 | |
|                a
 | |
|               bcd
 | |
|                e
 | |
|            """
 | |
|         And the ways
 | |
|             | nodes  |
 | |
|             | ac     |
 | |
|             | cb     |
 | |
|             | cd     |
 | |
|             | ce     |
 | |
|         And the data has been saved to disk
 | |
| 
 | |
|         When I run "osrm-extract --profile {profile_file} {osm_file}"
 | |
|         Then it should exit successfully
 | |
|         And stdout should contain "node_function"
 | |
|         And stdout should contain "way_function"
 | |
|         And stdout should contain "turn_function"
 | |
|         And stdout should contain "segment_function"
 | |
| 
 | |
|         When I route I should get
 | |
|            | from | to | route    | time  |
 | |
|            | a    | b  | ac,cb,cb | 19.2s |
 | |
|            | a    | d  | ac,cd,cd | 19.2s |
 | |
|            | a    | e  | ac,ce    | 20s   |
 | |
| 
 | |
|     Scenario: Weighting based on raster sources
 | |
|         Given the profile file
 | |
|         """
 | |
|         api_version = 1
 | |
| 
 | |
|         properties.force_split_edges = true
 | |
| 
 | |
|         function source_function()
 | |
|           local path = os.getenv('OSRM_RASTER_SOURCE')
 | |
|           if not path then
 | |
|             path = 'rastersource.asc'
 | |
|           end
 | |
|           raster_source = sources:load(
 | |
|             path,
 | |
|             0,    -- lon_min
 | |
|             0.1,  -- lon_max
 | |
|             0,    -- lat_min
 | |
|             0.1,  -- lat_max
 | |
|             5,    -- nrows
 | |
|             4     -- ncols
 | |
|           )
 | |
|         end
 | |
| 
 | |
|         function way_function (way, result)
 | |
|           result.name = way:get_value_by_key('name')
 | |
|           result.forward_mode = mode.cycling
 | |
|           result.backward_mode = mode.cycling
 | |
|           result.forward_speed = 15
 | |
|           result.backward_speed = 15
 | |
|         end
 | |
| 
 | |
|         function segment_function (segment)
 | |
|           local sourceData = sources:query(raster_source, segment.source.lon, segment.source.lat)
 | |
|           local targetData = sources:query(raster_source, segment.target.lon, segment.target.lat)
 | |
|           io.write('evaluating segment: ' .. sourceData.datum .. ' ' .. targetData.datum .. '\n')
 | |
|           local invalid = sourceData.invalid_data()
 | |
|           local scaled_weight = segment.weight
 | |
|           local scaled_duration = segment.duration
 | |
| 
 | |
|           if sourceData.datum ~= invalid and targetData.datum ~= invalid then
 | |
|             local slope = (targetData.datum - sourceData.datum) / segment.distance
 | |
|             scaled_weight = scaled_weight / (1.0 - (slope * 5.0))
 | |
|             scaled_duration = scaled_duration / (1.0 - (slope * 5.0))
 | |
|             io.write('   slope: ' .. slope .. '\n')
 | |
|             io.write('   was weight: ' .. segment.weight .. '\n')
 | |
|             io.write('   new weight: ' .. scaled_weight .. '\n')
 | |
|             io.write('   was duration: ' .. segment.duration .. '\n')
 | |
|             io.write('   new duration: ' .. scaled_duration .. '\n')
 | |
|           end
 | |
| 
 | |
|           segment.weight = scaled_weight
 | |
|           segment.duration = scaled_duration
 | |
|         end
 | |
|         """
 | |
|         And the node locations
 | |
|             | node | lat        | lon      |
 | |
|             | a    | 0.1        | 0.1      |
 | |
|             | b    | 0.05       | 0.1      |
 | |
|             | c    | 0.0        | 0.1      |
 | |
|             | d    | 0.05       | 0.03     |
 | |
|             | e    | 0.05       | 0.066    |
 | |
|             | f    | 0.075      | 0.066    |
 | |
|         And the ways
 | |
|             | nodes | highway |
 | |
|             | ab    | primary |
 | |
|             | ad    | primary |
 | |
|             | bc    | primary |
 | |
|             | dc    | primary |
 | |
|             | de    | primary |
 | |
|             | eb    | primary |
 | |
|             | df    | primary |
 | |
|             | fb    | primary |
 | |
|         And the raster source
 | |
|             """
 | |
|             0  0  0   0
 | |
|             0  0  0   250
 | |
|             0  0  250 500
 | |
|             0  0  0   250
 | |
|             0  0  0   0
 | |
|             """
 | |
|         And the data has been saved to disk
 | |
| 
 | |
|         When I route I should get
 | |
|             | from | to | route    | speed   |
 | |
|             | a    | b  | ab,ab    | 8 km/h  |
 | |
|             | b    | a  | ab,ab    | 22 km/h |
 | |
|             | a    | c  | ab,bc,bc | 12 km/h |
 | |
|             | b    | c  | bc,bc    | 22 km/h |
 | |
|             | a    | d  | ad,ad    | 15 km/h |
 | |
|             | d    | c  | dc,dc    | 15 km/h |
 | |
|             | d    | e  | de,de    | 10 km/h |
 | |
|             | e    | b  | eb,eb    | 10 km/h |
 | |
|             | d    | f  | df,df    | 15 km/h |
 | |
|             | f    | b  | fb,fb    | 7 km/h  |
 | |
|             | d    | b  | de,eb,eb | 10 km/h |
 |