67 lines
1.9 KiB
Ruby
67 lines
1.9 KiB
Ruby
When /^I request a travel time matrix I should get$/ do |table|
|
|
no_route = 2147483647 # MAX_INT
|
|
|
|
raise "*** Top-left cell of matrix table must be empty" unless table.headers[0]==""
|
|
|
|
waypoints = []
|
|
column_headers = table.headers[1..-1]
|
|
row_headers = table.rows.map { |h| h.first }
|
|
symmetric = Set.new(column_headers) == Set.new(row_headers)
|
|
if symmetric then
|
|
column_headers.each do |node_name|
|
|
node = find_node_by_name(node_name)
|
|
raise "*** unknown node '#{node_name}" unless node
|
|
waypoints << {:coord => node, :type => "loc"}
|
|
end
|
|
else
|
|
column_headers.each do |node_name|
|
|
node = find_node_by_name(node_name)
|
|
raise "*** unknown node '#{node_name}" unless node
|
|
waypoints << {:coord => node, :type => "dst"}
|
|
end
|
|
row_headers.each do |node_name|
|
|
node = find_node_by_name(node_name)
|
|
raise "*** unknown node '#{node_name}" unless node
|
|
waypoints << {:coord => node, :type => "src"}
|
|
end
|
|
end
|
|
|
|
reprocess
|
|
actual = []
|
|
actual << table.headers
|
|
OSRMLoader.load(self,"#{contracted_file}.osrm") do
|
|
|
|
# compute matrix
|
|
params = @query_params
|
|
response = request_table waypoints, params
|
|
if response.body.empty? == false
|
|
json_result = JSON.parse response.body
|
|
result = json_result["distance_table"]
|
|
end
|
|
|
|
|
|
# compare actual and expected result, one row at a time
|
|
table.rows.each_with_index do |row,ri|
|
|
# fuzzy match
|
|
ok = true
|
|
0.upto(result[ri].size-1) do |i|
|
|
if FuzzyMatch.match result[ri][i], row[i+1]
|
|
result[ri][i] = row[i+1]
|
|
elsif row[i+1]=="" and result[ri][i]==no_route
|
|
result[ri][i] = ""
|
|
else
|
|
result[ri][i] = result[ri][i].to_s
|
|
ok = false
|
|
end
|
|
end
|
|
|
|
# add row header
|
|
r = [row[0],result[ri]].flatten
|
|
|
|
# store row for comparison
|
|
actual << r
|
|
end
|
|
end
|
|
table.diff! actual
|
|
end
|