Skip to content

Commit 7f33633

Browse files
committed
Simplify test_container.cpp
* Reset mock_id for each test to facilitate assignment * Simplify creation of nested containers * Moved some test cases around * Output all exception messages (even expected ones)
1 parent b6a5f89 commit 7f33633

File tree

1 file changed

+70
-81
lines changed

1 file changed

+70
-81
lines changed

core/test/test_container.cpp

Lines changed: 70 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111

1212
using namespace moveit::task_constructor;
1313

14-
static int mock_id = 0;
14+
static unsigned int mock_id = 0;
1515

1616
class GeneratorMockup : public Generator
1717
{
1818
int runs = 0;
1919

2020
public:
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
{
3131
public:
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

3939
class PropagatorMockup : public PropagatingEitherWay
@@ -43,12 +43,12 @@ class PropagatorMockup : public PropagatingEitherWay
4343

4444
public:
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
5858
public:
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
};
6464
class BackwardMockup : public PropagatorMockup
6565
{
6666
public:
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

7777
public:
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

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

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

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

632621
TEST(Task, move) {

0 commit comments

Comments
 (0)