@@ -57,6 +57,7 @@ GTEST_TEST(SpanningForest, WorldOnlyTest) {
57
57
EXPECT_TRUE (graph.BuildForest ());
58
58
EXPECT_TRUE (graph.forest_is_valid ());
59
59
EXPECT_TRUE (forest.is_valid ());
60
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
60
61
EXPECT_EQ (&forest.graph (), &graph);
61
62
const SpanningForest::Mobod& world = forest.mobods (MobodIndex (0 ));
62
63
EXPECT_EQ (&world, &forest.world_mobod ());
@@ -293,6 +294,7 @@ GTEST_TEST(SpanningForest, MultipleBranchesDefaultOptions) {
293
294
294
295
// Build with default options.
295
296
EXPECT_TRUE (graph.BuildForest ());
297
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
296
298
297
299
EXPECT_EQ (forest.options (), ForestBuildingOptions::kDefault );
298
300
EXPECT_EQ (forest.options (left_instance), ForestBuildingOptions::kDefault );
@@ -678,6 +680,7 @@ GTEST_TEST(SpanningForest, SerialChainAndMore) {
678
680
ForestBuildingOptions::kStatic );
679
681
EXPECT_TRUE (graph.BuildForest ());
680
682
const SpanningForest& forest = graph.forest ();
683
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
681
684
EXPECT_TRUE (graph.forest_is_valid ());
682
685
683
686
// Verify that ChangeJointType() rejects an attempt to change a static link's
@@ -817,6 +820,7 @@ GTEST_TEST(SpanningForest, SerialChainAndMore) {
817
820
ForestBuildingOptions::kMergeLinkComposites |
818
821
ForestBuildingOptions::kStatic );
819
822
EXPECT_TRUE (graph.BuildForest ());
823
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
820
824
821
825
// The graph shouldn't change from SpanningForest 1, but the forest will.
822
826
EXPECT_EQ (ssize (graph.joints ()) - graph.num_user_joints (), 4 );
@@ -861,6 +865,7 @@ GTEST_TEST(SpanningForest, SerialChainAndMore) {
861
865
graph.ChangeJointFlags (joint_10_11_index, JointFlags::kMustBeModeled );
862
866
// Built the forest with same options as used for 2a.
863
867
EXPECT_TRUE (graph.BuildForest ());
868
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
864
869
865
870
EXPECT_EQ (ssize (forest.mobods ()), 9 );
866
871
EXPECT_EQ (ssize (forest.trees ()), 3 );
@@ -895,6 +900,7 @@ GTEST_TEST(SpanningForest, SerialChainAndMore) {
895
900
ForestBuildingOptions::kMergeLinkComposites |
896
901
ForestBuildingOptions::kStatic );
897
902
EXPECT_TRUE (graph.BuildForest ());
903
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
898
904
899
905
EXPECT_EQ (ssize (forest.mobods ()), 6 );
900
906
EXPECT_EQ (ssize (forest.trees ()), 1 );
@@ -1056,6 +1062,7 @@ GTEST_TEST(SpanningForest, WeldedSubgraphs) {
1056
1062
1057
1063
EXPECT_TRUE (graph.BuildForest ());
1058
1064
const SpanningForest& forest = graph.forest ();
1065
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1059
1066
1060
1067
EXPECT_EQ (graph.num_user_links (), 14 ); // Same as before building.
1061
1068
EXPECT_EQ (graph.num_user_joints (), 14 );
@@ -1223,6 +1230,7 @@ GTEST_TEST(SpanningForest, WeldedSubgraphs) {
1223
1230
graph.SetGlobalForestBuildingOptions (
1224
1231
ForestBuildingOptions::kMergeLinkComposites );
1225
1232
EXPECT_TRUE (graph.BuildForest ());
1233
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1226
1234
1227
1235
EXPECT_EQ (ssize (graph.links ()), 15 ); // Only one added shadow.
1228
1236
EXPECT_EQ (ssize (graph.link_composites ()), 3 );
@@ -1376,6 +1384,7 @@ GTEST_TEST(SpanningForest, MasslessLinksChangeLoopBreaking) {
1376
1384
1377
1385
EXPECT_TRUE (graph.BuildForest ()); // Using default options.
1378
1386
const SpanningForest& forest = graph.forest ();
1387
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1379
1388
1380
1389
EXPECT_EQ (ssize (graph.links ()), 8 ); // Added a shadow.
1381
1390
EXPECT_EQ (ssize (graph.joints ()), 7 );
@@ -1392,6 +1401,7 @@ GTEST_TEST(SpanningForest, MasslessLinksChangeLoopBreaking) {
1392
1401
// (Tests Case 2 in ExtendTreesOneLevel())
1393
1402
graph.ChangeLinkFlags (LinkIndex (3 ), LinkFlags::kMassless );
1394
1403
EXPECT_TRUE (graph.BuildForest ());
1404
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1395
1405
1396
1406
// Check that links not in a composite still respond correctly.
1397
1407
EXPECT_TRUE (graph.link_and_its_composite_are_massless (LinkOrdinal (3 )));
@@ -1411,6 +1421,7 @@ GTEST_TEST(SpanningForest, MasslessLinksChangeLoopBreaking) {
1411
1421
// (Tests Case 3 in ExtendTreesOneLevel())
1412
1422
graph.ChangeLinkFlags (LinkIndex (4 ), LinkFlags::kMassless );
1413
1423
EXPECT_TRUE (graph.BuildForest ());
1424
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1414
1425
1415
1426
EXPECT_EQ (ssize (graph.links ()), 8 );
1416
1427
EXPECT_EQ (ssize (graph.joints ()), 7 );
@@ -1478,6 +1489,7 @@ GTEST_TEST(SpanningForest, MasslessBodiesShareSplitLink) {
1478
1489
1479
1490
EXPECT_TRUE (graph.BuildForest ()); // Using default options.
1480
1491
const SpanningForest& forest = graph.forest ();
1492
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1481
1493
1482
1494
EXPECT_EQ (ssize (graph.links ()), 5 ); // After modeling.
1483
1495
EXPECT_EQ (graph.num_user_links (), 4 );
@@ -1566,6 +1578,7 @@ GTEST_TEST(SpanningForest, DoubleLoop) {
1566
1578
1567
1579
EXPECT_TRUE (graph.BuildForest ()); // Using default options.
1568
1580
const SpanningForest& forest = graph.forest ();
1581
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1569
1582
1570
1583
EXPECT_EQ (ssize (graph.links ()), 10 ); // After modeling.
1571
1584
EXPECT_EQ (ssize (graph.joints ()), 9 );
@@ -1668,6 +1681,7 @@ GTEST_TEST(SpanningForest, WorldCompositeComesFirst) {
1668
1681
1669
1682
EXPECT_TRUE (graph.BuildForest ()); // Using default options.
1670
1683
const SpanningForest& forest = graph.forest ();
1684
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1671
1685
1672
1686
EXPECT_EQ (ssize (graph.links ()), 5 );
1673
1687
EXPECT_EQ (ssize (forest.mobods ()), 5 ); // Because we're not merging.
@@ -1697,7 +1711,7 @@ GTEST_TEST(SpanningForest, WorldCompositeComesFirst) {
1697
1711
graph.SetGlobalForestBuildingOptions (
1698
1712
ForestBuildingOptions::kMergeLinkComposites );
1699
1713
EXPECT_TRUE (graph.BuildForest ());
1700
-
1714
+ EXPECT_NO_THROW (forest. SanityCheckForest ());
1701
1715
EXPECT_EQ (ssize (forest.mobods ()), 3 ); // Because we're merging.
1702
1716
EXPECT_EQ (forest.mobods (MobodIndex (0 )).follower_link_ordinals (),
1703
1717
(std::vector<LinkOrdinal>{LinkOrdinal (0 ), LinkOrdinal (3 )}));
@@ -1984,6 +1998,7 @@ GTEST_TEST(SpanningForest, LoopWithComposites) {
1984
1998
ForestBuildingOptions::kMergeLinkComposites );
1985
1999
EXPECT_TRUE (graph.BuildForest ());
1986
2000
const SpanningForest& forest = graph.forest ();
2001
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
1987
2002
1988
2003
// After modeling
1989
2004
EXPECT_EQ (ssize (graph.links ()), 12 ); // split one, added shadow
@@ -2022,6 +2037,7 @@ GTEST_TEST(SpanningForest, LoopWithComposites) {
2022
2037
EXPECT_EQ (ssize (graph_copy.links ()), 12 );
2023
2038
EXPECT_TRUE (graph_copy.forest_is_valid ());
2024
2039
const SpanningForest& copy_model = graph_copy.forest ();
2040
+ EXPECT_NO_THROW (copy_model.SanityCheckForest ());
2025
2041
EXPECT_NE (©_model, &forest);
2026
2042
EXPECT_EQ (©_model.graph (), &graph_copy); // backpointer
2027
2043
@@ -2030,30 +2046,35 @@ GTEST_TEST(SpanningForest, LoopWithComposites) {
2030
2046
EXPECT_EQ (ssize (graph_assign.links ()), 12 );
2031
2047
EXPECT_TRUE (graph_assign.forest_is_valid ());
2032
2048
EXPECT_NE (&graph_assign.forest (), &forest);
2049
+ EXPECT_NO_THROW (graph_assign.forest ().SanityCheckForest ());
2033
2050
EXPECT_EQ (&graph_assign.forest ().graph (), &graph_assign);
2034
2051
2035
2052
LinkJointGraph graph_move (std::move (graph));
2036
2053
EXPECT_EQ (ssize (graph_move.links ()), 12 );
2037
2054
EXPECT_EQ (ssize (graph.links ()), 1 ); // Just world now.
2038
2055
EXPECT_EQ (&graph_move.forest (), &forest);
2056
+ EXPECT_NO_THROW (graph_move.forest ().SanityCheckForest ());
2039
2057
EXPECT_EQ (&graph_move.forest ().graph (), &graph_move);
2040
2058
// graph is now default-constructed so still has a forest
2041
2059
EXPECT_NE (&graph.forest (), &forest);
2042
2060
EXPECT_FALSE (graph.forest_is_valid ());
2043
2061
EXPECT_EQ (&graph.forest ().graph (), &graph);
2062
+ EXPECT_NO_THROW (graph.forest ().SanityCheckForest ()); // Empty but OK.
2044
2063
2045
2064
LinkJointGraph graph_move_assign;
2046
2065
graph_move_assign = std::move (graph_copy);
2047
2066
EXPECT_EQ (ssize (graph_move_assign.links ()), 12 );
2048
2067
EXPECT_TRUE (graph_move_assign.forest_is_valid ());
2049
2068
EXPECT_EQ (&graph_move_assign.forest (), ©_model);
2069
+ EXPECT_NO_THROW (graph_move_assign.forest ().SanityCheckForest ());
2050
2070
EXPECT_EQ (&graph_move_assign.forest ().graph (), &graph_move_assign);
2051
2071
// graph_copy is now default-constructed. Should have world and a
2052
2072
// new (empty) forest.
2053
2073
EXPECT_EQ (ssize (graph_copy.links ()), 1 );
2054
2074
EXPECT_NE (&graph_copy.forest (), ©_model);
2055
2075
EXPECT_FALSE (graph_copy.forest_is_valid ());
2056
2076
EXPECT_EQ (&graph_copy.forest ().graph (), &graph_copy);
2077
+ EXPECT_NO_THROW (graph_copy.forest ().SanityCheckForest ()); // Empty but OK.
2057
2078
}
2058
2079
2059
2080
/* Make sure massless, merged composites are working correctly. They are
@@ -2129,6 +2150,7 @@ GTEST_TEST(SpanningForest, MasslessMergedComposites) {
2129
2150
EXPECT_EQ (ssize (graph.loop_constraints ()), 0 );
2130
2151
2131
2152
EXPECT_TRUE (graph.BuildForest ());
2153
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
2132
2154
2133
2155
// After modeling
2134
2156
EXPECT_EQ (ssize (graph.links ()), 10 ); // added shadow 3s {9}
@@ -2169,6 +2191,7 @@ GTEST_TEST(SpanningForest, MasslessMergedComposites) {
2169
2191
height of 3. */
2170
2192
graph.ChangeJointType (JointIndex (6 ), " revolute" );
2171
2193
EXPECT_TRUE (graph.BuildForest ());
2194
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
2172
2195
2173
2196
// The links are massless and so is their composite.
2174
2197
for (LinkOrdinal link_ordinal (4 ); link_ordinal <= 6 ; ++link_ordinal)
@@ -2195,6 +2218,7 @@ GTEST_TEST(SpanningForest, MasslessMergedComposites) {
2195
2218
graph.ChangeLinkFlags (LinkIndex (7 ), LinkFlags::kMassless );
2196
2219
graph.ChangeLinkFlags (LinkIndex (8 ), LinkFlags::kMassless );
2197
2220
EXPECT_TRUE (graph.BuildForest ());
2221
+ EXPECT_NO_THROW (forest.SanityCheckForest ());
2198
2222
const auto & newer_shadow_link = graph.link_by_index (LinkIndex (9 ));
2199
2223
EXPECT_TRUE (newer_shadow_link.is_shadow ());
2200
2224
EXPECT_EQ (newer_shadow_link.name (), " link3$1" );
0 commit comments