LCOV - code coverage report
Current view: top level - tests/point - GeometryOperationTests.cpp (source / functions) Hit Total Coverage
Test: ad_map_access Lines: 186 186 100.0 %
Date: 2022-10-04 09:48:07 Functions: 12 12 100.0 %
Branches: 166 602 27.6 %

           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/Operation.hpp>
      10                 :            : #include <ad/map/point/Operation.hpp>
      11                 :            : #include <gtest/gtest.h>
      12                 :            : 
      13                 :            : using namespace ::ad;
      14                 :            : using namespace ::ad::map;
      15                 :            : using namespace ::ad::map::point;
      16                 :            : 
      17                 :            : struct GeometryOperationTest : ::testing::Test
      18                 :            : {
      19                 :          4 :   GeometryOperationTest()
      20                 :          4 :   {
      21                 :          4 :   }
      22                 :            : 
      23                 :          4 :   virtual ~GeometryOperationTest() = default;
      24                 :            : 
      25                 :          4 :   virtual void SetUp()
      26                 :            :   {
      27                 :          4 :   }
      28                 :            : 
      29                 :          4 :   virtual void TearDown()
      30                 :            :   {
      31                 :          4 :     access::cleanup();
      32                 :          4 :   }
      33                 :            : };
      34                 :            : 
      35                 :          2 : TEST_F(GeometryOperationTest, NearestPointOnEdge)
      36                 :            : {
      37                 :          1 :   ECEFEdge pts;
      38         [ +  - ]:          1 :   pts.push_back(createECEFPoint(2, 1, 0));
      39         [ +  - ]:          1 :   pts.push_back(createECEFPoint(4, 1, 0));
      40         [ +  - ]:          1 :   pts.push_back(createECEFPoint(6, 3, 0));
      41         [ +  - ]:          1 :   pts.push_back(createECEFPoint(6, 5, 0));
      42         [ +  - ]:          1 :   Geometry geo = createGeometry(pts, false);
      43                 :            :   {
      44                 :          1 :     ECEFPoint pt = createECEFPoint(6.5, 3.5, 0);
      45         [ +  - ]:          1 :     auto t_geo = findNearestPointOnEdge(geo, pt);
      46         [ +  - ]:          1 :     ECEFPoint pt_geo = getParametricPoint(geo, t_geo);
      47         [ +  - ]:          1 :     auto t_seg = findNearestPointOnSegment(pt, pts[2], pts[3]);
      48         [ +  - ]:          1 :     ECEFPoint pt_seg = vectorInterpolate(pts[2], pts[3], t_seg);
      49   [ +  -  -  +  :          1 :     ASSERT_EQ(pt_geo, pt_seg);
          -  -  -  -  -  
                      - ]
      50                 :            :   }
      51                 :            :   {
      52                 :          1 :     ECEFPoint pt = createECEFPoint(1, 1, 1);
      53         [ +  - ]:          1 :     auto t = findNearestPointOnEdge(geo, pt);
      54   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::ParametricValue(0.));
          -  -  -  -  -  
                      - ]
      55                 :            :   }
      56                 :            :   {
      57                 :          1 :     ECEFPoint pt = createECEFPoint(2, 7, 0);
      58         [ +  - ]:          1 :     auto t = findNearestPointOnEdge(geo, pt);
      59   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::ParametricValue(1.));
          -  -  -  -  -  
                      - ]
      60                 :            :   }
      61                 :            : }
      62                 :            : 
      63                 :          2 : TEST_F(GeometryOperationTest, Position)
      64                 :            : {
      65                 :          1 :   ECEFEdge edge_ecef1;
      66                 :          1 :   ECEFEdge edge_ecef2;
      67                 :          1 :   Geometry geo1;
      68                 :          1 :   Geometry geo2;
      69                 :            : 
      70         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
      71         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
      72                 :            : 
      73   [ +  -  -  +  :          1 :   ASSERT_FALSE(isSuccessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      74   [ +  -  -  +  :          1 :   ASSERT_FALSE(isPredecessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      75   [ +  -  -  +  :          1 :   ASSERT_FALSE(haveSameStart(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      76   [ +  -  -  +  :          1 :   ASSERT_FALSE(haveSameEnd(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      77                 :            : 
      78         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 0));
      79         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(3, 4, 0));
      80         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
      81         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
      82   [ +  -  -  +  :          1 :   ASSERT_FALSE(isSuccessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      83   [ +  -  -  +  :          1 :   ASSERT_FALSE(isPredecessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      84   [ +  -  -  +  :          1 :   ASSERT_FALSE(haveSameStart(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      85   [ +  -  -  +  :          1 :   ASSERT_FALSE(haveSameEnd(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      86                 :            : 
      87                 :          1 :   edge_ecef1.clear();
      88                 :          1 :   edge_ecef2.clear();
      89         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 0));
      90         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(3, 4, 0));
      91         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(1, 2, 0));
      92         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(4, 5, 0));
      93         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
      94         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
      95   [ +  -  -  +  :          1 :   ASSERT_TRUE(isPredecessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      96   [ +  -  -  +  :          1 :   ASSERT_TRUE(haveSameStart(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
      97                 :            : 
      98                 :          1 :   edge_ecef1.clear();
      99                 :          1 :   edge_ecef2.clear();
     100         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 0));
     101         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(3, 4, 0));
     102         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(1, 2, 1));
     103         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(3, 4, 0));
     104         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     105         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     106   [ +  -  -  +  :          1 :   ASSERT_TRUE(isSuccessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
     107   [ +  -  -  +  :          1 :   ASSERT_TRUE(haveSameEnd(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
     108                 :            : 
     109                 :          1 :   edge_ecef1.clear();
     110                 :          1 :   edge_ecef2.clear();
     111         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 0));
     112         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(3, 4, 0));
     113         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(3, 4, 0));
     114         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(1, 2, 0));
     115         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     116         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     117   [ +  -  -  +  :          1 :   ASSERT_TRUE(isSuccessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
     118   [ +  -  -  +  :          1 :   ASSERT_TRUE(isPredecessor(geo1, geo2));
          -  -  -  -  -  
                -  -  - ]
     119                 :            : }
     120                 :            : 
     121                 :          2 : TEST_F(GeometryOperationTest, ParametricRange)
     122                 :            : {
     123                 :          1 :   physics::ParametricRange trange;
     124                 :          1 :   trange.minimum = physics::ParametricValue(0.2);
     125                 :          1 :   trange.maximum = physics::ParametricValue(0.8);
     126                 :          1 :   ECEFEdge edge_ecef1;
     127         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 3));
     128         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(2, 2, 3));
     129         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(3, 2, 3));
     130                 :          1 :   ECEFEdge edge_ecef2;
     131                 :          1 :   Geometry geo1, geo2;
     132         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     133                 :            : 
     134                 :          1 :   ECEFEdge edge_ecef3;
     135         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_ecef3, false);
     136   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3.size(), 3u);
          -  -  -  -  -  
                      - ]
     137   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[0], createECEFPoint(1.4, 2, 3));
          -  -  -  -  -  
                      - ]
     138   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[1], createECEFPoint(2, 2, 3));
          -  -  -  -  -  
                      - ]
     139   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[2], createECEFPoint(2.6, 2, 3));
          -  -  -  -  -  
                      - ]
     140                 :            : 
     141                 :          1 :   edge_ecef3.clear();
     142         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_ecef3, true);
     143   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3.size(), 3u);
          -  -  -  -  -  
                      - ]
     144   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[0], createECEFPoint(2.6, 2, 3));
          -  -  -  -  -  
                      - ]
     145   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[1], createECEFPoint(2, 2, 3));
          -  -  -  -  -  
                      - ]
     146   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[2], createECEFPoint(1.4, 2, 3));
          -  -  -  -  -  
                      - ]
     147                 :            : 
     148                 :          1 :   edge_ecef1.clear();
     149                 :          1 :   edge_ecef2.clear();
     150                 :          1 :   edge_ecef3.clear();
     151         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(10000, 200000, 300000));
     152         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(20000, 200000, 300000));
     153         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(30000, 200000, 300000));
     154         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     155         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_ecef3, false);
     156                 :          1 :   GeoEdge edge_geo1;
     157         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_geo1, false);
     158   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1.size(), 3u);
          -  -  -  -  -  
                      - ]
     159                 :          1 :   GeoEdge edge_geo2;
     160         [ +  - ]:          1 :   edge_geo2 = toGeo(edge_ecef3);
     161   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[0], edge_geo2[0]);
          -  -  -  -  -  
                      - ]
     162   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[1], edge_geo2[1]);
          -  -  -  -  -  
                      - ]
     163   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[2], edge_geo2[2]);
          -  -  -  -  -  
                      - ]
     164                 :            : 
     165                 :          1 :   edge_ecef1.clear();
     166                 :          1 :   edge_ecef2.clear();
     167                 :          1 :   edge_ecef3.clear();
     168         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(10000, 200000, 300000));
     169         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(20000, 200000, 300000));
     170         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(30000, 200000, 300000));
     171         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     172         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_ecef3, true);
     173         [ +  - ]:          1 :   getParametricRange(geo1, trange, edge_geo1, true);
     174   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1.size(), 3u);
          -  -  -  -  -  
                      - ]
     175         [ +  - ]:          1 :   edge_geo2 = toGeo(edge_ecef3);
     176   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[0], edge_geo2[0]);
          -  -  -  -  -  
                      - ]
     177   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[1], edge_geo2[1]);
          -  -  -  -  -  
                      - ]
     178   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_geo1[2], edge_geo2[2]);
          -  -  -  -  -  
                      - ]
     179                 :            : 
     180                 :          1 :   edge_ecef1.clear();
     181                 :          1 :   edge_ecef2.clear();
     182                 :          1 :   edge_ecef3.clear();
     183         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(1, 2, 3));
     184         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(2, 2, 3));
     185         [ +  - ]:          1 :   edge_ecef1.push_back(createECEFPoint(3, 2, 3));
     186         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(6, 6, 6));
     187         [ +  - ]:          1 :   edge_ecef2.push_back(createECEFPoint(8, 6, 6));
     188         [ +  - ]:          1 :   geo1 = createGeometry(edge_ecef1, false);
     189         [ +  - ]:          1 :   geo2 = createGeometry(edge_ecef2, false);
     190         [ +  - ]:          1 :   edge_ecef3 = getMiddleEdge(geo1, geo2);
     191   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3.size(), 3u);
          -  -  -  -  -  
                      - ]
     192   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[0], createECEFPoint(3.5, 4, 4.5));
          -  -  -  -  -  
                      - ]
     193   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[1], createECEFPoint(4.5, 4, 4.5));
          -  -  -  -  -  
                      - ]
     194   [ +  -  -  +  :          1 :   ASSERT_EQ(edge_ecef3[2], createECEFPoint(5.5, 4, 4.5));
          -  -  -  -  -  
                      - ]
     195                 :            : }
     196                 :            : 
     197                 :          2 : TEST_F(GeometryOperationTest, ParametricRangeENU)
     198                 :            : {
     199                 :          1 :   physics::ParametricRange trange;
     200                 :          1 :   ECEFEdge edge_ecef1, edge_ecef2;
     201                 :          1 :   Geometry geome;
     202                 :          1 :   ENUEdge edge_enu;
     203                 :            : 
     204                 :          1 :   trange.minimum = physics::ParametricValue(0.2);
     205                 :          1 :   trange.maximum = physics::ParametricValue(0.8);
     206                 :            : 
     207         [ +  - ]:          1 :   CoordinateTransform mCoordinateTransform;
     208                 :          1 :   const Altitude h(123.456);  // Invented altitude.
     209                 :          1 :   const Altitude dh(100.123); // Invented altitude difference.
     210                 :          1 :   GeoPoint geo0, geo1, geo2, geo3;
     211                 :            :   // Position of Intel Office
     212                 :          1 :   geo1 = createGeoPoint(Longitude(-121.935549), Latitude(37.401336), h);
     213                 :            :   // Position of San Jose Fire Department Station 29
     214                 :          1 :   geo2 = createGeoPoint(Longitude(-121.933886), Latitude(37.401112), h);
     215                 :            :   // Position of San Jose Fire Department Station 29 + altitude difference
     216         [ +  - ]:          1 :   geo3 = createGeoPoint(Longitude(-121.933886), Latitude(37.401112), h + dh);
     217                 :            : 
     218                 :          1 :   ECEFPoint ecef1, ecef2, ecef3;
     219         [ +  - ]:          1 :   ecef1 = mCoordinateTransform.Geo2ECEF(geo1);
     220         [ +  - ]:          1 :   ecef2 = mCoordinateTransform.Geo2ECEF(geo2);
     221         [ +  - ]:          1 :   ecef3 = mCoordinateTransform.Geo2ECEF(geo3);
     222                 :            : 
     223         [ +  - ]:          1 :   edge_ecef1.push_back(ecef1);
     224         [ +  - ]:          1 :   edge_ecef1.push_back(ecef2);
     225         [ +  - ]:          1 :   edge_ecef1.push_back(ecef3);
     226         [ +  - ]:          1 :   geome = createGeometry(edge_ecef1, false);
     227                 :            : 
     228         [ +  - ]:          1 :   mCoordinateTransform.setENUReferencePoint(geo1);
     229                 :          1 :   ENUPoint enu1, enu2, enu3;
     230         [ +  - ]:          1 :   enu1 = mCoordinateTransform.ECEF2ENU(ecef1);
     231         [ +  - ]:          1 :   enu2 = mCoordinateTransform.ECEF2ENU(ecef2);
     232         [ +  - ]:          1 :   enu3 = mCoordinateTransform.ECEF2ENU(ecef3);
     233                 :            : 
     234                 :            : #if SAFE_DATAYPES_THROW
     235                 :            :   //@todo: recheck when generator supports some compiler define to make feature visible to the outside
     236                 :            :   EXPECT_THROW(getParametricRange(geome, trange, edge_enu, false), std::out_of_range);
     237                 :            : #endif
     238   [ +  -  +  -  :          1 :   ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
          -  +  -  -  -  
             -  -  -  -  
                      - ]
     239                 :            : #if SAFE_DATAYPES_THROW
     240                 :            :   //@todo: recheck when generator supports some compiler define to make feature visible to the outside
     241                 :            :   EXPECT_THROW(getParametricRange(geome, trange, edge_enu, false), std::out_of_range);
     242                 :            : #endif
     243         [ +  - ]:          1 :   access::setENUReferencePoint(geo1);
     244                 :            : 
     245                 :          1 :   edge_enu.clear();
     246         [ +  - ]:          1 :   getParametricRange(geome, trange, edge_ecef2, false);
     247         [ +  - ]:          1 :   getParametricRange(geome, trange, edge_enu, false);
     248         [ +  - ]:          1 :   physics::Distance ecef_edge_length = calcLength(edge_ecef2);
     249         [ +  - ]:          1 :   physics::Distance enu_edge_length = calcLength(edge_enu);
     250   [ +  -  -  +  :          1 :   EXPECT_EQ(ecef_edge_length, enu_edge_length);
          -  -  -  -  -  
                      - ]
     251                 :            : 
     252                 :          1 :   edge_enu.clear();
     253         [ +  - ]:          1 :   getParametricRange(geome, trange, edge_ecef2, true);
     254         [ +  - ]:          1 :   getParametricRange(geome, trange, edge_enu, true);
     255         [ +  - ]:          1 :   ecef_edge_length = calcLength(edge_ecef2);
     256         [ +  - ]:          1 :   enu_edge_length = calcLength(edge_enu);
     257   [ +  -  -  +  :          1 :   EXPECT_EQ(ecef_edge_length, enu_edge_length);
          -  -  -  -  -  
                      - ]
     258                 :            : }

Generated by: LCOV version 1.14