Skip to content
Snippets Groups Projects
  • William F Godoy's avatar
    77a5923b
    Tested refactored implementation · 77a5923b
    William F Godoy authored
    1 Now IO (replaced Method) and is the factory for Variables and Engines
    2 Reduced core components to user-public objects only
    3 Moved and reorganized all helper functions to helper directory
    4 Engines are now lightweight (except for ADIOS1Reader WIP) using MACRO
    5 HF5Common and ADIOS1Common (except for Readers WIP) are now part of the toolkit so they can be reused by Engines
    6 TransportMan is a new layer for transport management (file is default)
    7 DataMan will be implemented under toolkit/transportman/dataman
    8 Template separation (tcc and inl) applied all over the code
    9 Improved Doxygen documentation
    
    Runtime Issues:
    DataMan library compilation (cacheman)
    ADIOS1 Warning
    TestADIOSInterfaceWrite catches exceptions
    77a5923b
    History
    Tested refactored implementation
    William F Godoy authored
    1 Now IO (replaced Method) and is the factory for Variables and Engines
    2 Reduced core components to user-public objects only
    3 Moved and reorganized all helper functions to helper directory
    4 Engines are now lightweight (except for ADIOS1Reader WIP) using MACRO
    5 HF5Common and ADIOS1Common (except for Readers WIP) are now part of the toolkit so they can be reused by Engines
    6 TransportMan is a new layer for transport management (file is default)
    7 DataMan will be implemented under toolkit/transportman/dataman
    8 Template separation (tcc and inl) applied all over the code
    9 Improved Doxygen documentation
    
    Runtime Issues:
    DataMan library compilation (cacheman)
    ADIOS1 Warning
    TestADIOSInterfaceWrite catches exceptions
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
TestADIOSInterfaceWrite.cpp 13.25 KiB
#include <cstdint>

#include <iostream>
#include <stdexcept>

#include <adios2.h>

#include <gtest/gtest.h>

class ADIOSInterfaceWriteTest : public ::testing::Test
{
public:
    ADIOSInterfaceWriteTest() : adios(true), io(adios.DeclareIO("TestIO")) {}

protected:
    // virtual void SetUp() { }

    // virtual void TearDown() { }

    adios::ADIOS adios;
    adios::IO &io;
};

TEST_F(ADIOSInterfaceWriteTest, DefineVarChar1x10)
{
    // Define ADIOS variables for each type
    auto &var_i8 = io.DefineVariable<char>("i8", adios::Dims{10});

    // Verify the return type is as expected
    ::testing::StaticAssertTypeEq<decltype(var_i8), adios::Variable<char> &>();

    // Verify exceptions are thrown upon duplicate variable names
    EXPECT_THROW(auto &foo = io.DefineVariable<char>("i8", adios::Dims{10}),
                 std::invalid_argument);

    // Verify the dimensions, name, and type are correct
    ASSERT_EQ(var_i8.m_Shape.size(), 1);
    EXPECT_EQ(var_i8.m_Shape[0], 10);
    EXPECT_EQ(var_i8.m_Count.size(), 0);
    EXPECT_EQ(var_i8.m_Start.size(), 0);
    EXPECT_EQ(var_i8.m_Name, "i8");
    EXPECT_EQ(var_i8.m_Type, "char");
}

