From 3f9defa8d0c961fd37e7c3610e26c88efeeadcc3 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Thu, 30 Mar 2023 03:50:29 -0700 Subject: [PATCH] Don't save an empty section. PiperOrigin-RevId: 520594748 Change-Id: Ib5e1eb3a93e9d579adeda1052a2c29d724d6b497 --- src/xml/xml_native_writer.cc | 7 +++++++ test/xml/xml_native_writer_test.cc | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index 76917936..24f1a481 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -1057,6 +1057,13 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { OneActuator(elem, &def->actuator, par); if (!elem->FirstAttribute()) section->DeleteChild(elem); + // if top-level class has no members or children, delete it and return + if (def->parentid<0 && section->NoChildren() && def->childid.empty()) { + root->DeleteChild(section); + delete par; + return; + } + // add children recursively for (int i=0; i<(int)def->childid.size(); i++) { Default(section, model->defaults[def->childid[i]]); diff --git a/test/xml/xml_native_writer_test.cc b/test/xml/xml_native_writer_test.cc index 7929c4f5..b125c9b5 100644 --- a/test/xml/xml_native_writer_test.cc +++ b/test/xml/xml_native_writer_test.cc @@ -52,6 +52,15 @@ using ::testing::NotNull; using XMLWriterTest = MujocoTest; +TEST_F(XMLWriterTest, EmptyModel) { + static constexpr char xml[] = ""; + mjModel* model = LoadModelFromString(xml); + ASSERT_THAT(model, NotNull()); + std::string saved_xml = SaveAndReadXml(model); + EXPECT_THAT(saved_xml, Not(HasSubstr("default"))); + mj_deleteModel(model); +} + TEST_F(XMLWriterTest, SavesMemory) { { static constexpr char xml[] = R"(