@@ -708,8 +708,6 @@ TEST_F(SensorTest, BadContact) {
708708 " at most one of (geom1, body1, subtree1, site) can be specified" },
709709 {" geom2='sphere1' body2='body'" ,
710710 " at most one of (geom2, body2, subtree2) can be specified" },
711- {" subtree1='non_root'" ,
712- " must be a child of the world" }
713711 };
714712
715713 for (const auto & test : test_cases) {
@@ -870,6 +868,31 @@ TEST_F(SensorTest, ContactSubtree) {
870868 mj_deleteModel (model);
871869}
872870
871+ TEST_F (SensorTest, ContactSubtreePartial) {
872+ const string xml_path =
873+ GetTestDataFilePath (" engine/testdata/sensor/contact_subtree_partial.xml" );
874+ char error[1024 ];
875+ mjModel* model = mj_loadXML (xml_path.c_str (), nullptr , error, sizeof (error));
876+ ASSERT_THAT (model, NotNull ()) << error;
877+
878+ mjData* data = mj_makeData (model);
879+
880+ while (data->time < 0.6 ) {
881+ mj_step (model, data);
882+ }
883+
884+ EXPECT_EQ (GetSensor (model, data, " all" )[0 ], 4 );
885+ EXPECT_EQ (GetSensor (model, data, " world" )[0 ], 4 );
886+ EXPECT_EQ (GetSensor (model, data, " thigh" )[0 ], 4 );
887+ EXPECT_EQ (GetSensor (model, data, " shin" )[0 ], 2 );
888+ EXPECT_EQ (GetSensor (model, data, " foot" )[0 ], 1 );
889+ EXPECT_EQ (GetSensor (model, data, " foot_w" )[0 ], 0 );
890+ EXPECT_EQ (GetSensor (model, data, " foot_w2" )[0 ], 1 );
891+
892+ mj_deleteData (data);
893+ mj_deleteModel (model);
894+ }
895+
873896TEST_F (SensorTest, ContactNet) {
874897 const string xml_path =
875898 GetTestDataFilePath (" engine/testdata/sensor/contact_net.xml" );
0 commit comments