// Rinse  and repeat for remaining types
TEST_F(ADIOSInterfaceWriteTest, DefineVarShort1x10)
{
    auto &var_i16 = io.DefineVariable<short>("i16", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_i16),
                                  adios::Variable<short> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<short>("i16", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_i16.m_Shape.size(), 1);
    EXPECT_EQ(var_i16.m_Shape[0], 10);
    EXPECT_EQ(var_i16.m_Count.size(), 0);
    EXPECT_EQ(var_i16.m_Start.size(), 0);
    EXPECT_EQ(var_i16.m_Name, "i16");
    EXPECT_EQ(var_i16.m_Type, "short");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarInt1x10)
{
    auto &var_i32 = io.DefineVariable<int>("i32", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_i32), adios::Variable<int> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<int>("i32", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_i32.m_Shape.size(), 1);
    EXPECT_EQ(var_i32.m_Shape[0], 10);
    EXPECT_EQ(var_i32.m_Count.size(), 0);
    EXPECT_EQ(var_i32.m_Start.size(), 0);
    EXPECT_EQ(var_i32.m_Name, "i32");
    EXPECT_EQ(var_i32.m_Type, "int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarLong1x10)
{
    auto &var_i64 = io.DefineVariable<long>("i64", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_i64), adios::Variable<long> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<long>("i64", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_i64.m_Shape.size(), 1);
    EXPECT_EQ(var_i64.m_Shape[0], 10);
    EXPECT_EQ(var_i64.m_Count.size(), 0);
    EXPECT_EQ(var_i64.m_Start.size(), 0);
    EXPECT_EQ(var_i64.m_Name, "i64");
    EXPECT_EQ(var_i64.m_Type, "long int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUChar1x10)
{
    auto &var_u8 = io.DefineVariable<unsigned char>("u8", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_u8),
                                  adios::Variable<unsigned char> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned char>("u8", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_u8.m_Shape.size(), 1);
    EXPECT_EQ(var_u8.m_Shape[0], 10);
    EXPECT_EQ(var_u8.m_Count.size(), 0);
    EXPECT_EQ(var_u8.m_Start.size(), 0);
    EXPECT_EQ(var_u8.m_Name, "u8");
    EXPECT_EQ(var_u8.m_Type, "unsigned char");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUShort1x10)
{
    auto &var_u16 = io.DefineVariable<unsigned short>("u16", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_u16),
                                  adios::Variable<unsigned short> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned short>("u16", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_u16.m_Shape.size(), 1);
    EXPECT_EQ(var_u16.m_Shape[0], 10);
    EXPECT_EQ(var_u16.m_Count.size(), 0);
    EXPECT_EQ(var_u16.m_Start.size(), 0);
    EXPECT_EQ(var_u16.m_Name, "u16");
    EXPECT_EQ(var_u16.m_Type, "unsigned short");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUInt1x10)
{
    auto &var_u32 = io.DefineVariable<unsigned int>("u32", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_u32),
                                  adios::Variable<unsigned int> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned int>("u32", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_u32.m_Shape.size(), 1);
    EXPECT_EQ(var_u32.m_Shape[0], 10);
    EXPECT_EQ(var_u32.m_Count.size(), 0);
    EXPECT_EQ(var_u32.m_Start.size(), 0);
    EXPECT_EQ(var_u32.m_Name, "u32");
    EXPECT_EQ(var_u32.m_Type, "unsigned int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarULong1x10)
{
    auto &var_u64 = io.DefineVariable<unsigned long>("u64", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_u64),
                                  adios::Variable<unsigned long> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned long>("u64", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_u64.m_Shape.size(), 1);
    EXPECT_EQ(var_u64.m_Shape[0], 10);
    EXPECT_EQ(var_u64.m_Count.size(), 0);
    EXPECT_EQ(var_u64.m_Start.size(), 0);
    EXPECT_EQ(var_u64.m_Name, "u64");
    EXPECT_EQ(var_u64.m_Type, "unsigned long int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarFloat1x10)
{
    auto &var_r32 = io.DefineVariable<float>("r32", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_r32),
                                  adios::Variable<float> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<float>("r32", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_r32.m_Shape.size(), 1);
    EXPECT_EQ(var_r32.m_Shape[0], 10);
    EXPECT_EQ(var_r32.m_Count.size(), 0);
    EXPECT_EQ(var_r32.m_Start.size(), 0);
    EXPECT_EQ(var_r32.m_Name, "r32");
    EXPECT_EQ(var_r32.m_Type, "float");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarDouble1x10)
{
    auto &var_r64 = io.DefineVariable<double>("r64", adios::Dims{10});
    ::testing::StaticAssertTypeEq<decltype(var_r64),
                                  adios::Variable<double> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<double>("r64", adios::Dims{10}),
                 std::invalid_argument);
    ASSERT_EQ(var_r64.m_Shape.size(), 1);
    EXPECT_EQ(var_r64.m_Shape[0], 10);
    EXPECT_EQ(var_r64.m_Count.size(), 0);
    EXPECT_EQ(var_r64.m_Start.size(), 0);
    EXPECT_EQ(var_r64.m_Name, "r64");
    EXPECT_EQ(var_r64.m_Type, "double");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarChar2x5)
{
    auto &var_i8 = io.DefineVariable<char>("i8", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_i8), adios::Variable<char> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<char>("i8", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_i8.m_Shape.size(), 2);
    EXPECT_EQ(var_i8.m_Shape[0], 2);
    EXPECT_EQ(var_i8.m_Shape[1], 5);
    EXPECT_EQ(var_i8.m_Count.size(), 0);
    EXPECT_EQ(var_i8.m_Start.size(), 0);
    EXPECT_EQ(var_i8.m_Name, "i8");
    EXPECT_EQ(var_i8.m_Type, "char");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarShort2x5)
{
    auto &var_i16 = io.DefineVariable<short>("i16", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_i16),
                                  adios::Variable<short> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<short>("i16", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_i16.m_Shape.size(), 2);
    EXPECT_EQ(var_i16.m_Shape[0], 2);
    EXPECT_EQ(var_i16.m_Shape[1], 5);
    EXPECT_EQ(var_i16.m_Count.size(), 0);
    EXPECT_EQ(var_i16.m_Start.size(), 0);
    EXPECT_EQ(var_i16.m_Name, "i16");
    EXPECT_EQ(var_i16.m_Type, "short");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarInt2x5)
{
    auto &var_i32 = io.DefineVariable<int>("i32", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_i32), adios::Variable<int> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<int>("i32", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_i32.m_Shape.size(), 2);
    EXPECT_EQ(var_i32.m_Shape[0], 2);
    EXPECT_EQ(var_i32.m_Shape[1], 5);
    EXPECT_EQ(var_i32.m_Count.size(), 0);
    EXPECT_EQ(var_i32.m_Start.size(), 0);
    EXPECT_EQ(var_i32.m_Name, "i32");
    EXPECT_EQ(var_i32.m_Type, "int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarLong2x5)
{
    auto &var_i64 = io.DefineVariable<long>("i64", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_i64), adios::Variable<long> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<long>("i64", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_i64.m_Shape.size(), 2);
    EXPECT_EQ(var_i64.m_Shape[0], 2);
    EXPECT_EQ(var_i64.m_Shape[1], 5);
    EXPECT_EQ(var_i64.m_Count.size(), 0);
    EXPECT_EQ(var_i64.m_Start.size(), 0);
    EXPECT_EQ(var_i64.m_Name, "i64");
    EXPECT_EQ(var_i64.m_Type, "long int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUChar2x5)
{
    auto &var_u8 = io.DefineVariable<unsigned char>("u8", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_u8),
                                  adios::Variable<unsigned char> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned char>("u8", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_u8.m_Shape.size(), 2);
    EXPECT_EQ(var_u8.m_Shape[0], 2);
    EXPECT_EQ(var_u8.m_Shape[1], 5);
    EXPECT_EQ(var_u8.m_Count.size(), 0);
    EXPECT_EQ(var_u8.m_Start.size(), 0);
    EXPECT_EQ(var_u8.m_Name, "u8");
    EXPECT_EQ(var_u8.m_Type, "unsigned char");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUShort2x5)
{
    auto &var_u16 = io.DefineVariable<unsigned short>("u16", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_u16),
                                  adios::Variable<unsigned short> &>();
    EXPECT_THROW(
        auto &foo = io.DefineVariable<unsigned short>("u16", adios::Dims{2, 5}),
        std::invalid_argument);
    ASSERT_EQ(var_u16.m_Shape.size(), 2);
    EXPECT_EQ(var_u16.m_Shape[0], 2);
    EXPECT_EQ(var_u16.m_Shape[1], 5);
    EXPECT_EQ(var_u16.m_Count.size(), 0);
    EXPECT_EQ(var_u16.m_Start.size(), 0);
    EXPECT_EQ(var_u16.m_Name, "u16");
    EXPECT_EQ(var_u16.m_Type, "unsigned short");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarUInt2x5)
{
    auto &var_u32 = io.DefineVariable<unsigned int>("u32", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_u32),
                                  adios::Variable<unsigned int> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned int>("u32", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_u32.m_Shape.size(), 2);
    EXPECT_EQ(var_u32.m_Shape[0], 2);
    EXPECT_EQ(var_u32.m_Shape[1], 5);
    EXPECT_EQ(var_u32.m_Count.size(), 0);
    EXPECT_EQ(var_u32.m_Start.size(), 0);
    EXPECT_EQ(var_u32.m_Name, "u32");
    EXPECT_EQ(var_u32.m_Type, "unsigned int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarULong2x5)
{
    auto &var_u64 = io.DefineVariable<unsigned long>("u64", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_u64),
                                  adios::Variable<unsigned long> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<unsigned long>("u64", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_u64.m_Shape.size(), 2);
    EXPECT_EQ(var_u64.m_Shape[0], 2);
    EXPECT_EQ(var_u64.m_Shape[1], 5);
    EXPECT_EQ(var_u64.m_Count.size(), 0);
    EXPECT_EQ(var_u64.m_Start.size(), 0);
    EXPECT_EQ(var_u64.m_Name, "u64");
    EXPECT_EQ(var_u64.m_Type, "unsigned long int");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarFloat2x5)
{
    auto &var_r32 = io.DefineVariable<float>("r32", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_r32),
                                  adios::Variable<float> &>();
    EXPECT_THROW(auto &foo = io.DefineVariable<float>("r32", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_r32.m_Shape.size(), 2);
    EXPECT_EQ(var_r32.m_Shape[0], 2);
    EXPECT_EQ(var_r32.m_Shape[1], 5);
    EXPECT_EQ(var_r32.m_Count.size(), 0);
    EXPECT_EQ(var_r32.m_Start.size(), 0);
    EXPECT_EQ(var_r32.m_Name, "r32");
    EXPECT_EQ(var_r32.m_Type, "float");
}

TEST_F(ADIOSInterfaceWriteTest, DefineVarDouble2x5)
{
    auto &var_r64 = io.DefineVariable<double>("r64", adios::Dims{2, 5});
    ::testing::StaticAssertTypeEq<decltype(var_r64),
                                  adios::Variable<double> &>();
    EXPECT_THROW(auto &foo =
                     io.DefineVariable<double>("r64", adios::Dims{2, 5}),
                 std::invalid_argument);
    ASSERT_EQ(var_r64.m_Shape.size(), 2);
    EXPECT_EQ(var_r64.m_Shape[0], 2);
    EXPECT_EQ(var_r64.m_Shape[1], 5);
    EXPECT_EQ(var_r64.m_Count.size(), 0);
    EXPECT_EQ(var_r64.m_Start.size(), 0);
    EXPECT_EQ(var_r64.m_Name, "r64");
    EXPECT_EQ(var_r64.m_Type, "double");
}

int main(int argc, char **argv)
{
#ifdef ADIOS2_HAVE_MPI
    MPI_Init(nullptr, nullptr);
#endif
    ::testing::InitGoogleTest(&argc, argv);
    int result = RUN_ALL_TESTS();

#ifdef ADIOS2_HAVE_MPI
    MPI_Finalize();
#endif

    return result;
}