Enable WriteReadCompare for models with assets.

PiperOrigin-RevId: 765500742
Change-Id: I119dbea11ed6771839b5e81d04070e95a51d3ed0
This commit is contained in:
Alessio Quaglino
2025-05-31 00:55:32 -07:00
committed by Copybara-Service
parent 84ad22a590
commit fe81373ffe
+44 -32
View File
@@ -1381,19 +1381,30 @@ TEST_F(XMLWriterTest, WriteReadCompare) {
std::string xml = p.path().string(); std::string xml = p.path().string();
// if file is meant to fail, skip it // if file is meant to fail, skip it
if (absl::StrContains(p.path().string(), "100_humanoids") || if (absl::StrContains(p.path().string(), "malformed_") ||
absl::StrContains(p.path().string(), "malformed_") || // exclude files that are too slow to load
absl::StrContains(p.path().string(), "cow") || absl::StrContains(p.path().string(), "cow") ||
absl::StrContains(p.path().string(), "gmsh_") || absl::StrContains(p.path().string(), "gmsh_") ||
absl::StrContains(p.path().string(), "shark_") || absl::StrContains(p.path().string(), "shark_") ||
absl::StrContains(p.path().string(), "frameless_contact_hfield") || absl::StrContains(p.path().string(), "spheremesh") ||
absl::StrContains(p.path().string(), "spheremesh")) { // exclude files that fail the comparison test
absl::StrContains(p.path().string(), "usd") ||
absl::StrContains(p.path().string(), "torus_maxhull") ||
absl::StrContains(p.path().string(), "fitmesh_") ||
absl::StrContains(p.path().string(), "lengthrange") ||
absl::StrContains(p.path().string(), "hfield_xml") ||
absl::StrContains(p.path().string(), "fromto_convex") ||
absl::StrContains(p.path().string(), "cube_skin") ||
absl::StrContains(p.path().string(), "cube_3x3x3")) {
continue; continue;
} }
// load model // load model
std::array<char, 1000> error; std::array<char, 1000> error;
mjModel* m = mj_loadXML( mjSpec* s =
xml.c_str(), nullptr, error.data(), error.size()); mj_parseXML(xml.c_str(), nullptr, error.data(), error.size());
ASSERT_THAT(s, NotNull())
<< "Failed to load " << xml.c_str() << ": " << error.data();
mjModel* m = mj_compile(s, nullptr);
ASSERT_THAT(m, NotNull()) ASSERT_THAT(m, NotNull())
<< "Failed to load " << xml.c_str() << ": " << error.data(); << "Failed to load " << xml.c_str() << ": " << error.data();
@@ -1402,32 +1413,33 @@ TEST_F(XMLWriterTest, WriteReadCompare) {
ASSERT_THAT(d, testing::NotNull()) << "Failed to create data\n"; ASSERT_THAT(d, testing::NotNull()) << "Failed to create data\n";
// save and load back // save and load back
mjModel* mtemp = auto abs_path = p.path();
LoadModelFromString(SaveAndReadXml(m), error.data(), error.size()); mjSpec* stemp = mj_parseXMLString(SaveAndReadXml(s).c_str(), 0,
error.data(), error.size());
mjs_setString(stemp->modelfiledir,
abs_path.remove_filename().string().c_str());
mjModel* mtemp = mj_compile(stemp, nullptr);
if (!mtemp) { ASSERT_THAT(mtemp, NotNull())
// if failing because assets are missing, accept the test << error.data() << " from " << xml.c_str();
ASSERT_THAT(error.data(), HasSubstr("file"))
<< error.data() << " from " << xml.c_str();
} else {
mjtNum tol = 0;
// for particularly sensitive models, relax the tolerance mjtNum tol = 0;
if (absl::StrContains(p.path().string(), "belt.xml") ||
absl::StrContains(p.path().string(), "cable.xml")) {
tol = 1e-13;
}
// compare and delete // for particularly sensitive models, relax the tolerance
std::string field = ""; if (absl::StrContains(p.path().string(), "belt.xml") ||
mjtNum result = CompareModel(m, mtemp, field); absl::StrContains(p.path().string(), "cable.xml")) {
EXPECT_LE(result, tol) tol = 1e-13;
<< "Loaded and saved models are different!\n"
<< "Affected file " << p.path().string() << '\n'
<< "Different field: " << field << '\n';
mj_deleteModel(mtemp);
} }
// compare and delete
std::string field = "";
mjtNum result = CompareModel(m, mtemp, field);
EXPECT_LE(result, tol)
<< "Loaded and saved models are different!\n"
<< "Affected file " << p.path().string() << '\n'
<< "Different field: " << field << '\n';
mj_deleteModel(mtemp);
// check for stack memory leak // check for stack memory leak
mj_step(m, d); mj_step(m, d);
EXPECT_EQ(d->pstack, 0) << "mjData stack memory leak detected in " << EXPECT_EQ(d->pstack, 0) << "mjData stack memory leak detected in " <<
@@ -1452,21 +1464,21 @@ TEST_F(XMLWriterTest, WriteReadCompare) {
ASSERT_THAT(mtemp, NotNull()); ASSERT_THAT(mtemp, NotNull());
// compare with 0 tolerance // compare with 0 tolerance
std::string field = ""; field = "";
mjtNum result = CompareModel(m, mtemp, field); result = CompareModel(m, mtemp, field);
EXPECT_EQ(result, 0) EXPECT_EQ(result, 0)
<< "Loaded and saved binary models are different!\n" << "Loaded and saved binary models are different!\n"
<< "Affected file " << p.path().string() << '\n' << "Affected file " << p.path().string() << '\n'
<< "Different field: " << field << '\n'; << "Different field: " << field << '\n';
// clean up // clean up
mj_deleteSpec(s);
mj_deleteSpec(stemp);
mj_deleteModel(m);
mj_deleteModel(mtemp); mj_deleteModel(mtemp);
mj_deleteVFS(vfs); mj_deleteVFS(vfs);
mju_free(vfs); mju_free(vfs);
mju_free(buffer); mju_free(buffer);
// delete model
mj_deleteModel(m);
} }
} }
} }