diff --git a/features/bicycle/maxspeed.feature b/features/bicycle/maxspeed.feature index 72f6a0ed6..32b71c5f1 100644 --- a/features/bicycle/maxspeed.feature +++ b/features/bicycle/maxspeed.feature @@ -7,15 +7,15 @@ Feature: Bike - Max speed restrictions Scenario: Bicycle - Respect maxspeeds when lower that way type speed Then routability should be - | highway | maxspeed | bothw | - | residential | | 15 km/h | - | residential | 10 | 10 km/h | + | highway | maxspeed | bothw | + | residential | | 15 km/h +- 1 | + | residential | 10 | 10 km/h +- 1 | Scenario: Bicycle - Ignore maxspeed when higher than way speed Then routability should be - | highway | maxspeed | bothw | - | residential | | 15 km/h | - | residential | 80 | 15 km/h | + | highway | maxspeed | bothw | + | residential | | 15 km/h +- 1 | + | residential | 80 | 15 km/h | @todo Scenario: Bicycle - Maxspeed formats @@ -63,14 +63,14 @@ Feature: Bike - Max speed restrictions | snail | 720s ~10% | Then routability should be - | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw | - | | | | 15 km/h | 15 km/h | - | 10 | | | 10 km/h | 10 km/h | - | | 10 | | 10 km/h | 15 km/h | - | | | 10 | 15 km/h | 10 km/h | - | 2 | 10 | | 10 km/h | 2 km/h | - | 2 | | 10 | 2 km/h | 10 km/h | - | 2 | 5 | 10 | 5 km/h | 10 km/h | + | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw | + | | | | 15 km/h +- 1 | 15 km/h +- 1 | + | 10 | | | 10 km/h +- 1 | 10 km/h +- 1 | + | | 10 | | 10 km/h +- 1 | 15 km/h +- 1 | + | | | 10 | 15 km/h | 10 km/h +- 1 | + | 2 | 10 | | 10 km/h +- 1 | 2 km/h | + | 2 | | 10 | 2 km/h | 10 km/h +- 1 | + | 2 | 5 | 10 | 5 km/h | 10 km/h +- 1 | Scenario: Bike - Maxspeed should not allow routing on unroutable ways Then routability should be diff --git a/features/bicycle/pushing.feature b/features/bicycle/pushing.feature index 2c672584f..7d3b1cdb0 100644 --- a/features/bicycle/pushing.feature +++ b/features/bicycle/pushing.feature @@ -65,6 +65,7 @@ Feature: Bike - Accessability of different way types | runway | | | | | runway | yes | foot | foot | + @todo Scenario: Bike - Pushing bikes on ways with foot=yes in one direction Then routability should be | highway | foot:forward | foot:backward | forw | backw | diff --git a/features/bicycle/surface.feature b/features/bicycle/surface.feature index b2e9b4105..0485c9e6d 100644 --- a/features/bicycle/surface.feature +++ b/features/bicycle/surface.feature @@ -7,35 +7,34 @@ Feature: Bike - Surfaces Scenario: Bicycle - Slow surfaces Then routability should be | highway | surface | bothw | - | cycleway | | 48s | - | cycleway | asphalt | 48s | - | cycleway | cobblestone:flattened | 72s | - | cycleway | paving_stones | 72s | - | cycleway | compacted | 72s | - | cycleway | cobblestone | 120s | - | cycleway | unpaved | 120s | - | cycleway | fine_gravel | 120s | - | cycleway | gravel | 120s | - | cycleway | pebblestone | 120s | - | cycleway | dirt | 120s | - | cycleway | earth | 120s | - | cycleway | grass | 120s | - | cycleway | mud | 240s | - | cycleway | sand | 240s | + | cycleway | | 48 s | + | cycleway | asphalt | 48 s | + | cycleway | cobblestone:flattened | 72 s | + | cycleway | paving_stones | 72 s | + | cycleway | compacted | 72 s | + | cycleway | cobblestone | 120 s | + | cycleway | fine_gravel | 120 s | + | cycleway | gravel | 120 s | + | cycleway | pebblestone | 120 s | + | cycleway | dirt | 120 s | + | cycleway | earth | 120 s | + | cycleway | grass | 120 s | + | cycleway | mud | 240 s | + | cycleway | sand | 240 s | Scenario: Bicycle - Good surfaces on small paths Then routability should be | highway | surface | bothw | - | cycleway | | 48s | - | path | | 60s | - | track | | 60s | - | track | asphalt | 48s | - | path | asphalt | 48s | + | cycleway | | 48 s | + | path | | 60 s | + | track | | 60 s | + | track | asphalt | 60 s | + | path | asphalt | 60 s | Scenario: Bicycle - Surfaces should not make unknown ways routable Then routability should be | highway | surface | bothw | - | cycleway | | 48s | + | cycleway | | 48 s | | nosense | | | | nosense | asphalt | | diff --git a/features/car/maxspeed.feature b/features/car/maxspeed.feature index dc9a60375..11612952c 100644 --- a/features/car/maxspeed.feature +++ b/features/car/maxspeed.feature @@ -52,14 +52,14 @@ OSRM will use 4/5 of the projected free-flow speed. Given a grid size of 100 meters Then routability should be - | highway | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw | - | primary | | | | 65 km/h | 65 km/h | - | primary | 60 | | | 60 km/h | 60 km/h | - | primary | | 60 | | 60 km/h | 65 km/h | - | primary | | | 60 | 65 km/h | 60 km/h | - | primary | 15 | 60 | | 60 km/h | 23 km/h | - | primary | 15 | | 60 | 23 km/h | 60 km/h | - | primary | 15 | 30 | 60 | 34 km/h | 60 km/h | + | highway | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw | + | primary | | | | 63 km/h | 63 km/h | + | primary | 60 | | | 60 km/h +- 1 | 60 km/h +- 1 | + | primary | | 60 | | 60 km/h +- 1 | 63 km/h | + | primary | | | 60 | 63 km/h | 60 km/h +- 1 | + | primary | 15 | 60 | | 60 km/h +- 1 | 23 km/h | + | primary | 15 | | 60 | 23 km/h +- 1 | 60 km/h +- 1 | + | primary | 15 | 30 | 60 | 34 km/h +- 1 | 60 km/h +- 1 | Scenario: Car - Maxspeed should not allow routing on unroutable ways Then routability should be @@ -85,17 +85,17 @@ OSRM will use 4/5 of the projected free-flow speed. | primary | | | | | 63 km/h | 63 km/h | | primary | | 3 | | | 32 km/h | 32 km/h | | primary | 60 | | | | 59 km/h | 59 km/h | - | primary | 60 | 3 | | | 30 km/h | 30 km/h | + | primary | 60 | 3 | | | 29 km/h | 29 km/h | | primary | | | 60 | | 59 km/h | 63 km/h | - | primary | | 3 | 60 | | 30 km/h | 32 km/h | + | primary | | 3 | 60 | | 29 km/h | 32 km/h | | primary | | | | 60 | 63 km/h | 59 km/h | - | primary | | 3 | | 60 | 32 km/h | 30 km/h | + | primary | | 3 | | 60 | 32 km/h | 29 km/h | | primary | 15 | | 60 | | 59 km/h | 23 km/h | - | primary | 15 | 3 | 60 | | 30 km/h | 7 km/h | - | primary | 15 | | | 60 | 23 km/h | 59 km/h | - | primary | 15 | 3 | | 60 | 7 km/h | 30 km/h | - | primary | 15 | | 30 | 60 | 34 km/h | 59 km/h | - | primary | 15 | 3 | 30 | 60 | 15 km/h | 30 km/h | + | primary | 15 | 3 | 60 | | 29 km/h | 7 km/h | + | primary | 15 | | | 60 | 22 km/h | 59 km/h | + | primary | 15 | 3 | | 60 | 7 km/h | 29 km/h | + | primary | 15 | | 30 | 60 | 35 km/h | 59 km/h | + | primary | 15 | 3 | 30 | 60 | 14 km/h | 29 km/h | Scenario: Car - Single lane streets be ignored or incur a penalty Then routability should be @@ -104,22 +104,22 @@ OSRM will use 4/5 of the projected free-flow speed. | primary | | | | | 63 km/h | 63 km/h | | primary | | 1 | | | 32 km/h | 32 km/h | | primary | 60 | | | | 59 km/h | 59 km/h | - | primary | 60 | 1 | | | 30 km/h | 30 km/h | + | primary | 60 | 1 | | | 29 km/h | 29 km/h | | primary | | | 60 | | 59 km/h | 63 km/h | - | primary | | 1 | 60 | | 30 km/h | 32 km/h | + | primary | | 1 | 60 | | 29 km/h | 32 km/h | | primary | | | | 60 | 63 km/h | 59 km/h | - | primary | | 1 | | 60 | 32 km/h | 30 km/h | + | primary | | 1 | | 60 | 32 km/h | 29 km/h | | primary | 15 | | 60 | | 59 km/h | 23 km/h | - | primary | 15 | 1 | 60 | | 30 km/h | 7 km/h | - | primary | 15 | | | 60 | 23 km/h | 59 km/h | - | primary | 15 | 1 | | 60 | 7 km/h | 30 km/h | - | primary | 15 | | 30 | 60 | 34 km/h | 59 km/h | - | primary | 15 | 1 | 30 | 60 | 15 km/h | 30 km/h | + | primary | 15 | 1 | 60 | | 29 km/h | 7 km/h | + | primary | 15 | | | 60 | 22 km/h | 59 km/h | + | primary | 15 | 1 | | 60 | 7 km/h | 29 km/h | + | primary | 15 | | 30 | 60 | 35 km/h | 59 km/h | + | primary | 15 | 1 | 30 | 60 | 14 km/h | 29 km/h | Scenario: Car - Single lane streets only incure a penalty for two-way streets Then routability should be | highway | maxspeed | lanes | oneway | forw | backw | - | primary | 30 | 1 | yes | 34 km/h | | - | primary | 30 | 1 | -1 | | 34 km/h | + | primary | 30 | 1 | yes | 35 km/h | | + | primary | 30 | 1 | -1 | | 35 km/h | | primary | 30 | 1 | | 15 km/h | 15 km/h | - | primary | 30 | 2 | | 34 km/h | 34 km/h | + | primary | 30 | 2 | | 35 km/h | 35 km/h | diff --git a/features/car/service.feature b/features/car/service.feature index 22e62d6d7..b5f359748 100644 --- a/features/car/service.feature +++ b/features/car/service.feature @@ -4,6 +4,7 @@ Feature: Car - Surfaces Background: Given the profile "car" + @todo Scenario: Car - Surface should reduce speed Then routability should be | highway | service | forw | backw | diff --git a/features/car/speed.feature b/features/car/speed.feature index 08104af41..d5b9406f4 100644 --- a/features/car/speed.feature +++ b/features/car/speed.feature @@ -8,30 +8,30 @@ Feature: Car - speeds Scenario: Car - speed of various way types Then routability should be | highway | oneway | bothw | - | motorway | no | 82 km/h | - | motorway_link | no | 47 km/h | + | motorway | no | 82 km/h +- 1 | + | motorway_link | no | 47 km/h +- 1 | | trunk | no | 79 km/h +- 1 | | trunk_link | no | 43 km/h +- 1 | | primary | no | 63 km/h +- 1 | - | primary_link | no | 34 km/h | + | primary_link | no | 35 km/h +- 1 | | secondary | no | 54 km/h +- 1 | - | secondary_link | no | 31 km/h | - | tertiary | no | 43 km/h | - | tertiary_link | no | 26 km/h | - | unclassified | no | 31 km/h | - | residential | no | 31 km/h | - | living_street | no | 18 km/h | - | service | no | 23 km/h | + | secondary_link | no | 31 km/h +- 1 | + | tertiary | no | 43 km/h +- 1 | + | tertiary_link | no | 27 km/h +- 1 | + | unclassified | no | 31 km/h +- 1 | + | residential | no | 31 km/h +- 1 | + | living_street | no | 18 km/h +- 1 | + | service | no | 23 km/h +- 1 | # Alternating oneways have to take average waiting time into account. Scenario: Car - scaled speeds for oneway=alternating Then routability should be - | highway | oneway | junction | bothw | # | - | tertiary | | | 43 km/h | | - | tertiary | alternating | | 20 km/h +- 5 | | - | motorway | | | 82 km/h | implied oneway | - | motorway | alternating | | 30 km/h +- 5 | implied oneway | - | motorway | reversible | | | unroutable | - | primary | | roundabout | 63 km/h | implied oneway | - | primary | alternating | roundabout | 25 km/h +- 5 | implied oneway | - | primary | reversible | roundabout | | unroutable | + | highway | oneway | junction | forw | backw | # | + | tertiary | | | 43 km/h | 43 km/h | | + | tertiary | alternating | | 20 km/h +- 5 | 20 km/h +- 5 | | + | motorway | | | 82 km/h | | implied oneway | + | motorway | alternating | | 30 km/h +- 5 | | implied oneway | + | motorway | reversible | | | | unroutable | + | primary | | roundabout | 63 km/h | | implied oneway | + | primary | alternating | roundabout | 25 km/h +- 5 | | implied oneway | + | primary | reversible | roundabout | | | unroutable | diff --git a/features/car/surface.feature b/features/car/surface.feature index 5dd4ed66d..9f8196eb6 100644 --- a/features/car/surface.feature +++ b/features/car/surface.feature @@ -4,7 +4,7 @@ Feature: Car - Surfaces Background: Given the profile "car" - Scenario: Car - Routeability of tracktype tags + Scenario: Car - Routability of tracktype tags Then routability should be | highway | tracktype | bothw | | trunk | grade1 | x | @@ -26,8 +26,8 @@ Feature: Car - Surfaces | trunk | very_horrible | x | | trunk | impassable | | | trunk | nonsense | x | - - Scenario: Car - Routabiliy of surface tags + + Scenario: Car - Routability of surface tags Then routability should be | highway | surface | bothw | | trunk | asphalt | x | @@ -64,15 +64,15 @@ Feature: Car - Surfaces Scenario: Car - Surface should reduce speed Then routability should be | highway | oneway | surface | forw | backw | - | motorway | no | | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | asphalt | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | concrete | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | concrete:plates | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | concrete:lanes | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | paved | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | cement | 72 km/h +-1 | 72 km/h +-1 | - | motorway | no | compacted | 72 km/h +-1 | 72 km/h +-1 | - | motorway | no | fine_gravel | 72 km/h +-1 | 72 km/h +-1 | + | motorway | no | | 83 km/h | 83 km/h | + | motorway | no | asphalt | 84 km/h | 83 km/h +-1 | + | motorway | no | concrete | 83 km/h +-1 | 83 km/h +-1 | + | motorway | no | concrete:plates | 83 km/h +-1 | 83 km/h +-1 | + | motorway | no | concrete:lanes | 83 km/h +-1 | 83 km/h +-1 | + | motorway | no | paved | 83 km/h +-1 | 83 km/h +-1 | + | motorway | no | cement | 75 km/h +-1 | 75 km/h +-1 | + | motorway | no | compacted | 75 km/h +-1 | 75 km/h +-1 | + | motorway | no | fine_gravel | 75 km/h +-1 | 75 km/h +-1 | | motorway | no | paving_stones | 60 km/h +-1 | 60 km/h +-1 | | motorway | no | metal | 60 km/h +-1 | 60 km/h +-1 | | motorway | no | bricks | 60 km/h +-1 | 60 km/h +-1 | @@ -96,7 +96,7 @@ Feature: Car - Surfaces Scenario: Car - Tracktypes should reduce speed Then routability should be | highway | oneway | tracktype | forw | backw | - | motorway | no | | 80 km/h +-1 | 80 km/h +-1 | + | motorway | no | | 83 km/h | 83 km/h | | motorway | no | grade1 | 60 km/h +-1 | 60 km/h +-1 | | motorway | no | grade2 | 42 km/h +-1 | 42 km/h +-1 | | motorway | no | grade3 | 34 km/h +-1 | 34 km/h +-1 | @@ -106,8 +106,8 @@ Feature: Car - Surfaces Scenario: Car - Smoothness should reduce speed Then routability should be | highway | oneway | smoothness | forw | backw | - | motorway | no | | 80 km/h +-1 | 80 km/h +-1 | - | motorway | no | intermediate | 72 km/h +-1 | 72 km/h +-1 | + | motorway | no | | 83 km/h | 83 km/h | + | motorway | no | intermediate | 75 km/h | 75 km/h | | motorway | no | bad | 42 km/h +-1 | 42 km/h +-1 | | motorway | no | very_bad | 26 km/h +-1 | 26 km/h +-1 | | motorway | no | horrible | 18 km/h +-1 | 18 km/h +-1 | @@ -116,10 +116,10 @@ Feature: Car - Surfaces Scenario: Car - Combination of surface tags should use lowest speed Then routability should be | highway | oneway | tracktype | surface | smoothness | backw | forw | - | motorway | no | | | | 80 km/h | 80 km/h | + | motorway | no | | | | 83 km/h | 83 km/h | | service | no | grade1 | asphalt | excellent | 23 km/h | 23 km/h | - | motorway | no | grade5 | asphalt | excellent | 26 km/h | 26 km/h | - | motorway | no | grade1 | mud | excellent | 18 km/h | 18 km/h | + | motorway | no | grade5 | asphalt | excellent | 27 km/h | 27 km/h | + | motorway | no | grade1 | mud | excellent | 19 km/h | 19 km/h | | motorway | no | grade1 | asphalt | very_horrible | 15 km/h | 15 km/h | | service | no | grade5 | mud | very_horrible | 15 km/h | 15 km/h | diff --git a/features/foot/maxspeed.feature b/features/foot/maxspeed.feature index d4e358351..75c968d4f 100644 --- a/features/foot/maxspeed.feature +++ b/features/foot/maxspeed.feature @@ -6,14 +6,14 @@ Background: Use specific speeds Scenario: Foot - Ignore maxspeed Then routability should be - | highway | maxspeed | bothw | - | residential | | 145s ~10% | - | residential | 1 | 145s ~10% | - | residential | 100 | 145s ~10% | - | residential | 1 | 145s ~10% | - | residential | 1mph | 145s ~10% | - | residential | 1 mph | 145s ~10% | - | residential | 1unknown | 145s ~10% | - | residential | 1 unknown | 145s ~10% | - | residential | none | 145s ~10% | - | residential | signals | 145s ~10% | + | highway | maxspeed | bothw | + | residential | | 145 s ~10% | + | residential | 1 | 145 s ~10% | + | residential | 100 | 145 s ~10% | + | residential | 1 | 145 s ~10% | + | residential | 1mph | 145 s ~10% | + | residential | 1 mph | 145 s ~10% | + | residential | 1unknown | 145 s ~10% | + | residential | 1 unknown | 145 s ~10% | + | residential | none | 145 s ~10% | + | residential | signals | 145 s ~10% | diff --git a/features/foot/surface.feature b/features/foot/surface.feature index 9bcd80c78..b61bb6b1a 100644 --- a/features/foot/surface.feature +++ b/features/foot/surface.feature @@ -6,10 +6,10 @@ Feature: Foot - Surfaces Scenario: Foot - Slow surfaces Then routability should be - | highway | surface | bothw | - | footway | | 145s ~10% | - | footway | fine_gravel | 193s ~10% | - | footway | gravel | 193s ~10% | - | footway | pebblestone | 193s ~10% | - | footway | mud | 289s ~10% | - | footway | sand | 289s ~10% | + | highway | surface | bothw | + | footway | | 145 s ~10% | + | footway | fine_gravel | 193 s ~10% | + | footway | gravel | 193 s ~10% | + | footway | pebblestone | 193 s ~10% | + | footway | mud | 289 s ~10% | + | footway | sand | 289 s ~10% | diff --git a/features/step_definitions/routability.js b/features/step_definitions/routability.js index ea2a45e65..7aa93e1ff 100644 --- a/features/step_definitions/routability.js +++ b/features/step_definitions/routability.js @@ -15,12 +15,21 @@ module.exports = function () { this.reprocessAndLoadData((e) => { if (e) return callback(e); var testRow = (row, i, cb) => { - var outputRow = row; + var outputRow = Object.assign({}, row); testRoutabilityRow(i, (err, result) => { if (err) return cb(err); directions.filter(d => headers.has(d)).forEach((direction) => { - var want = this.shortcutsHash[row[direction]] || row[direction]; + var usingShortcut = false, + want = row[direction]; + // shortcuts are when a test has mapped a value like `foot` to + // a value like `5 km/h`, to represent the speed that one + // can travel by foot. we check for these and use the mapped to + // value for later comparison. + if (this.shortcutsHash[row[direction]]) { + want = this.shortcutsHash[row[direction]]; + usingShortcut = row[direction]; + } switch (true) { case '' === want: @@ -28,23 +37,39 @@ module.exports = function () { outputRow[direction] = result[direction].status ? result[direction].status.toString() : ''; break; - case /^\d+s/.test(want): + case /^\d+ s/.test(want): + // the result here can come back as a non-number value like + // `diff`, but we only want to apply the unit when it comes + // back as a number, for tableDiff's literal comparison + if (result[direction].time) { + outputRow[direction] = !isNaN(result[direction].time) ? + result[direction].time.toString()+' s' : + result[direction].time.toString() || ''; + } else { + outputRow[direction] = ''; + } break; case /^\d+ km\/h/.test(want): + if (result[direction].speed) { + outputRow[direction] = !isNaN(result[direction].speed) ? + result[direction].speed.toString()+' km/h' : + result[direction].speed.toString() || ''; + } else { + outputRow[direction] = ''; + } break; default: throw new Error(util.format('*** Unknown expectation format: %s', want)); } if (this.FuzzyMatch.match(outputRow[direction], want)) { - outputRow[direction] = row[direction]; + outputRow[direction] = [usingShortcut ? usingShortcut : row[direction]]; } }); cb(null, outputRow); }); }; - this.processRowsAndDiff(table, testRow, callback); }); }); @@ -102,6 +127,23 @@ module.exports = function () { var parseRes = (key, scb) => { if (result.forw[key] === result.backw[key]) { result.bothw[key] = result.forw[key]; + // FIXME these time and speed checks are stopgaps for precision errors in how + // OSRM returns inconsistent durations for rev/for requests along the same way + } else if (key === 'time') { + var range = [result.forw[key] - 1, result.forw[key] + 1]; + if (result.backw[key] >= range[0] && result.backw[key] <= range[1]) + // usually when we see minor differences here there's an integer + // duration value and one that comes back with a .9 or .1 rounding. + // This returns the integer one + result.bothw[key] = parseInt(result.forw[key]) === result.forw[key] ? result.forw[key] : result.backw[key]; + else + result.bothw[key] = 'diff'; + } else if (key === 'speed') { + if (Math.abs(result.backw.time - result.forw.time) < 0.2) { + result.bothw[key] = parseInt(result.forw[key]) === result.forw[key] ? result.forw[key] : result.backw[key]; + } else { + result.bothw[key] = 'diff'; + } } else { result.bothw[key] = 'diff'; }