@@ -70,19 +70,53 @@ TEST_F(FallbacksFixturePropagate, ComputeFirstSuccessfulStageOnly) {
7070}
7171
7272TEST_F (FallbacksFixturePropagate, ComputeFirstSuccessfulStagePerSolutionOnly) {
73+ t.add (std::make_unique<GeneratorMockup>(PredefinedCosts ({ 2.0 , 1.0 })));
74+ // duplicate generator solutions with resulting costs: 4, 2 | 3, 1
75+ t.add (std::make_unique<ForwardMockup>(PredefinedCosts ({ 2.0 , 0.0 , 2.0 , 0.0 }), 2 ));
76+
77+ auto fallbacks = std::make_unique<Fallbacks>(" Fallbacks" );
78+ fallbacks->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF, INF, 110.0 , 120.0 })));
79+ fallbacks->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ 210.0 , 220.0 , 0 , 0 })));
80+ t.add (std::move (fallbacks));
81+
82+ EXPECT_TRUE (t.plan ());
83+ EXPECT_COSTS (t.solutions (), testing::ElementsAre (113 , 124 , 211 , 222 ));
84+ }
85+
86+ TEST_F (FallbacksFixturePropagate, UpdateSolutionOrder) {
87+ t.add (std::make_unique<BackwardMockup>(PredefinedCosts ({ 10.0 , 0.0 })));
7388 t.add (std::make_unique<GeneratorMockup>(PredefinedCosts ({ 1.0 , 2.0 })));
89+ // available solutions (sorted) in individual runs of fallbacks: 1 | 11, 2 | 2, 11
90+
91+ // use a fallback container to delay computation twice: only the last child succeeds
92+ auto inner = std::make_unique<Fallbacks>(" Inner" );
93+ inner->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF }, false )));
94+ inner->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF }, false )));
95+ inner->add (std::make_unique<ForwardMockup>(PredefinedCosts::constant (0.0 )));
7496
7597 auto fallbacks = std::make_unique<Fallbacks>(" Fallbacks" );
76- fallbacks->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF, 10.0 })));
77- fallbacks->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ 20.0 , INF })));
78- auto fwd1 = fallbacks->findChild (" FWD1" );
79- auto fwd2 = fallbacks->findChild (" FWD2" );
98+ fallbacks->add (std::move (inner));
99+ t.add (std::move (fallbacks));
100+
101+ EXPECT_TRUE (t.plan (1 )); // only return 1st solution
102+ EXPECT_COSTS (t.solutions (), testing::ElementsAre (2 )); // expecting less costly solution as result
103+ }
104+
105+ TEST_F (FallbacksFixturePropagate, MultipleActivePendingStates) {
106+ t.add (std::make_unique<GeneratorMockup>(PredefinedCosts ({ 2.0 , 1.0 , 3.0 })));
107+ // use a fallback container to delay computation: the 1st child never succeeds, but only the 2nd
108+ auto inner = std::make_unique<Fallbacks>(" Inner" );
109+ inner->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF }, false ))); // always fail
110+ inner->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ 10.0 , INF, 30.0 })));
111+
112+ auto fallbacks = std::make_unique<Fallbacks>(" Fallbacks" );
113+ fallbacks->add (std::move (inner));
114+ fallbacks->add (std::make_unique<ForwardMockup>(PredefinedCosts ({ INF })));
80115 t.add (std::move (fallbacks));
81116
82117 EXPECT_TRUE (t.plan ());
83- EXPECT_COSTS (t.solutions (), testing::ElementsAre (12 , 21 ));
84- EXPECT_EQ (fwd1->solutions ().size (), 1u );
85- EXPECT_EQ (fwd2->solutions ().size (), 1u );
118+ EXPECT_COSTS (t.solutions (), testing::ElementsAre (11 , 33 ));
119+ // check that first solution is not marked as pruned
86120}
87121
88122TEST_F (FallbacksFixturePropagate, successfulWithMixedSolutions) {
@@ -128,14 +162,28 @@ TEST_F(FallbacksFixturePropagate, ActiveChildReset) {
128162using FallbacksFixtureConnect = TaskTestBase;
129163
130164TEST_F (FallbacksFixtureConnect, ConnectStageInsideFallbacks) {
131- t.add (std::make_unique<GeneratorMockup>());
165+ t.add (std::make_unique<GeneratorMockup>(PredefinedCosts ({ 1.0 , 2.0 }) ));
132166
133167 auto fallbacks = std::make_unique<Fallbacks>(" Fallbacks" );
134- fallbacks->add (std::make_unique<ConnectMockup>());
168+ fallbacks->add (std::make_unique<ConnectMockup>(PredefinedCosts::constant (0.0 )));
169+ fallbacks->add (std::make_unique<ConnectMockup>(PredefinedCosts::constant (100.0 )));
135170 t.add (std::move (fallbacks));
136171
137- t.add (std::make_unique<GeneratorMockup>());
172+ t.add (std::make_unique<GeneratorMockup>(PredefinedCosts ({ 10.0 , 20.0 }) ));
138173
139174 EXPECT_TRUE (t.plan ());
140- EXPECT_EQ (t.numSolutions (), 1u );
175+ EXPECT_COSTS (t.solutions (), testing::ElementsAre (11 , 12 , 21 , 22 ));
176+ }
177+
178+ int main (int argc, char ** argv) {
179+ for (int i = 1 ; i < argc; ++i) {
180+ if (strcmp (argv[i], " --debug" ) == 0 ) {
181+ if (ros::console::set_logger_level (ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug))
182+ ros::console::notifyLoggerLevelsChanged ();
183+ break ;
184+ }
185+ }
186+
187+ testing::InitGoogleTest (&argc, argv);
188+ return RUN_ALL_TESTS ();
141189}
0 commit comments