From 59b28696cd6f8d65e6a10da114d6e1bf457c6fce Mon Sep 17 00:00:00 2001
From: guj <jgu@lbl.gov>
Date: Thu, 4 May 2017 10:53:01 -0700
Subject: [PATCH] added HDF5 native read test in TestHDF5WriterRead.cpp

---
 examples/hello/hdf5Writer/helloHDF5Writer.cpp | 123 +++---
 .../adios2/engine/hdf5/TestHDF5WriteRead.cpp  | 369 +++++++++++++++++-
 2 files changed, 419 insertions(+), 73 deletions(-)

diff --git a/examples/hello/hdf5Writer/helloHDF5Writer.cpp b/examples/hello/hdf5Writer/helloHDF5Writer.cpp
index 71caa0d2b..e666f96e5 100644
--- a/examples/hello/hdf5Writer/helloHDF5Writer.cpp
+++ b/examples/hello/hdf5Writer/helloHDF5Writer.cpp
@@ -10,7 +10,10 @@
 
 #include <mpi.h>
 
-#include <adios2.h>
+#define ADIOS_HAVE_PHDF5 // so hdf5 related items are loaded in ADIOS_CPP.h
+//#include "ADIOS_CPP.h"
+#include "adios2.h"
+#include "adios2/engine/hdf5/HDF5ReaderP.h"
 
 int main(int argc, char *argv[])
 {
@@ -65,11 +68,8 @@ int main(int argc, char *argv[])
         intCountDim1 = intDim1 - rank * (intDim1 / size);
     }
 
