From 98c9718aaf2524a38e13be823cf545c2d4b2b13b Mon Sep 17 00:00:00 2001 From: Kristian Hartikainen Date: Tue, 4 Apr 2023 19:59:58 +0100 Subject: [PATCH 1/3] Add (currently-failing) `mj_sizeModel` test --- test/engine/engine_io_test.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/engine/engine_io_test.cc b/test/engine/engine_io_test.cc index 6539930c..aec4b3dc 100644 --- a/test/engine/engine_io_test.cc +++ b/test/engine/engine_io_test.cc @@ -18,7 +18,11 @@ #include #include +#include #include +#include +#include +#include #include #include @@ -47,6 +51,34 @@ mjModel PartialModel(const mjModel* m) { return partial_model; } +TEST_F(EngineIoTest, VerifySizeModel) { + constexpr char xml[] = R"( + + + + + + + + + )"; + + std::array error; + mjModel* model = LoadModelFromString(xml, error.data(), error.size()); + ASSERT_THAT(model, NotNull()) << "Failed to load model: " << error.data(); + + std::filesystem::path temp_file = ( + std::filesystem::temp_directory_path() / "model.mjb"); + + mj_saveModel(model, temp_file.string().c_str(), NULL, 0); + + std::uintmax_t file_size = std::filesystem::file_size(temp_file); + + std::filesystem::remove(temp_file); + + EXPECT_EQ(file_size, mj_sizeModel(model)); +} + TEST_F(EngineIoTest, MakeDataFromPartialModel) { constexpr char xml[] = R"( From f287fb020c9f3b733d042cdf0a65ba629483d56a Mon Sep 17 00:00:00 2001 From: Kristian Hartikainen Date: Tue, 4 Apr 2023 20:00:39 +0100 Subject: [PATCH 2/3] Fix `mj_sizeModel` --- src/engine/engine_io.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index d14647e5..0381e613 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -803,8 +803,19 @@ void mj_deleteModel(mjModel* m) { // size of buffer needed to hold model int mj_sizeModel(const mjModel* m) { - return sizeof(int)*(4+getnint()) + sizeof(mjOption) + - sizeof(mjVisual) + sizeof(mjStatistic) + m->nbuffer; + int size = ( + sizeof(int)*(4+getnint()) + + sizeof(mjOption) + + sizeof(mjVisual) + + sizeof(mjStatistic)); + +MJMODEL_POINTERS_PREAMBLE(m) +#define X(type, name, nr, nc) \ + size += sizeof(type)*(m->nr)*(nc); + MJMODEL_POINTERS +#undef X + + return size; } From f91b760799f5a2f478767f72995199599b0215be Mon Sep 17 00:00:00 2001 From: Kristian Hartikainen Date: Wed, 5 Apr 2023 11:56:07 +0100 Subject: [PATCH 3/3] Clean `model` in `VerifySizeModel` test --- test/engine/engine_io_test.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/engine/engine_io_test.cc b/test/engine/engine_io_test.cc index aec4b3dc..4ccebcce 100644 --- a/test/engine/engine_io_test.cc +++ b/test/engine/engine_io_test.cc @@ -73,10 +73,12 @@ TEST_F(EngineIoTest, VerifySizeModel) { mj_saveModel(model, temp_file.string().c_str(), NULL, 0); std::uintmax_t file_size = std::filesystem::file_size(temp_file); + int model_size = mj_sizeModel(model); std::filesystem::remove(temp_file); + mj_deleteModel(model); - EXPECT_EQ(file_size, mj_sizeModel(model)); + EXPECT_EQ(file_size, model_size); } TEST_F(EngineIoTest, MakeDataFromPartialModel) {