From 31811dcad8d224022c0654e0ba0315dd448d5e1d Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Sun, 5 May 2024 12:11:40 +0200 Subject: [PATCH 1/5] Remove `ReadWrite{Attribute,DataSet}` helper. There's three copies of unifying API for DataSet and Attribute. This removes one copy. --- tests/unit/tests_high_five_base.cpp | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/tests/unit/tests_high_five_base.cpp b/tests/unit/tests_high_five_base.cpp index bc33d5dad..94d221218 100644 --- a/tests/unit/tests_high_five_base.cpp +++ b/tests/unit/tests_high_five_base.cpp @@ -27,6 +27,7 @@ #include #include "tests_high_five.hpp" +#include "create_traits.hpp" #ifdef HIGHFIVE_TEST_BOOST #include @@ -1717,28 +1718,6 @@ void check_empty_dimensions(const std::vector& dims) { check_empty_dimensions(input_data, dims); } -struct ReadWriteAttribute { - template - static void create(HighFive::File& file, const std::string& name, const Container& container) { - file.createAttribute(name, container); - } - - static HighFive::Attribute get(HighFive::File& file, const std::string& name) { - return file.getAttribute(name); - } -}; - -struct ReadWriteDataSet { - template - static void create(HighFive::File& file, const std::string& name, const Container& container) { - file.createDataSet(name, container); - } - - static HighFive::DataSet get(HighFive::File& file, const std::string& name) { - return file.getDataSet(name); - } -}; - template void check_empty_read_write_cycle(const std::vector& dims) { using container_type = typename CreateContainer::container_type; @@ -1781,12 +1760,12 @@ void check_empty_read_write_cycle(const std::vector& dims) { template void check_empty_dataset(const std::vector& dims) { - check_empty_read_write_cycle(dims); + check_empty_read_write_cycle(dims); } template void check_empty_attribute(const std::vector& dims) { - check_empty_read_write_cycle(dims); + check_empty_read_write_cycle(dims); } template From d148f79977a26747596c111f5ee3475f9ca83d2e Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Mon, 6 May 2024 14:12:34 +0200 Subject: [PATCH 2/5] Remove `ForwardTo{Attribute,DataSet}`. This removes a second copy of the unifying API used for testing `Attribute`s and `DataSet`s. --- tests/unit/tests_high_five_base.cpp | 79 ++++++++++++++++------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/tests/unit/tests_high_five_base.cpp b/tests/unit/tests_high_five_base.cpp index 94d221218..9da7de5cd 100644 --- a/tests/unit/tests_high_five_base.cpp +++ b/tests/unit/tests_high_five_base.cpp @@ -2311,8 +2311,8 @@ class ForwardToDataSet { HighFive::File _file; }; -template -void check_single_string(Proxy proxy, size_t string_length) { +template +void check_single_string(File file, size_t string_length) { auto value = std::string(string_length, 'o'); auto dataspace = DataSpace::From(value); @@ -2327,42 +2327,47 @@ void check_single_string(Proxy proxy, size_t string_length) { auto variable_length = VariableLengthStringType(); SECTION("automatic") { - proxy.create("auto", value); - REQUIRE(proxy.get("auto").template read() == value); + auto obj = CreateTraits::create(file, "auto", value); + REQUIRE(obj.template read() == value); } SECTION("fixed length") { - proxy.create("fixed", dataspace, fixed_length).write(value); - REQUIRE(proxy.get("fixed").template read() == value); + auto obj = CreateTraits::create(file, "fixed", dataspace, fixed_length); + obj.template write(value); + REQUIRE(obj.template read() == value); } SECTION("overlength null-terminated") { - proxy.create("overlength_nullterm", dataspace, overlength_nullterm).write(value); - REQUIRE(proxy.get("overlength_nullterm").template read() == value); + auto obj = CreateTraits::create(file, "overlength_nullterm", dataspace, overlength_nullterm); + obj.template write(value); + REQUIRE(obj.template read() == value); } SECTION("overlength null-padded") { - proxy.create("overlength_nullpad", dataspace, overlength_nullpad).write(value); + auto obj = CreateTraits::create(file, "overlength_nullpad", dataspace, overlength_nullpad); + obj.template write(value); auto expected = std::string(n_chars_overlength, '\0'); expected.replace(0, value.size(), value.data()); - REQUIRE(proxy.get("overlength_nullpad").template read() == expected); + REQUIRE(obj.template read() == expected); } SECTION("overlength space-padded") { - proxy.create("overlength_spacepad", dataspace, overlength_spacepad).write(value); + auto obj = CreateTraits::create(file, "overlength_spacepad", dataspace, overlength_spacepad); + obj. template write(value); auto expected = std::string(n_chars_overlength, ' '); expected.replace(0, value.size(), value.data()); - REQUIRE(proxy.get("overlength_spacepad").template read() == expected); + REQUIRE(obj.template read() == expected); } SECTION("variable length") { - proxy.create("variable", dataspace, variable_length).write(value); - REQUIRE(proxy.get("variable").template read() == value); + auto obj = CreateTraits::create(file, "variable", dataspace, variable_length); + obj. template write(value); + REQUIRE(obj.template read() == value); } } -template -void check_multiple_string(Proxy proxy, size_t string_length) { +template +void check_multiple_string(File file, size_t string_length) { using value_t = std::vector; auto value = value_t{std::string(string_length, 'o'), std::string(string_length, 'x')}; @@ -2386,13 +2391,14 @@ void check_multiple_string(Proxy proxy, size_t string_length) { }; SECTION("automatic") { - proxy.create("auto", value); - check(proxy.get("auto").template read(), value); + auto obj = CreateTraits::create("auto", value); + check(obj.template read(), value); } SECTION("variable length") { - proxy.create("variable", dataspace, variable_length).write(value); - check(proxy.get("variable").template read(), value); + auto obj = CreateTraits::create("variable", dataspace, variable_length); + obj.template write(value); + check(obj.template read(), value); } auto make_padded_reference = [&](char pad, size_t n) { @@ -2407,22 +2413,24 @@ void check_multiple_string(Proxy proxy, size_t string_length) { auto check_fixed_length = [&](const std::string& label, size_t length) { SECTION(label + " null-terminated") { auto datatype = FixedLengthStringType(length + 1, StringPadding::NullTerminated); - proxy.create(label + "_nullterm", dataspace, datatype).write(value); - check(proxy.get(label + "_nullterm").template read(), value); + auto obj = CreateTraits::create(label + "_nullterm", dataspace, datatype); + obj.template write(value); + check(obj.template read(), value); } SECTION(label + " null-padded") { auto datatype = FixedLengthStringType(length, StringPadding::NullPadded); - proxy.create(label + "_nullpad", dataspace, datatype).write(value); + auto obj = CreateTraits::create(label + "_nullpad", dataspace, datatype).write(value); auto expected = make_padded_reference('\0', length); - check(proxy.get(label + "_nullpad").template read(), expected); + check(obj.template read(), expected); } SECTION(label + " space-padded") { auto datatype = FixedLengthStringType(length, StringPadding::SpacePadded); - proxy.create(label + "_spacepad", dataspace, datatype).write(value); + auto obj = CreateTraits::create(label + "_spacepad", dataspace, datatype); + obj.template write(value); auto expected = make_padded_reference(' ', length); - check(proxy.get(label + "_spacepad").template read(), expected); + check(obj.template read(), expected); } }; @@ -2432,43 +2440,46 @@ void check_multiple_string(Proxy proxy, size_t string_length) { SECTION("underlength null-terminated") { auto datatype = FixedLengthStringType(string_length, StringPadding::NullTerminated); - REQUIRE_THROWS(proxy.create("underlength_nullterm", dataspace, datatype).write(value)); + auto obj = CreateTraits::create("underlength_nullterm", dataspace, datatype); + REQUIRE_THROWS(obj.template write(value)); } SECTION("underlength nullpad") { auto datatype = FixedLengthStringType(string_length - 1, StringPadding::NullPadded); - REQUIRE_THROWS(proxy.create("underlength_nullpad", dataspace, datatype).write(value)); + auto obj = CreateTraits::create("underlength_nullpad", dataspace, datatype); + REQUIRE_THROWS(obj.template write(value)); } SECTION("underlength spacepad") { auto datatype = FixedLengthStringType(string_length - 1, StringPadding::NullTerminated); - REQUIRE_THROWS(proxy.create("underlength_spacepad", dataspace, datatype).write(value)); + auto obj = proxy.create("underlength_spacepad", dataspace, datatype); + REQUIRE_THROWS(obj.write(value)); } } TEST_CASE("HighFiveSTDString (dataset, single, short)") { File file("std_string_dataset_single_short.h5", File::Truncate); - check_single_string(ForwardToDataSet(file), 3); + check_single_string(file, 3); } TEST_CASE("HighFiveSTDString (attribute, single, short)") { File file("std_string_attribute_single_short.h5", File::Truncate); - check_single_string(ForwardToAttribute(file), 3); + check_single_string(file, 3); } TEST_CASE("HighFiveSTDString (dataset, single, long)") { File file("std_string_dataset_single_long.h5", File::Truncate); - check_single_string(ForwardToDataSet(file), 256); + check_single_string(file, 256); } TEST_CASE("HighFiveSTDString (attribute, single, long)") { File file("std_string_attribute_single_long.h5", File::Truncate); - check_single_string(ForwardToAttribute(file), 256); + check_single_string(file, 256); } TEST_CASE("HighFiveSTDString (dataset, multiple, short)") { File file("std_string_dataset_multiple_short.h5", File::Truncate); - check_multiple_string(ForwardToDataSet(file), 3); + check_multiple_string(file, 3); } TEST_CASE("HighFiveSTDString (attribute, multiple, short)") { From 296dad0f9c95faed18941a91c5022dd5772188c7 Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Mon, 6 May 2024 14:21:54 +0200 Subject: [PATCH 3/5] Improve formatting. --- tests/unit/tests_high_five_base.cpp | 35 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/tests/unit/tests_high_five_base.cpp b/tests/unit/tests_high_five_base.cpp index 9da7de5cd..8ef254478 100644 --- a/tests/unit/tests_high_five_base.cpp +++ b/tests/unit/tests_high_five_base.cpp @@ -2338,7 +2338,8 @@ void check_single_string(File file, size_t string_length) { } SECTION("overlength null-terminated") { - auto obj = CreateTraits::create(file, "overlength_nullterm", dataspace, overlength_nullterm); + auto obj = + CreateTraits::create(file, "overlength_nullterm", dataspace, overlength_nullterm); obj.template write(value); REQUIRE(obj.template read() == value); } @@ -2352,8 +2353,9 @@ void check_single_string(File file, size_t string_length) { } SECTION("overlength space-padded") { - auto obj = CreateTraits::create(file, "overlength_spacepad", dataspace, overlength_spacepad); - obj. template write(value); + auto obj = + CreateTraits::create(file, "overlength_spacepad", dataspace, overlength_spacepad); + obj.template write(value); auto expected = std::string(n_chars_overlength, ' '); expected.replace(0, value.size(), value.data()); REQUIRE(obj.template read() == expected); @@ -2361,7 +2363,7 @@ void check_single_string(File file, size_t string_length) { SECTION("variable length") { auto obj = CreateTraits::create(file, "variable", dataspace, variable_length); - obj. template write(value); + obj.template write(value); REQUIRE(obj.template read() == value); } } @@ -2391,13 +2393,13 @@ void check_multiple_string(File file, size_t string_length) { }; SECTION("automatic") { - auto obj = CreateTraits::create("auto", value); + auto obj = CreateTraits::create(file, "auto", value); check(obj.template read(), value); } SECTION("variable length") { - auto obj = CreateTraits::create("variable", dataspace, variable_length); - obj.template write(value); + auto obj = CreateTraits::create(file, "variable", dataspace, variable_length); + obj.template write(value); check(obj.template read(), value); } @@ -2413,21 +2415,22 @@ void check_multiple_string(File file, size_t string_length) { auto check_fixed_length = [&](const std::string& label, size_t length) { SECTION(label + " null-terminated") { auto datatype = FixedLengthStringType(length + 1, StringPadding::NullTerminated); - auto obj = CreateTraits::create(label + "_nullterm", dataspace, datatype); + auto obj = CreateTraits::create(file, label + "_nullterm", dataspace, datatype); obj.template write(value); check(obj.template read(), value); } SECTION(label + " null-padded") { auto datatype = FixedLengthStringType(length, StringPadding::NullPadded); - auto obj = CreateTraits::create(label + "_nullpad", dataspace, datatype).write(value); + auto obj = CreateTraits::create(file, label + "_nullpad", dataspace, datatype); + obj.template write(value); auto expected = make_padded_reference('\0', length); check(obj.template read(), expected); } SECTION(label + " space-padded") { auto datatype = FixedLengthStringType(length, StringPadding::SpacePadded); - auto obj = CreateTraits::create(label + "_spacepad", dataspace, datatype); + auto obj = CreateTraits::create(file, label + "_spacepad", dataspace, datatype); obj.template write(value); auto expected = make_padded_reference(' ', length); check(obj.template read(), expected); @@ -2440,19 +2443,19 @@ void check_multiple_string(File file, size_t string_length) { SECTION("underlength null-terminated") { auto datatype = FixedLengthStringType(string_length, StringPadding::NullTerminated); - auto obj = CreateTraits::create("underlength_nullterm", dataspace, datatype); + auto obj = CreateTraits::create(file, "underlength_nullterm", dataspace, datatype); REQUIRE_THROWS(obj.template write(value)); } SECTION("underlength nullpad") { auto datatype = FixedLengthStringType(string_length - 1, StringPadding::NullPadded); - auto obj = CreateTraits::create("underlength_nullpad", dataspace, datatype); + auto obj = CreateTraits::create(file, "underlength_nullpad", dataspace, datatype); REQUIRE_THROWS(obj.template write(value)); } SECTION("underlength spacepad") { auto datatype = FixedLengthStringType(string_length - 1, StringPadding::NullTerminated); - auto obj = proxy.create("underlength_spacepad", dataspace, datatype); + auto obj = CreateTraits::create(file, "underlength_spacepad", dataspace, datatype); REQUIRE_THROWS(obj.write(value)); } } @@ -2484,17 +2487,17 @@ TEST_CASE("HighFiveSTDString (dataset, multiple, short)") { TEST_CASE("HighFiveSTDString (attribute, multiple, short)") { File file("std_string_attribute_multiple_short.h5", File::Truncate); - check_multiple_string(ForwardToAttribute(file), 3); + check_multiple_string(file, 3); } TEST_CASE("HighFiveSTDString (dataset, multiple, long)") { File file("std_string_dataset_multiple_long.h5", File::Truncate); - check_multiple_string(ForwardToDataSet(file), 256); + check_multiple_string(file, 256); } TEST_CASE("HighFiveSTDString (attribute, multiple, long)") { File file("std_string_attribute_multiple_long.h5", File::Truncate); - check_multiple_string(ForwardToAttribute(file), 256); + check_multiple_string(file, 256); } TEST_CASE("HighFiveFixedString") { From 5955c67a6e2545345888a5512810697b40b5a5e4 Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Mon, 6 May 2024 15:02:10 +0200 Subject: [PATCH 4/5] Windows fixups. --- tests/unit/tests_high_five_base.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/unit/tests_high_five_base.cpp b/tests/unit/tests_high_five_base.cpp index 8ef254478..b71063251 100644 --- a/tests/unit/tests_high_five_base.cpp +++ b/tests/unit/tests_high_five_base.cpp @@ -2333,20 +2333,20 @@ void check_single_string(File file, size_t string_length) { SECTION("fixed length") { auto obj = CreateTraits::create(file, "fixed", dataspace, fixed_length); - obj.template write(value); + obj.write(value); REQUIRE(obj.template read() == value); } SECTION("overlength null-terminated") { auto obj = CreateTraits::create(file, "overlength_nullterm", dataspace, overlength_nullterm); - obj.template write(value); + obj.write(value); REQUIRE(obj.template read() == value); } SECTION("overlength null-padded") { auto obj = CreateTraits::create(file, "overlength_nullpad", dataspace, overlength_nullpad); - obj.template write(value); + obj.write(value); auto expected = std::string(n_chars_overlength, '\0'); expected.replace(0, value.size(), value.data()); REQUIRE(obj.template read() == expected); @@ -2355,7 +2355,7 @@ void check_single_string(File file, size_t string_length) { SECTION("overlength space-padded") { auto obj = CreateTraits::create(file, "overlength_spacepad", dataspace, overlength_spacepad); - obj.template write(value); + obj.write(value); auto expected = std::string(n_chars_overlength, ' '); expected.replace(0, value.size(), value.data()); REQUIRE(obj.template read() == expected); @@ -2363,7 +2363,7 @@ void check_single_string(File file, size_t string_length) { SECTION("variable length") { auto obj = CreateTraits::create(file, "variable", dataspace, variable_length); - obj.template write(value); + obj.write(value); REQUIRE(obj.template read() == value); } } @@ -2399,7 +2399,7 @@ void check_multiple_string(File file, size_t string_length) { SECTION("variable length") { auto obj = CreateTraits::create(file, "variable", dataspace, variable_length); - obj.template write(value); + obj.write(value); check(obj.template read(), value); } @@ -2416,14 +2416,14 @@ void check_multiple_string(File file, size_t string_length) { SECTION(label + " null-terminated") { auto datatype = FixedLengthStringType(length + 1, StringPadding::NullTerminated); auto obj = CreateTraits::create(file, label + "_nullterm", dataspace, datatype); - obj.template write(value); + obj.write(value); check(obj.template read(), value); } SECTION(label + " null-padded") { auto datatype = FixedLengthStringType(length, StringPadding::NullPadded); auto obj = CreateTraits::create(file, label + "_nullpad", dataspace, datatype); - obj.template write(value); + obj.write(value); auto expected = make_padded_reference('\0', length); check(obj.template read(), expected); } @@ -2431,7 +2431,7 @@ void check_multiple_string(File file, size_t string_length) { SECTION(label + " space-padded") { auto datatype = FixedLengthStringType(length, StringPadding::SpacePadded); auto obj = CreateTraits::create(file, label + "_spacepad", dataspace, datatype); - obj.template write(value); + obj.write(value); auto expected = make_padded_reference(' ', length); check(obj.template read(), expected); } @@ -2444,13 +2444,13 @@ void check_multiple_string(File file, size_t string_length) { SECTION("underlength null-terminated") { auto datatype = FixedLengthStringType(string_length, StringPadding::NullTerminated); auto obj = CreateTraits::create(file, "underlength_nullterm", dataspace, datatype); - REQUIRE_THROWS(obj.template write(value)); + REQUIRE_THROWS(obj.write(value)); } SECTION("underlength nullpad") { auto datatype = FixedLengthStringType(string_length - 1, StringPadding::NullPadded); auto obj = CreateTraits::create(file, "underlength_nullpad", dataspace, datatype); - REQUIRE_THROWS(obj.template write(value)); + REQUIRE_THROWS(obj.write(value)); } SECTION("underlength spacepad") { From 39dc73d3dd9caa33f6ec242a40b4e732c11d0883 Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Mon, 6 May 2024 16:28:39 +0200 Subject: [PATCH 5/5] ... and remove. --- tests/unit/tests_high_five_base.cpp | 48 ----------------------------- 1 file changed, 48 deletions(-) diff --git a/tests/unit/tests_high_five_base.cpp b/tests/unit/tests_high_five_base.cpp index b71063251..fde643e04 100644 --- a/tests/unit/tests_high_five_base.cpp +++ b/tests/unit/tests_high_five_base.cpp @@ -2263,54 +2263,6 @@ TEST_CASE("DirectWriteBool") { } -class ForwardToAttribute { - public: - ForwardToAttribute(const HighFive::File& file) - : _file(file) {} - - template - HighFive::Attribute create(const std::string& name, const T& value) { - return _file.createAttribute(name, value); - } - - HighFive::Attribute create(const std::string& name, - const HighFive::DataSpace filespace, - const HighFive::DataType& datatype) { - return _file.createAttribute(name, filespace, datatype); - } - - HighFive::Attribute get(const std::string& name) { - return _file.getAttribute(name); - } - - private: - HighFive::File _file; -}; - -class ForwardToDataSet { - public: - ForwardToDataSet(const HighFive::File& file) - : _file(file) {} - - template - HighFive::DataSet create(const std::string& name, const T& value) { - return _file.createDataSet(name, value); - } - - HighFive::DataSet create(const std::string& name, - const HighFive::DataSpace filespace, - const HighFive::DataType& datatype) { - return _file.createDataSet(name, filespace, datatype); - } - - HighFive::DataSet get(const std::string& name) { - return _file.getDataSet(name); - } - - private: - HighFive::File _file; -}; - template void check_single_string(File file, size_t string_length) { auto value = std::string(string_length, 'o');