-    std::cout << " rank=" << rank << " of " << size
-              << ",  dim1 count: " << intCountDim1
-              << ", offset: " << intOffsetDim1 << std::endl;
-    std::cout << " intOffsetDim2=" << intOffsetDim2 << " " << intDim2
-              << std::endl;
+    std::cout<<" rank="<<rank<<" of "<<size<<",  dim1 count: "<<intCountDim1<<", offset: "<<intOffsetDim1<<std::endl;
+    std::cout<<" intOffsetDim2="<<intOffsetDim2<<" "<<intDim2<<std::endl;
     try
     {
         // Define variable and local size
@@ -103,66 +103,59 @@ int main(int argc, char *argv[])
             throw std::ios_base::failure(
                 "ERROR: failed to create HDF5 I/O engine at Open\n");
 
-        int ts = 0;
-        int totalts = 2;
-        while (true)
-        {
-            if (rank == 0)
-            {
-                std::cout << " total timesteps: " << totalts << " curr: " << ts
-                          << " th" << std::endl;
-            }
-            HDF5Writer->Write(ioMyDoubles,
-                              myDoubles.data() +
-                                  doubleVOffset); // Base class Engine
-            // own the Write<T>
-            // that will call
-            // overloaded Write
-            // from Derived
-            HDF5Writer->Write(ioMyInts,
-                              myInts.data() + (intOffsetDim1 * intDim2));
-
-            HDF5Writer->Write(ioMyCFloats, myCFloats.data() + complexOffset);
-            HDF5Writer->Write(ioMyCDoubles, myCDoubles.data() + complexOffset);
-            HDF5Writer->Write(ioMyCLongDoubles,
-                              myCLongDoubles.data() + complexOffset);
-            ts++;
-            if (ts >= totalts)
-            {
-                break;
-            }
-            HDF5Writer->Advance();
-        }
-        HDF5Writer->Close();
-
-        // now read out:
-        /*
+	int ts = 0;
+	int totalts = 3;
+	while (true) {
+	  if (rank == 0) {
+	    std::cout<<" total timesteps: "<<totalts<<" curr: "<<ts<<" th"<<std::endl;
+	  }
+	  HDF5Writer->Write(ioMyDoubles, myDoubles.data() +
+			    doubleVOffset); // Base class Engine
+	  // own the Write<T>
+	  // that will call
+	  // overloaded Write
+	  // from Derived
+	  HDF5Writer->Write(ioMyInts,
+			    myInts.data() + (intOffsetDim1 * intDim2 ));
+	  
+	  HDF5Writer->Write(ioMyCFloats, myCFloats.data() + complexOffset);
+	  HDF5Writer->Write(ioMyCDoubles, myCDoubles.data() + complexOffset);
+	  HDF5Writer->Write(ioMyCLongDoubles,
+			    myCLongDoubles.data() + complexOffset);
+	  ts++;
+	  if (ts >= totalts) {
+	    break;
+	  }
+	  HDF5Writer->Advance();
+	}
+	HDF5Writer->Close();
+
+	// now read out:
+	/*
         HDF5Settings.SetEngine("HDF5Reader");
-        std::cout<<"... Testing a copy of test.h5, [test1.h5] , b/c engine does
-        not decrease name count !! "<<std::endl;
-        auto HDF5Reader = adios.Open("test1.h5", "r", HDF5Settings);
-
-        //int findts = HDF5Reader->getNumTimeSteps();
-        //HDF5Reader->InquireVariableDouble("wrongMyDoubles", true);
-        HDF5Reader->InquireVariableDouble(ioMyDoubles.m_Name, true);
-        */
-        /*
-                adios::HDF5Reader myReader(adios, "test.h5", "r",
-        MPI_COMM_WORLD, HDF5Settings);
-                double values[15];
-
-        #ifndef NEVER
-                ts = 0;
-                while (ts < totalts) {
-                  myReader.ReadMe(ioMyDoubles, values, H5T_NATIVE_DOUBLE);
-                  myReader.Advance();
-                  ts++;
-                }
-
-        #else
-                myReader.ReadMe(ioMyDoubles, values, H5T_NATIVE_DOUBLE);
-        #endif
-        */
+	std::cout<<"... Testing a copy of test.h5, [test1.h5] , b/c engine does not decrease name count !! "<<std::endl;
+	auto HDF5Reader = adios.Open("test1.h5", "r", HDF5Settings);
+
+	//int findts = HDF5Reader->getNumTimeSteps();
+	//HDF5Reader->InquireVariableDouble("wrongMyDoubles", true);
+	HDF5Reader->InquireVariableDouble(ioMyDoubles.m_Name, true);
+	*/
+	adios::HDF5Reader myReader(adios, "test.h5", "r", MPI_COMM_WORLD, HDF5Settings);
+	double values[15];
+
+#ifndef NEVER	
+	ts = 0;
+	while (ts < totalts) {    
+	  myReader.ReadMe(ioMyDoubles, values, H5T_NATIVE_DOUBLE);    
+	  myReader.Advance();
+	  ts++;
+	}
+
+#else
+	myReader.ReadMe(ioMyDoubles, values, H5T_NATIVE_DOUBLE);
+	myReader.Close();
+#endif
+
     }
     catch (std::invalid_argument &e)
     {
diff --git a/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp b/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
index bac7570fb..a540da6eb 100644
--- a/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
+++ b/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
@@ -9,6 +9,7 @@
 #include <stdexcept>
 
 #include <adios2.h>
+#include "adios2/engine/hdf5/HDF5ReaderP.h"
 #include <hdf5.h>
 
 #include <gtest/gtest.h>
@@ -34,8 +35,7 @@ TEST_F(HDF5WriteReadTest, ADIOS2HDF5WriteHDF5Read1D8)
 
     // Write test data using ADIOS2
     {
-        adios::ADIOS adios(adios::Verbose::WARN, true);
-
+        adios::ADIOS adios(adios::Verbose::WARN, true); // moved up
         // Declare 1D variables
         {
             auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{8});
@@ -97,10 +97,122 @@ TEST_F(HDF5WriteReadTest, ADIOS2HDF5WriteHDF5Read1D8)
     }
 
     // Read test data using HDF5
+#ifdef ADIOS2_HAVE_MPI
+    // Read everything from rank 0
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    if (rank == 0)
+#endif
     {
-        ASSERT_TRUE(false)
-            << "Native HDF5 read validation is not yet implemented";
+      adios::ADIOS adios(adios::Verbose::WARN, true); 
+      // call reader directly
+      auto method = adios.DeclareMethod("TestMethod");
+      method.SetEngine("HDF5Reader");
+
+      adios::HDF5Reader hdf5Reader(adios, fname, "r", MPI_COMM_WORLD, method);
+				   
+      ASSERT_TRUE(hdf5Reader.isValid());
+
+      
+        std::array<char, 8> I8;
+        std::array<int16_t, 8> I16;
+        std::array<int32_t, 8> I32;
+        std::array<int64_t, 8> I64;
+        std::array<unsigned char, 8> U8;
+        std::array<uint16_t, 8> U16;
+        std::array<uint32_t, 8> U32;
+        std::array<uint64_t, 8> U64;
+        std::array<float, 8> R32;
+        std::array<double, 8> R64;
+
+
+	auto &var_i8 = adios.DefineVariable<char>("i8");
+	auto &var_i16 = adios.DefineVariable<short>("i16");
+	auto &var_i32 = adios.DefineVariable<int>("i32" );
+	auto &var_i64 = adios.DefineVariable<long>("i64" );
+	auto &var_u8 =
+	  adios.DefineVariable<unsigned char>("u8");
+	auto &var_u16 =
+	  adios.DefineVariable<unsigned short>("u16");
+	auto &var_u32 =
+	  adios.DefineVariable<unsigned int>("u32");
+	auto &var_u64 =
+	  adios.DefineVariable<unsigned long>("u64");
+	auto &var_r32 = adios.DefineVariable<float>("r32");
+	auto &var_r64 = adios.DefineVariable<double>("r64");
+	
+        // Read stuff
+        for (size_t t = 0; t < 3; ++t)
+        {
+            // Read the current step
+	    hdf5Reader.ReadMe(var_i8, I8.data(), H5T_NATIVE_CHAR);	    
+	    hdf5Reader.ReadMe(var_i16, I16.data(), H5T_NATIVE_SHORT);
+	    hdf5Reader.ReadMe(var_i32, I32.data(), H5T_NATIVE_INT);
+	    hdf5Reader.ReadMe(var_i64, I64.data(), H5T_NATIVE_LONG);
+	    hdf5Reader.ReadMe(var_u8,  U8.data(),  H5T_NATIVE_UCHAR);
+	    hdf5Reader.ReadMe(var_u16, U16.data(), H5T_NATIVE_USHORT);
+	    hdf5Reader.ReadMe(var_u32, U32.data(), H5T_NATIVE_UINT);
+	    hdf5Reader.ReadMe(var_u64, U64.data(), H5T_NATIVE_ULONG);
+	    hdf5Reader.ReadMe(var_r32, R32.data(), H5T_NATIVE_FLOAT);
+	    hdf5Reader.ReadMe(var_r64, R64.data(), H5T_NATIVE_DOUBLE);
+
+	    // Check the variables exist      
+	    ASSERT_EQ(var_i8.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_i8.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_i16.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_i16.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_i32.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_i32.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_i64.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_i64.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_u8.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_u8.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_u16.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_u16.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_u32.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_u32.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_u64.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_u64.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_r32.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_r32.m_GlobalDimensions[0], 8);
+
+	    ASSERT_EQ(var_r64.m_GlobalDimensions.size(), 1);
+	    ASSERT_EQ(var_r64.m_GlobalDimensions[0], 8);
+
+
+            // Check if it's correct
+            for (size_t i = 0; i < 8; ++i)
+            {
+                std::stringstream ss;
+                ss << "t=" << t << " i=" << i;
+                std::string msg = ss.str();
+
+                EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg;
+                EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg;
+                EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg;
+                EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg;
+                EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg;
+                EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg;
+                EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg;
+                EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg;
+                EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg;
+                EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg;
+            }
+	    hdf5Reader.Advance();
+        }
+
+        // Cleanup file
+	hdf5Reader.Close();
     }
+
 }
 
 // ADIOS2 write, ADIOS2 read
