LCOV - code coverage report
Current view: top level - autotest/cpp - test_gdal_dted.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 108 111 97.3 %
Date: 2024-11-21 22:18:42 Functions: 31 31 100.0 %

          Line data    Source code
       1             : ///////////////////////////////////////////////////////////////////////////////
       2             : //
       3             : // Project:  C++ Test Suite for GDAL/OGR
       4             : // Purpose:  Test DTED support. Ported from gdrivers/dted.py.
       5             : // Author:   Mateusz Loskot <mateusz@loskot.net>
       6             : //
       7             : ///////////////////////////////////////////////////////////////////////////////
       8             : // Copyright (c) 2006, Mateusz Loskot <mateusz@loskot.net>
       9             : // Copyright (c) 2010, Even Rouault <even dot rouault at spatialys.com>
      10             : /*
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #include "gdal_unit_test.h"
      15             : 
      16             : #include "cpl_string.h"
      17             : #include "gdal_alg.h"
      18             : #include "gdal_priv.h"
      19             : #include "gdal.h"
      20             : 
      21             : #include <vector>
      22             : 
      23             : #include "gtest_include.h"
      24             : 
      25             : namespace
      26             : {
      27             : 
      28             : // Common fixture with test data
      29             : struct test_gdal_dted : public ::testing::Test
      30             : {
      31             :     struct raster_t
      32             :     {
      33             :         std::string file_;
      34             :         int band_;
      35             :         int checksum_;
      36             : 
      37           7 :         raster_t(std::string const &f, int b, int c)
      38           7 :             : file_(f), band_(b), checksum_(c)
      39             :         {
      40           7 :         }
      41             :     };
      42             : 
      43             :     typedef std::vector<raster_t> rasters_t;
      44             : 
      45             :     GDALDriverH drv_;
      46             :     std::string drv_name_;
      47             :     std::string data_;
      48             :     std::string data_tmp_;
      49             :     rasters_t rasters_;
      50             : 
      51           7 :     test_gdal_dted() : drv_(nullptr), drv_name_("DTED")
      52             :     {
      53           7 :         drv_ = GDALGetDriverByName(drv_name_.c_str());
      54             : 
      55             :         // Compose data path for test group
      56           7 :         data_ = tut::common::data_basedir;
      57           7 :         data_tmp_ = tut::common::tmp_basedir;
      58             : 
      59             :         // Collection of test DEM datasets
      60             : 
      61             :         // TODO: Verify value of this checksum
      62           7 :         rasters_.push_back(raster_t("n43.dt0", 1, 49187));
      63           7 :     }
      64             : 
      65           7 :     void SetUp() override
      66             :     {
      67           7 :         if (drv_ == nullptr)
      68           0 :             GTEST_SKIP() << "DTED driver missing";
      69             :     }
      70             : };
      71             : 
      72             : // Test open dataset
      73           4 : TEST_F(test_gdal_dted, open)
      74             : {
      75           1 :     if (drv_ == nullptr)
      76           0 :         return;
      77           2 :     for (const auto &raster : rasters_)
      78             :     {
      79           1 :         std::string file(data_ + SEP);
      80           1 :         file += raster.file_;
      81           1 :         GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
      82           1 :         ASSERT_TRUE(nullptr != ds);
      83           1 :         GDALClose(ds);
      84             :     }
      85             : }
      86             : 
      87             : // Test dataset checksums
      88           4 : TEST_F(test_gdal_dted, checksums)
      89             : {
      90           1 :     if (drv_ == nullptr)
      91           0 :         return;
      92           2 :     for (const auto &raster : rasters_)
      93             :     {
      94           1 :         std::string file(data_ + SEP);
      95           1 :         file += raster.file_;
      96             : 
      97           1 :         GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
      98           1 :         ASSERT_TRUE(nullptr != ds);
      99             : 
     100           1 :         GDALRasterBandH band = GDALGetRasterBand(ds, raster.band_);
     101           1 :         ASSERT_TRUE(nullptr != band);
     102             : 
     103           1 :         const int xsize = GDALGetRasterXSize(ds);
     104           1 :         const int ysize = GDALGetRasterYSize(ds);
     105           1 :         const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize);
     106             : 
     107           1 :         EXPECT_EQ(checksum, raster.checksum_);
     108             : 
     109           1 :         GDALClose(ds);
     110             :     }
     111             : }
     112             : 
     113             : // Test affine transformation coefficients
     114           4 : TEST_F(test_gdal_dted, geotransform)
     115             : {
     116             :     // Index of test file being tested
     117           1 :     const std::size_t fileIdx = 0;
     118             : 
     119           1 :     std::string file(data_ + SEP);
     120           1 :     file += rasters_.at(fileIdx).file_;
     121             : 
     122           1 :     GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
     123           1 :     ASSERT_TRUE(nullptr != ds);
     124             : 
     125           1 :     double geoTransform[6] = {0};
     126           1 :     CPLErr err = GDALGetGeoTransform(ds, geoTransform);
     127           1 :     ASSERT_EQ(err, CE_None);
     128             : 
     129             :     // Test affine transformation coefficients
     130           1 :     const double maxError = 0.000001;
     131             :     const double expect[6] = {
     132             :         -80.004166666666663,   0.0083333333333333332, 0, 44.00416666666667, 0,
     133             :         -0.0083333333333333332};
     134           1 :     EXPECT_NEAR(expect[0], geoTransform[0], maxError);
     135           1 :     EXPECT_NEAR(expect[1], geoTransform[1], maxError);
     136           1 :     EXPECT_NEAR(expect[2], geoTransform[2], maxError);
     137           1 :     EXPECT_NEAR(expect[3], geoTransform[3], maxError);
     138           1 :     EXPECT_NEAR(expect[4], geoTransform[4], maxError);
     139           1 :     EXPECT_NEAR(expect[5], geoTransform[5], maxError);
     140             : 
     141           1 :     GDALClose(ds);
     142             : }
     143             : 
     144             : // Test projection definition
     145           4 : TEST_F(test_gdal_dted, projection)
     146             : {
     147             :     // Index of test file being tested
     148           1 :     const std::size_t fileIdx = 0;
     149             : 
     150           1 :     std::string file(data_ + SEP);
     151           1 :     file += rasters_.at(fileIdx).file_;
     152             : 
     153           1 :     GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
     154           1 :     ASSERT_TRUE(nullptr != ds);
     155             : 
     156           1 :     std::string proj(GDALGetProjectionRef(ds));
     157           1 :     ASSERT_TRUE(!proj.empty());
     158             : 
     159             :     std::string expect(
     160             :         "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS "
     161             :         "84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY["
     162             :         "\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\","
     163             :         "\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\","
     164             :         "\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],"
     165           2 :         "AUTHORITY[\"EPSG\",\"4326\"]]");
     166           1 :     EXPECT_EQ(proj, expect);
     167             : 
     168           1 :     GDALClose(ds);
     169             : }
     170             : 
     171             : // Test band data type and NODATA value
     172           4 : TEST_F(test_gdal_dted, nodata)
     173             : {
     174             :     // Index of test file being tested
     175           1 :     const std::size_t fileIdx = 0;
     176             : 
     177           1 :     std::string file(data_ + SEP);
     178           1 :     file += rasters_.at(fileIdx).file_;
     179             : 
     180           1 :     GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
     181           1 :     ASSERT_TRUE(nullptr != ds);
     182             : 
     183           1 :     GDALRasterBandH band = GDALGetRasterBand(ds, rasters_.at(fileIdx).band_);
     184           1 :     ASSERT_TRUE(nullptr != band);
     185             : 
     186           1 :     const double noData = GDALGetRasterNoDataValue(band, nullptr);
     187           1 :     EXPECT_EQ(noData, -32767);
     188             : 
     189           1 :     EXPECT_EQ(GDALGetRasterDataType(band), GDT_Int16);
     190             : 
     191           1 :     GDALClose(ds);
     192             : }
     193             : 
     194             : // Create simple copy and check
     195           4 : TEST_F(test_gdal_dted, copy)
     196             : {
     197             :     // Index of test file being tested
     198           1 :     const std::size_t fileIdx = 0;
     199             : 
     200           1 :     std::string src(data_ + SEP);
     201           1 :     src += rasters_.at(fileIdx).file_;
     202             : 
     203           1 :     GDALDatasetH dsSrc = GDALOpen(src.c_str(), GA_ReadOnly);
     204           1 :     ASSERT_TRUE(nullptr != dsSrc);
     205             : 
     206           1 :     std::string dst(data_tmp_ + SEP);
     207           1 :     dst += rasters_.at(fileIdx).file_;
     208             : 
     209           1 :     GDALDatasetH dsDst = nullptr;
     210           1 :     dsDst = GDALCreateCopy(drv_, dst.c_str(), dsSrc, FALSE, nullptr, nullptr,
     211             :                            nullptr);
     212           1 :     GDALClose(dsSrc);
     213           1 :     ASSERT_TRUE(nullptr != dsDst);
     214             : 
     215           1 :     std::string proj(GDALGetProjectionRef(dsDst));
     216           1 :     ASSERT_TRUE(!proj.empty());
     217             : 
     218             :     std::string expect(
     219             :         "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS "
     220             :         "84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY["
     221             :         "\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\","
     222             :         "\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\","
     223             :         "\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],"
     224           1 :         "AUTHORITY[\"EPSG\",\"4326\"]]");
     225           1 :     EXPECT_EQ(proj, expect);
     226             : 
     227           1 :     GDALRasterBandH band = GDALGetRasterBand(dsDst, rasters_.at(fileIdx).band_);
     228           1 :     ASSERT_TRUE(nullptr != band);
     229             : 
     230           1 :     const int xsize = GDALGetRasterXSize(dsDst);
     231           1 :     const int ysize = GDALGetRasterYSize(dsDst);
     232           1 :     const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize);
     233             : 
     234           1 :     EXPECT_EQ(checksum, rasters_.at(fileIdx).checksum_);
     235             : 
     236           1 :     GDALClose(dsDst);
     237             : }
     238             : 
     239             : // Test subwindow read and the tail recursion problem.
     240           4 : TEST_F(test_gdal_dted, subwindow_read)
     241             : {
     242             :     // Index of test file being tested
     243           1 :     const std::size_t fileIdx = 0;
     244             : 
     245           1 :     std::string file(data_ + SEP);
     246           1 :     file += rasters_.at(fileIdx).file_;
     247             : 
     248           1 :     GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly);
     249           1 :     ASSERT_TRUE(nullptr != ds);
     250             : 
     251           1 :     GDALRasterBandH band = GDALGetRasterBand(ds, rasters_.at(fileIdx).band_);
     252           1 :     ASSERT_TRUE(nullptr != band);
     253             : 
     254             :     // Sub-windows size
     255             :     const int win[4] = {5, 5, 5, 5};
     256             :     // subwindow checksum
     257           1 :     const int winChecksum = 305;
     258             :     const int checksum =
     259           1 :         GDALChecksumImage(band, win[0], win[1], win[2], win[3]);
     260             : 
     261           1 :     EXPECT_EQ(checksum, winChecksum);
     262             : 
     263           1 :     GDALClose(ds);
     264             : }
     265             : 
     266             : }  // namespace

Generated by: LCOV version 1.14