update cucumber suport code to return separate annotations headers

This commit is contained in:
karenzshea 2017-02-02 13:30:01 +01:00 committed by Patrick Niklaus
parent 84261fd214
commit ab91a05680
7 changed files with 69 additions and 87 deletions

View File

@ -1,6 +1,6 @@
# Testsuite
OSRM comes with a testsuite containing both unit-tests using the Boost library and cucucmber.js for scenario driven testing.
OSRM comes with a testsuite containing both unit-tests using the Boost library and cucumber.js for scenario driven testing.
## Unit Tests

View File

@ -83,7 +83,10 @@ module.exports = function () {
duration = json.matchings[0].duration;
}
if (headers.has('annotation')) {
// annotation response values are requested by 'a:{type_name}'
var found = false;
headers.forEach((h) => { if (h.match(/^a:/)) found = true; });
if (found) {
if (json.matchings.length != 1) throw new Error('*** Checking annotation only supported for matchings with one subtrace');
annotation = this.annotationList(json.matchings[0]);
}
@ -92,11 +95,6 @@ module.exports = function () {
if (json.matchings.length != 1) throw new Error('*** Checking geometry only supported for matchings with one subtrace');
geometry = json.matchings[0].geometry;
}
if (headers.has('OSM IDs')) {
if (json.matchings.length != 1) throw new Error('*** Checking annotation only supported for matchings with one subtrace');
OSMIDs = this.OSMIDList(json.matchings[0]);
}
}
if (headers.has('turns')) {
@ -111,9 +109,19 @@ module.exports = function () {
got.duration = duration.toString();
}
if (headers.has('annotation')) {
got.annotation = annotation.toString();
// if header matches 'a:*', parse out the values for *
// and return in that header
headers.forEach((k) => {
let whitelist = ['duration', 'distance', 'datasources', 'nodes', 'weight'];
if (k.match(/^a:/)) {
let a_type = k.slice(2);
if (whitelist.indexOf(a_type) == -1)
return cb(new Error('Unrecognized annotation field:' + a_type));
if (!annotation[a_type])
return cb(new Error('Annotation not found in response: ' + a_type));
got[k] = annotation[a_type];
}
});
if (headers.has('geometry')) {
if (this.queryParams['geometries'] === 'polyline') {

View File

@ -167,23 +167,17 @@ module.exports = function () {
if (!('annotation' in instructions.legs[0]))
return '';
function zip(list_1, list_2, list_3, list_4)
{
let tuples = [];
for (let i = 0; i < list_1.length; ++i) {
tuples.push([list_1[i], list_2[i], list_3[i], list_4[i]]);
}
return tuples;
}
return instructions.legs.map(l => {
const values = zip( l.annotation.weight, l.annotation.duration, l.annotation.distance, l.annotation.datasources);
return values.map(p => { return p.join(':'); }).join(',');
}).join(',');
};
this.OSMIDList = (instructions) => {
// OSM node IDs also come from the annotation list
return instructions.legs.map(l => l.annotation.nodes.map(n => n.toString()).join(',')).join(',');
var merged = {};
instructions.legs.map(l => {
Object.keys(l.annotation).forEach(a => {
if (!merged[a]) merged[a] = [];
merged[a].push(l.annotation[a].join(':'));
});
});
Object.keys(merged).map(a => {
merged[a] = merged[a].join(',');
});
return merged;
};
this.lanesList = (instructions) => {

View File

@ -133,9 +133,19 @@ module.exports = function () {
got.locations = (locations || '').trim();
}
if (headers.has('annotation')){
got.annotation = (annotation || '').trim();
// if header matches 'a:*', parse out the values for *
// and return in that header
headers.forEach((k) => {
let whitelist = ['duration', 'distance', 'datasources', 'nodes', 'weight'];
if (k.match(/^a:/)) {
let a_type = k.slice(2);
if (whitelist.indexOf(a_type) == -1)
return cb(new Error('Unrecognized annotation field', a_type));
if (!annotation[a_type])
return cb(new Error('Annotation not found in response', a_type));
got[k] = annotation[a_type];
}
});
var putValue = (key, value) => {
if (headers.has(key)) got[key] = instructions ? value : '';

View File

@ -141,12 +141,12 @@ Feature: Basic Map Matching
And the contract extra arguments "--segment-speed-file {speeds_file}"
When I match I should get
| trace | matchings | annotation |
| ach | ach | 1,1,0,1,1,2,1 |
| trace | matchings | a:duration |
| ach | ach | 1:1,0:1:1:2:1 |
Scenario: Testbot - Duration details
Given the query options
| annotations | true |
| annotations | duration,nodes |
Given the node map
"""
@ -167,15 +167,15 @@ Feature: Basic Map Matching
And the contract extra arguments "--segment-speed-file {speeds_file}"
When I match I should get
| trace | matchings | annotation |
| abeh | abeh | 1:10.008842:1:1:1,0:0:0:2:0,1:10.008842:1:2:0,1:10.008842:1:3:0,1:10.008842:1:4:0,0:0:0:4:0,2:19.906475:2:5:0,1:10.008842:1:6:0 |
| abci | abci | 1:10.008842:1:1:1,0:0:0:2:0,1:10.008842:1:2:0,0:0:0:2:0,1:10.010367:1:3:0 |
| trace | matchings | a:duration |
| abeh | abeh | 1:0,1:1:1,0:2:1 |
| abci | abci | 1:0,1,0:1 |
# The following is the same as the above, but separated for readability (line length)
When I match I should get
| trace | matchings | OSM IDs |
| abeh | abeh | 1,2,3,2,3,4,5,4,5,6,7 |
| abci | abci | 1,2,3,2,3,2,3,8 |
| trace | matchings | a:nodes |
| abeh | abeh | 1:2:3,2:3:4:5,4:5:6:7 |
| abci | abci | 1:2:3,2:3,2:3:8 |
Scenario: Testbot - Regression test for #3037
Given the query options
@ -303,7 +303,7 @@ Feature: Basic Map Matching
| abcd | 0 1 2 3 | abcd |
# Regression test 1 for issue 3176
Scenario: Testbot - multiuple segments: properly expose OSM IDs
Scenario: Testbot - multiple segments: properly expose OSM IDs
Given the query options
| annotations | true |
@ -332,9 +332,9 @@ Feature: Basic Map Matching
| fg | no |
When I match I should get
| trace | OSM IDs |
| 12 | 1,2,3,4,5,6,7 |
| 21 | 7,6,5,4,3,2,1 |
| trace | a:nodes |
| 12 | 1:2:3:4:5:6:7 |
| 21 | 7:6:5:4:3:2:1 |
# Regression test 2 for issue 3176
Scenario: Testbot - same edge: properly expose OSM IDs
@ -360,32 +360,6 @@ Feature: Basic Map Matching
| abcdef | no |
When I match I should get
| trace | OSM IDs |
| 12 | 1,2,3,4,5,6 |
| 21 | 6,5,4,3,2,1 |
Scenario: Testbot - return annotations based on parameter
Given the query options
| annotations | duration,weight |
Given the node map
"""
a - b
|
c
"""
And the nodes
| node | id |
| a | 1 |
| b | 2 |
| c | 3 |
And the ways
| nodes | oneway |
| abc | no |
When I match I should get
| trace | annotation |
| ac | 2:2,2:2 |
| ca | 2:2,2:2,0:0 |
| trace | a:nodes |
| 12 | 1:2:3:4:5:6 |
| 21 | 6:5:4:3:2:1 |

View File

@ -10,7 +10,7 @@ Feature: Weight tests
Scenario: Weight details
Given the query options
| annotations | true |
| annotations | weight |
Given the node map
"""
@ -29,8 +29,8 @@ Feature: Weight tests
| cde |
When I route I should get
| waypoints | route | annotation |
| s,t | abc,cde,cde | 1.1:10.008843:1.1:2:0,2:20.017686:2:3:0,2:20.020734:2:4:0,1:10.010367:1:5:0 |
| waypoints | route | a:weight |
| s,t | abc,cde,cde | 1.1:2:2:1 |
When I route I should get
| waypoints | route | times | weight_name | weights |
@ -39,7 +39,7 @@ Feature: Weight tests
# FIXME include/engine/guidance/assemble_geometry.hpp:95
Scenario: Start and target on the same and adjacent edge
Given the query options
| annotations | true |
| annotations | distance,duration,weight,nodes |
Given the node map
"""
@ -53,11 +53,11 @@ Feature: Weight tests
| abc |
When I route I should get
| waypoints | route | distances | weights | times | annotation |
| s,t | abc,abc | 20m,0m | 2.1,0 | 2.1s,0s | 3:20.017685:3:1:0 |
| t,s | abc,abc | 20m,0m | 2.1,0 | 2.1s,0s | 3.1:20.017685:3.1:2:0 |
| s,e | abc,abc | 40m,0m | 4.1,0 | 4.1s,0s | 3.1:30.026527:3.1:1:0,1:10.008842:1:2:0 |
| e,s | abc,abc | 40m,0m | 4.1,0 | 4.1s,0s | 1:10.008842:1:3:0,3.1:30.026527:3.1:2:0 |
| waypoints | route | distances | weights | times | a:distance | a:duration | a:weight |
| s,t | abc,abc | 20m,0m | 2.1,0 | 2.1s,0s | 20.017685 | 3 | 3 |
| t,s | abc,abc | 20m,0m | 2.1,0 | 2.1s,0s | 20.017685 | 3.1 | 3.1 |
| s,e | abc,abc | 40m,0m | 4.1,0 | 4.1s,0s | 30.026527:10.008842 | 3.1:1 | 3.1:1 |
| e,s | abc,abc | 40m,0m | 4.1,0 | 4.1s,0s | 10.008842:30.026527 | 1:3.1 | 1:3.1 |
Scenario: Step weights -- way_function: fail if no weight or weight_per_meter property

View File

@ -132,9 +132,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
CHECK_EQUAL_RANGE(reference_2.hints, result_2->hints);
BOOST_CHECK_EQUAL(
static_cast<bool>(result_2->annotations_type & RouteParameters::AnnotationsType::All),
true);
BOOST_CHECK_EQUAL(result_2->annotations_type == RouteParameters::AnnotationsType::All, true);
RouteParameters reference_3{false,
false,
@ -376,9 +374,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
"1,2;3,4?overview=simplified&annotations=duration,weight,nodes,datasources,distance");
BOOST_CHECK(result_17);
BOOST_CHECK_EQUAL(reference_17.geometries, result_17->geometries);
BOOST_CHECK_EQUAL(
static_cast<bool>(result_2->annotations_type & RouteParameters::AnnotationsType::All),
true);
BOOST_CHECK_EQUAL(result_2->annotations_type == RouteParameters::AnnotationsType::All, true);
BOOST_CHECK_EQUAL(result_17->annotations, true);
}