LCOV - code coverage report
Current view: top level - tests/lane - LaneOperationTests.cpp (source / functions) Hit Total Coverage
Test: ad_map_access Lines: 585 585 100.0 %
Date: 2022-10-04 09:48:07 Functions: 20 20 100.0 %
Branches: 666 1966 33.9 %

           Branch data     Line data    Source code
       1                 :            : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
       2                 :            : //
       3                 :            : // Copyright (C) 2018-2021 Intel Corporation
       4                 :            : //
       5                 :            : // SPDX-License-Identifier: MIT
       6                 :            : //
       7                 :            : // ----------------- END LICENSE BLOCK -----------------------------------
       8                 :            : 
       9                 :            : #include <ad/map/access/Factory.hpp>
      10                 :            : #include <ad/map/access/Operation.hpp>
      11                 :            : #include <ad/map/lane/BorderOperation.hpp>
      12                 :            : #include <ad/map/lane/LaneOperation.hpp>
      13                 :            : #include <ad/map/match/AdMapMatching.hpp>
      14                 :            : #include <ad/map/point/Operation.hpp>
      15                 :            : #include <ad/map/route/LaneIntervalOperation.hpp>
      16                 :            : #include <ad/map/serialize/SerializerFileCRC32.hpp>
      17                 :            : #include <ad/map/test_support/NoLogTestMacros.hpp>
      18                 :            : #include <gtest/gtest.h>
      19                 :            : #include "../../src/lane/LaneOperationPrivate.hpp"
      20                 :            : #include "../point/RandomGeometry.hpp"
      21                 :            : 
      22                 :            : using namespace ::ad;
      23                 :            : using namespace ::ad::map;
      24                 :            : using namespace ::ad::map::point;
      25                 :            : using namespace ::ad::map::lane;
      26                 :            : 
      27                 :            : struct LaneOperationTest : ::testing::Test
      28                 :            : {
      29                 :          8 :   LaneOperationTest()
      30                 :          8 :   {
      31                 :          8 :   }
      32                 :            : 
      33                 :          8 :   virtual void SetUp()
      34                 :            :   {
      35                 :          8 :   }
      36                 :          8 :   virtual void TearDown()
      37                 :            :   {
      38                 :          8 :     access::cleanup();
      39                 :          8 :   }
      40                 :          4 :   void setupSingleLongLane()
      41                 :            :   {
      42   [ +  -  +  -  :          4 :     mStorePtr.reset(new access::Store());
                   +  - ]
      43   [ +  -  +  - ]:          4 :     pFactory.reset(new access::Factory(*mStorePtr));
      44                 :            :     // setup one single long lane
      45                 :            :     point::GeoPoint bottomRight
      46                 :          4 :       = point::createGeoPoint(point::Longitude(8.44937788), point::Latitude(49.00736837), point::Altitude(0.));
      47                 :            :     point::GeoPoint upRight
      48                 :          4 :       = point::createGeoPoint(point::Longitude(8.45010064), point::Latitude(49.00884320), point::Altitude(0.));
      49                 :            :     point::GeoPoint bottomLeft
      50                 :          4 :       = point::createGeoPoint(point::Longitude(8.44933898), point::Latitude(49.00737633), point::Altitude(0.));
      51                 :            :     point::GeoPoint upLeft
      52                 :          4 :       = point::createGeoPoint(point::Longitude(8.45006151), point::Latitude(49.00885163), point::Altitude(0.));
      53                 :            : 
      54                 :          8 :     point::ECEFEdge rightPoints;
      55   [ +  -  +  - ]:          4 :     rightPoints.push_back(point::toECEF(bottomRight));
      56   [ +  -  +  - ]:          4 :     rightPoints.push_back(point::toECEF(upRight));
      57         [ +  - ]:          4 :     rightEdge = point::createGeometry(rightPoints, false);
      58                 :          4 :     point::ECEFEdge leftPoints;
      59   [ +  -  +  - ]:          4 :     leftPoints.push_back(point::toECEF(bottomLeft));
      60   [ +  -  +  - ]:          4 :     leftPoints.push_back(point::toECEF(upLeft));
      61         [ +  - ]:          4 :     leftEdge = point::createGeometry(leftPoints, false);
      62         [ +  - ]:          4 :     pFactory->set(access::TrafficType::RIGHT_HAND_TRAFFIC);
      63                 :            : 
      64         [ +  - ]:          4 :     pFactory->add(access::PartitionId(0), laneId, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
      65                 :            : 
      66         [ +  - ]:          4 :     pFactory->set(laneId, leftEdge, rightEdge);
      67         [ +  - ]:          4 :     access::init(mStorePtr);
      68                 :          4 :   }
      69                 :            :   lane::LaneId laneId{4711};
      70                 :            :   point::Geometry leftEdge;
      71                 :            :   point::Geometry rightEdge;
      72                 :            :   access::Store::Ptr mStorePtr;
      73                 :            :   std::shared_ptr<access::Factory> pFactory;
      74                 :            : };
      75                 :            : 
      76                 :          2 : TEST_F(LaneOperationTest, getLane)
      77                 :            : {
      78   [ +  -  +  -  :          1 :   ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
      79                 :          1 :   auto pos = point::createGeoPoint(point::Longitude(8.4398011), point::Latitude(49.0188015), point::Altitude(0.));
      80                 :          1 :   auto bad = point::createGeoPoint(point::Longitude(9.), point::Latitude(9.), point::Altitude(0.));
      81   [ +  -  +  -  :          2 :   EXPECT_THROW(lane::uniqueLaneId(bad), std::runtime_error);
          +  -  -  +  -  
          +  -  -  -  -  
             -  -  -  - ]
      82         [ +  - ]:          1 :   lane::LaneId id = lane::uniqueLaneId(pos);
      83   [ +  -  +  - ]:          2 :   auto lane = lane::getLane(id);
      84   [ +  -  -  +  :          1 :   EXPECT_EQ(id, lane.id);
          -  -  -  -  -  
                      - ]
      85                 :            : }
      86                 :            : 
      87                 :          2 : TEST_F(LaneOperationTest, getPointsOfInterest)
      88                 :            : {
      89   [ +  -  +  -  :          1 :   ASSERT_TRUE(access::init("test_files/Town01.txt"));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
      90                 :          1 :   auto pos = point::createGeoPoint(point::Longitude(0.00193915337), point::Latitude(-0.00295), point::Altitude(0.));
      91                 :          1 :   std::vector<config::PointOfInterest> poI;
      92         [ +  - ]:          1 :   poI = access::getPointsOfInterest(pos, physics::Distance(1.0));
      93   [ +  -  -  +  :          1 :   ASSERT_EQ(poI.size(), 0u);
          -  -  -  -  -  
                      - ]
      94         [ +  - ]:          1 :   poI = access::getPointsOfInterest(pos, physics::Distance(5.0));
      95   [ +  -  -  +  :          1 :   ASSERT_EQ(poI.size(), 1u);
          -  -  -  -  -  
                      - ]
      96   [ +  -  +  -  :          2 :   ASSERT_EQ(poI.front().name, std::string("T1"));
          -  +  -  -  -  
                -  -  - ]
      97                 :            : }
      98                 :            : 
      99                 :          2 : TEST_F(LaneOperationTest, getLaneHeading)
     100                 :            : {
     101   [ +  -  +  -  :          1 :   ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     102                 :            : 
     103                 :          1 :   std::vector<::point::ENUHeading> headings;
     104                 :          1 :   std::vector<match::MapMatchedPosition> mapMatchedPositions;
     105                 :          1 :   match::MapMatchedPosition position;
     106                 :            :   position.lanePoint.paraPoint.laneId = lane::uniqueLaneId(
     107         [ +  - ]:          1 :     point::createGeoPoint(point::Longitude(8.4398011), point::Latitude(49.0188015), point::Altitude(0.)));
     108                 :          1 :   position.lanePoint.paraPoint.parametricOffset = physics::ParametricValue(0.5);
     109                 :          1 :   position.lanePoint.lateralT = physics::RatioValue(0.5);
     110                 :            :   position.matchedPoint = point::toECEF(
     111         [ +  - ]:          1 :     point::createGeoPoint(point::Longitude(8.4401510), point::Latitude(49.0191792), point::Altitude(0.)));
     112         [ +  - ]:          1 :   mapMatchedPositions.push_back(position);
     113                 :            :   position.lanePoint.paraPoint.laneId = lane::uniqueLaneId(
     114         [ +  - ]:          1 :     point::createGeoPoint(point::Longitude(8.4398226), point::Latitude(49.0187687), point::Altitude(0.)));
     115         [ +  - ]:          1 :   mapMatchedPositions.push_back(position);
     116                 :            : 
     117         [ +  + ]:          3 :   for (auto mapMatchedPosition : mapMatchedPositions)
     118                 :            :   {
     119   [ +  -  +  - ]:          2 :     headings.push_back(lane::getLaneENUHeading(mapMatchedPosition));
     120                 :            :   }
     121   [ +  -  -  +  :          1 :   ASSERT_EQ(2u, headings.size());
          -  -  -  -  -  
                      - ]
     122                 :            :   // since the two lanes are in opposite direction, the heading should differ by PI
     123   [ +  -  -  +  :          1 :   ASSERT_NEAR(static_cast<double>(headings[0]) + M_PI, static_cast<double>(headings[1]), 0.1);
          -  -  -  -  -  
                      - ]
     124                 :          1 :   headings.clear();
     125                 :            : }
     126                 :            : 
     127                 :          2 : TEST_F(LaneOperationTest, findNearestPointOnEdge)
     128                 :            : {
     129         [ +  - ]:          1 :   setupSingleLongLane();
     130   [ +  -  +  - ]:          2 :   auto lane = lane::getLane(laneId);
     131                 :            :   // perform query
     132                 :            :   point::GeoPoint requestPoint
     133                 :          1 :     = point::createGeoPoint(point::Longitude(8.4493674), point::Latitude(49.0073880), point::Altitude(0.));
     134                 :            : 
     135                 :          1 :   match::MapMatchedPosition mmpos;
     136   [ +  -  +  -  :          1 :   EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPoint), mmpos));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     137   [ +  -  -  +  :          1 :   EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_IN);
          -  -  -  -  -  
                      - ]
     138                 :            :   point::GeoPoint requestPointVeryClose
     139                 :          1 :     = point::createGeoPoint(point::Longitude(8.4493662), point::Latitude(49.0073866), point::Altitude(0.));
     140   [ +  -  +  -  :          1 :   EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPointVeryClose), mmpos));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     141   [ +  -  -  +  :          1 :   EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_IN);
          -  -  -  -  -  
                      - ]
     142                 :            :   point::GeoPoint requestPointVeryFar
     143                 :          1 :     = point::createGeoPoint(point::Longitude(9.4493662), point::Latitude(49.0073866), point::Altitude(0.));
     144   [ +  -  +  -  :          1 :   EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPointVeryFar), mmpos));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     145   [ +  -  -  +  :          1 :   EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_RIGHT);
          -  -  -  -  -  
                      - ]
     146                 :            :   // write map for convenience
     147         [ +  - ]:          2 :   serialize::SerializerFileCRC32 serializer(true);
     148                 :          1 :   size_t versionMajorWrite = ::ad::map::serialize::SerializerFileCRC32::VERSION_MAJOR;
     149                 :          1 :   size_t versionMinorWrite = ::ad::map::serialize::SerializerFileCRC32::VERSION_MINOR;
     150   [ +  -  +  - ]:          1 :   serializer.open("test_files/test_straight.adm", versionMajorWrite, versionMinorWrite);
     151   [ +  -  +  - ]:          1 :   access::getStore().save(serializer);
     152         [ +  - ]:          1 :   serializer.close();
     153                 :          1 : }
     154                 :            : 
     155                 :          2 : TEST_F(LaneOperationTest, LaneRelation)
     156                 :            : {
     157         [ +  - ]:          1 :   setupSingleLongLane();
     158                 :          1 :   ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
     159                 :          1 :   Geometry geo1, geo2, geo3, geo4;
     160         [ +  - ]:          1 :   ECEFPoint basePoint = randECEFPoint();
     161                 :          1 :   lane::LaneId x11, x12;
     162                 :          1 :   access::PartitionId p(0);
     163                 :          1 :   uint32_t i = 100;
     164                 :          1 :   x11 = lane::LaneId(i++);
     165         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     166   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->set(x11, geo3, geo4));
          -  -  -  -  -  
                -  -  - ]
     167                 :            : 
     168   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 0));
     169   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
     170   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 0));
     171   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
     172         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     173                 :          1 :   x11 = lane::LaneId(i++);
     174         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     175   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->set(x11, geo1, geo4));
          -  -  -  -  -  
                -  -  - ]
     176         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     177                 :          1 :   x11 = lane::LaneId(i++);
     178         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     179   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->set(x11, geo3, geo1));
          -  -  -  -  -  
                -  -  - ]
     180                 :            : 
     181                 :          1 :   edge_ecef1.clear();
     182                 :          1 :   edge_ecef2.clear();
     183                 :          1 :   x11 = lane::LaneId(i++);
     184         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     185   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 0));
     186   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
     187   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 0));
     188   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
     189         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     190         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     191         [ +  - ]:          1 :   pFactory->set(x11, geo1, geo2);
     192                 :          1 :   edge_ecef1.clear();
     193                 :          1 :   edge_ecef2.clear();
     194   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
     195   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(7, 4, 0));
     196   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
     197   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(7, 2, 0));
     198         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     199         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     200                 :          1 :   x12 = lane::LaneId(i++);
     201         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     202         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     203   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     204   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     205         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef2, false);
     206         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef1, false);
     207         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     208   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     209   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     210                 :            : 
     211                 :          1 :   edge_ecef1.clear();
     212                 :          1 :   edge_ecef2.clear();
     213   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
     214   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(7, 4, 0));
     215   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 4, 0));
     216   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 7, 0));
     217         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     218         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     219                 :          1 :   x12 = lane::LaneId(i++);
     220         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     221         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     222   [ +  -  +  -  :          1 :   ASSERT_TRUE(isVanishingLaneStart(*(lane::getLanePtr(x12))));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     223                 :            : 
     224                 :          1 :   edge_ecef1.clear();
     225                 :          1 :   edge_ecef2.clear();
     226   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(2, 4, 0));
     227   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(8, 8, 0));
     228   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 4, 0));
     229   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(8, 8, 0));
     230         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     231         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     232                 :          1 :   x12 = lane::LaneId(i++);
     233         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     234         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     235   [ +  -  +  -  :          1 :   ASSERT_TRUE(isVanishingLaneEnd(*(lane::getLanePtr(x12))));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     236                 :            : 
     237                 :          1 :   edge_ecef1.clear();
     238                 :          1 :   edge_ecef2.clear();
     239   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 1));
     240   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 1));
     241   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 1));
     242   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 1));
     243         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     244         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     245                 :          1 :   x12 = lane::LaneId(i++);
     246         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     247         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     248                 :            : 
     249                 :          1 :   point::ParaPoint para1;
     250                 :          1 :   para1.laneId = x12;
     251                 :          1 :   para1.parametricOffset = physics::ParametricValue(0.5);
     252   [ +  -  +  -  :          1 :   ASSERT_EQ(calcWidth(x12, physics::ParametricValue(0.5)), physics::Distance(2.));
          -  +  -  -  -  
                -  -  - ]
     253   [ +  -  +  -  :          1 :   ASSERT_EQ(calcWidth(para1), physics::Distance(2.));
          -  +  -  -  -  
                -  -  - ]
     254                 :            : 
     255                 :          1 :   match::LaneOccupiedRegion occupiedRegion;
     256                 :          1 :   occupiedRegion.laneId = x12;
     257                 :          1 :   occupiedRegion.longitudinalRange.minimum = physics::ParametricValue(0.2);
     258                 :          1 :   occupiedRegion.longitudinalRange.maximum = physics::ParametricValue(0.8);
     259                 :          1 :   occupiedRegion.lateralRange.minimum = physics::ParametricValue(0.3);
     260                 :          1 :   occupiedRegion.lateralRange.maximum = physics::ParametricValue(0.7);
     261   [ +  -  +  -  :          1 :   ASSERT_EQ(calcWidth(occupiedRegion), physics::Distance(2.) * 0.4);
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     262   [ +  -  +  -  :          1 :   ASSERT_EQ(calcLength(occupiedRegion), calcLength(x12) * 0.6);
          +  -  +  -  -  
          +  -  -  -  -  
                   -  - ]
     263                 :            : 
     264                 :          1 :   ECEFPoint ecef_pt1;
     265                 :            :   ecef_pt1 = getProjectedParametricPoint(
     266   [ +  -  +  - ]:          1 :     *(lane::getLanePtr(x12)), physics::ParametricValue(0.5), physics::ParametricValue(0.5));
     267   [ +  -  +  -  :          1 :   ASSERT_EQ(ecef_pt1, basePoint + createECEFPoint(2.5, 3, 1));
          -  +  -  -  -  
                -  -  - ]
     268   [ +  -  -  +  :          1 :   ASSERT_FALSE(isSuccessorOrPredecessor(x11, x12));
          -  -  -  -  -  
                -  -  - ]
     269                 :            : 
     270                 :          1 :   edge_ecef1.clear();
     271                 :          1 :   edge_ecef2.clear();
     272   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 4, 1));
     273   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
     274   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
     275   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 4, 1));
     276   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(14, 8, 1));
     277         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     278         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     279                 :          1 :   x11 = lane::LaneId(i++);
     280         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     281         [ +  - ]:          1 :   pFactory->set(x11, geo1, geo2);
     282                 :            : 
     283                 :          1 :   edge_ecef1.clear();
     284                 :          1 :   edge_ecef2.clear();
     285   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
     286   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
     287   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
     288   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(14, 12, 1));
     289         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     290         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     291                 :          1 :   x12 = lane::LaneId(i++);
     292         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     293         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     294   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     295                 :            : 
     296                 :          1 :   edge_ecef1.clear();
     297                 :          1 :   edge_ecef2.clear();
     298   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 8, 1));
     299   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(14, 8, 1));
     300   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 12, 1));
     301   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 12, 1));
     302         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     303         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     304                 :          1 :   x12 = lane::LaneId(i++);
     305         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     306         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     307   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     308                 :            : 
     309                 :          1 :   edge_ecef1.clear();
     310                 :          1 :   edge_ecef2.clear();
     311   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 8, 1));
     312   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
     313   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
     314   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
     315   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
     316         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     317         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     318                 :          1 :   x12 = lane::LaneId(i++);
     319         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     320         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     321   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     322                 :            : 
     323                 :          1 :   edge_ecef1.clear();
     324                 :          1 :   edge_ecef2.clear();
     325   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 6, 1));
     326   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
     327   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 7, 1));
     328   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10, 6, 1));
     329   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(14, 7, 1));
     330         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     331         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     332                 :          1 :   x12 = lane::LaneId(i++);
     333         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     334         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     335   [ +  -  +  -  :          1 :   ASSERT_FALSE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     336                 :            : 
     337                 :          1 :   edge_ecef1.clear();
     338                 :          1 :   edge_ecef2.clear();
     339   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20, 4, 1));
     340   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
     341   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
     342   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20, 4, 1));
     343   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
     344         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     345         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     346                 :          1 :   x11 = lane::LaneId(i++);
     347         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     348         [ +  - ]:          1 :   pFactory->set(x11, geo1, geo2);
     349                 :            : 
     350                 :          1 :   edge_ecef1.clear();
     351                 :          1 :   edge_ecef2.clear();
     352   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20, 4, 1));
     353   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
     354   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20, 8, 1));
     355   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(24, 12, 1));
     356         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     357         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     358                 :          1 :   x12 = lane::LaneId(i++);
     359         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     360         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     361   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     362                 :            : 
     363                 :          1 :   edge_ecef1.clear();
     364                 :          1 :   edge_ecef2.clear();
     365   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20, 4, 1));
     366   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
     367   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
     368   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(24, 12, 1));
     369         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     370         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     371                 :          1 :   x12 = lane::LaneId(i++);
     372         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     373         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     374   [ +  -  +  -  :          1 :   ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     375                 :            : 
     376                 :          1 :   edge_ecef1.clear();
     377                 :          1 :   edge_ecef2.clear();
     378   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
     379   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(24, 4, 1));
     380   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
     381   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
     382   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20, 8, 1));
     383         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     384         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     385                 :          1 :   x12 = lane::LaneId(i++);
     386         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     387         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     388   [ +  -  +  -  :          1 :   ASSERT_FALSE(isPhysicalPredecessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     389                 :            : }
     390                 :            : 
     391                 :          2 : TEST_F(LaneOperationTest, LanePoint)
     392                 :            : {
     393         [ +  - ]:          1 :   setupSingleLongLane();
     394   [ +  -  +  -  :          2 :   EXPECT_THROW_NO_LOG(lane::getLane(lane::LaneId(3811)), std::invalid_argument);
          +  -  +  -  +  
          -  +  -  -  +  
          -  +  -  -  -  
          -  -  -  +  -  
                   -  - ]
     395                 :            : 
     396                 :          1 :   lane::Lane badLane;
     397                 :          1 :   physics::ParametricValue leftPara(0.1);
     398                 :          1 :   physics::ParametricValue rightPara(0.1);
     399   [ +  -  +  -  :          1 :   ASSERT_FALSE(isValid(getParametricPoint(badLane, leftPara, rightPara)));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     400   [ +  -  +  - ]:          1 :   auto lane = lane::getLane(laneId);
     401                 :            : 
     402                 :          1 :   ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
     403                 :          1 :   Geometry geo1, geo2, geo3, geo4;
     404         [ +  - ]:          1 :   ECEFPoint basePoint = randECEFPoint();
     405                 :          1 :   lane::LaneId x11, x12, x13;
     406                 :          1 :   access::PartitionId p(0);
     407                 :          1 :   uint32_t i = 100;
     408                 :          1 :   ECEFPoint ecef_pt1;
     409                 :          1 :   point::ParaPoint para1;
     410                 :            : 
     411         [ +  - ]:          1 :   CoordinateTransform mCoordinateTransform;
     412                 :          1 :   edge_ecef1.clear();
     413                 :          1 :   edge_ecef2.clear();
     414   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(10., 200., 300.));
     415   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20., 200., 300.));
     416   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(10., 300., 300.));
     417   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20., 300., 300.));
     418         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     419         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     420                 :          1 :   x11 = lane::LaneId(i++);
     421         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     422         [ +  - ]:          1 :   pFactory->set(x11, geo1, geo2);
     423   [ +  -  +  - ]:          1 :   ecef_pt1 = getParametricPoint(*(lane::getLanePtr(x11)), physics::ParametricValue(0.5), physics::ParametricValue(0.5));
     424   [ +  -  +  -  :          1 :   ASSERT_EQ(ecef_pt1, basePoint + createECEFPoint(15., 250., 300.));
          -  +  -  -  -  
                -  -  - ]
     425                 :            : 
     426         [ +  - ]:          1 :   GeoPoint geo_pt1 = toGeo(basePoint);
     427                 :          1 :   ENUPoint enu1, enu2;
     428         [ +  - ]:          1 :   access::setENUReferencePoint(geo_pt1);
     429                 :          1 :   para1.laneId = x11;
     430                 :          1 :   para1.parametricOffset = physics::ParametricValue(0.5);
     431         [ +  - ]:          1 :   enu2 = map::lane::getENULanePoint(para1, physics::ParametricValue(0.5));
     432   [ +  -  +  - ]:          1 :   mCoordinateTransform.setENUReferencePoint(access::getENUReferencePoint());
     433         [ +  - ]:          1 :   enu1 = mCoordinateTransform.ECEF2ENU(ecef_pt1);
     434   [ +  -  -  +  :          1 :   ASSERT_EQ(enu1, enu2);
          -  -  -  -  -  
                      - ]
     435                 :            : 
     436                 :          1 :   point::ParaPoint para2;
     437                 :          1 :   point::ENUHeading laneHeading;
     438                 :          1 :   point::ENUHeading inverseLaneHeading;
     439         [ +  - ]:          1 :   laneHeading = lane::getLaneENUHeading(para1);
     440         [ +  - ]:          1 :   inverseLaneHeading = point::createENUHeading(M_PI_2);
     441                 :          1 :   edge_ecef1.clear();
     442                 :          1 :   edge_ecef2.clear();
     443   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(20., 200., 300.));
     444   [ +  -  +  - ]:          1 :   edge_ecef1.push_back(basePoint + createECEFPoint(30., 200., 300.));
     445   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(20., 300., 300.));
     446   [ +  -  +  - ]:          1 :   edge_ecef2.push_back(basePoint + createECEFPoint(30., 300., 300.));
     447         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     448         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     449                 :          1 :   x12 = lane::LaneId(i++);
     450         [ +  - ]:          1 :   pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     451         [ +  - ]:          1 :   pFactory->set(x12, geo1, geo2);
     452                 :          1 :   lane::ContactLocation left(lane::ContactLocation::LEFT);
     453         [ +  - ]:          1 :   lane::ContactTypeList free({lane::ContactType::FREE});
     454                 :          1 :   restriction::Restriction all_vehicles;
     455                 :            :   all_vehicles.roadUserTypes
     456         [ +  - ]:          1 :     = {restriction::RoadUserType::CAR, restriction::RoadUserType::BUS, restriction::RoadUserType::TRUCK};
     457                 :          1 :   restriction::RestrictionList all_vehicles_list;
     458         [ +  - ]:          1 :   all_vehicles_list.push_back(all_vehicles);
     459                 :          1 :   restriction::Restrictions all_vehicle_restrs;
     460         [ +  - ]:          1 :   all_vehicle_restrs.conjunctions = all_vehicles_list;
     461   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->add(x11, x12, left, free, all_vehicle_restrs));
          -  -  -  -  -  
                -  -  - ]
     462   [ +  -  -  +  :          1 :   ASSERT_TRUE(projectPositionToLaneInHeadingDirection(para1, inverseLaneHeading, para2));
          -  -  -  -  -  
                -  -  - ]
     463                 :            : 
     464   [ +  -  +  -  :          1 :   ASSERT_FALSE(satisfiesFilter(*(lane::getLanePtr(x11)), std::string("abc"), false));
          +  -  -  +  -  
          -  -  -  -  -  
                   -  - ]
     465                 :            : 
     466   [ +  -  -  +  :          1 :   ASSERT_FALSE(access::isLeftHandedTraffic());
          -  -  -  -  -  
                -  -  - ]
     467         [ +  - ]:          1 :   pFactory->set(access::TrafficType::LEFT_HAND_TRAFFIC);
     468   [ +  -  -  +  :          1 :   ASSERT_TRUE(access::isLeftHandedTraffic());
          -  -  -  -  -  
                -  -  - ]
     469                 :            : }
     470                 :            : 
     471                 :          2 : TEST_F(LaneOperationTest, LaneOperation)
     472                 :            : {
     473         [ +  - ]:          1 :   setupSingleLongLane();
     474   [ +  -  +  - ]:          1 :   auto lane = lane::getLane(laneId);
     475                 :          1 :   restriction::SpeedLimit speedLimit;
     476                 :          1 :   speedLimit.speedLimit = physics::Speed(0.);
     477   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->add(laneId, speedLimit));
          -  -  -  -  -  
                -  -  - ]
     478                 :            : 
     479                 :          1 :   physics::ParametricRange trange;
     480                 :          1 :   trange.minimum = physics::ParametricValue(0.2);
     481                 :          1 :   trange.maximum = physics::ParametricValue(0.7);
     482         [ +  - ]:          1 :   auto ptrLane = lane::getLanePtr(laneId);
     483                 :          1 :   physics::Speed maxSpeed(0);
     484         [ +  - ]:          1 :   maxSpeed = getMaxSpeed(*ptrLane, trange);
     485   [ +  -  -  +  :          1 :   ASSERT_EQ(std::numeric_limits<physics::Speed>::max(), maxSpeed);
          -  -  -  -  -  
                      - ]
     486                 :            : 
     487                 :          1 :   ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
     488                 :          1 :   Geometry geo1, geo2, geo3, geo4;
     489                 :          1 :   lane::LaneId x11, x12;
     490                 :          1 :   access::PartitionId p(0);
     491                 :          1 :   uint32_t i = 100;
     492                 :          1 :   x11 = lane::LaneId(i++);
     493         [ +  - ]:          1 :   pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
     494         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 4, 0));
     495         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(401, 4, 0));
     496         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(1, 2, 0));
     497         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(401, 2, 0));
     498         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     499         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     500         [ +  - ]:          1 :   pFactory->set(x11, geo1, geo2);
     501                 :          1 :   speedLimit.speedLimit = physics::Speed(100.);
     502   [ +  -  -  +  :          1 :   ASSERT_TRUE(pFactory->add(x11, speedLimit));
          -  -  -  -  -  
                -  -  - ]
     503                 :            : 
     504                 :          1 :   physics::Duration duration;
     505   [ +  -  +  - ]:          1 :   duration = getDuration(*(lane::getLanePtr(x11)), trange);
     506   [ +  -  -  +  :          1 :   ASSERT_EQ(duration, physics::Duration(2.));
          -  -  -  -  -  
                      - ]
     507                 :          1 :   route::LaneInterval laneInt1;
     508                 :          1 :   laneInt1.laneId = x11;
     509                 :          1 :   laneInt1.start = ::ad::physics::ParametricValue(0.2);
     510                 :          1 :   laneInt1.end = ::ad::physics::ParametricValue(0.7);
     511   [ +  -  +  -  :          1 :   ASSERT_EQ(calcDuration(laneInt1), physics::Duration(2.));
          -  +  -  -  -  
                -  -  - ]
     512                 :            : }
     513                 :            : 
     514                 :          2 : TEST_F(LaneOperationTest, BorderOperation)
     515                 :            : {
     516                 :          1 :   ENUEdge edge_enu1, edge_enu2, edge_enu3, edge_enu4;
     517                 :          1 :   ENUBorder border_enu1, border_enu2, border_enu3;
     518                 :            : 
     519         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1, 4, 0));
     520         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(4, 4, 0));
     521         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1, 2, 0));
     522         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(4, 2, 0));
     523         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     524         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     525         [ +  - ]:          1 :   normalizeBorder(border_enu1, &border_enu2);
     526   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right[1], createENUPoint(4, 2, 0));
          -  -  -  -  -  
                      - ]
     527                 :            : 
     528                 :          1 :   edge_enu1.clear();
     529                 :          1 :   edge_enu2.clear();
     530         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 4., 0));
     531         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4., 0));
     532         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(701., 4., 0));
     533         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1., 2., 0));
     534         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(701., 2., 0));
     535         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     536         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     537         [ +  - ]:          1 :   normalizeBorder(border_enu1, &border_enu2);
     538   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right.size(), 3u);
          -  -  -  -  -  
                      - ]
     539   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right[2], createENUPoint(701., 2., 0));
          -  -  -  -  -  
                      - ]
     540                 :            : 
     541                 :          1 :   edge_enu1.clear();
     542                 :          1 :   edge_enu2.clear();
     543         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(201., 4., 0));
     544         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4., 0));
     545         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(701., 4., 0));
     546         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(201., 2., 0));
     547         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(701., 2., 0));
     548         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     549         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     550                 :          1 :   edge_enu1.clear();
     551                 :          1 :   edge_enu2.clear();
     552         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1, 4, 0));
     553         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(101, 4, 0));
     554         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1, 2, 0));
     555         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(101, 2, 0));
     556         [ +  - ]:          1 :   border_enu2.left = edge_enu1;
     557         [ +  - ]:          1 :   border_enu2.right = edge_enu2;
     558         [ +  - ]:          1 :   normalizeBorder(border_enu1, &border_enu2);
     559   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right.size(), 3u);
          -  -  -  -  -  
                      - ]
     560   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right[2], createENUPoint(701., 2., 0));
          -  -  -  -  -  
                      - ]
     561                 :            : 
     562                 :          1 :   edge_enu1.clear();
     563                 :          1 :   edge_enu2.clear();
     564         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1, 4, 1));
     565         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(4, 4, 1));
     566         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1, 2, 1));
     567         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(4, 2, 1));
     568         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     569         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     570         [ +  - ]:          1 :   edge_enu3 = getLateralAlignmentEdge(border_enu1, physics::ParametricValue(0.5));
     571                 :          1 :   edge_enu4.clear();
     572         [ +  - ]:          1 :   edge_enu4.push_back(createENUPoint(1, 3, 1));
     573         [ +  - ]:          1 :   edge_enu4.push_back(createENUPoint(4, 3, 1));
     574   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu3, edge_enu4);
          -  -  -  -  -  
                      - ]
     575                 :            : 
     576                 :          1 :   edge_enu3.clear();
     577         [ +  - ]:          1 :   edge_enu3.push_back(createENUPoint(1, 2, 1));
     578         [ +  - ]:          1 :   edge_enu3.push_back(createENUPoint(101, 2, 1));
     579         [ +  - ]:          1 :   physics::Distance dis = getDistanceEnuPointToLateralAlignmentEdge(createENUPoint(101, 202, 1), edge_enu3);
     580   [ +  -  -  +  :          1 :   ASSERT_EQ(dis, physics::Distance(200));
          -  -  -  -  -  
                      - ]
     581                 :            : 
     582                 :          1 :   edge_enu1.clear();
     583                 :          1 :   edge_enu2.clear();
     584                 :          1 :   edge_enu3.clear();
     585         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 4, 1));
     586         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4, 1));
     587         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(501., 401, 1));
     588         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(901., 401, 1));
     589         [ +  - ]:          1 :   edge_enu3 = edge_enu1;
     590         [ +  - ]:          1 :   makeTransitionFromFirstEdgeContinuous(edge_enu1, edge_enu2);
     591   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu1.size(), 3u);
          -  -  -  -  -  
                      - ]
     592   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu1[0], edge_enu3[0]);
          -  -  -  -  -  
                      - ]
     593   [ +  -  -  +  :          1 :   ASSERT_NE(edge_enu1[1], edge_enu3[1]);
          -  -  -  -  -  
                      - ]
     594   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(edge_enu1), calcLength(edge_enu3));
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     595         [ +  - ]:          1 :   dis = calcLength(edge_enu3);
     596                 :            : 
     597                 :          1 :   edge_enu1.clear();
     598                 :          1 :   edge_enu2.clear();
     599                 :          1 :   edge_enu3.clear();
     600         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 4, 1));
     601         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4, 1));
     602         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(501., 901, 1));
     603         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(901., 901, 1));
     604         [ +  - ]:          1 :   makeTransitionFromFirstEdgeContinuous(edge_enu1, edge_enu2);
     605   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(edge_enu1), dis);
          -  +  -  -  -  
                -  -  - ]
     606                 :            : 
     607                 :          1 :   edge_enu1.clear();
     608                 :          1 :   edge_enu2.clear();
     609                 :          1 :   edge_enu3.clear();
     610         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 4, 1));
     611         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4, 1));
     612         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(501., 401, 1));
     613         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(901., 401, 1));
     614         [ +  - ]:          1 :   edge_enu3 = edge_enu2;
     615         [ +  - ]:          1 :   makeTransitionToSecondEdgeContinuous(edge_enu1, edge_enu2);
     616   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu2.size(), 3u);
          -  -  -  -  -  
                      - ]
     617   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu2[0], edge_enu1[1]);
          -  -  -  -  -  
                      - ]
     618   [ +  -  -  +  :          1 :   ASSERT_NE(edge_enu2[1], edge_enu3[0]);
          -  -  -  -  -  
                      - ]
     619   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_enu2[2], edge_enu3[1]);
          -  -  -  -  -  
                      - ]
     620   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(edge_enu2), calcLength(edge_enu3));
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     621         [ +  - ]:          1 :   dis = calcLength(edge_enu2);
     622                 :            : 
     623                 :          1 :   edge_enu1.clear();
     624                 :          1 :   edge_enu2.clear();
     625                 :          1 :   edge_enu3.clear();
     626         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 4, 1));
     627         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 4, 1));
     628         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(501., 901, 1));
     629         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(901., 901, 1));
     630         [ +  - ]:          1 :   makeTransitionToSecondEdgeContinuous(edge_enu1, edge_enu2);
     631   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(edge_enu2), dis);
          -  +  -  -  -  
                -  -  - ]
     632                 :            : 
     633                 :          1 :   edge_enu1.clear();
     634                 :          1 :   edge_enu2.clear();
     635         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 404., 1));
     636         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 404., 1));
     637         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1., 4., 1));
     638         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(401., 4., 1));
     639         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     640         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     641                 :          1 :   edge_enu1.clear();
     642                 :          1 :   edge_enu2.clear();
     643         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(801., 604., 1));
     644         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1201., 604., 1));
     645         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(801., 204., 1));
     646         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1201., 204., 1));
     647         [ +  - ]:          1 :   border_enu2.left = edge_enu1;
     648         [ +  - ]:          1 :   border_enu2.right = edge_enu2;
     649         [ +  - ]:          1 :   border_enu3 = border_enu1;
     650         [ +  - ]:          1 :   makeTransitionFromFirstBorderContinuous(border_enu1, border_enu2);
     651   [ +  -  -  +  :          1 :   ASSERT_NE(border_enu1, border_enu3);
          -  -  -  -  -  
                      - ]
     652   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.left.size(), 4u);
          -  -  -  -  -  
                      - ]
     653   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right.size(), 4u);
          -  -  -  -  -  
                      - ]
     654   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.left[0], border_enu3.left[0]);
          -  -  -  -  -  
                      - ]
     655   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.left[3], border_enu2.left[0]);
          -  -  -  -  -  
                      - ]
     656   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right[0], border_enu3.right[0]);
          -  -  -  -  -  
                      - ]
     657   [ +  -  -  +  :          1 :   ASSERT_EQ(border_enu1.right[3], border_enu2.right[0]);
          -  -  -  -  -  
                      - ]
     658   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(border_enu1.left), calcLength(border_enu3.left));
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     659   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(border_enu1.right), calcLength(border_enu3.right));
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     660         [ +  - ]:          1 :   physics::Distance leftedge_length = calcLength(border_enu1.left);
     661         [ +  - ]:          1 :   physics::Distance rightedge_length = calcLength(border_enu1.right);
     662                 :            : 
     663         [ +  - ]:          1 :   auto borderLength = calcLength(border_enu1);
     664   [ +  -  +  -  :          1 :   ASSERT_EQ(0.5 * (leftedge_length + rightedge_length), borderLength);
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     665                 :            : 
     666   [ +  -  +  -  :          5 :   lane::ENUBorderList enuBorderList{border_enu1, border_enu1, border_enu1};
             +  -  +  - ]
     667   [ +  -  +  -  :          1 :   ASSERT_EQ(3.0 * borderLength, calcLength(enuBorderList));
          +  -  -  +  -  
             -  -  -  -  
                      - ]
     668                 :            : 
     669                 :          1 :   edge_enu1.clear();
     670                 :          1 :   edge_enu2.clear();
     671         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 404., 1));
     672         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 404., 1));
     673         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1., 4., 1));
     674         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(401., 4., 1));
     675         [ +  - ]:          1 :   border_enu1.left = edge_enu1;
     676         [ +  - ]:          1 :   border_enu1.right = edge_enu2;
     677                 :          1 :   edge_enu1.clear();
     678                 :          1 :   edge_enu2.clear();
     679         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(801., 1004., 1));
     680         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1201., 1004., 1));
     681         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(801., 604., 1));
     682         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1201., 604., 1));
     683         [ +  - ]:          1 :   border_enu2.left = edge_enu1;
     684         [ +  - ]:          1 :   border_enu2.right = edge_enu2;
     685         [ +  - ]:          1 :   border_enu3 = border_enu1;
     686         [ +  - ]:          1 :   makeTransitionFromFirstBorderContinuous(border_enu1, border_enu2);
     687   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(border_enu1.left), leftedge_length);
          -  +  -  -  -  
                -  -  - ]
     688   [ +  -  +  -  :          1 :   ASSERT_GT(calcLength(border_enu1.right), rightedge_length);
          -  +  -  -  -  
                -  -  - ]
     689                 :            : 
     690         [ +  - ]:          1 :   struct IndexPairs indexPairs = getIndexPairs(edge_enu1, edge_enu2);
     691   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices.size(), 2u);
          -  -  -  -  -  
                      - ]
     692   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices[0], 0u);
          -  -  -  -  -  
                      - ]
     693   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices[1], 1u);
          -  -  -  -  -  
                      - ]
     694   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices, indexPairs.rightEdgeIndices);
          -  -  -  -  -  
                      - ]
     695                 :            : 
     696                 :          1 :   edge_enu1.clear();
     697                 :          1 :   edge_enu2.clear();
     698         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(1., 404., 1));
     699         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(401., 404., 1));
     700         [ +  - ]:          1 :   edge_enu1.push_back(createENUPoint(801., 404., 1));
     701         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(1., 4., 1));
     702         [ +  - ]:          1 :   edge_enu2.push_back(createENUPoint(401., 4., 1));
     703         [ +  - ]:          1 :   indexPairs = getIndexPairs(edge_enu1, edge_enu2);
     704   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices.size(), 3u);
          -  -  -  -  -  
                      - ]
     705   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices[0], 0u);
          -  -  -  -  -  
                      - ]
     706   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices[1], 1u);
          -  -  -  -  -  
                      - ]
     707   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.leftEdgeIndices[2], 2u);
          -  -  -  -  -  
                      - ]
     708   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.rightEdgeIndices.size(), 3u);
          -  -  -  -  -  
                      - ]
     709   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.rightEdgeIndices[0], 0u);
          -  -  -  -  -  
                      - ]
     710   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.rightEdgeIndices[1], 1u);
          -  -  -  -  -  
                      - ]
     711   [ +  -  -  +  :          1 :   ASSERT_EQ(indexPairs.rightEdgeIndices[2], 1u);
          -  -  -  -  -  
                      - ]
     712                 :            : }

Generated by: LCOV version 1.14