Skip to content

Commit 35dc037

Browse files
rhaschkev4hn
authored andcommitted
Add more fallback tests
1 parent 4e0f295 commit 35dc037

File tree

1 file changed

+59
-11
lines changed

1 file changed

+59
-11
lines changed

core/test/test_fallback.cpp

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,53 @@ TEST_F(FallbacksFixturePropagate, ComputeFirstSuccessfulStageOnly) {
7070
}
7171

7272
TEST_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

88122
TEST_F(FallbacksFixturePropagate, successfulWithMixedSolutions) {
@@ -128,14 +162,28 @@ TEST_F(FallbacksFixturePropagate, ActiveChildReset) {
128162
using FallbacksFixtureConnect = TaskTestBase;
129163

130164
TEST_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

Comments
 (0)