@@ -197,10 +309,131 @@ TEST_F(HDF5WriteReadTest, ADIOS2HDF5WriteHDF5Read2D2x4)
     }
 
     // Read test data using HDF5
+#ifdef ADIOS2_HAVE_MPI
+    // Read everything from rank 0
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    if (rank == 0)
+#endif
     {
-        ASSERT_TRUE(false)
-            << "Native HDF5 read validation is not yet implemented";
+      adios::ADIOS adios(adios::Verbose::WARN, true); 
+      // call reader directly
+      auto method = adios.DeclareMethod("TestMethod");
+      method.SetEngine("HDF5Reader");
+
+      adios::HDF5Reader hdf5Reader(adios, fname, "r", MPI_COMM_WORLD, method);
+				   
+      ASSERT_TRUE(hdf5Reader.isValid());
+      
+      std::array<char, 8> I8;
+      std::array<int16_t, 8> I16;
+      std::array<int32_t, 8> I32;
+      std::array<int64_t, 8> I64;
+      std::array<unsigned char, 8> U8;
+      std::array<uint16_t, 8> U16;
+      std::array<uint32_t, 8> U32;
+      std::array<uint64_t, 8> U64;
+      std::array<float, 8> R32;
+      std::array<double, 8> R64;
+      
+      
+      auto &var_i8 = adios.DefineVariable<char>("i8");
+      auto &var_i16 = adios.DefineVariable<short>("i16");
+      auto &var_i32 = adios.DefineVariable<int>("i32" );
+      auto &var_i64 = adios.DefineVariable<long>("i64" );
+      auto &var_u8 =
+	adios.DefineVariable<unsigned char>("u8");
+      auto &var_u16 =
+	adios.DefineVariable<unsigned short>("u16");
+      auto &var_u32 =
+	adios.DefineVariable<unsigned int>("u32");
+      auto &var_u64 =
+	adios.DefineVariable<unsigned long>("u64");
+      auto &var_r32 = adios.DefineVariable<float>("r32");
+      auto &var_r64 = adios.DefineVariable<double>("r64");
+      
+      // Read stuff
+      for (size_t t = 0; t < 3; ++t)
+        {
+	  // Read the current step
+	  hdf5Reader.ReadMe(var_i8, I8.data(), H5T_NATIVE_CHAR);	    
+	  hdf5Reader.ReadMe(var_i16, I16.data(), H5T_NATIVE_SHORT);
+	  hdf5Reader.ReadMe(var_i32, I32.data(), H5T_NATIVE_INT);
+	  hdf5Reader.ReadMe(var_i64, I64.data(), H5T_NATIVE_LONG);
+	  hdf5Reader.ReadMe(var_u8,  U8.data(),  H5T_NATIVE_UCHAR);
+	  hdf5Reader.ReadMe(var_u16, U16.data(), H5T_NATIVE_USHORT);
+	  hdf5Reader.ReadMe(var_u32, U32.data(), H5T_NATIVE_UINT);
+	  hdf5Reader.ReadMe(var_u64, U64.data(), H5T_NATIVE_ULONG);
+	  hdf5Reader.ReadMe(var_r32, R32.data(), H5T_NATIVE_FLOAT);
+	  hdf5Reader.ReadMe(var_r64, R64.data(), H5T_NATIVE_DOUBLE);
+	  
+	  // Check the variables exist      
+	  ASSERT_EQ(var_i8.m_GlobalDimensions.size(), 2);
+	  ASSERT_EQ(var_i8.m_GlobalDimensions[0], 2);
+	  ASSERT_EQ(var_i8.m_GlobalDimensions[1], 4);
+	  
+	    ASSERT_EQ(var_i16.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i16.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_i16.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_i32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i32.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_i32.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_i64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i64.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_i64.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_u8.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u8.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_u8.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_u16.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u16.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_u16.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_u32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u32.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_u32.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_u64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u64.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_u64.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_r32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_r32.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_r32.m_GlobalDimensions[1], 4);
+
+	    ASSERT_EQ(var_r64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_r64.m_GlobalDimensions[0], 2);
+	    ASSERT_EQ(var_r64.m_GlobalDimensions[1], 4);
+
+
+            // Check if it's correct
+            for (size_t i = 0; i < 8; ++i)
+            {
+                std::stringstream ss;
+                ss << "t=" << t << " i=" << i;
+                std::string msg = ss.str();
+
+                EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg;
+                EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg;
+                EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg;
+                EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg;
+                EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg;
+                EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg;
+                EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg;
+                EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg;
+                EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg;
+                EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg;
+            }
+	    hdf5Reader.Advance();
+        }
+
+        // Cleanup file
+	hdf5Reader.Close();
     }
