@@ -2033,6 +2033,19 @@ TEST_F(MujocoTest, ResizeParentKeyframe) {
2033
2033
}
2034
2034
2035
2035
TEST_F (MujocoTest, DifferentUnitsAllowed) {
2036
+ static constexpr char gchild_xml[] = R"(
2037
+ <mujoco model="gchild">
2038
+ <compiler angle="radian"/>
2039
+
2040
+ <worldbody>
2041
+ <body name="gchild" euler="-1.5707963 0 0">
2042
+ <geom type="box" size="1 1 1"/>
2043
+ <joint name="gchild_joint" range="-3.1415926 3.1415926"/>
2044
+ </body>
2045
+ </worldbody>
2046
+ </mujoco>
2047
+ )" ;
2048
+
2036
2049
static constexpr char child_xml[] = R"(
2037
2050
<mujoco>
2038
2051
<compiler angle="radian"/>
@@ -2041,6 +2054,7 @@ TEST_F(MujocoTest, DifferentUnitsAllowed) {
2041
2054
<body name="child" euler="-1.5707963 0 0">
2042
2055
<geom type="box" size="1 1 1"/>
2043
2056
<joint name="child_joint" range="-3.1415926 3.1415926"/>
2057
+ <frame name="frame" euler="1.5707963 0 0"/>
2044
2058
</body>
2045
2059
</worldbody>
2046
2060
</mujoco>
@@ -2059,38 +2073,49 @@ TEST_F(MujocoTest, DifferentUnitsAllowed) {
2059
2073
)" ;
2060
2074
2061
2075
std::array<char , 1024 > error;
2076
+ mjSpec* gchild =
2077
+ mj_parseXMLString (gchild_xml, 0 , error.data (), error.size ());
2062
2078
mjSpec* child = mj_parseXMLString (child_xml, 0 , error.data (), error.size ());
2063
2079
mjSpec* spec = mj_parseXMLString (parent_xml, 0 , error.data (), error.size ());
2064
2080
ASSERT_THAT (spec, NotNull ()) << error.data ();
2065
- mjs_attachBody (mjs_findFrame (spec, " frame" ), mjs_findBody (child, " child" ),
2081
+ mjs_attachBody (mjs_findFrame (child, " frame" ),
2082
+ mjs_findBody (gchild, " gchild" ),
2083
+ " gchild_" , " " );
2084
+ mjs_attachBody (mjs_findFrame (spec, " frame" ),
2085
+ mjs_findBody (child, " child" ),
2066
2086
" child_" , " " );
2067
2087
2068
2088
mjModel* model = mj_compile (spec, 0 );
2069
2089
EXPECT_THAT (model, NotNull ());
2070
- EXPECT_THAT (model->njnt , 2 );
2090
+ EXPECT_THAT (model->njnt , 3 );
2071
2091
EXPECT_NEAR (model->jnt_range [0 ], -mjPI, 1e-6 );
2072
2092
EXPECT_NEAR (model->jnt_range [1 ], mjPI, 1e-6 );
2073
2093
EXPECT_NEAR (model->jnt_range [2 ], -mjPI, 1e-6 );
2074
2094
EXPECT_NEAR (model->jnt_range [3 ], mjPI, 1e-6 );
2095
+ EXPECT_NEAR (model->jnt_range [4 ], -mjPI, 1e-6 );
2096
+ EXPECT_NEAR (model->jnt_range [5 ], mjPI, 1e-6 );
2075
2097
EXPECT_NEAR (model->body_quat [4 ], 1 , 1e-12 );
2076
2098
EXPECT_NEAR (model->body_quat [5 ], 0 , 1e-12 );
2077
2099
EXPECT_NEAR (model->body_quat [6 ], 0 , 1e-12 );
2078
2100
EXPECT_NEAR (model->body_quat [7 ], 0 , 1e-12 );
2079
2101
2080
2102
mjSpec* copied_spec = mj_copySpec (spec);
2081
2103
ASSERT_THAT (copied_spec, NotNull ());
2104
+ mj_deleteSpec (gchild);
2082
2105
mj_deleteSpec (child);
2083
2106
mj_deleteSpec (spec);
2084
2107
mj_deleteModel (model);
2085
2108
2086
2109
// check that deleting `parent` or `child` does not invalidate the copy
2087
2110
mjModel* copied_model = mj_compile (copied_spec, 0 );
2088
2111
EXPECT_THAT (copied_model, NotNull ());
2089
- EXPECT_THAT (copied_model->njnt , 2 );
2112
+ EXPECT_THAT (copied_model->njnt , 3 );
2090
2113
EXPECT_NEAR (copied_model->jnt_range [0 ], -mjPI, 1e-6 );
2091
2114
EXPECT_NEAR (copied_model->jnt_range [1 ], mjPI, 1e-6 );
2092
2115
EXPECT_NEAR (copied_model->jnt_range [2 ], -mjPI, 1e-6 );
2093
2116
EXPECT_NEAR (copied_model->jnt_range [3 ], mjPI, 1e-6 );
2117
+ EXPECT_NEAR (copied_model->jnt_range [4 ], -mjPI, 1e-6 );
2118
+ EXPECT_NEAR (copied_model->jnt_range [5 ], mjPI, 1e-6 );
2094
2119
EXPECT_NEAR (copied_model->body_quat [4 ], 1 , 1e-12 );
2095
2120
EXPECT_NEAR (copied_model->body_quat [5 ], 0 , 1e-12 );
2096
2121
EXPECT_NEAR (copied_model->body_quat [6 ], 0 , 1e-12 );
0 commit comments