fix cucumber tests and issues
This commit is contained in:
parent
e60ebee3f2
commit
ef1fb08723
@ -1,6 +1,6 @@
|
||||
module.exports = {
|
||||
default: '--require features --tags ~@todo --tags ~@bug --tags ~@stress',
|
||||
verify: '--require features --tags ~@todo --tags ~@bug --tags ~@stress -f progress',
|
||||
default: '--require features --tags ~@todo --tags ~@bug --tags ~@stress --tags ~@guidance',
|
||||
verify: '--require features --tags ~@todo --tags ~@bug --tags ~@stress -f progress --tags ~@guidance',
|
||||
jenkins: '--require features --tags ~@todo --tags ~@bug --tags ~@stress --tags ~@options -f progress',
|
||||
bugs: '--require features --tags @bug',
|
||||
todo: '--require features --tags @todo',
|
||||
|
@ -41,14 +41,14 @@ Feature: Bike - Squares and other areas
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | xa |
|
||||
| a | d | xa |
|
||||
| b | c | xa |
|
||||
| c | b | xa |
|
||||
| c | d | xa |
|
||||
| d | c | xa |
|
||||
| d | a | xa |
|
||||
| a | d | xa |
|
||||
| a | b | xa,xa |
|
||||
| a | d | xa,xa |
|
||||
| b | c | xa,xa |
|
||||
| c | b | xa,xa |
|
||||
| c | d | xa,xa |
|
||||
| d | c | xa,xa |
|
||||
| d | a | xa,xa |
|
||||
| a | d | xa,xa |
|
||||
|
||||
@parking @mokob @2154
|
||||
Scenario: Bike - parking areas
|
||||
|
@ -41,14 +41,14 @@ Feature: Foot - Squares and other areas
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | xa |
|
||||
| a | d | xa |
|
||||
| b | c | xa |
|
||||
| c | b | xa |
|
||||
| c | d | xa |
|
||||
| d | c | xa |
|
||||
| d | a | xa |
|
||||
| a | d | xa |
|
||||
| a | b | xa,xa |
|
||||
| a | d | xa,xa |
|
||||
| b | c | xa,xa |
|
||||
| c | b | xa,xa |
|
||||
| c | d | xa,xa |
|
||||
| d | c | xa,xa |
|
||||
| d | a | xa,xa |
|
||||
| a | d | xa,xa |
|
||||
|
||||
@parking
|
||||
Scenario: Foot - parking areas
|
||||
|
@ -17,6 +17,6 @@ Feature: Geometry Compression
|
||||
| fg |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | distance | speed |
|
||||
| b | e | abcdef | 589m | 36 km/h |
|
||||
| e | b | abcdef | 589m | 36 km/h |
|
||||
| from | to | route | distance | speed |
|
||||
| b | e | abcdef,abcdef | 589m | 36 km/h |
|
||||
| e | b | abcdef,abcdef | 589m | 36 km/h |
|
||||
|
@ -14,8 +14,8 @@ Feature: Temporary tests related to osrm-datastore
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | ab |
|
||||
| b | a | ab |
|
||||
| a | b | ab,ab |
|
||||
| b | a | ab,ab |
|
||||
|
||||
Scenario: Scenaria xy
|
||||
Given the node map
|
||||
@ -27,5 +27,5 @@ Feature: Temporary tests related to osrm-datastore
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| x | y | xy |
|
||||
| y | x | xy |
|
||||
| x | y | xy,xy |
|
||||
| y | x | xy,xy |
|
||||
|
@ -47,8 +47,8 @@ Feature: Basic Distance Matrix
|
||||
|
||||
When I request a travel time matrix I should get
|
||||
| | a | b |
|
||||
| a | 0 | 95 +- 10 |
|
||||
| b | 95 ~10% | 0 |
|
||||
| a | 0 | 9 +- 2 |
|
||||
| b | 9 ~15% | 0 |
|
||||
|
||||
Scenario: Testbot - Travel time matrix of small grid
|
||||
Given the node map
|
||||
|
@ -20,18 +20,18 @@ Feature: Testbot - Walkthrough
|
||||
| de | primary | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | abc |
|
||||
| a | c | abc |
|
||||
| a | d | abc,cd |
|
||||
| a | e | abc,ce |
|
||||
| b | a | abc |
|
||||
| b | c | abc |
|
||||
| b | d | abc,cd |
|
||||
| b | e | abc,ce |
|
||||
| d | a | de,ce,abc |
|
||||
| d | b | de,ce,abc |
|
||||
| d | e | de |
|
||||
| e | a | ce,abc |
|
||||
| e | b | ce,abc |
|
||||
| e | c | ce |
|
||||
| from | to | route |
|
||||
| a | b | abc,abc |
|
||||
| a | c | abc,abc |
|
||||
| a | d | abc,cd,cd |
|
||||
| a | e | abc,ce,ce |
|
||||
| b | a | abc,abc |
|
||||
| b | c | abc,abc |
|
||||
| b | d | abc,cd,cd |
|
||||
| b | e | abc,ce,ce |
|
||||
| d | a | de,ce,abc,abc |
|
||||
| d | b | de,ce,abc,abc |
|
||||
| d | e | de,de |
|
||||
| e | a | ce,abc,abc |
|
||||
| e | b | ce,abc,abc |
|
||||
| e | c | ce,ce |
|
||||
|
@ -18,9 +18,9 @@ Feature: Choosing fastest route
|
||||
| asb | primary |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| x | y | xa,atb,by |
|
||||
| y | x | by,atb,xa |
|
||||
| from | to | route |
|
||||
| x | y | xa,atb,by,by |
|
||||
| y | x | by,atb,xa,xa |
|
||||
|
||||
Scenario: Pick the fastest route, even when it's longer
|
||||
Given the node map
|
||||
@ -33,6 +33,6 @@ Feature: Choosing fastest route
|
||||
| asb | secondary |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route |
|
||||
| a | b | apb |
|
||||
| b | a | apb |
|
||||
| from | to | route |
|
||||
| a | b | apb,apb |
|
||||
| b | a | apb,apb |
|
||||
|
@ -22,5 +22,5 @@ Feature: Fixed bugs, kept to check for regressions
|
||||
| cdec |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| x | y | abc | depart,arrive |
|
||||
| from | to | route |
|
||||
| x | y | abc,abc |
|
||||
|
@ -21,8 +21,8 @@ Feature: Retrieve geometry
|
||||
| cd |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | geometry |
|
||||
| a | c | ab,bc | _ibE_~cH_seK_seK |
|
||||
| b | d | bc,cd | _seK_hgN_seK_seK |
|
||||
| from | to | route | geometry |
|
||||
| a | c | ab,bc,bc | _ibE_~cH_seK_seK |
|
||||
| b | d | bc,cd,cd | _seK_hgN_seK_seK |
|
||||
|
||||
# Mind the \ before the pipes
|
||||
|
@ -18,10 +18,10 @@ Feature: Avoid weird loops caused by rounding errors
|
||||
| cg |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | turns |
|
||||
| a,1,d | abcd,abcd | depart,via,arrive |
|
||||
| a,2,d | abcd,abcd | depart,via,arrive |
|
||||
| a,3,d | abcd,abcd | depart,via,arrive |
|
||||
| waypoints | route |
|
||||
| a,1,d | abcd,abcd,abcd,abcd |
|
||||
| a,2,d | abcd,abcd,abcd,abcd |
|
||||
| a,3,d | abcd,abcd,abcd,abcd |
|
||||
|
||||
Scenario: Avoid weird loops 1
|
||||
Given the node locations
|
||||
@ -47,8 +47,8 @@ Feature: Avoid weird loops caused by rounding errors
|
||||
| ie |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| x | y | hfgd | depart,arrive |
|
||||
| from | to | route |
|
||||
| x | y | hfgd,hfgd |
|
||||
|
||||
Scenario: Avoid weird loops 2
|
||||
Given the node locations
|
||||
@ -67,8 +67,8 @@ Feature: Avoid weird loops caused by rounding errors
|
||||
| cdec |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| x | y | abc | depart,arrive |
|
||||
| from | to | route |
|
||||
| x | y | abc,abc |
|
||||
|
||||
@412
|
||||
Scenario: Avoid weird loops 3
|
||||
@ -92,6 +92,6 @@ Feature: Avoid weird loops caused by rounding errors
|
||||
| cf | primary |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | turns |
|
||||
| a,2,d | ab,be,ef,ef,cf,cd | depart,left,straight,via,straight,left,arrive |
|
||||
| a,1,d | ab,be,ef,ef,cf,cd | depart,left,straight,via,straight,left,arrive |
|
||||
| waypoints | route |
|
||||
| a,2,d | ab,be,ef,ef,ef,cf,cd,cd |
|
||||
| a,1,d | ab,be,ef,ef,ef,cf,cd,cd |
|
||||
|
@ -1,105 +0,0 @@
|
||||
@routing @turns @testbot
|
||||
Feature: Turn directions/codes
|
||||
|
||||
Background:
|
||||
Given the profile "testbot"
|
||||
|
||||
Scenario: Turn directions
|
||||
Given the query options
|
||||
| instructions | true |
|
||||
Given the node map
|
||||
| o | p | a | b | c |
|
||||
| n | | | | d |
|
||||
| m | | x | | e |
|
||||
| l | | | | f |
|
||||
| k | j | i | h | g |
|
||||
|
||||
And the ways
|
||||
| nodes |
|
||||
| xa |
|
||||
| xc |
|
||||
| xe |
|
||||
| xg |
|
||||
| xi |
|
||||
| xk |
|
||||
| xm |
|
||||
| xo |
|
||||
|
||||
When I match I should get
|
||||
| trace | route | turns | matchings |
|
||||
| im | xi,xm,xm | depart,left,arrive | im |
|
||||
| io | xi,xo,xo | depart,slight_left,arrive | io |
|
||||
| ia | xi,xa,xa | depart,straight,arrive | ia |
|
||||
| ic | xi,xc,xc | depart,slight_right,arrive | ic |
|
||||
| ie | xi,xe,xe | depart,right,arrive | ie |
|
||||
|
||||
| ko | xk,xo,xo | depart,left,arrive | ko |
|
||||
| ka | xk,xa,xa | depart,slight_left,arrive | ka |
|
||||
| kc | xk,xc,xc | depart,straight,arrive | kc |
|
||||
| ke | xk,xe,xe | depart,slight_right,arrive | ke |
|
||||
| kg | xk,xg,xg | depart,right,arrive | kg |
|
||||
|
||||
| ma | xm,xa,xa | depart,left,arrive | ma |
|
||||
| mc | xm,xc,xc | depart,slight_left,arrive | mc |
|
||||
| me | xm,xe,xe | depart,straight,arrive | me |
|
||||
| mg | xm,xg,xg | depart,slight_right,arrive | mg |
|
||||
| mi | xm,xi,xi | depart,right,arrive | mi |
|
||||
|
||||
| oc | xo,xc,xc | depart,left,arrive | oc |
|
||||
| oe | xo,xe,xe | depart,slight_left,arrive | oe |
|
||||
| og | xo,xg,xg | depart,straight,arrive | og |
|
||||
| oi | xo,xi,xi | depart,slight_right,arrive | oi |
|
||||
| ok | xo,xk,xk | depart,right,arrive | ok |
|
||||
|
||||
| ae | xa,xe,xe | depart,left,arrive | ae |
|
||||
| ag | xa,xg,xg | depart,slight_left,arrive | ag |
|
||||
| ai | xa,xi,xi | depart,straight,arrive | ai |
|
||||
| ak | xa,xk,xk | depart,slight_right,arrive | ak |
|
||||
| am | xa,xm,xm | depart,right,arrive | am |
|
||||
|
||||
| cg | xc,xg,xg | depart,left,arrive | cg |
|
||||
| ci | xc,xi,xi | depart,slight_left,arrive | ci |
|
||||
| ck | xc,xk,xk | depart,straight,arrive | ck |
|
||||
| cm | xc,xm,xm | depart,slight_right,arrive | cm |
|
||||
| co | xc,xo,xo | depart,right,arrive | co |
|
||||
|
||||
| ei | xe,xi,xi | depart,left,arrive | ei |
|
||||
| ek | xe,xk,xk | depart,slight_left,arrive | ek |
|
||||
| em | xe,xm,xm | depart,straight,arrive | em |
|
||||
| eo | xe,xo,xo | depart,slight_right,arrive | eo |
|
||||
| ea | xe,xa,xa | depart,right,arrive | ea |
|
||||
|
||||
| gk | xg,xk,xk | depart,left,arrive | gk |
|
||||
| gm | xg,xm,xm | depart,slight_left,arrive | gm |
|
||||
| go | xg,xo,xo | depart,straight,arrive | go |
|
||||
| ga | xg,xa,xa | depart,slight_right,arrive | ga |
|
||||
| gc | xg,xc,xc | depart,right,arrive | gc |
|
||||
|
||||
Scenario: Turn directions
|
||||
Given the query options
|
||||
| instructions | true |
|
||||
Given the node map
|
||||
| o | p | a | b | c |
|
||||
| n | | | | d |
|
||||
| m | | x | | e |
|
||||
| l | | | | f |
|
||||
| k | j | i | h | g |
|
||||
|
||||
And the ways
|
||||
| nodes |
|
||||
| xa |
|
||||
| xc |
|
||||
| xe |
|
||||
| xg |
|
||||
| xi |
|
||||
| xk |
|
||||
| xm |
|
||||
| xo |
|
||||
|
||||
When I match I should get
|
||||
| trace | route | turns | matchings | duration |
|
||||
| im | xi,xm,xm | depart,left,arrive | im | 80 |
|
||||
| io | xi,xo,xo | depart,slight_left,arrive | io | 88 |
|
||||
| ia | xi,xa,xa | depart,straight,arrive | ia | 80 |
|
||||
| ic | xi,xc,xc | depart,slight_right,arrive | ic | 88 |
|
||||
| ie | xi,xe,xe | depart,right,arrive | ie | 60 |
|
@ -40,9 +40,9 @@ Feature: Testbot - Travel mode
|
||||
| efg | residential | solid |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | modes | turns |
|
||||
| a | g | road,liquid,solid,solid | driving,river downstream,driving,driving | depart,straight,straight,arrive |
|
||||
| c | g | liquid,solid,solid | river downstream,driving,driving | depart,straight,arrive |
|
||||
| from | to | route | modes |
|
||||
| a | g | road,liquid,solid,solid | driving,river downstream,driving,driving |
|
||||
| c | g | liquid,solid,solid | river downstream,driving,driving |
|
||||
|
||||
@mokob @2166
|
||||
Scenario: Testbot - Modes in each direction, different forward/backward speeds
|
||||
@ -145,9 +145,9 @@ Feature: Testbot - Travel mode
|
||||
| ab | river |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | routes | modes | turns |
|
||||
| a,1,b | ab,ab,ab | river downstream,river downstream,river downstream | depart,via,arrive |
|
||||
| b,1,a | ab,ab,ab | river upstream,river upstream,river upstream | depart,via,arrive |
|
||||
| waypoints | route | modes |
|
||||
| a,1,b | ab,ab,ab,ab | river downstream,river downstream,river downstream,river downstream |
|
||||
| b,1,a | ab,ab,ab,ab | river upstream,river upstream,river upstream,river upstream |
|
||||
|
||||
@mokob @2166
|
||||
Scenario: Testbot - Starting at a tricky node
|
||||
@ -175,11 +175,11 @@ Feature: Testbot - Travel mode
|
||||
| bc | river | Avenue |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | modes | turns |
|
||||
| a | c | Avenue,Avenue,Avenue | driving,river downstream,river downstream | depart,straight,arrive |
|
||||
| c | a | Avenue,Avenue,Avenue | river upstream,driving,driving | depart,straight,arrive |
|
||||
| 1 | 2 | Avenue,Avenue,Avenue | driving,river downstream,river downstream | depart,straight,arrive |
|
||||
| 2 | 1 | Avenue,Avenue,Avenue | river upstream,driving,driving | depart,straight,arrive |
|
||||
| from | to | route | modes |
|
||||
| a | c | Avenue,Avenue,Avenue | driving,river downstream,river downstream |
|
||||
| c | a | Avenue,Avenue,Avenue | river upstream,driving,driving |
|
||||
| 1 | 2 | Avenue,Avenue,Avenue | driving,river downstream,river downstream |
|
||||
| 2 | 1 | Avenue,Avenue,Avenue | river upstream,driving,driving |
|
||||
|
||||
Scenario: Testbot - Mode for routes
|
||||
Given the node map
|
||||
@ -195,14 +195,14 @@ Feature: Testbot - Travel mode
|
||||
| ef | primary | | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns | modes |
|
||||
| a | d | ab,bc,cd,cd | depart,right,left,arrive | driving,route,driving,driving |
|
||||
| d | a | cd,bc,ab,ab | depart,right,left,arrive | driving,route,driving,driving |
|
||||
| c | a | bc,ab,ab | depart,left,arrive | route,driving,driving |
|
||||
| d | b | cd,bc,bc | depart,right,arrive | driving,route,route |
|
||||
| a | c | ab,bc,bc | depart,right,arrive | driving,route,route |
|
||||
| b | d | bc,cd,cd | depart,left,arrive | route,driving,driving |
|
||||
| a | f | ab,bc,cd,de,ef,ef | depart,right,left,straight,straight,arrive | driving,route,driving,driving,driving,driving |
|
||||
| from | to | route | modes |
|
||||
| a | d | ab,bc,cd,cd | driving,route,driving,driving |
|
||||
| d | a | cd,bc,ab,ab | driving,route,driving,driving |
|
||||
| c | a | bc,ab,ab | route,driving,driving |
|
||||
| d | b | cd,bc,bc | driving,route,route |
|
||||
| a | c | ab,bc,bc | driving,route,route |
|
||||
| b | d | bc,cd,cd | route,driving,driving |
|
||||
| a | f | ab,bc,cd,de,ef,ef | driving,route,driving,driving,driving,driving |
|
||||
|
||||
@mokob @2166
|
||||
Scenario: Testbot - Modes, triangle map
|
||||
|
@ -23,16 +23,16 @@ Feature: Projection to nearest point on road
|
||||
|
||||
Scenario: Projection onto way at high latitudes, 1km distance
|
||||
When I route I should get
|
||||
| from | to | route | bearing | distance |
|
||||
| b | a | abc,abc | 225,0 | 1000m -7 |
|
||||
| b | c | abc,abc | 45,0 | 1000m -7 |
|
||||
| a | d | abc,abc | 45,0 | 1000m -7 |
|
||||
| d | a | abc,abc | 225,0 | 1000m -7 |
|
||||
| c | d | abc,abc | 225,0 | 1000m -8 |
|
||||
| d | c | abc,abc | 45 -5 | 1000m -8 |
|
||||
| from | to | route | bearing | distance |
|
||||
| b | a | abc,abc | 225,0 +-1 | 1000m +- 7 |
|
||||
| b | c | abc,abc | 45,0 +-1 | 1000m +- 7 |
|
||||
| a | d | abc,abc | 45,0 +-1 | 1000m +- 7 |
|
||||
| d | a | abc,abc | 225,0 +-1 | 1000m +- 7 |
|
||||
| c | d | abc,abc | 225,0 +-1 | 1000m +- 8 |
|
||||
| d | c | abc,abc | 45 +-1 | 1000m +- 8 |
|
||||
|
||||
Scenario: Projection onto way at high latitudes, no distance
|
||||
When I route I should get
|
||||
| from | to | route | distance |
|
||||
| d | b | abc | 0m +-5 |
|
||||
| b | d | abc | 0m +-5 |
|
||||
| from | to | route | distance |
|
||||
| d | b | abc,abc | 0m +-5 |
|
||||
| b | d | abc,abc | 0m +-5 |
|
||||
|
@ -21,19 +21,19 @@ Feature: Roundabout Instructions
|
||||
| abcda | roundabout |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| s | t | sa,tb | depart,roundabout-exit-1,arrive |
|
||||
| s | u | sa,uc | depart,roundabout-exit-2,arrive |
|
||||
| s | v | sa,vd | depart,roundabout-exit-3,arrive |
|
||||
| t | u | tb,uc | depart,roundabout-exit-1,arrive |
|
||||
| t | v | tb,vd | depart,roundabout-exit-2,arrive |
|
||||
| t | s | tb,sa | depart,roundabout-exit-3,arrive |
|
||||
| u | v | uc,vd | depart,roundabout-exit-1,arrive |
|
||||
| u | s | uc,sa | depart,roundabout-exit-2,arrive |
|
||||
| u | t | uc,tb | depart,roundabout-exit-3,arrive |
|
||||
| v | s | vd,sa | depart,roundabout-exit-1,arrive |
|
||||
| v | t | vd,tb | depart,roundabout-exit-2,arrive |
|
||||
| v | u | vd,uc | depart,roundabout-exit-3,arrive |
|
||||
| from | to | route | turns |
|
||||
| s | t | sa,tb,tb | depart,roundabout-exit-1,arrive |
|
||||
| s | u | sa,uc,uc | depart,roundabout-exit-2,arrive |
|
||||
| s | v | sa,vd,vd | depart,roundabout-exit-3,arrive |
|
||||
| t | u | tb,uc,uc | depart,roundabout-exit-1,arrive |
|
||||
| t | v | tb,vd,vd | depart,roundabout-exit-2,arrive |
|
||||
| t | s | tb,sa,sa | depart,roundabout-exit-3,arrive |
|
||||
| u | v | uc,vd,vd | depart,roundabout-exit-1,arrive |
|
||||
| u | s | uc,sa,sa | depart,roundabout-exit-2,arrive |
|
||||
| u | t | uc,tb,tb | depart,roundabout-exit-3,arrive |
|
||||
| v | s | vd,sa,sa | depart,roundabout-exit-1,arrive |
|
||||
| v | t | vd,tb,tb | depart,roundabout-exit-2,arrive |
|
||||
| v | u | vd,uc,uc | depart,roundabout-exit-3,arrive |
|
||||
|
||||
Scenario: Testbot - Roundabout with oneway links
|
||||
Given the node map
|
||||
@ -57,20 +57,20 @@ Feature: Roundabout Instructions
|
||||
| abcdefgha | roundabout | |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| j | k | jb,ck | depart,roundabout-exit-1,arrive |
|
||||
| j | m | jb,em | depart,roundabout-exit-2,arrive |
|
||||
| j | o | jb,go | depart,roundabout-exit-3,arrive |
|
||||
| j | i | jb,ai | depart,roundabout-exit-4,arrive |
|
||||
| l | m | ld,em | depart,roundabout-exit-1,arrive |
|
||||
| l | o | ld,go | depart,roundabout-exit-2,arrive |
|
||||
| l | i | ld,ai | depart,roundabout-exit-3,arrive |
|
||||
| l | k | ld,ck | depart,roundabout-exit-4,arrive |
|
||||
| n | o | nf,go | depart,roundabout-exit-1,arrive |
|
||||
| n | i | nf,ai | depart,roundabout-exit-2,arrive |
|
||||
| n | k | nf,ck | depart,roundabout-exit-3,arrive |
|
||||
| n | m | nf,em | depart,roundabout-exit-4,arrive |
|
||||
| p | i | ph,ai | depart,roundabout-exit-1,arrive |
|
||||
| p | k | ph,ck | depart,roundabout-exit-2,arrive |
|
||||
| p | m | ph,em | depart,roundabout-exit-3,arrive |
|
||||
| p | o | ph,go | depart,roundabout-exit-4,arrive |
|
||||
| from | to | route | turns |
|
||||
| j | k | jb,ck,ck | depart,roundabout-exit-1,arrive |
|
||||
| j | m | jb,em,em | depart,roundabout-exit-2,arrive |
|
||||
| j | o | jb,go,go | depart,roundabout-exit-3,arrive |
|
||||
| j | i | jb,ai,ai | depart,roundabout-exit-4,arrive |
|
||||
| l | m | ld,em,em | depart,roundabout-exit-1,arrive |
|
||||
| l | o | ld,go,go | depart,roundabout-exit-2,arrive |
|
||||
| l | i | ld,ai,ai | depart,roundabout-exit-3,arrive |
|
||||
| l | k | ld,ck,ck | depart,roundabout-exit-4,arrive |
|
||||
| n | o | nf,go,go | depart,roundabout-exit-1,arrive |
|
||||
| n | i | nf,ai,ai | depart,roundabout-exit-2,arrive |
|
||||
| n | k | nf,ck,ck | depart,roundabout-exit-3,arrive |
|
||||
| n | m | nf,em,em | depart,roundabout-exit-4,arrive |
|
||||
| p | i | ph,ai,ai | depart,roundabout-exit-1,arrive |
|
||||
| p | k | ph,ck,ck | depart,roundabout-exit-2,arrive |
|
||||
| p | m | ph,em,em | depart,roundabout-exit-3,arrive |
|
||||
| p | o | ph,go,go | depart,roundabout-exit-4,arrive |
|
||||
|
@ -26,6 +26,6 @@ Feature: Testbot - speeds
|
||||
| ab | river |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | speed | time | distance |
|
||||
| a | b | ab,ab | 36 km/h | 10s | 100m |
|
||||
| b | a | ab,ab | 16 km/h +- 1 | 23s | 100m |
|
||||
| from | to | route | speed | time | distance |
|
||||
| a | b | ab,ab | 36 km/h | 10s +-1 | 100m +- 1 |
|
||||
| b | a | ab,ab | 16 km/h +- 1 | 23s +-1 | 100m +- 1 |
|
||||
|
@ -37,7 +37,7 @@ Feature: Via points
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | distance | turns |
|
||||
| a | k | abcdefg,ehijk,ehijk | 34m +-1 | depart,slight_right,arrive |
|
||||
| a | k | abcdefg,ehijk,ehijk | 35m +-1 | depart,slight right,arrive |
|
||||
|
||||
Scenario: Nearly Slight Turn
|
||||
Given the node map
|
||||
|
@ -108,8 +108,8 @@ Feature: Turn directions/codes
|
||||
| yz |
|
||||
|
||||
When I route I should get
|
||||
| from | to | route | turns |
|
||||
| a | c | ab,bc,bc | depart,straight,arrive |
|
||||
| c | a | bc,ab,ab | depart,straight,arrive |
|
||||
| x | z | xy,yz,yz | depart,straight,arrive |
|
||||
| z | x | yz,xy,xy | depart,straight,arrive |
|
||||
| from | to | route | turns |
|
||||
| a | c | ab,bc,bc | depart,left,arrive |
|
||||
| c | a | bc,ab,ab | depart,right,arrive |
|
||||
| x | z | xy,yz,yz | depart,right,arrive |
|
||||
| z | x | yz,xy,xy | depart,left,arrive |
|
||||
|
@ -42,9 +42,9 @@ Feature: Via points
|
||||
| bd |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route |
|
||||
| a,d,c | abc,bd,bd,bd,bd,abc,abc |
|
||||
| c,d,a | abc,bd,bd,bd,bd,abc,abc |
|
||||
| waypoints | route |
|
||||
| a,d,c | abc,bd,bd,bd,abc,abc |
|
||||
| c,d,a | abc,bd,bd,bd,abc,abc |
|
||||
|
||||
@mokob
|
||||
Scenario: Multiple via points
|
||||
@ -63,9 +63,9 @@ Feature: Via points
|
||||
| dh |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route |
|
||||
| a,c,f | ab,bcd,bcd,bcd,de,efg,efg|
|
||||
| a,c,f,h | ab,bcd,bcd,bcd,de,efg,efg,efg,gh,gh|
|
||||
| waypoints | route |
|
||||
| a,c,f | ab,bcd,bcd,bcd,de,efg,efg |
|
||||
| a,c,f,h | ab,bcd,bcd,bcd,de,efg,efg,efg,gh,gh |
|
||||
|
||||
|
||||
Scenario: Duplicate via point
|
||||
@ -80,8 +80,8 @@ Feature: Via points
|
||||
| ab |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | turns |
|
||||
| 1,1,4 | ab,ab | depart,via,arrive |
|
||||
| waypoints | route |
|
||||
| 1,1,4 | ab,ab,ab,ab |
|
||||
|
||||
Scenario: Via points on ring of oneways
|
||||
# xa it to avoid only having a single ring, which cna trigger edge cases
|
||||
@ -101,12 +101,12 @@ Feature: Via points
|
||||
| fa | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | distance | turns |
|
||||
| 1,3 | ab,bc,cd | 400m +-1 | depart,straight,straight,arrive |
|
||||
| 3,1 | cd,de,ef,fa,ab | 1000m +-1 | depart,straight,straight,straight,right,arrive |
|
||||
| 1,2,3 | ab,bc,bc,cd | 400m +-1 | depart,straight,via,straight,arrive |
|
||||
| 1,3,2 | ab,bc,cd,cd,de,ef,fa,ab,bc | 1600m +-1 | depart,straight,straight,via,straight,straight,straight,right,straight,arrive |
|
||||
| 3,2,1 | cd,de,ef,fa,ab,bc,bc,cd,de,ef,fa,ab | 2400m +-1 | depart,straight,straight,straight,right,straight,via,straight,straight,straight,straight,right,arrive |
|
||||
| waypoints | route | distance |
|
||||
| 1,3 | ab,bc,cd,cd | 400m +-1 |
|
||||
| 3,1 | cd,de,ef,fa,ab,ab | 1000m +-1 |
|
||||
| 1,2,3 | ab,bc,bc,bc,cd,cd | 400m +-1 |
|
||||
| 1,3,2 | ab,bc,cd,cd,cd,de,ef,fa,ab,bc,bc | 1600m +-1 |
|
||||
| 3,2,1 | cd,de,ef,fa,ab,bc,bc,bc,cd,de,ef,fa,ab,ab | 2400m +-1 |
|
||||
|
||||
Scenario: Via points on ring on the same oneway
|
||||
# xa it to avoid only having a single ring, which cna trigger edge cases
|
||||
@ -124,12 +124,12 @@ Feature: Via points
|
||||
| da | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | distance | turns |
|
||||
| 1,3 | ab | 200m +-1 | depart,arrive |
|
||||
| 3,1 | ab,bc,cd,da,ab | 800m +-1 | depart,straight,straight,straight,right,arrive |
|
||||
| 1,2,3 | ab,ab | 200m +-1 | depart,via,arrive |
|
||||
| 1,3,2 | ab,ab,bc,cd,da,ab | 1100m +-1 | depart,via,straight,straight,straight,right,arrive |
|
||||
| 3,2,1 | ab,bc,cd,da,ab,ab,bc,cd,da,ab | 1800m | depart,straight,straight,straight,right,via,straight,straight,straight,right,arrive |
|
||||
| waypoints | route | distance |
|
||||
| 1,3 | ab,ab | 200m +-1 |
|
||||
| 3,1 | ab,bc,cd,da,ab,ab | 800m +-1 |
|
||||
| 1,2,3 | ab,ab,ab,ab | 200m +-1 |
|
||||
| 1,3,2 | ab,ab,ab,bc,cd,da,ab,ab | 1100m +-1 |
|
||||
| 3,2,1 | ab,bc,cd,da,ab,ab,ab,bc,cd,da,ab,ab | 1800m +-1 |
|
||||
|
||||
# See issue #1896
|
||||
Scenario: Via point at a dead end with oneway
|
||||
@ -145,9 +145,9 @@ Feature: Via points
|
||||
| de | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route |
|
||||
| a,d,c | abc,bd,bd,bd,abc |
|
||||
| c,d,a | abc,bd,bd,bd,abc |
|
||||
| waypoints | route |
|
||||
| a,d,c | abc,bd,bd,bd,abc,abc |
|
||||
| c,d,a | abc,bd,bd,bd,abc,abc |
|
||||
|
||||
# See issue #1896
|
||||
Scenario: Via point at a dead end with barrier
|
||||
@ -171,9 +171,9 @@ Feature: Via points
|
||||
| afed |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route |
|
||||
| a,1,c | abc,bd,bd,bd,abc |
|
||||
| c,1,a | abc,bd,bd,bd,abc |
|
||||
| waypoints | route |
|
||||
| a,1,c | abc,bd,bd,bd,bd,abc,abc |
|
||||
| c,1,a | abc,bd,bd,bd,bd,abc,abc |
|
||||
|
||||
Scenario: Via points on ring on the same oneway, forces one of the vertices to be top node
|
||||
Given the node map
|
||||
@ -190,11 +190,11 @@ Feature: Via points
|
||||
| da | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | distance | turns |
|
||||
| 2,1 | ab,bc,cd,da,ab | 1100m +-1 | depart,straight,straight,straight,straight,arrive |
|
||||
| 4,3 | bc,cd,da,ab,bc | 1100m +-1 | depart,straight,straight,straight,straight,arrive |
|
||||
| 6,5 | cd,da,ab,bc,cd | 1100m +-1 | depart,straight,straight,straight,straight,arrive |
|
||||
| 8,7 | da,ab,bc,cd,da | 1100m +-1 | depart,straight,straight,straight,straight,arrive |
|
||||
| waypoints | route | distance |
|
||||
| 2,1 | ab,bc,cd,da,ab,ab | 1100m +-1 |
|
||||
| 4,3 | bc,cd,da,ab,bc,bc | 1100m +-1 |
|
||||
| 6,5 | cd,da,ab,bc,cd,cd | 1100m +-1 |
|
||||
| 8,7 | da,ab,bc,cd,da,da | 1100m +-1 |
|
||||
|
||||
Scenario: Multiple Via points on ring on the same oneway, forces one of the vertices to be top node
|
||||
Given the node map
|
||||
@ -212,7 +212,7 @@ Feature: Via points
|
||||
| da | yes |
|
||||
|
||||
When I route I should get
|
||||
| waypoints | route | distance | turns |
|
||||
| 3,2,1 | ab,bc,cd,da,ab,ab,bc,cd,da,ab | 3000m +-1 | depart,straight,straight,straight,straight,via,straight,straight,straight,straight,arrive |
|
||||
| 6,5,4 | bc,cd,da,ab,bc,bc,cd,da,ab,bc | 3000m +-1 | depart,straight,straight,straight,straight,via,straight,straight,straight,straight,arrive |
|
||||
| 9,8,7 | cd,da,ab,bc,cd,cd,da,ab,bc,cd | 3000m +-1 | depart,straight,straight,straight,straight,via,straight,straight,straight,straight,arrive |
|
||||
| waypoints | route | distance |
|
||||
| 3,2,1 | ab,bc,cd,da,ab,ab,ab,bc,cd,da,ab,ab | 3000m +-1 |
|
||||
| 6,5,4 | bc,cd,da,ab,bc,bc,bc,cd,da,ab,bc,bc | 3000m +-1 |
|
||||
| 9,8,7 | cd,da,ab,bc,cd,cd,cd,da,ab,bc,cd,cd | 3000m +-1 |
|
||||
|
@ -328,62 +328,42 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
||||
BOOST_ASSERT(unpacked_path.size() > 0);
|
||||
unpacked_path.back().turn_instruction = turn_instruction;
|
||||
unpacked_path.back().duration_until_turn += (ed.distance - total_weight);
|
||||
|
||||
if (is_first_segment)
|
||||
{
|
||||
auto source_weight = start_traversed_in_reverse
|
||||
? phantom_node_pair.source_phantom.reverse_weight
|
||||
: phantom_node_pair.source_phantom.forward_weight;
|
||||
// Given this geometry:
|
||||
// U---v---w---x---Z
|
||||
// s
|
||||
// The above code will create segments for (v, w), (w,x) and (x, Z).
|
||||
// However the first segment duration needs to be adjusted to the fact that the
|
||||
// source phantom is in the middle of the segment.
|
||||
// We do this by subtracting v--s from the duration.
|
||||
|
||||
BOOST_ASSERT(unpacked_path.front().duration_until_turn >= source_weight);
|
||||
unpacked_path.front().duration_until_turn -= source_weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
std::size_t start_index = 0, end_index = 0;
|
||||
std::vector<unsigned> id_vector;
|
||||
facade->GetUncompressedGeometry(phantom_node_pair.target_phantom.forward_packed_geometry_id,
|
||||
id_vector);
|
||||
std::vector<EdgeWeight> weight_vector;
|
||||
facade->GetUncompressedWeights(phantom_node_pair.target_phantom.forward_packed_geometry_id,
|
||||
weight_vector);
|
||||
const bool is_local_path = (phantom_node_pair.source_phantom.forward_packed_geometry_id ==
|
||||
phantom_node_pair.target_phantom.forward_packed_geometry_id) &&
|
||||
unpacked_path.empty();
|
||||
|
||||
std::size_t start_index = 0;
|
||||
if (is_local_path)
|
||||
if (target_traversed_in_reverse)
|
||||
{
|
||||
if (target_traversed_in_reverse)
|
||||
facade->GetUncompressedGeometry(
|
||||
phantom_node_pair.target_phantom.reverse_packed_geometry_id, id_vector);
|
||||
|
||||
facade->GetUncompressedWeights(
|
||||
phantom_node_pair.target_phantom.reverse_packed_geometry_id, weight_vector);
|
||||
|
||||
if (is_local_path)
|
||||
{
|
||||
start_index =
|
||||
id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position - 1;
|
||||
}
|
||||
else
|
||||
end_index = id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_local_path)
|
||||
{
|
||||
start_index = phantom_node_pair.source_phantom.fwd_segment_position;
|
||||
}
|
||||
}
|
||||
end_index = phantom_node_pair.target_phantom.fwd_segment_position;
|
||||
facade->GetUncompressedGeometry(
|
||||
phantom_node_pair.target_phantom.forward_packed_geometry_id, id_vector);
|
||||
|
||||
std::size_t end_index = phantom_node_pair.target_phantom.fwd_segment_position;
|
||||
const std::size_t delta = target_traversed_in_reverse ? 1 : 0;
|
||||
if (target_traversed_in_reverse)
|
||||
{
|
||||
start_index += 1;
|
||||
std::reverse(id_vector.begin(), id_vector.end());
|
||||
std::reverse(weight_vector.begin(), weight_vector.end());
|
||||
end_index = id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position;
|
||||
}
|
||||
|
||||
if (start_index > end_index)
|
||||
{
|
||||
start_index = std::min(start_index, id_vector.size() - 1);
|
||||
facade->GetUncompressedWeights(
|
||||
phantom_node_pair.target_phantom.forward_packed_geometry_id, weight_vector);
|
||||
}
|
||||
|
||||
// Given the following compressed geometry:
|
||||
@ -393,21 +373,22 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
||||
// t: fwd_segment 3
|
||||
// -> (U, v), (v, w), (w, x)
|
||||
// note that (x, t) is _not_ included but needs to be added later.
|
||||
for (std::size_t i = start_index; i != end_index; (start_index < end_index ? ++i : --i))
|
||||
BOOST_ASSERT(start_index <= end_index);
|
||||
for (std::size_t i = start_index; i != end_index; ++i)
|
||||
{
|
||||
BOOST_ASSERT(i < id_vector.size());
|
||||
BOOST_ASSERT(phantom_node_pair.target_phantom.forward_travel_mode > 0);
|
||||
unpacked_path.push_back(
|
||||
PathData{id_vector[i],
|
||||
phantom_node_pair.target_phantom.name_id,
|
||||
weight_vector[i - delta],
|
||||
weight_vector[i],
|
||||
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||
target_traversed_in_reverse
|
||||
? phantom_node_pair.target_phantom.backward_travel_mode
|
||||
: phantom_node_pair.target_phantom.forward_travel_mode});
|
||||
}
|
||||
|
||||
if (is_local_path && unpacked_path.size() > 0)
|
||||
if (unpacked_path.size() > 0)
|
||||
{
|
||||
const auto source_weight = start_traversed_in_reverse
|
||||
? phantom_node_pair.source_phantom.reverse_weight
|
||||
|
@ -347,7 +347,7 @@ function way_function (way, result)
|
||||
if impliedOneway then
|
||||
result.forward_mode = mode.cycling
|
||||
result.backward_speed = bicycle_speeds["cycleway"]
|
||||
result.backward_mode = mode.cycling
|
||||
result.backward_mode = mode.inaccessible
|
||||
end
|
||||
elseif oneway == "-1" then
|
||||
result.forward_mode = mode.inaccessible
|
||||
|
@ -70,13 +70,13 @@ function way_function (way, result)
|
||||
|
||||
if highway == "river" then
|
||||
local temp_speed = speed_forw
|
||||
result.forward_mode = mode.river_up
|
||||
result.backward_mode = mode.river_down
|
||||
result.forward_mode = mode.river_down
|
||||
result.backward_mode = mode.river_up
|
||||
speed_forw = temp_speed*1.5
|
||||
speed_back = temp_speed/1.5
|
||||
elseif highway == "steps" then
|
||||
result.forward_mode = mode.steps_up
|
||||
result.backward_mode = mode.steps_down
|
||||
result.forward_mode = mode.steps_down
|
||||
result.backward_mode = mode.steps_up
|
||||
end
|
||||
|
||||
if maxspeed_forward ~= nil and maxspeed_forward > 0 then
|
||||
|
@ -301,7 +301,7 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry)
|
||||
// few seconds of inaccuracy at both ends. This is acceptable, however, since the turn should
|
||||
// usually not be as relevant.
|
||||
|
||||
if (steps.size() < 2)
|
||||
if (steps.size() < 2 || geometry.locations.size() <= 2)
|
||||
return;
|
||||
|
||||
// if phantom node is located at the connection of two segments, either one can be selected as
|
||||
@ -320,7 +320,8 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry)
|
||||
BOOST_ASSERT(geometry.locations.size() >= steps.size());
|
||||
// Look for distances under 1m
|
||||
const bool zero_length_step = steps.front().distance <= 1;
|
||||
const bool duplicated_coordinate = geometry.locations[0] == geometry.locations[1];
|
||||
const bool duplicated_coordinate = util::coordinate_calculation::haversineDistance(
|
||||
geometry.locations[0], geometry.locations[1]) <= 1;
|
||||
if (zero_length_step || duplicated_coordinate)
|
||||
{
|
||||
// fixup the coordinate
|
||||
@ -381,7 +382,7 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry)
|
||||
}
|
||||
|
||||
// make sure we still have enough segments
|
||||
if (steps.size() < 2)
|
||||
if (steps.size() < 2 || geometry.locations.size() == 2)
|
||||
return;
|
||||
|
||||
BOOST_ASSERT(geometry.locations.size() >= steps.size());
|
||||
@ -410,8 +411,9 @@ void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry)
|
||||
next_to_last_step.mode = new_next_to_last.mode;
|
||||
// the geometry indices of the last step are already correct;
|
||||
}
|
||||
else if (geometry.locations[geometry.locations.size() - 2] ==
|
||||
geometry.locations[geometry.locations.size() - 1])
|
||||
else if (util::coordinate_calculation::haversineDistance(
|
||||
geometry.locations[geometry.locations.size() - 2],
|
||||
geometry.locations[geometry.locations.size() - 1]) <= 1)
|
||||
{
|
||||
// correct steps but duplicated coordinate in the end.
|
||||
// This can happen if the last coordinate snaps to a node in the unpacked geometry
|
||||
|
@ -749,6 +749,9 @@ TurnInstruction TurnAnalysis::getInstructionForObvious(const std::size_t num_roa
|
||||
const ConnectedRoad &road) const
|
||||
{
|
||||
const auto type = findBasicTurnType(via_edge, road);
|
||||
// handle travel modes:
|
||||
const auto in_mode = node_based_graph.GetEdgeData(via_edge).travel_mode;
|
||||
const auto out_mode = node_based_graph.GetEdgeData(road.turn.eid).travel_mode;
|
||||
if (type == TurnType::Ramp)
|
||||
{
|
||||
return {TurnType::Ramp, getTurnDirection(road.turn.angle)};
|
||||
@ -767,9 +770,18 @@ TurnInstruction TurnAnalysis::getInstructionForObvious(const std::size_t num_roa
|
||||
name_table.GetNameForID(out_data.name_id)))
|
||||
return {TurnType::NewName, getTurnDirection(road.turn.angle)};
|
||||
else
|
||||
return {TurnType::Suppressed, getTurnDirection(road.turn.angle)};
|
||||
{
|
||||
if (in_mode == out_mode)
|
||||
return {TurnType::Suppressed, getTurnDirection(road.turn.angle)};
|
||||
else
|
||||
return {TurnType::Notification, getTurnDirection(road.turn.angle)};
|
||||
}
|
||||
}
|
||||
BOOST_ASSERT(type == TurnType::Continue);
|
||||
if (in_mode != out_mode)
|
||||
{
|
||||
return {TurnType::Notification, getTurnDirection(road.turn.angle)};
|
||||
}
|
||||
if (num_roads > 2)
|
||||
{
|
||||
return {TurnType::Suppressed, getTurnDirection(road.turn.angle)};
|
||||
@ -984,17 +996,9 @@ TurnAnalysis::handleThreeWayTurn(const EdgeID via_edge,
|
||||
}
|
||||
else
|
||||
{
|
||||
const unsigned in_name_id = node_based_graph.GetEdgeData(via_edge).name_id;
|
||||
const unsigned out_names[2] = {
|
||||
node_based_graph.GetEdgeData(intersection[1].turn.eid).name_id,
|
||||
node_based_graph.GetEdgeData(intersection[2].turn.eid).name_id};
|
||||
if (isObviousOfTwo(intersection[1], intersection[2]))
|
||||
{
|
||||
intersection[1].turn.instruction = {
|
||||
(in_name_id != INVALID_NAME_ID || out_names[0] != INVALID_NAME_ID)
|
||||
? TurnType::NewName
|
||||
: TurnType::NoTurn,
|
||||
getTurnDirection(intersection[1].turn.angle)};
|
||||
intersection[1].turn.instruction = getInstructionForObvious(3,via_edge,intersection[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1004,11 +1008,7 @@ TurnAnalysis::handleThreeWayTurn(const EdgeID via_edge,
|
||||
|
||||
if (isObviousOfTwo(intersection[2], intersection[1]))
|
||||
{
|
||||
intersection[2].turn.instruction = {
|
||||
(in_name_id != INVALID_NAME_ID || out_names[1] != INVALID_NAME_ID)
|
||||
? TurnType::NewName
|
||||
: TurnType::NoTurn,
|
||||
getTurnDirection(intersection[2].turn.angle)};
|
||||
intersection[2].turn.instruction = getInstructionForObvious(3,via_edge,intersection[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user