@routing @testbot @via
Feature: Via points

    Background:
        Given the profile "testbot"

    Scenario: Simple via point
        Given the node map
            """
            a b c
            """

        And the ways
            | nodes |
            | abc   |

        When I route I should get
            | waypoints | route           |
            | a,b,c     | abc,abc,abc,abc |

    Scenario: Simple via point with core factor
        Given the contract extra arguments "--core 0.8"
        Given the node map
            """
            a b c
            """

        And the ways
            | nodes |
            | abc   |

        When I route I should get
            | waypoints | route           |
            | a,b,c     | abc,abc,abc,abc |
            | c,b,a     | abc,abc,abc,abc |
            | c,b,a     | abc,abc,abc,abc |

    Scenario: Via point at a dead end
        Given the node map
            """
            a b c
              d
            """

        And the ways
            | nodes |
            | abc   |
            | bd    |

        When I route I should get
            | waypoints | route                |
            | a,d,c     | abc,bd,bd,bd,abc,abc |
            | c,d,a     | abc,bd,bd,bd,abc,abc |

    Scenario: Multiple via points
        Given the node map
            """
            a       e f g
              b c d       h
            """

        And the ways
            | nodes |
            | ae    |
            | ab    |
            | bcd   |
            | de    |
            | efg   |
            | gh    |
            | 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 |


    Scenario: Duplicate via point
        Given the node map
            """
            x
            a 1 2 3 4 b

            """

        And the ways
            | nodes |
            | xa    |
            | ab    |

        When I route I should get
            | 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
        Given the node map
            """
              x           g
              a 1 b 2 c 3 d
            i f           e h
            """

        And the ways
            | nodes | oneway |
            | xa    |        |
            | if    |        |
            | gd    |        |
            | eh    |        |
            | ab    | yes    |
            | bc    | yes    |
            | cd    | yes    |
            | de    | yes    |
            | ef    | yes    |
            | fa    | yes    |

        When I route I should get
            | 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
        Given the node map
            """
              x       e
              a 1 2 3 b
            g d       c f
            """

        And the ways
            | nodes | oneway |
            | xa    |        |
            | eb    |        |
            | cf    |        |
            | dg    |        |
            | ab    | yes    |
            | bc    | yes    |
            | cd    | yes    |
            | da    | yes    |

        When I route I should get
            | 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
        Given the node map
            """
            a b c
              d
              e
            """

        And the ways
            | nodes | oneway |
            | abc   |  no    |
            | bd    |  no    |
            | de    |  yes   |

        When I route I should get
            | waypoints | route                |
            | a,d,c     | abc,bd,bd,bd,abc,abc |
            | c,d,a     | abc,bd,bd,bd,abc,abc |

    # See issue #2349
    Scenario: Via point at a dead end with oneway
        Given the node map
            """
            a b c
              d
              e
            """

        And the ways
            | nodes | oneway |
            | abc   |  no    |
            | bd    |  no    |
            | ed    |  yes   |

        When I route I should get
            | waypoints | route                |
            | a,d,c     | abc,bd,bd,bd,abc,abc |
            | c,d,a     | abc,bd,bd,bd,abc,abc |

    # See issue #2349
    @todo
    Scenario: Via point at a dead end with oneway
        Given the node map
            """
            a b c
              d
              e g
              f
            """

        And the ways
            | nodes | oneway |
            | abc   |  no    |
            | bd    |  no    |
            | ed    |  yes   |
            | dg    |  yes   |
            | ef    |  no    |
            | fg    |  yes   |

        When I route I should get
            | 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
        Given the profile "car"
        Given the node map
            """
            a b c
              1
              d


            f e
            """

        And the nodes
            | node | barrier |
            | d    | bollard |

        And the ways
            | nodes |
            | abc   |
            | bd    |
            | afed  |

        When I route I should get
            | 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
            """
            a 1 2 b
            8     3
            7     4
            d 6 5 c
            """

        And the ways
            | nodes | oneway |
            | ab    | yes    |
            | bc    | yes    |
            | cd    | yes    |
            | da    | yes    |

        When I route I should get
            | 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
            """
            a 1 2 3 b
                    4
                    5
                    6
            d 9 8 7 c
            """

        And the ways
            | nodes | oneway |
            | ab    | yes    |
            | bc    | yes    |
            | cd    | yes    |
            | da    | yes    |

        When I route I should get
            | 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    |

    # See issue #2706
    # this case is currently broken. It simply works as put here due to staggered intersections triggering a name collapse.
    # See 2824 for further information
    @todo
    Scenario: Incorrect ordering of nodes can produce multiple U-turns
        Given the node map
            """
              a
            e b c d f
            """

        And the ways
            | nodes  | oneway |
            | abcd   | no     |
            | ebbdcf | yes    |

        When I route I should get
            | from | to | route         |
            | e    | f  | ebbdcf,ebbdcf |

    @2798
    Scenario: UTurns Enabled
        Given the node map
            """
            a b c d e
            """

        And the query options
            | continue_straight | false |

        And the ways
            | nodes | oneway |
            | abc   | yes    |
            | edc   | yes    |

        When I route I should get
            | waypoints | route |
            | a,b,e     |       |
