LCOV - code coverage report
Current view: top level - elsa/io/tests - test_EDFHandler.cpp (source / functions) Hit Total Coverage
Test: coverage-all.lcov Lines: 104 104 100.0 %
Date: 2022-08-25 03:05:39 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /**
       2             :  * @file test_EDFHandler.cpp
       3             :  *
       4             :  * @brief Tests for the EDFHandler class
       5             :  *
       6             :  * @author Tobias Lasser - initial code
       7             :  */
       8             : 
       9             : #include "doctest/doctest.h"
      10             : #include "EDFHandler.h"
      11             : #include "VolumeDescriptor.h"
      12             : 
      13             : using namespace elsa;
      14             : using namespace doctest;
      15             : 
      16             : TEST_SUITE_BEGIN("io");
      17             : 
      18             : std::vector<std::string> split(const std::string& s, char delim)
      19           2 : {
      20           2 :     std::stringstream ss(s);
      21           2 :     std::string item;
      22           2 :     std::vector<std::string> elems;
      23          25 :     while (std::getline(ss, item, delim)) {
      24          23 :         elems.push_back(std::move(item));
      25          23 :     }
      26           2 :     return elems;
      27           2 : }
      28             : 
      29             : TEST_CASE("EDFHandler: Reading and writing data")
      30           5 : {
      31           5 :     GIVEN("a 1D DataContainer")
      32           5 :     {
      33           2 :         IndexVector_t numCoeff(1);
      34           2 :         numCoeff << 5;
      35           2 :         DataContainer dc(VolumeDescriptor{numCoeff});
      36           2 :         dc = 0;
      37             : 
      38           2 :         WHEN("Writing it to an edf format")
      39           2 :         {
      40           2 :             std::stringstream buffer;
      41           2 :             EDF::write(dc, buffer);
      42             : 
      43           2 :             THEN("The header is correct")
      44           2 :             {
      45           1 :                 auto buffer_string = buffer.str();
      46           1 :                 auto header = buffer_string.substr(0, buffer_string.find('}' + 1));
      47             : 
      48           1 :                 auto parts = split(header, '\n');
      49           1 :                 parts.erase(std::begin(parts)); // remove the '{'
      50           1 :                 parts.pop_back();               // remove empty newline
      51           1 :                 parts.pop_back();               // remove closing '}'
      52           1 :                 parts.pop_back();               // remove filling spaces
      53             : 
      54           1 :                 CHECK_EQ(parts[0], "HeaderID = EH:000001:000000:000000;");
      55           1 :                 CHECK_EQ(parts[1], "Image = 1;");
      56           1 :                 CHECK_EQ(parts[2], "ByteOrder = LowByteFirst;");
      57           1 :                 CHECK_EQ(parts[3], "DataType = FloatValue;");
      58           1 :                 CHECK_EQ(parts[4], "Dim_1 = 5;");   // dim
      59           1 :                 CHECK_EQ(parts[5], "Size = 20;");   // dim * sizeof(float)
      60           1 :                 CHECK_EQ(parts[6], "Spacing = 1;"); // default 1D spacing
      61           1 :             }
      62             : 
      63           2 :             WHEN("Reading it back in")
      64           2 :             {
      65           1 :                 auto read = EDF::read(buffer);
      66             : 
      67           1 :                 CHECK_EQ(dc.getSize(), read.getSize());
      68           1 :                 CHECK_EQ(dc.getDataDescriptor(), read.getDataDescriptor());
      69             : 
      70           1 :                 CHECK_EQ(dc, read);
      71           1 :             }
      72           2 :         }
      73           2 :     }
      74             : 
      75           5 :     GIVEN("a 2D DataContainer")
      76           5 :     {
      77           2 :         IndexVector_t numCoeff(2);
      78           2 :         numCoeff << 5, 10;
      79           2 :         DataContainer dc(VolumeDescriptor{numCoeff});
      80           2 :         dc = 0;
      81             : 
      82           2 :         WHEN("Writing it to an edf format")
      83           2 :         {
      84           2 :             std::stringstream buffer;
      85           2 :             EDF::write(dc, buffer);
      86             : 
      87           2 :             THEN("The header is correct")
      88           2 :             {
      89           1 :                 auto buffer_string = buffer.str();
      90           1 :                 auto header = buffer_string.substr(0, buffer_string.find('}' + 1));
      91             : 
      92           1 :                 auto parts = split(header, '\n');
      93           1 :                 parts.erase(std::begin(parts)); // remove the '{'
      94           1 :                 parts.pop_back();               // remove empty newline
      95           1 :                 parts.pop_back();               // remove closing '}'
      96           1 :                 parts.pop_back();               // remove filling spaces
      97             : 
      98           1 :                 CHECK_EQ(parts[0], "HeaderID = EH:000001:000000:000000;");
      99           1 :                 CHECK_EQ(parts[1], "Image = 1;");
     100           1 :                 CHECK_EQ(parts[2], "ByteOrder = LowByteFirst;");
     101           1 :                 CHECK_EQ(parts[3], "DataType = FloatValue;");
     102           1 :                 CHECK_EQ(parts[4], "Dim_1 = 5;");     // dim 1
     103           1 :                 CHECK_EQ(parts[5], "Dim_2 = 10;");    // dim 2
     104           1 :                 CHECK_EQ(parts[6], "Size = 200;");    // dim 1 * dim 2 * sizeof(float)
     105           1 :                 CHECK_EQ(parts[7], "Spacing = 1 1;"); // default 2D spacing
     106           1 :             }
     107             : 
     108           2 :             WHEN("Reading it back in")
     109           2 :             {
     110           1 :                 auto read = EDF::read(buffer);
     111             : 
     112           1 :                 CHECK_EQ(dc.getSize(), read.getSize());
     113           1 :                 CHECK_EQ(dc.getDataDescriptor(), read.getDataDescriptor());
     114             : 
     115           1 :                 CHECK_EQ(dc, read);
     116           1 :             }
     117           2 :         }
     118           2 :     }
     119             : 
     120           5 :     GIVEN("a DataContainer")
     121           5 :     {
     122           1 :         IndexVector_t numCoeff(2);
     123           1 :         numCoeff << 11, 17;
     124           1 :         VolumeDescriptor dd(numCoeff);
     125           1 :         DataContainer dc(dd);
     126           1 :         dc = 1;
     127             : 
     128           1 :         WHEN("writing out and reading in this DataContainer")
     129           1 :         {
     130           1 :             std::stringstream buffer;
     131           1 :             EDF::write(dc, buffer);
     132           1 :             auto dcRead = EDF::read(buffer);
     133             : 
     134           1 :             THEN("the read in DataContainer contains the expected data")
     135           1 :             {
     136           1 :                 CHECK_EQ(dc.getSize(), dcRead.getSize());
     137           1 :                 CHECK_EQ(dc.getDataDescriptor(), dcRead.getDataDescriptor());
     138             : 
     139           1 :                 CHECK_EQ(dcRead, dc);
     140           1 :             }
     141           1 :         }
     142           1 :     }
     143           5 : }
     144             : 
     145             : TEST_SUITE_END();

Generated by: LCOV version 1.14