1111
1212using namespace moveit ::task_constructor;
1313
14- static int mock_id = 0 ;
14+ static unsigned int mock_id = 0 ;
1515
1616class GeneratorMockup : public Generator
1717{
1818 int runs = 0 ;
1919
2020public:
21- GeneratorMockup (int runs = 0 ) : Generator(" generator " + std::to_string(mock_id++ )), runs(runs) {}
21+ GeneratorMockup (int runs = 0 ) : Generator(" generator " + std::to_string(++mock_id )), runs(runs) {}
2222 bool canCompute () const override { return runs > 0 ; }
2323 void compute () override {
2424 if (runs > 0 )
@@ -30,10 +30,10 @@ class MonitoringGeneratorMockup : public MonitoringGenerator
3030{
3131public:
3232 MonitoringGeneratorMockup (Stage* monitored)
33- : MonitoringGenerator(" monitoring generator " + std::to_string(mock_id++ ), monitored) {}
33+ : MonitoringGenerator(" monitoring generator " + std::to_string(++mock_id ), monitored) {}
3434 bool canCompute () const override { return false ; }
3535 void compute () override {}
36- void onNewSolution (const SolutionBase& s ) override {}
36+ void onNewSolution (const SolutionBase&) override {}
3737};
3838
3939class PropagatorMockup : public PropagatingEitherWay
@@ -43,12 +43,12 @@ class PropagatorMockup : public PropagatingEitherWay
4343
4444public:
4545 PropagatorMockup (int fw = 0 , int bw = 0 )
46- : PropagatingEitherWay(" propagate " + std::to_string(mock_id++ )), fw_runs(fw), bw_runs(bw) {}
47- void computeForward (const InterfaceState& from) override {
46+ : PropagatingEitherWay(" propagate " + std::to_string(++mock_id )), fw_runs(fw), bw_runs(bw) {}
47+ void computeForward (const InterfaceState& /* from */ ) override {
4848 if (fw_runs > 0 )
4949 --fw_runs;
5050 }
51- void computeBackward (const InterfaceState& from) override {
51+ void computeBackward (const InterfaceState& /* from */ ) override {
5252 if (bw_runs > 0 )
5353 --bw_runs;
5454 }
@@ -58,15 +58,15 @@ class ForwardMockup : public PropagatorMockup
5858public:
5959 ForwardMockup (int runs = 0 ) : PropagatorMockup(runs, 0 ) {
6060 restrictDirection (FORWARD);
61- setName (" forward " + std::to_string (mock_id++ ));
61+ setName (" forward " + std::to_string (mock_id));
6262 }
6363};
6464class BackwardMockup : public PropagatorMockup
6565{
6666public:
6767 BackwardMockup (int runs = 0 ) : PropagatorMockup(0 , runs) {
6868 restrictDirection (BACKWARD);
69- setName (" backward " + std::to_string (mock_id++ ));
69+ setName (" backward " + std::to_string (mock_id));
7070 }
7171};
7272
@@ -75,8 +75,8 @@ class ConnectMockup : public Connecting
7575 int runs = 0 ;
7676
7777public:
78- ConnectMockup (int runs = 0 ) : Connecting(" connect " + std::to_string(mock_id++ )), runs(runs) {}
79- void compute (const InterfaceState& from, const InterfaceState& to ) override {
78+ ConnectMockup (int runs = 0 ) : Connecting(" connect " + std::to_string(++mock_id )), runs(runs) {}
79+ void compute (const InterfaceState& /* from */ , const InterfaceState& /* to */ ) override {
8080 if (runs > 0 )
8181 --runs;
8282 }
@@ -187,6 +187,11 @@ class InitTest : public ::testing::Test
187187 impl->setPrevEnds (InterfacePtr ());
188188 pushInterface (start, end);
189189 }
190+ void initContainer (const std::initializer_list<StageType>& types = {}) {
191+ container.clear ();
192+ mock_id = 0 ;
193+ append (container, types);
194+ }
190195
191196 void validateInit (bool start, bool end, bool expect_failure) { validateInit (start, end, {}, expect_failure); }
192197
@@ -213,9 +218,11 @@ class InitTest : public ::testing::Test
213218 return ; // as expected
214219 ADD_FAILURE () << " init() didn't recognize a failure condition as expected\n " << container;
215220 } catch (const InitStageException& e) {
216- if (expect_failure)
221+ if (expect_failure) {
222+ std::cout << " Expected " << e << " \n " << container;
217223 return ; // as expected
218- ADD_FAILURE () << " unexpected init failure: \n " << e << " \n " << container;
224+ }
225+ ADD_FAILURE () << " Unexpected " << e << " \n " << container;
219226 } catch (const std::exception& e) {
220227 ADD_FAILURE () << " unexpected exception thrown:\n " << e.what ();
221228 } catch (...) {
@@ -293,14 +300,14 @@ TEST_F(SerialTest, insertion_order) {
293300#define EXPECT_INIT_FAILURE (start, end, ...) \
294301 { \
295302 SCOPED_TRACE (" validateInit({" #__VA_ARGS__ " })" ); \
296- container. clear (); \
303+ initContainer (); \
297304 validateInit (start, end, { __VA_ARGS__ }, true ); \
298305 }
299306
300307#define EXPECT_INIT_SUCCESS (start, end, ...) \
301308 { \
302309 SCOPED_TRACE (" validateInit({" #__VA_ARGS__ " })" ); \
303- container. clear (); \
310+ initContainer (); \
304311 validateInit (start, end, { __VA_ARGS__ }, false ); \
305312 }
306313
@@ -316,7 +323,10 @@ TEST_F(SerialTest, init_connecting) {
316323 EXPECT_INIT_SUCCESS (false , false , CONN);
317324 EXPECT_EQ (container.pimpl ()->interfaceFlags (), InterfaceFlags (CONNECT));
318325
319- EXPECT_INIT_FAILURE (true , true , CONN); // external interface says GENERATOR, stage is CONNECTOR
326+ // external interface does not match CONNECT
327+ EXPECT_INIT_FAILURE (false , true , CONN);
328+ EXPECT_INIT_FAILURE (true , false , CONN);
329+ EXPECT_INIT_FAILURE (true , true , CONN);
320330
321331 EXPECT_INIT_FAILURE (false , false , CONN, CONN); // two connecting stages cannot be connected
322332}
@@ -325,7 +335,10 @@ TEST_F(SerialTest, init_generator) {
325335 EXPECT_INIT_SUCCESS (true , true , GEN);
326336 EXPECT_EQ (container.pimpl ()->interfaceFlags (), InterfaceFlags (GENERATE));
327337
328- EXPECT_INIT_FAILURE (false , false , GEN); // generator wants to push, but container cannot propagate pushes
338+ // external interface does not match GENERATE
339+ EXPECT_INIT_FAILURE (false , false , GEN);
340+ EXPECT_INIT_FAILURE (false , true , GEN);
341+ EXPECT_INIT_FAILURE (true , false , GEN);
329342
330343 EXPECT_INIT_FAILURE (true , true , GEN, GEN); // two generator stages cannot be connected
331344}
@@ -441,80 +454,60 @@ TEST_F(SerialTest, interface_detection) {
441454 EXPECT_INIT_FAILURE (false , false , ANY, ANY); // no connect
442455}
443456
444- TEST_F (SerialTest, nested_interface_detection) {
445- SerialContainer* inner;
457+ template <typename T>
458+ Stage::pointer make (const std::string& name, const std::initializer_list<StageType>& children, int runs = 0 ) {
459+ auto container = new T (name);
460+ append (*container, children);
461+ return Stage::pointer (container);
462+ }
446463
464+ TEST_F (SerialTest, nested_interface_detection) {
447465 // direction imposed from outer generator
448- container.clear ();
449-
450- inner = new SerialContainer (" inner serial" );
451- append (*inner, { ANY, ANY });
452-
453- append (container, { GEN, ANY });
454- container.add (Stage::pointer (inner));
466+ initContainer ({ GEN, ANY });
467+ container.add (make<SerialContainer>(" inner serial" , { ANY, ANY }));
455468 append (container, { ANY });
456469 {
457470 SCOPED_TRACE (" GEN - ANY - Serial( ANY - ANY ) - ANY" );
458471 validateInit (true , true , false );
459472 }
460473
461474 // direction imposed from inner generator
462- container.clear ();
463-
464- inner = new SerialContainer (" inner serial" );
465- append (*inner, { ANY, GEN, ANY });
466-
467- append (container, { ANY });
468- container.add (Stage::pointer (inner));
475+ initContainer ({ ANY });
476+ container.add (make<SerialContainer>(" inner serial" , { ANY, GEN, ANY }));
469477 append (container, { ANY });
470478 {
471479 SCOPED_TRACE (" ANY - Serial( ANY - GEN - ANY ) - ANY" );
472480 validateInit (true , true , false );
473481 }
474482
475- container.clear ();
476- inner = new SerialContainer (" inner serial" );
477- append (*inner, { GEN, ANY });
478-
479- container.insert (Stage::pointer (inner));
483+ initContainer ();
484+ container.add (make<SerialContainer>(" inner serial" , { GEN, ANY }));
480485 append (container, { ANY });
481486 {
482487 SCOPED_TRACE (" Serial( GEN - ANY ) - ANY" );
483488 validateInit (true , true , false );
484489 }
485490
486491 // outer and inner generators conflict with each other
487- container.clear ();
488-
489- inner = new SerialContainer (" inner serial" );
490- append (*inner, { ANY, GEN, ANY });
491-
492- append (container, { GEN, ANY });
493- container.add (Stage::pointer (inner));
492+ initContainer ({ GEN, ANY });
493+ container.add (make<SerialContainer>(" inner serial" , { ANY, GEN, ANY }));
494494 append (container, { ANY });
495495 {
496496 SCOPED_TRACE (" GEN - ANY - Serial( ANY - GEN - ANY ) - ANY" );
497- validateInit (true , true , {}, true ); // expected to fail
497+ validateInit (true , true , true ); // expected to fail
498498 }
499499}
500500
501501TEST_F (SerialTest, nested_parallel) {
502- container.clear ();
503-
504- append (container, { GEN });
505- auto inner_alt = new Alternatives (" inner alternatives" );
506- append (*inner_alt, { ANY, ANY });
507- container.add (Stage::pointer (inner_alt));
502+ initContainer ({ GEN });
503+ container.add (make<Alternatives>(" inner alternatives" , { ANY, ANY }));
508504 {
509505 SCOPED_TRACE (" GEN - Alternatives( ANY - ANY )" );
510506 validateInit (true , true , false );
511507 }
512508
513- container.clear ();
514- append (container, { GEN });
515- auto inner_fb = new Fallbacks (" inner alternatives" );
516- append (*inner_fb, { ANY, FW });
517- container.add (Stage::pointer (inner_fb));
509+ initContainer ({ GEN });
510+ container.add (make<Fallbacks>(" inner alternatives" , { ANY, FW }));
518511 {
519512 SCOPED_TRACE (" GEN - Fallback( ANY - FW )" );
520513 validateInit (true , true , false );
@@ -576,32 +569,25 @@ TEST_F(ParallelTest, init_mismatching) {
576569 EXPECT_INIT_FAILURE (true , false , CONN, GEN);
577570 EXPECT_INIT_FAILURE (false , true , CONN, GEN);
578571 EXPECT_INIT_FAILURE (true , true , CONN, GEN);
572+
573+ EXPECT_INIT_FAILURE (false , false , BW, FW);
574+ EXPECT_INIT_FAILURE (true , false , BW, FW);
575+ EXPECT_INIT_FAILURE (false , true , BW, FW);
576+ EXPECT_INIT_FAILURE (true , true , BW, FW);
579577}
580578
581579TEST_F (ParallelTest, init_propagating) {
582580 EXPECT_INIT_SUCCESS (false , true , FW, FW);
583581 EXPECT_EQ (container.pimpl ()->interfaceFlags (), PROPAGATE_FORWARDS);
582+ EXPECT_INIT_FAILURE (false , false , FW, FW);
583+ EXPECT_INIT_FAILURE (true , false , FW, FW);
584+ EXPECT_INIT_FAILURE (true , true , FW, FW);
584585
585586 EXPECT_INIT_SUCCESS (true , false , BW, BW);
586587 EXPECT_EQ (container.pimpl ()->interfaceFlags (), PROPAGATE_BACKWARDS);
587-
588588 EXPECT_INIT_FAILURE (false , false , BW, BW);
589589 EXPECT_INIT_FAILURE (false , true , BW, BW);
590590 EXPECT_INIT_FAILURE (true , true , BW, BW);
591-
592- EXPECT_INIT_FAILURE (false , false , FW, FW);
593- EXPECT_INIT_FAILURE (true , false , FW, FW);
594- EXPECT_INIT_FAILURE (true , true , FW, FW);
595-
596- // conflicting definitions
597- EXPECT_INIT_FAILURE (true , true , BW, FW); // no generator
598- EXPECT_INIT_FAILURE (false , false , BW, FW); // no connect
599-
600- // The following two cases could in principle be allowed,
601- // assuming the non-matching children are plain disabled,
602- // but that behavior leads to very frustrating troubleshooting
603- EXPECT_INIT_FAILURE (false , true , BW, FW);
604- EXPECT_INIT_FAILURE (true , false , BW, FW);
605591}
606592
607593TEST_F (ParallelTest, init_any) {
@@ -611,22 +597,25 @@ TEST_F(ParallelTest, init_any) {
611597 // infer container (and children) direction from outside
612598 EXPECT_INIT_SUCCESS (false , true , ANY, ANY);
613599 EXPECT_EQ (container.pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS));
614- auto it = container.pimpl ()->children ().cbegin ();
615- EXPECT_EQ ((*it)->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS));
616- EXPECT_EQ ((*++it)->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS));
600+ for (const auto & child : container.pimpl ()->children ())
601+ EXPECT_EQ (child->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS)) << child->name ();
617602
618603 EXPECT_INIT_SUCCESS (true , false , ANY, ANY);
619604 EXPECT_EQ (container.pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_BACKWARDS));
620- it = container.pimpl ()->children ().cbegin ();
621- EXPECT_EQ ((*it)->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_BACKWARDS));
622- EXPECT_EQ ((*++it)->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_BACKWARDS));
605+ for (const auto & child : container.pimpl ()->children ())
606+ EXPECT_EQ (child->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_BACKWARDS)) << child->name ();
623607
624608 EXPECT_INIT_SUCCESS (true , false , BW, ANY); // infer ANY as BACKWARDS
625- EXPECT_EQ ((*container.pimpl ()->childByIndex (1 ))->pimpl ()->interfaceFlags (), PROPAGATE_BACKWARDS);
609+ for (const auto & child : container.pimpl ()->children ())
610+ EXPECT_EQ (child->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_BACKWARDS)) << child->name ();
611+
626612 EXPECT_INIT_SUCCESS (false , true , ANY, FW); // infer ANY as FORWARDS
627- EXPECT_EQ ((*container.pimpl ()->childByIndex (0 ))->pimpl ()->interfaceFlags (), PROPAGATE_FORWARDS);
613+ for (const auto & child : container.pimpl ()->children ())
614+ EXPECT_EQ (child->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS)) << child->name ();
615+
628616 EXPECT_INIT_SUCCESS (false , true , FW, ANY, FW); // infer ANY as FORWARDS
629- EXPECT_EQ ((*container.pimpl ()->childByIndex (1 ))->pimpl ()->interfaceFlags (), PROPAGATE_FORWARDS);
617+ for (const auto & child : container.pimpl ()->children ())
618+ EXPECT_EQ (child->pimpl ()->interfaceFlags (), InterfaceFlags (PROPAGATE_FORWARDS)) << child->name ();
630619}
631620
632621TEST (Task, move) {
0 commit comments