Improve error reporting of sensorized objects.

Also remove duplication of element name and id from most error messages.

PiperOrigin-RevId: 628065116
Change-Id: Idd962fbab7aeba09e3a70c6c9d044b23db94cf23
This commit is contained in:
Yuval Tassa
2024-04-25 07:12:26 -07:00
committed by Copybara-Service
parent cbb048ff00
commit 027c26a153
4 changed files with 187 additions and 217 deletions
+64 -22
View File
@@ -543,8 +543,9 @@ TEST_F(RelativeFrameSensorParsingTest, BadRefName) {
)";
std::array<char, 1024> error;
LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(error.data(), HasSubstr("unrecognized name of reference frame"));
EXPECT_THAT(error.data(), HasSubstr("line = 8"));
EXPECT_THAT(error.data(),
HasSubstr("unrecognized name 'wrong_name' of reference frame"));
EXPECT_THAT(error.data(), HasSubstr("line 8"));
}
TEST_F(RelativeFrameSensorParsingTest, BadRefType) {
@@ -563,7 +564,48 @@ TEST_F(RelativeFrameSensorParsingTest, BadRefType) {
std::array<char, 1024> error;
LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(error.data(), HasSubstr("reference frame object must be"));
EXPECT_THAT(error.data(), HasSubstr("line = 8"));
EXPECT_THAT(error.data(), HasSubstr("line 8"));
}
TEST_F(RelativeFrameSensorParsingTest, BadObjName) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<site name="a"/>
</worldbody>
<sensor>
<framepos name="tom" objtype="site" objname="alessio" reftype="site" refname="a"/>
</sensor>
</mujoco>
)";
std::array<char, 1024> error;
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(),
HasSubstr("unrecognized name 'alessio' of sensorized object"));
EXPECT_THAT(error.data(), HasSubstr("name 'tom'"));
EXPECT_THAT(error.data(), HasSubstr("line 7"));
}
TEST_F(RelativeFrameSensorParsingTest, BadObjRefName) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<site name="a"/>
</worldbody>
<sensor>
<framepos name="tom" objtype="site" objname="a" reftype="site" refname="alessio"/>
</sensor>
</mujoco>
)";
std::array<char, 1024> error;
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(
error.data(),
HasSubstr("unrecognized name 'alessio' of reference frame object"));
EXPECT_THAT(error.data(), HasSubstr("name 'tom'"));
EXPECT_THAT(error.data(), HasSubstr("line 7"));
}
// ------------- sensor compilation --------------------------------------------
@@ -710,7 +752,7 @@ TEST_F(MjCGeomTest, NanSize) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, testing::IsNull());
ASSERT_THAT(error.data(), HasSubstr("nan"));
EXPECT_THAT(error.data(), HasSubstr("line = 5"));
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
// ------------- test height fields --------------------------------------------
@@ -785,7 +827,7 @@ TEST_F(CameraSpecTest, FovyLimits) {
mjModel* m = LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(m, IsNull()) << error.data();
EXPECT_THAT(error.data(), HasSubstr("fovy too large"));
EXPECT_THAT(error.data(), HasSubstr("line = 6"));
EXPECT_THAT(error.data(), HasSubstr("line 6"));
mj_deleteModel(m);
}
@@ -1071,7 +1113,7 @@ TEST_F(ActRangeTest, ActRangeBad) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("invalid actrange"));
EXPECT_THAT(error.data(), HasSubstr("line = 10"));
EXPECT_THAT(error.data(), HasSubstr("line 10"));
}
TEST_F(ActRangeTest, ActRangeUndefined) {
@@ -1092,7 +1134,7 @@ TEST_F(ActRangeTest, ActRangeUndefined) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("invalid actrange"));
EXPECT_THAT(error.data(), HasSubstr("line = 10"));
EXPECT_THAT(error.data(), HasSubstr("line 10"));
}
TEST_F(ActRangeTest, ActRangeNoDyntype) {
@@ -1199,7 +1241,7 @@ TEST_F(ActDimTest, NonzeroNotAllowedInStateless) {
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("invalid actdim 1 in stateless"));
EXPECT_THAT(error.data(), HasSubstr("line = 10"));
EXPECT_THAT(error.data(), HasSubstr("line 10"));
}
TEST_F(ActDimTest, ZeroNotAllowedInStateful) {
@@ -1221,7 +1263,7 @@ TEST_F(ActDimTest, ZeroNotAllowedInStateful) {
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("invalid actdim 0 in stateful"));
EXPECT_THAT(error.data(), HasSubstr("line = 10"));
EXPECT_THAT(error.data(), HasSubstr("line 10"));
}
// ------------- test nuser_xxx fields -----------------------------------------
@@ -1241,7 +1283,7 @@ TEST_F(UserDataTest, NBodyTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_body"));
EXPECT_THAT(error.data(), HasSubstr("line = 5"));
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
TEST_F(UserDataTest, NJointTooSmall) {
@@ -1260,7 +1302,7 @@ TEST_F(UserDataTest, NJointTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_jnt"));
EXPECT_THAT(error.data(), HasSubstr("line = 7"));
EXPECT_THAT(error.data(), HasSubstr("line 7"));
}
TEST_F(UserDataTest, NGeomTooSmall) {
@@ -1276,7 +1318,7 @@ TEST_F(UserDataTest, NGeomTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_geom"));
EXPECT_THAT(error.data(), HasSubstr("line = 5"));
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
TEST_F(UserDataTest, NSiteTooSmall) {
@@ -1292,7 +1334,7 @@ TEST_F(UserDataTest, NSiteTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_site"));
EXPECT_THAT(error.data(), HasSubstr("line = 5"));
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
TEST_F(UserDataTest, NCameraTooSmall) {
@@ -1308,7 +1350,7 @@ TEST_F(UserDataTest, NCameraTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_cam"));
EXPECT_THAT(error.data(), HasSubstr("line = 5"));
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
TEST_F(UserDataTest, NTendonTooSmall) {
@@ -1331,7 +1373,7 @@ TEST_F(UserDataTest, NTendonTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_tendon"));
EXPECT_THAT(error.data(), HasSubstr("line = 9"));
EXPECT_THAT(error.data(), HasSubstr("line 9"));
}
TEST_F(UserDataTest, NActuatorTooSmall) {
@@ -1353,7 +1395,7 @@ TEST_F(UserDataTest, NActuatorTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_actuator"));
EXPECT_THAT(error.data(), HasSubstr("line = 11"));
EXPECT_THAT(error.data(), HasSubstr("line 11"));
}
TEST_F(UserDataTest, NSensorTooSmall) {
@@ -1372,7 +1414,7 @@ TEST_F(UserDataTest, NSensorTooSmall) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("nuser_sensor"));
EXPECT_THAT(error.data(), HasSubstr("line = 8"));
EXPECT_THAT(error.data(), HasSubstr("line 8"));
}
// ------------- test for auto parsing of *limited fields ----------------------
@@ -1415,7 +1457,7 @@ TEST_F(LimitedTest, ErrorIfLimitedMissingOnJoint) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("limited"));
EXPECT_THAT(error.data(), HasSubstr("line = 6"));
EXPECT_THAT(error.data(), HasSubstr("line 6"));
}
TEST_F(LimitedTest, ExplicitLimitedFalseIsOk) {
@@ -1465,7 +1507,7 @@ TEST_F(LimitedTest, ErrorIfLimitedMissingOnTendon) {
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("limited"));
EXPECT_THAT(error.data(), HasSubstr("tendon"));
EXPECT_THAT(error.data(), HasSubstr("line = 13"));
EXPECT_THAT(error.data(), HasSubstr("line 13"));
}
TEST_F(LimitedTest, ErrorIfForceLimitedMissingOnActuator) {
@@ -1490,7 +1532,7 @@ TEST_F(LimitedTest, ErrorIfForceLimitedMissingOnActuator) {
EXPECT_THAT(error.data(), HasSubstr("forcelimited"));
EXPECT_THAT(error.data(), HasSubstr("forcerange"));
EXPECT_THAT(error.data(), HasSubstr("actuator"));
EXPECT_THAT(error.data(), HasSubstr("line = 11"));
EXPECT_THAT(error.data(), HasSubstr("line 11"));
}
// ------------- tests for tendon ----------------------------------------------
@@ -1518,7 +1560,7 @@ TEST_F(TendonTest, SiteBetweenPulleyNotAllowed) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("needs a neighbor that is not a pulley"));
EXPECT_THAT(error.data(), HasSubstr("line = 9"));
EXPECT_THAT(error.data(), HasSubstr("line 9"));
}
// ------------- tests for tendon springrange ----------------------------------
@@ -1573,7 +1615,7 @@ TEST_F(SpringrangeTest, InvalidRange) {
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
ASSERT_THAT(model, IsNull());
EXPECT_THAT(error.data(), HasSubstr("invalid springlength in tendon"));
EXPECT_THAT(error.data(), HasSubstr("line = 9"));
EXPECT_THAT(error.data(), HasSubstr("line 9"));
}
// ------------- test frame ----------------------------------------------------