diff --git a/modules/core/test/tools/io/testNPZ.cpp b/modules/core/test/tools/io/testNPZ.cpp index aad6afdd26..e6ae41913d 100644 --- a/modules/core/test/tools/io/testNPZ.cpp +++ b/modules/core/test/tools/io/testNPZ.cpp @@ -123,8 +123,9 @@ TEST_CASE("Test visp::cnpy::npy_load/npz_save", "[visp::cnpy I/O]") SECTION("Read/Save vpImage") { - // REQUIRE(std::is_trivially_copyable_v == true); // false - // REQUIRE(std::is_trivial_v == true); // false + // CHECK(std::is_trivially_copyable::value == true); // false + // CHECK(std::is_trivial::value == true); // false + CHECK(sizeof(vpRGBa) == (4 * sizeof(unsigned char))); const std::string identifier = "vpImage"; vpImage I_save_copy; @@ -158,10 +159,13 @@ TEST_CASE("Test visp::cnpy::npy_load/npz_save", "[visp::cnpy I/O]") SECTION("Read/Save std::complex") { + // Handling of std::complex<>? + // - https://github.com/rogersce/cnpy/blob/4e8810b1a8637695171ed346ce68f6984e585ef4/cnpy.cpp#L40-L42 + // - https://github.com/rogersce/cnpy/blob/4e8810b1a8637695171ed346ce68f6984e585ef4/cnpy.h#L129 // https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable - REQUIRE(std::is_trivially_copyable_v> == true); + CHECK(std::is_trivially_copyable>::value == true); // https://en.cppreference.com/w/cpp/types/is_trivial - // REQUIRE(std::is_trivial_v> == true); // false + // CHECK(std::is_trivial>::value == true); // false const std::string identifier = "std::complex"; std::complex complex_data_copy; @@ -215,6 +219,66 @@ TEST_CASE("Test visp::cnpy::npy_load/npz_save", "[visp::cnpy I/O]") } } + SECTION("Read/Save vpHomogeneousMatrix") + { + const std::string identifier = "vpHomogeneousMatrix"; + vpHomogeneousMatrix cMo_save_copy; + { + vpHomogeneousMatrix cMo_save(vpTranslationVector(10, 20, 30), vpThetaUVector(1, 2, 3)); + // std::cout << "cMo_save:\n" << cMo_save << std::endl; + + visp::cnpy::npz_save(npz_filename, identifier, &cMo_save.data[0], { cMo_save.getRows(), cMo_save.getCols() }, "a"); // append + cMo_save_copy = cMo_save; + } + + { + visp::cnpy::npz_t npz_data = visp::cnpy::npz_load(npz_filename); + REQUIRE(npz_data.find(identifier) != npz_data.end()); + + visp::cnpy::NpyArray arr_vec_data = npz_data[identifier]; + vpHomogeneousMatrix cMo_read(arr_vec_data.as_vec()); + // std::cout << "cMo_read:\n" << cMo_read << std::endl; + + CHECK(cMo_save_copy == cMo_read); + } + } + + SECTION("Read/Save std::vector") + { + const std::string identifier = "std::vector"; + std::vector vec_cMo_save_copy; + { + std::vector vec_cMo_save; + for (size_t i = 0; i < 5; i++) { + vpHomogeneousMatrix cMo_save(vpTranslationVector(1+10*i, 2+20*i, 3+30*i), vpThetaUVector(0.1+i, 0.2+i, 0.3+i)); + vec_cMo_save_copy.push_back(cMo_save); + vec_cMo_save.insert(vec_cMo_save.end(), cMo_save.data, cMo_save.data+cMo_save.size()); + // std::cout << "cMo_save:\n" << cMo_save << std::endl; + } + + visp::cnpy::npz_save(npz_filename, identifier, &vec_cMo_save[0], { vec_cMo_save.size()/16, 16 }, "a"); // append + } + + { + visp::cnpy::npz_t npz_data = visp::cnpy::npz_load(npz_filename); + REQUIRE(npz_data.find(identifier) != npz_data.end()); + + visp::cnpy::NpyArray arr_vec_data = npz_data[identifier]; + std::vector vec_cMo_read = arr_vec_data.as_vec(); + REQUIRE(vec_cMo_save_copy.size() == arr_vec_data.shape[0]); + + for (size_t i = 0; i < arr_vec_data.shape[0]; i++) { + std::vector::const_iterator first = vec_cMo_read.begin() + i*arr_vec_data.shape[1]; + std::vector::const_iterator last = first + arr_vec_data.shape[1]; + std::vector subvec_cMo_read(first, last); + + vpHomogeneousMatrix cMo_read(subvec_cMo_read); + // std::cout << "cMo_read:\n" << cMo_read << std::endl; + CHECK(vec_cMo_save_copy[i] == cMo_read); + } + } + } + REQUIRE(vpIoTools::remove(directory_filename)); REQUIRE(!vpIoTools::checkDirectory(directory_filename)); }