LCOV - code coverage report
Current view: top level - autotest/cpp - test_gdal_vectorx.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 222 222 100.0 %
Date: 2025-05-31 00:00:17 Functions: 117 117 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * Project:  GDAL Vector abstraction
       3             :  * Purpose:  Tests for the VectorX class
       4             :  * Author:   Javier Jimenez Shaw
       5             :  *
       6             :  ******************************************************************************
       7             :  * Copyright (c) 2024, Javier Jimenez Shaw
       8             :  *
       9             :  * SPDX-License-Identifier: MIT
      10             :  ****************************************************************************/
      11             : 
      12             : #include "gdal_unit_test.h"
      13             : 
      14             : #include "gdal_vectorx.h"
      15             : 
      16             : #include <array>
      17             : #include <cmath>
      18             : #include <complex>
      19             : #include <limits>
      20             : #include <type_traits>
      21             : 
      22             : #include "gtest_include.h"
      23             : 
      24             : namespace
      25             : {
      26             : 
      27             : // Common fixture with test data
      28             : struct test_vectorx : public ::testing::Test
      29             : {
      30             : };
      31             : 
      32             : // Dummy test
      33           4 : TEST_F(test_vectorx, simple_int)
      34             : {
      35           1 :     gdal::Vector2i a;
      36           1 :     EXPECT_EQ(0, a.x());
      37           1 :     EXPECT_EQ(0, a.y());
      38             :     static_assert(std::is_same_v<decltype(a)::value_type, int> == true);
      39             : 
      40           1 :     gdal::Vector2i p2(2, 3);
      41           1 :     EXPECT_EQ(2, p2.x());
      42           1 :     EXPECT_EQ(3, p2.y());
      43             : 
      44           1 :     gdal::Vector3i p3(12, 13, 14);
      45           1 :     EXPECT_EQ(12, p3.x());
      46           1 :     EXPECT_EQ(13, p3.y());
      47           1 :     EXPECT_EQ(14, p3.z());
      48             : 
      49           1 :     gdal::VectorX<int, 1> p1{2};
      50           1 :     EXPECT_EQ(2, p1.x());
      51             : 
      52           1 :     gdal::VectorX<int, 4> p4(12, 13, -14, 150);
      53           1 :     EXPECT_EQ(12, p4.x());
      54           1 :     EXPECT_EQ(13, p4.y());
      55           1 :     EXPECT_EQ(-14, p4.z());
      56           1 :     EXPECT_EQ(150, p4[3]);
      57           1 : }
      58             : 
      59           4 : TEST_F(test_vectorx, simple_double)
      60             : {
      61           1 :     gdal::Vector2d a;
      62           1 :     EXPECT_EQ(0.0, a.x());
      63           1 :     EXPECT_EQ(0.0, a.y());
      64           1 :     EXPECT_EQ(2, a.size());
      65             :     static_assert(std::is_same_v<decltype(a)::value_type, double> == true);
      66             : 
      67           1 :     gdal::Vector2d p2(2.1, 3.6);
      68           1 :     EXPECT_EQ(2.1, p2.x());
      69           1 :     EXPECT_EQ(3.6, p2.y());
      70           1 :     EXPECT_EQ(2, p2.size());
      71             : 
      72           1 :     gdal::Vector3d p3(12e-2, -13.0, 14e3);
      73           1 :     EXPECT_EQ(12e-2, p3.x());
      74           1 :     EXPECT_EQ(-13.0, p3.y());
      75           1 :     EXPECT_EQ(14e3, p3.z());
      76           1 :     EXPECT_EQ(3, p3.size());
      77             : 
      78           1 :     gdal::VectorX<double, 1> p1{2.1};
      79           1 :     EXPECT_EQ(2.1, p1.x());
      80           1 :     EXPECT_EQ(1, p1.size());
      81             : 
      82           1 :     gdal::VectorX<double, 4> p4(12.0, 13.1, -14.2, 150.0);
      83           1 :     EXPECT_EQ(12.0, p4.x());
      84           1 :     EXPECT_EQ(13.1, p4.y());
      85           1 :     EXPECT_EQ(-14.2, p4.z());
      86           1 :     EXPECT_EQ(150.0, p4[3]);
      87           1 :     EXPECT_EQ(4, p4.size());
      88           1 : }
      89             : 
      90           4 : TEST_F(test_vectorx, simple_float)
      91             : {
      92           1 :     gdal::VectorX<float, 1> p1{2.1f};
      93           1 :     EXPECT_EQ(2.1f, p1.x());
      94             :     static_assert(std::is_same_v<decltype(p1)::value_type, float> == true);
      95             : 
      96           1 :     gdal::VectorX<float, 4> p4(12.0f, 13.1f, -14.2f, 150.0f);
      97           1 :     EXPECT_EQ(12.0f, p4.x());
      98           1 :     EXPECT_EQ(13.1f, p4.y());
      99           1 :     EXPECT_EQ(-14.2f, p4.z());
     100           1 :     EXPECT_EQ(150.0f, p4[3]);
     101           1 : }
     102             : 
     103           4 : TEST_F(test_vectorx, simple_complex)
     104             : {
     105             :     using namespace std::complex_literals;
     106           1 :     gdal::VectorX<std::complex<double>, 2> p2{2.1 + 3.0i, -9.0 + -7.0i};
     107           1 :     EXPECT_EQ(2.1 + 3.0i, p2.x());
     108           1 :     EXPECT_EQ(-9.0 + -7.0i, p2.y());
     109             :     static_assert(
     110             :         std::is_same_v<decltype(p2)::value_type, std::complex<double>> == true);
     111           1 : }
     112             : 
     113           4 : TEST_F(test_vectorx, array)
     114             : {
     115           1 :     gdal::Vector2d p2(2.1, 3.6);
     116           1 :     const std::array<double, 2> arr = p2.array();
     117           1 :     EXPECT_EQ(2.1, arr[0]);
     118           1 :     EXPECT_EQ(3.6, arr[1]);
     119           1 : }
     120             : 
     121           4 : TEST_F(test_vectorx, fill)
     122             : {
     123           1 :     const gdal::Vector3d a = gdal::Vector3d().fill(42.0);
     124           1 :     EXPECT_EQ(3, a.size());
     125           1 :     EXPECT_EQ(42.0, a[0]);
     126           1 :     EXPECT_EQ(42.0, a[1]);
     127           1 :     EXPECT_EQ(42.0, a[2]);
     128           1 : }
     129             : 
     130           4 : TEST_F(test_vectorx, fill_nan)
     131             : {
     132             :     const gdal::Vector3d a =
     133           1 :         gdal::Vector3d().fill(std::numeric_limits<double>::quiet_NaN());
     134           1 :     EXPECT_EQ(3, a.size());
     135           1 :     EXPECT_TRUE(std::isnan(a[0]));
     136           1 :     EXPECT_TRUE(std::isnan(a[1]));
     137           1 :     EXPECT_TRUE(std::isnan(a[2]));
     138           1 : }
     139             : 
     140           4 : TEST_F(test_vectorx, change)
     141             : {
     142           1 :     gdal::Vector2d p2(2.1, 3.6);
     143           1 :     p2[0] = 7;
     144           1 :     EXPECT_EQ(7, p2.x());
     145           1 :     p2[1] = 10.5;
     146           1 :     EXPECT_EQ(10.5, p2.y());
     147             : 
     148           1 :     gdal::Vector3d p3(12.1, 13.6, -9.0);
     149           1 :     p3.x() = 79;
     150           1 :     EXPECT_EQ(79, p3[0]);
     151           1 :     p3.y() = 10.4;
     152           1 :     EXPECT_EQ(10.4, p3[1]);
     153           1 :     p3.z() = 1.5;
     154           1 :     EXPECT_EQ(1.5, p3[2]);
     155           1 : }
     156             : 
     157           4 : TEST_F(test_vectorx, scalar_prod)
     158             : {
     159           1 :     gdal::Vector2d a(2.1, 3.6);
     160           1 :     gdal::Vector2d b(-2.0, 10.0);
     161           1 :     EXPECT_NEAR(2.1 * -2.0 + 3.6 * 10.0, a.scalarProd(b), 1e-10);
     162           1 : }
     163             : 
     164           4 : TEST_F(test_vectorx, norm2)
     165             : {
     166           1 :     gdal::Vector2d a(2.1, 3.6);
     167           1 :     EXPECT_NEAR(2.1 * 2.1 + 3.6 * 3.6, a.norm2(), 1e-10);
     168           1 : }
     169             : 
     170           4 : TEST_F(test_vectorx, cast)
     171             : {
     172           1 :     gdal::Vector2d a(2.1, -3.6);
     173           1 :     auto b = a.cast<int>();
     174             :     static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
     175           1 :     EXPECT_EQ(2, b.x());
     176           1 :     EXPECT_EQ(-3, b.y());
     177             : 
     178           1 :     gdal::Vector2d c = b.cast<double>();
     179             :     static_assert(std::is_same_v<decltype(c)::value_type, double> == true);
     180           1 :     EXPECT_EQ(2.0, c.x());
     181           1 :     EXPECT_EQ(-3.0, c.y());
     182           1 : }
     183             : 
     184           4 : TEST_F(test_vectorx, floor)
     185             : {
     186           1 :     const gdal::Vector2d a(2.1, -3.6);
     187           1 :     const gdal::Vector2d d = a.floor();
     188           1 :     EXPECT_EQ(2.0, d.x());
     189           1 :     EXPECT_EQ(-4.0, d.y());
     190             : 
     191             :     // just to show how to use the template keyword.
     192           1 :     const gdal::Vector2i i = a.floor().template cast<int>();
     193           1 :     EXPECT_EQ(2, i.x());
     194           1 :     EXPECT_EQ(-4, i.y());
     195           1 : }
     196             : 
     197           4 : TEST_F(test_vectorx, ceil)
     198             : {
     199           1 :     const gdal::Vector2d a(2.1, -3.6);
     200           1 :     const gdal::Vector2d d = a.ceil();
     201           1 :     EXPECT_EQ(3.0, d.x());
     202           1 :     EXPECT_EQ(-3.0, d.y());
     203           1 : }
     204             : 
     205           4 : TEST_F(test_vectorx, apply)
     206             : {
     207           1 :     const gdal::Vector2d a(2.1, -3.6);
     208             :     const gdal::Vector2d d =
     209           3 :         a.apply([](const gdal::Vector2d::value_type v) { return v + 1.0; });
     210           1 :     EXPECT_NEAR(3.1, d.x(), 1e-10);
     211           1 :     EXPECT_NEAR(-2.6, d.y(), 1e-10);
     212           1 : }
     213             : 
     214           4 : TEST_F(test_vectorx, sum)
     215             : {
     216           1 :     const gdal::Vector2d a(2.1, -3.6);
     217           1 :     const gdal::Vector2d b = a + 2.2;
     218           1 :     EXPECT_NEAR(4.3, b.x(), 1e-10);
     219           1 :     EXPECT_NEAR(-1.4, b.y(), 1e-10);
     220           1 : }
     221             : 
     222           4 : TEST_F(test_vectorx, sum_eq)
     223             : {
     224           1 :     gdal::Vector2d a(2.1, -3.6);
     225           1 :     a += 2.0;
     226           1 :     EXPECT_NEAR(4.1, a.x(), 1e-10);
     227           1 :     EXPECT_NEAR(-1.6, a.y(), 1e-10);
     228           1 : }
     229             : 
     230           4 : TEST_F(test_vectorx, sum_eq_int)
     231             : {
     232           1 :     gdal::Vector2i a(2, -3);
     233           1 :     a += 1;
     234           1 :     EXPECT_EQ(3, a.x());
     235           1 :     EXPECT_EQ(-2, a.y());
     236           1 : }
     237             : 
     238           4 : TEST_F(test_vectorx, minus)
     239             : {
     240           1 :     const gdal::Vector2d a(2.1, -3.6);
     241           1 :     const gdal::Vector2d b = a - 2.2;
     242           1 :     EXPECT_NEAR(-0.1, b.x(), 1e-10);
     243           1 :     EXPECT_NEAR(-5.8, b.y(), 1e-10);
     244           1 : }
     245             : 
     246           4 : TEST_F(test_vectorx, minus_eq)
     247             : {
     248           1 :     gdal::Vector2d a(2.1, -3.6);
     249           1 :     a -= 2.0;
     250           1 :     EXPECT_NEAR(0.1, a.x(), 1e-10);
     251           1 :     EXPECT_NEAR(-5.6, a.y(), 1e-10);
     252           1 : }
     253             : 
     254           4 : TEST_F(test_vectorx, minus_eq_int)
     255             : {
     256           1 :     gdal::Vector2i a(2, -3);
     257           1 :     a -= 1;
     258           1 :     EXPECT_EQ(1, a.x());
     259           1 :     EXPECT_EQ(-4, a.y());
     260           1 : }
     261             : 
     262           4 : TEST_F(test_vectorx, minus_op)
     263             : {
     264           1 :     gdal::Vector2d a(2.1, -3.6);
     265           1 :     const auto b = -a;
     266           1 :     EXPECT_NEAR(-2.1, b.x(), 1e-10);
     267           1 :     EXPECT_NEAR(3.6, b.y(), 1e-10);
     268           1 : }
     269             : 
     270           4 : TEST_F(test_vectorx, multiply_int_double)
     271             : {
     272           1 :     gdal::Vector2i a(2, -3);
     273           1 :     const auto b = a * 2.6;
     274             :     static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
     275           1 :     EXPECT_EQ(5, b.x());
     276           1 :     EXPECT_EQ(-7, b.y());
     277           1 : }
     278             : 
     279           4 : TEST_F(test_vectorx, multiply_double)
     280             : {
     281           1 :     gdal::Vector2d a(2.1, -3.2);
     282           1 :     const auto b = a * 2.6;
     283           1 :     EXPECT_NEAR(5.46, b.x(), 1e-10);
     284           1 :     EXPECT_NEAR(-8.32, b.y(), 1e-10);
     285           1 : }
     286             : 
     287           4 : TEST_F(test_vectorx, divide_int_double)
     288             : {
     289           1 :     gdal::Vector2i a(4, -3);
     290           1 :     const auto b = a / 2.2;
     291             :     static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
     292           1 :     EXPECT_EQ(1, b.x());
     293           1 :     EXPECT_EQ(-1, b.y());
     294           1 : }
     295             : 
     296           4 : TEST_F(test_vectorx, divide_double)
     297             : {
     298           1 :     gdal::Vector2d a(2.1, -3.2);
     299           1 :     const auto b = a / 2.5;
     300           1 :     EXPECT_NEAR(0.84, b.x(), 1e-10);
     301           1 :     EXPECT_NEAR(-1.28, b.y(), 1e-10);
     302           1 : }
     303             : 
     304           4 : TEST_F(test_vectorx, plus_vectorx)
     305             : {
     306           1 :     const gdal::Vector2d a(2.1, -3.6);
     307           1 :     const gdal::Vector2d b(10.0, 1.1);
     308           1 :     const auto c = a + b;
     309           1 :     EXPECT_NEAR(12.1, c.x(), 1e-10);
     310           1 :     EXPECT_NEAR(-2.5, c.y(), 1e-10);
     311           1 : }
     312             : 
     313           4 : TEST_F(test_vectorx, minus_vectorx)
     314             : {
     315           1 :     const gdal::Vector2d a(2.1, -3.6);
     316           1 :     const gdal::Vector2d b(10.0, 1.1);
     317           1 :     const auto c = a - b;
     318           1 :     EXPECT_NEAR(-7.9, c.x(), 1e-10);
     319           1 :     EXPECT_NEAR(-4.7, c.y(), 1e-10);
     320           1 : }
     321             : 
     322           4 : TEST_F(test_vectorx, plus_scalar_vectorx)
     323             : {
     324           1 :     const gdal::Vector2d a(2.1, -3.6);
     325           1 :     const auto b = 2.5 + a;
     326           1 :     EXPECT_NEAR(4.6, b.x(), 1e-10);
     327           1 :     EXPECT_NEAR(-1.1, b.y(), 1e-10);
     328           1 : }
     329             : 
     330           4 : TEST_F(test_vectorx, minus_scalar_vectorx)
     331             : {
     332           1 :     const gdal::Vector2d a(2.1, -3.6);
     333           1 :     const auto b = 2.5 - a;
     334           1 :     EXPECT_NEAR(0.4, b.x(), 1e-10);
     335           1 :     EXPECT_NEAR(6.1, b.y(), 1e-10);
     336           1 : }
     337             : 
     338             : }  // namespace

Generated by: LCOV version 1.14