@@ -54,44 +54,45 @@ struct GeneratorMockup : Generator
5454 void compute () override { spawn (InterfaceState (ps_), costs_.cost ()); }
5555};
5656
57- class PropagatorMockup : public PropagatingEitherWay
57+ struct PropagatorMockup : public PropagatingEitherWay
5858{
5959 PredefinedCosts costs_;
6060 std::size_t solutions_per_compute_;
6161
62- public:
62+ unsigned int calls_ = 0 ;
63+
6364 PropagatorMockup (std::initializer_list<double > costs = { 0.0 }, std::size_t solutions_per_compute = 1 )
6465 : PropagatingEitherWay(), costs_(false , costs), solutions_per_compute_(solutions_per_compute) {}
6566
6667 void computeForward (const InterfaceState& from) override {
68+ ++calls_;
6769 for (std::size_t i = 0 ; i < solutions_per_compute_; ++i) {
6870 SubTrajectory solution (robot_trajectory::RobotTrajectoryConstPtr (), costs_.cost ());
6971 sendForward (from, InterfaceState (from.scene ()->diff ()), std::move (solution));
7072 }
7173 }
7274 void computeBackward (const InterfaceState& to) override {
75+ ++calls_;
7376 for (std::size_t i = 0 ; i < solutions_per_compute_; ++i) {
7477 SubTrajectory solution (robot_trajectory::RobotTrajectoryConstPtr (), costs_.cost ());
7578 sendBackward (InterfaceState (to.scene ()->diff ()), to, std::move (solution));
7679 }
7780 }
7881};
79- class ForwardMockup : public PropagatorMockup
82+ struct ForwardMockup : public PropagatorMockup
8083{
8184 static unsigned int id_;
8285
83- public:
8486 ForwardMockup (std::initializer_list<double > costs = { 0.0 }, std::size_t solutions_per_compute = 1 )
8587 : PropagatorMockup(costs, solutions_per_compute) {
8688 restrictDirection (FORWARD);
8789 setName (" FW" + std::to_string (++id_));
8890 }
8991};
90- class BackwardMockup : public PropagatorMockup
92+ struct BackwardMockup : public PropagatorMockup
9193{
9294 static unsigned int id_;
9395
94- public:
9596 BackwardMockup (std::initializer_list<double > costs = { 0.0 }) : PropagatorMockup(costs) {
9697 restrictDirection (BACKWARD);
9798 setName (" BW" + std::to_string (++id_));
@@ -137,9 +138,17 @@ unsigned int ForwardMockup::id_ = 0;
137138unsigned int BackwardMockup::id_ = 0 ;
138139unsigned int Connect::id_ = 0 ;
139140
141+ void resetIds () {
142+ GeneratorMockup::id_ = 0 ;
143+ ForwardMockup::id_ = 0 ;
144+ BackwardMockup::id_ = 0 ;
145+ Connect::id_ = 0 ;
146+ }
147+
140148// https://github.com/ros-planning/moveit_task_constructor/issues/182
141149TEST (ConnectConnect, SuccSucc) {
142- GeneratorMockup::id_ = Connect::id_ = 0 ; // reset IDs
150+ resetIds ();
151+
143152 Task t;
144153 t.setRobotModel (getModel ());
145154 t.add (Stage::pointer (new GeneratorMockup ({ 1 , 2 , 3 })));
@@ -158,8 +167,44 @@ TEST(ConnectConnect, SuccSucc) {
158167 }
159168}
160169
161- TEST (ConnectConnect, PruningForward) {
162- GeneratorMockup::id_ = Connect::id_ = 0 ; // reset IDs
170+ // https://github.com/ros-planning/moveit_task_constructor/issues/218
171+ TEST (ConnectConnect, FailSucc) {
172+ resetIds ();
173+ Task t;
174+ t.setRobotModel (getModel ());
175+ t.add (Stage::pointer (new GeneratorMockup ()));
176+ t.add (Stage::pointer (new Connect ({ inf }, true )));
177+ t.add (Stage::pointer (new GeneratorMockup ()));
178+ t.add (Stage::pointer (new Connect ()));
179+ t.add (Stage::pointer (new GeneratorMockup ()));
180+ t.add (Stage::pointer (new ForwardDummy ()));
181+
182+ EXPECT_FALSE (t.plan ());
183+ }
184+
185+ TEST (Pruning, PruningMultiForward) {
186+ resetIds ();
187+ Task t;
188+ t.setRobotModel (getModel ());
189+
190+ t.add (Stage::pointer (new BackwardMockup ()));
191+ t.add (Stage::pointer (new BackwardMockup ()));
192+ t.add (Stage::pointer (new GeneratorMockup ()));
193+ // spawn two solutions for the only incoming state
194+ t.add (Stage::pointer (new ForwardMockup ({ 0 , 0 }, 2 )));
195+ // fail to exten
196+ t.add (Stage::pointer (new ForwardMockup ({ 0 , inf })));
197+
198+ t.plan ();
199+
200+ // the second (infeasible) solution in the last stage must not disable
201+ // the earlier partial solution just because they share stage solutions
202+ ASSERT_EQ (t.solutions ().size (), 1 );
203+ EXPECT_EQ ((*t.solutions ().begin ())->cost (), 0u );
204+ }
205+
206+ TEST (Pruning, ConnectConnectForward) {
207+ resetIds ();
163208 Task t;
164209 t.setRobotModel (getModel ());
165210 Connect *c1, *c2;
@@ -183,30 +228,8 @@ TEST(ConnectConnect, PruningForward) {
183228 EXPECT_EQ (c2->calls_ , 6u );
184229}
185230
186- TEST (ConnectConnect, PruningMultiForward) {
187- GeneratorMockup::id_ = Connect::id_ = 0 ; // reset IDs
188- Task t;
189-
190- t.setRobotModel (getModel ());
191- t.add (Stage::pointer (new GeneratorMockup ()));
192- t.add (Stage::pointer (new Connect ()));
193- t.add (Stage::pointer (new BackwardMockup ()));
194- /* TODO(v4hn):
195- * t.add(Stage::pointer(new GeneratorMockup()));
196- * should be enough instead of the above, but propagators do not even respect ENABLED/DISABLED yet
197- */
198-
199- t.add (Stage::pointer (new GeneratorMockup ()));
200- t.add (Stage::pointer (new ForwardMockup ({ 0 , 0 }, 2 ))); // spawn two solutions for the only incoming state
201- t.add (Stage::pointer (new ForwardMockup ({ 0 , inf })));
202- t.plan ();
203-
204- ASSERT_EQ (t.solutions ().size (), 1 );
205- EXPECT_EQ ((*t.solutions ().begin ())->cost (), 0u );
206- }
207-
208- TEST (ConnectConnect, PruningBackward) {
209- GeneratorMockup::id_ = Connect::id_ = 0 ; // reset IDs
231+ TEST (Pruning, ConnectConnectBackward) {
232+ resetIds ();
210233 Task t;
211234 t.setRobotModel (getModel ());
212235 Connect *c1, *c2;
@@ -229,18 +252,3 @@ TEST(ConnectConnect, PruningBackward) {
229252 EXPECT_EQ (c2->calls_ , 3u );
230253 EXPECT_EQ (c1->calls_ , 6u );
231254}
232-
233- // https://github.com/ros-planning/moveit_task_constructor/issues/218
234- TEST (ConnectConnect, FailSucc) {
235- GeneratorMockup::id_ = Connect::id_ = 0 ; // reset IDs
236- Task t;
237- t.setRobotModel (getModel ());
238- t.add (Stage::pointer (new GeneratorMockup ()));
239- t.add (Stage::pointer (new Connect ({ inf }, true )));
240- t.add (Stage::pointer (new GeneratorMockup ()));
241- t.add (Stage::pointer (new Connect ()));
242- t.add (Stage::pointer (new GeneratorMockup ()));
243- t.add (Stage::pointer (new ForwardDummy ()));
244-
245- EXPECT_FALSE (t.plan ());
246- }
0 commit comments