LCOV - code coverage report
Current view: top level - tests/point - PointOperationTests.cpp (source / functions) Hit Total Coverage
Test: ad_map_access Lines: 117 117 100.0 %
Date: 2022-10-04 09:48:07 Functions: 17 17 100.0 %
Branches: 134 368 36.4 %

           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/ENUOperation.hpp>
      11                 :            : #include <ad/map/point/Operation.hpp>
      12                 :            : #include <ad/map/point/Transform.hpp>
      13                 :            : #include <gtest/gtest.h>
      14                 :            : 
      15                 :            : double const epsilon = 0.00001;
      16                 :            : 
      17                 :            : using namespace ::ad;
      18                 :            : using namespace ::ad::map;
      19                 :            : using namespace ::ad::map::point;
      20                 :            : 
      21                 :            : struct PointOperationTest : ::testing::Test
      22                 :            : {
      23                 :          7 :   PointOperationTest()
      24                 :          7 :   {
      25                 :          7 :   }
      26                 :            : 
      27                 :          7 :   virtual void SetUp()
      28                 :            :   {
      29                 :          7 :   }
      30                 :            : 
      31                 :          7 :   virtual void TearDown()
      32                 :            :   {
      33                 :          7 :     access::cleanup();
      34                 :          7 :   }
      35                 :            : };
      36                 :            : 
      37                 :          2 : TEST_F(PointOperationTest, dot_product)
      38                 :            : {
      39                 :            :   std::vector<std::pair<double, std::pair<ENUPoint, ENUPoint>>> testVectors{
      40   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(10., 0., 0.), createENUPoint(0., 10., 0.))),
      41   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(10., 0., 0.), createENUPoint(0., 0., 10.))),
      42   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(0., 10., 0.), createENUPoint(0., 0., 10.))),
      43   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(0., 10., 0.), createENUPoint(10., 0., 0.))),
      44   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(0., 0., 10.), createENUPoint(10., 0., 0.))),
      45   [ +  -  +  - ]:          1 :     std::make_pair(0., std::make_pair(createENUPoint(0., 0., 10.), createENUPoint(0., 10., 0.))),
      46   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(10., 0., 0.), createENUPoint(10., 0., 0.))),
      47   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(0., 10., 0.), createENUPoint(0., 10., 0.))),
      48   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(0., 0., 10.), createENUPoint(0., 0., 10.))),
      49   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(10., 0., 0.), createENUPoint(-10., 0., 0.))),
      50   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(0., 10., 0.), createENUPoint(0., -10., 0.))),
      51   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(0., 0., 10.), createENUPoint(0., 0., -10.))),
      52   [ +  -  +  - ]:          1 :     std::make_pair(300., std::make_pair(createENUPoint(10., 10., 10.), createENUPoint(10., 10., 10.))),
      53   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(-10., 10., 10.), createENUPoint(10., 10., 10.))),
      54   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(10., -10., 10.), createENUPoint(10., 10., 10.))),
      55   [ +  -  +  - ]:          1 :     std::make_pair(100., std::make_pair(createENUPoint(10., 10., -10.), createENUPoint(10., 10., 10.))),
      56   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(-10., -10., 10.), createENUPoint(10., 10., 10.))),
      57   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(10., -10., -10.), createENUPoint(10., 10., 10.))),
      58   [ +  -  +  - ]:          1 :     std::make_pair(-100., std::make_pair(createENUPoint(-10., 10., -10.), createENUPoint(10., 10., 10.))),
      59   [ +  -  +  -  :          2 :     std::make_pair(-300., std::make_pair(createENUPoint(-10., -10., -10.), createENUPoint(10., 10., 10.)))};
                   +  - ]
      60                 :            : 
      61         [ +  + ]:         21 :   for (auto entry : testVectors)
      62                 :            :   {
      63                 :         20 :     auto result = vectorDotProduct(entry.second.first, entry.second.second);
      64   [ +  -  -  +  :         20 :     EXPECT_NEAR(entry.first, result, epsilon);
          -  -  -  -  -  
                      - ]
      65         [ +  - ]:         20 :     result = entry.second.first * entry.second.second;
      66   [ +  -  -  +  :         20 :     EXPECT_NEAR(entry.first, result, epsilon);
          -  -  -  -  -  
                      - ]
      67                 :            :   }
      68                 :          1 : }
      69                 :            : 
      70                 :          2 : TEST_F(PointOperationTest, cross_product)
      71                 :            : {
      72                 :            :   std::vector<std::pair<ENUPoint, std::pair<ENUPoint, ENUPoint>>> testVectors{
      73   [ +  -  +  - ]:          1 :     std::make_pair(createENUPoint(0., 0., 1.), std::make_pair(createENUPoint(1., 0., 0.), createENUPoint(0., 1., 0.))),
      74   [ +  -  +  - ]:          1 :     std::make_pair(createENUPoint(1., 0., 0.), std::make_pair(createENUPoint(0., 1., 0.), createENUPoint(0., 0., 1.))),
      75   [ +  -  +  - ]:          1 :     std::make_pair(createENUPoint(0., 1., 0.), std::make_pair(createENUPoint(0., 0., 1.), createENUPoint(1., 0., 0.))),
      76         [ +  - ]:          2 :   };
      77                 :            : 
      78         [ +  + ]:          4 :   for (auto entry : testVectors)
      79                 :            :   {
      80         [ +  - ]:          3 :     auto result = vectorCrossProduct(entry.second.first, entry.second.second);
      81   [ +  -  -  +  :          3 :     EXPECT_EQ(entry.first, result);
          -  -  -  -  -  
                      - ]
      82         [ +  - ]:          3 :     result = vectorCrossProduct(entry.second.second, entry.second.first);
      83   [ +  -  +  -  :          3 :     EXPECT_EQ(-1. * entry.first, result);
          -  +  -  -  -  
                -  -  - ]
      84                 :            :   }
      85                 :          1 : }
      86                 :            : 
      87                 :          2 : TEST_F(PointOperationTest, enu_heading_normalization)
      88                 :            : {
      89         [ +  - ]:          2 :   std::vector<double> numbers{0., 22., 85.6, 90., 101., 130., 179., 179.99};
      90         [ +  + ]:          9 :   for (auto number : numbers)
      91                 :            :   {
      92         [ +  - ]:          8 :     ENUHeading a = createENUHeading(degree2radians(number));
      93   [ +  -  -  +  :          8 :     EXPECT_EQ(a, ENUHeading(degree2radians(number)));
          -  -  -  -  -  
                      - ]
      94                 :            : 
      95         [ +  - ]:          8 :     ENUHeading b = createENUHeading(degree2radians(-number));
      96   [ +  -  -  +  :          8 :     EXPECT_EQ(b, ENUHeading(degree2radians(-number)));
          -  -  -  -  -  
                      - ]
      97                 :            : 
      98         [ +  - ]:          8 :     ENUHeading a1 = createENUHeading(degree2radians(number + 360.));
      99   [ +  -  -  +  :          8 :     EXPECT_EQ(a1, ENUHeading(degree2radians(number)));
          -  -  -  -  -  
                      - ]
     100                 :            : 
     101         [ +  - ]:          8 :     ENUHeading a2 = createENUHeading(degree2radians(number - 360.));
     102   [ +  -  -  +  :          8 :     EXPECT_EQ(a2, ENUHeading(degree2radians(number)));
          -  -  -  -  -  
                      - ]
     103                 :            : 
     104         [ +  - ]:          8 :     ENUHeading b1 = createENUHeading(degree2radians(-number + 360.));
     105   [ +  -  -  +  :          8 :     EXPECT_EQ(b1, ENUHeading(degree2radians(-number)));
          -  -  -  -  -  
                      - ]
     106                 :            : 
     107         [ +  - ]:          8 :     ENUHeading b2 = createENUHeading(degree2radians(-number - 360.));
     108   [ +  -  -  +  :          8 :     EXPECT_EQ(b2, ENUHeading(degree2radians(-number)));
          -  -  -  -  -  
                      - ]
     109                 :            :   }
     110                 :            : 
     111         [ +  - ]:          1 :   ENUHeading d = createENUHeading(degree2radians(-180.));
     112   [ +  -  -  +  :          1 :   EXPECT_EQ(d, ENUHeading(degree2radians(180)));
          -  -  -  -  -  
                      - ]
     113                 :          1 : }
     114                 :            : 
     115                 :          2 : TEST_F(PointOperationTest, enu_heading_construction)
     116                 :            : {
     117                 :          1 :   GeoPoint enuReferencePoint;
     118                 :          1 :   enuReferencePoint.longitude = Longitude(8.4399515);
     119                 :          1 :   enuReferencePoint.latitude = Latitude(49.0189305);
     120                 :          1 :   enuReferencePoint.altitude = Altitude(0.);
     121                 :            : 
     122   [ +  -  +  - ]:          1 :   access::init("test_files/TPK.adm.txt");
     123                 :            : 
     124         [ +  - ]:          1 :   access::setENUReferencePoint(enuReferencePoint);
     125         [ +  - ]:          1 :   ECEFPoint enuReferencePointEcef = toECEF(enuReferencePoint);
     126                 :            : 
     127         [ +  - ]:          1 :   std::vector<std::pair<ENUPoint, double>> pointPairs{std::make_pair(createENUPoint(1., 0., 0.), 0.),
     128         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(0., 1., 0.), 90.),
     129         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(-1., 0., 0.), 180.),
     130         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(0., -1., 0.), -90.),
     131         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(5., 0., 0.), 0.),
     132         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(5., 5., 0.), 45.),
     133         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(0., 5., 0.), 90.),
     134         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(-5., 5., 0.), 135.),
     135         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(-5., 0., 0.), 180.),
     136         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(-5., -5., 0.), -135.),
     137         [ +  - ]:          1 :                                                       std::make_pair(createENUPoint(0., -5., 0.), -90.),
     138   [ +  -  +  - ]:          2 :                                                       std::make_pair(createENUPoint(5., -5., 0.), -45.)};
     139                 :            : 
     140         [ +  + ]:         13 :   for (auto pairElement : pointPairs)
     141                 :            :   {
     142   [ +  -  +  - ]:         12 :     ECEFHeading heading = createECEFHeading(enuReferencePointEcef, toECEF(pairElement.first));
     143         [ +  - ]:         12 :     ENUHeading a = createENUHeading(heading, enuReferencePoint);
     144   [ +  -  -  +  :         12 :     EXPECT_EQ(a, ENUHeading(degree2radians(pairElement.second)));
          -  -  -  -  -  
                      - ]
     145                 :            :   }
     146                 :          1 : }
     147                 :            : 
     148                 :          2 : TEST_F(PointOperationTest, NearestPointOnLine)
     149                 :            : {
     150                 :            :   {
     151                 :          1 :     ECEFPoint pt0 = createECEFPoint(1, 1, 0);
     152                 :          1 :     ECEFPoint pt1 = createECEFPoint(3, 1, 0);
     153                 :          1 :     ECEFPoint pt = createECEFPoint(2, 2, 0);
     154         [ +  - ]:          1 :     auto t = findNearestPointOnEdge(pt, pt0, pt1);
     155   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::RatioValue(0.5));
          -  -  -  -  -  
                      - ]
     156                 :            :   }
     157                 :            : }
     158                 :            : 
     159                 :          2 : TEST_F(PointOperationTest, NearestPointOnSegment)
     160                 :            : {
     161                 :          1 :   ECEFPoint pt0 = createECEFPoint(1, 1, 0);
     162                 :          1 :   ECEFPoint pt1 = createECEFPoint(3, 1, 0);
     163                 :            :   {
     164                 :          1 :     ECEFPoint pt = createECEFPoint(2, 2, 0);
     165         [ +  - ]:          1 :     auto t = findNearestPointOnSegment(pt, pt0, pt1);
     166   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::ParametricValue(0.5));
          -  -  -  -  -  
                      - ]
     167                 :            :   }
     168                 :            :   {
     169                 :          1 :     ECEFPoint pt = createECEFPoint(0, 2, 0);
     170         [ +  - ]:          1 :     auto t = findNearestPointOnSegment(pt, pt0, pt1);
     171   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::ParametricValue(0.));
          -  -  -  -  -  
                      - ]
     172                 :            :   }
     173                 :            :   {
     174                 :          1 :     ECEFPoint pt = createECEFPoint(7, 3, 7);
     175         [ +  - ]:          1 :     auto t = findNearestPointOnSegment(pt, pt0, pt1);
     176   [ +  -  -  +  :          1 :     ASSERT_EQ(t, physics::ParametricValue(1.));
          -  -  -  -  -  
                      - ]
     177                 :            :   }
     178                 :            : }
     179                 :            : 
     180                 :          2 : TEST_F(PointOperationTest, CalcENUDistance)
     181                 :            : {
     182                 :          1 :   ENUPoint pt1 = point::createENUPoint(1., 2., 3.);
     183                 :          1 :   ENUPoint pt2 = point::createENUPoint(2., 3., 4.);
     184                 :          1 :   ENUEdge edge;
     185         [ +  - ]:          1 :   edge.push_back(pt1);
     186         [ +  - ]:          1 :   edge.push_back(pt2);
     187         [ +  - ]:          1 :   auto ret = point::calcLength(edge);
     188   [ +  -  -  +  :          1 :   ASSERT_DOUBLE_EQ(static_cast<double>(ret), std::sqrt(3.));
          -  -  -  -  -  
                      - ]
     189   [ +  -  +  - ]:          1 :   ENUHeading heading = normalizeENUHeading(point::createENUHeading(M_PI_2));
     190   [ +  -  +  -  :          1 :   ASSERT_EQ(heading, createENUHeading(M_PI_2));
          -  +  -  -  -  
                -  -  - ]
     191                 :            : }

Generated by: LCOV version 1.14