diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b21988535..c28cf726fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -792,6 +792,10 @@ if(openPMD_BUILD_TESTING) test/Files_ParallelIO/read_variablebased_randomaccess.cpp test/Files_ParallelIO/iterate_nonstreaming_series.cpp ) + elseif(${test_name} STREQUAL "Core") + list(APPEND ${out_list} + test/Files_Core/automatic_variable_encoding.cpp + ) endif() endmacro() diff --git a/test/CoreTest.cpp b/test/CoreTest.cpp index eedffef598..140851d34e 100644 --- a/test/CoreTest.cpp +++ b/test/CoreTest.cpp @@ -5,6 +5,8 @@ #endif #include "openPMD/openPMD.hpp" +#include "Files_Core/CoreTests.hpp" + #include "openPMD/IO/ADIOS/macros.hpp" #include "openPMD/auxiliary/Filesystem.hpp" #include "openPMD/auxiliary/JSON.hpp" @@ -1498,338 +1500,10 @@ TEST_CASE("unavailable_backend", "[core]") #endif } -void breakpoint() -{} - -#if openPMD_HAVE_ADIOS2 TEST_CASE("automatic_variable_encoding", "[adios2]") { - size_t filename_counter = 0; - auto filename = [&filename_counter]() { - std::stringstream res; - res << "../samples/automatic_variable_encoding/test_no_" - << filename_counter << ".bp5"; - return res.str(); - }; - auto next_filename = [&filename_counter, &filename]() { - ++filename_counter; - return filename(); - }; - auto require_encoding = [&filename](IterationEncoding ie) { - Series read(filename(), openPMD::Access::READ_RANDOM_ACCESS); - REQUIRE(read.iterationEncoding() == ie); - }; - - // TESTS - - { - Series write(next_filename(), Access::CREATE); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - // explicitly set variable encoding - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "variable_based")"); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "variable_based")"); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "variable_based")"); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "variable_based")"); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "variable_based")"); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - // explicitly set variable encoding - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "group_based")"); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "group_based")"); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "group_based")"); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "group_based")"); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write( - next_filename(), - Access::CREATE, - R"(iteration_encoding = "group_based")"); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - // explicitly use API call to set variable encoding - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - // explicitly use API call to set group encoding - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::groupBased); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::groupBased); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::groupBased); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::groupBased); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::groupBased); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - // explicitly use API call to set group encoding - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.flush(); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.setIterationEncoding(IterationEncoding::variableBased); - write.flush(); - write.snapshots(SnapshotWorkflow::Synchronous); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - // explicitly use API call to set group encoding a bit late - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.setIterationEncoding(IterationEncoding::groupBased); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::Synchronous); - write.setIterationEncoding(IterationEncoding::groupBased); - write.close(); - require_encoding(IterationEncoding::groupBased); - } - - // explicitly use API call to set variable encoding a bit late - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::RandomAccess); - write.setIterationEncoding(IterationEncoding::variableBased); - write.close(); - require_encoding(IterationEncoding::variableBased); - } - - { - Series write(next_filename(), Access::CREATE); - write.snapshots(SnapshotWorkflow::Synchronous); - write.setIterationEncoding(IterationEncoding::variableBased); - write.close(); - require_encoding(IterationEncoding::variableBased); - } + automatic_variable_encoding::automatic_variable_encoding(); } -#endif TEST_CASE("unique_ptr", "[core]") { diff --git a/test/Files_Core/CoreTests.hpp b/test/Files_Core/CoreTests.hpp new file mode 100644 index 0000000000..27cb896706 --- /dev/null +++ b/test/Files_Core/CoreTests.hpp @@ -0,0 +1,6 @@ +#include + +namespace automatic_variable_encoding +{ +auto automatic_variable_encoding() -> void; +} diff --git a/test/Files_Core/automatic_variable_encoding.cpp b/test/Files_Core/automatic_variable_encoding.cpp new file mode 100644 index 0000000000..172d7162d1 --- /dev/null +++ b/test/Files_Core/automatic_variable_encoding.cpp @@ -0,0 +1,339 @@ +#include "CoreTests.hpp" +#include + +#include + +namespace automatic_variable_encoding +{ +auto automatic_variable_encoding() -> void +{ +#if openPMD_HAVE_ADIOS2 && openPMD_HAS_ADIOS_2_9 + using namespace openPMD; + + size_t filename_counter = 0; + auto filename = [&filename_counter]() { + std::stringstream res; + res << "../samples/automatic_variable_encoding/test_no_" + << filename_counter << ".bp5"; + return res.str(); + }; + auto next_filename = [&filename_counter, &filename]() { + ++filename_counter; + return filename(); + }; + auto require_encoding = [&filename](IterationEncoding ie) { + Series read(filename(), openPMD::Access::READ_RANDOM_ACCESS); + REQUIRE(read.iterationEncoding() == ie); + }; + + // TESTS + + { + Series write(next_filename(), Access::CREATE); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + // explicitly set variable encoding + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "variable_based")"); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "variable_based")"); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "variable_based")"); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "variable_based")"); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "variable_based")"); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + // explicitly set variable encoding + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "group_based")"); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "group_based")"); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "group_based")"); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "group_based")"); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write( + next_filename(), + Access::CREATE, + R"(iteration_encoding = "group_based")"); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + // explicitly use API call to set variable encoding + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + // explicitly use API call to set group encoding + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::groupBased); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::groupBased); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::groupBased); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::groupBased); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::groupBased); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + // explicitly use API call to set group encoding + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.flush(); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.setIterationEncoding(IterationEncoding::variableBased); + write.flush(); + write.snapshots(SnapshotWorkflow::Synchronous); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + // explicitly use API call to set group encoding a bit late + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.setIterationEncoding(IterationEncoding::groupBased); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::Synchronous); + write.setIterationEncoding(IterationEncoding::groupBased); + write.close(); + require_encoding(IterationEncoding::groupBased); + } + + // explicitly use API call to set variable encoding a bit late + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::RandomAccess); + write.setIterationEncoding(IterationEncoding::variableBased); + write.close(); + require_encoding(IterationEncoding::variableBased); + } + + { + Series write(next_filename(), Access::CREATE); + write.snapshots(SnapshotWorkflow::Synchronous); + write.setIterationEncoding(IterationEncoding::variableBased); + write.close(); + require_encoding(IterationEncoding::variableBased); + } +#endif +} +} // namespace automatic_variable_encoding