+        
 }
 
 // ADIOS2 write, ADIOS2 read
@@ -297,9 +530,129 @@ TEST_F(HDF5WriteReadTest, ADIOS2HDF5WriteHDF5Read2D4x2)
     }
 
     // Read test data using HDF5
+#ifdef ADIOS2_HAVE_MPI
+    // Read everything from rank 0
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    if (rank == 0)
+#endif
     {
-        ASSERT_TRUE(false)
-            << "Native HDF5 read validation is not yet implemented";
+      adios::ADIOS adios(adios::Verbose::WARN, true); 
+      // call reader directly
+      auto method = adios.DeclareMethod("TestMethod");
+      method.SetEngine("HDF5Reader");
+
+      adios::HDF5Reader hdf5Reader(adios, fname, "r", MPI_COMM_WORLD, method);
+				   
+      ASSERT_TRUE(hdf5Reader.isValid());
+      
+      std::array<char, 8> I8;
+      std::array<int16_t, 8> I16;
+      std::array<int32_t, 8> I32;
+      std::array<int64_t, 8> I64;
+      std::array<unsigned char, 8> U8;
+      std::array<uint16_t, 8> U16;
+      std::array<uint32_t, 8> U32;
+      std::array<uint64_t, 8> U64;
+      std::array<float, 8> R32;
+      std::array<double, 8> R64;
+      
+      
+      auto &var_i8 = adios.DefineVariable<char>("i8");
+      auto &var_i16 = adios.DefineVariable<short>("i16");
+      auto &var_i32 = adios.DefineVariable<int>("i32" );
+      auto &var_i64 = adios.DefineVariable<long>("i64" );
+      auto &var_u8 =
+	adios.DefineVariable<unsigned char>("u8");
+      auto &var_u16 =
+	adios.DefineVariable<unsigned short>("u16");
+      auto &var_u32 =
+	adios.DefineVariable<unsigned int>("u32");
+      auto &var_u64 =
+	adios.DefineVariable<unsigned long>("u64");
+      auto &var_r32 = adios.DefineVariable<float>("r32");
+      auto &var_r64 = adios.DefineVariable<double>("r64");
+      
+      // Read stuff
+      for (size_t t = 0; t < 3; ++t)
+        {
+	  // Read the current step
+	  hdf5Reader.ReadMe(var_i8, I8.data(), H5T_NATIVE_CHAR);	    
+	  hdf5Reader.ReadMe(var_i16, I16.data(), H5T_NATIVE_SHORT);
+	  hdf5Reader.ReadMe(var_i32, I32.data(), H5T_NATIVE_INT);
+	  hdf5Reader.ReadMe(var_i64, I64.data(), H5T_NATIVE_LONG);
+	  hdf5Reader.ReadMe(var_u8,  U8.data(),  H5T_NATIVE_UCHAR);
+	  hdf5Reader.ReadMe(var_u16, U16.data(), H5T_NATIVE_USHORT);
+	  hdf5Reader.ReadMe(var_u32, U32.data(), H5T_NATIVE_UINT);
+	  hdf5Reader.ReadMe(var_u64, U64.data(), H5T_NATIVE_ULONG);
+	  hdf5Reader.ReadMe(var_r32, R32.data(), H5T_NATIVE_FLOAT);
+	  hdf5Reader.ReadMe(var_r64, R64.data(), H5T_NATIVE_DOUBLE);
+	  
+	  // Check the variables exist      
+	  ASSERT_EQ(var_i8.m_GlobalDimensions.size(), 2);
+	  ASSERT_EQ(var_i8.m_GlobalDimensions[0], 4);
+	  ASSERT_EQ(var_i8.m_GlobalDimensions[1], 2);
+	  
+	    ASSERT_EQ(var_i16.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i16.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_i16.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_i32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i32.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_i32.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_i64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_i64.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_i64.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_u8.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u8.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_u8.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_u16.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u16.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_u16.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_u32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u32.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_u32.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_u64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_u64.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_u64.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_r32.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_r32.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_r32.m_GlobalDimensions[1], 2);
+
+	    ASSERT_EQ(var_r64.m_GlobalDimensions.size(), 2);
+	    ASSERT_EQ(var_r64.m_GlobalDimensions[0], 4);
+	    ASSERT_EQ(var_r64.m_GlobalDimensions[1], 2);
+
+
+            // Check if it's correct
+            for (size_t i = 0; i < 8; ++i)
+            {
+                std::stringstream ss;
+                ss << "t=" << t << " i=" << i;
+                std::string msg = ss.str();
+
+                EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg;
+                EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg;
+                EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg;
+                EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg;
+                EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg;
+                EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg;
+                EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg;
+                EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg;
+                EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg;
+                EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg;
+            }
+	    hdf5Reader.Advance();
+        }
+
+        // Cleanup file
+	hdf5Reader.Close();
     }
 }
 
-- 
GitLab