Container: more unit tests for interface detection / validation

This commit is contained in:
Robert Haschke 2019-03-10 23:26:36 +01:00
parent d741f36ee3
commit 7d25c55978

View File

@ -235,7 +235,6 @@ TEST_F(SerialTest, init_empty) {
TEST_F(SerialTest, init_connecting) { TEST_F(SerialTest, init_connecting) {
EXPECT_INIT_SUCCESS(false, false, CONN); EXPECT_INIT_SUCCESS(false, false, CONN);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(CONNECT)); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(CONNECT));
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags());
EXPECT_INIT_FAILURE(true, true, CONN); EXPECT_INIT_FAILURE(true, true, CONN);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags({CONNECT, GENERATE})); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags({CONNECT, GENERATE}));
@ -246,7 +245,6 @@ TEST_F(SerialTest, init_connecting) {
TEST_F(SerialTest, init_generator) { TEST_F(SerialTest, init_generator) {
EXPECT_INIT_SUCCESS(true, true, GEN); EXPECT_INIT_SUCCESS(true, true, GEN);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE)); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE));
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags());
EXPECT_INIT_FAILURE(false, false, GEN); // generator wants to push, but container cannot propagate pushes EXPECT_INIT_FAILURE(false, false, GEN); // generator wants to push, but container cannot propagate pushes
@ -259,15 +257,48 @@ TEST_F(SerialTest, init_forward) {
EXPECT_INIT_FAILURE(true, true, FW); EXPECT_INIT_FAILURE(true, true, FW);
EXPECT_INIT_FAILURE(true, false, FW); EXPECT_INIT_FAILURE(true, false, FW);
// wrong inner connectivity
EXPECT_INIT_FAILURE(false, false, FW, BW);
EXPECT_INIT_FAILURE(true, true, BW, FW);
// these should be fine // these should be fine
EXPECT_INIT_SUCCESS(false, true, FW); EXPECT_INIT_SUCCESS(false, true, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags()); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(false, true, FW, FW); EXPECT_INIT_SUCCESS(false, true, FW, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags()); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(true, true, GEN, FW); EXPECT_INIT_SUCCESS(true, true, GEN, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE)); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE));
EXPECT_INIT_SUCCESS(true, true, BW, GEN, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE));
EXPECT_INIT_SUCCESS(false, true, ANY, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(false, true, FW, ANY);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(true, false, ANY, BW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(true, false, BW, ANY);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(false, true, BOTH, FW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(false, true, FW, BOTH);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(true, false, BOTH, BW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(true, false, BW, BOTH);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
} }
TEST_F(SerialTest, init_backward) { TEST_F(SerialTest, init_backward) {
@ -278,10 +309,10 @@ TEST_F(SerialTest, init_backward) {
// these should be fine // these should be fine
EXPECT_INIT_SUCCESS(true, false, BW); EXPECT_INIT_SUCCESS(true, false, BW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags()); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(true, false, BW, BW); EXPECT_INIT_SUCCESS(true, false, BW, BW);
EXPECT_EQ(container.pimpl()->interfaceFlags(), container.pimpl()->children().front()->pimpl()->interfaceFlags()); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(true, true, BW, GEN); EXPECT_INIT_SUCCESS(true, true, BW, GEN);
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE)); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(GENERATE));
@ -320,6 +351,11 @@ TEST_F(SerialTest, interface_detection) {
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(CONNECT)); EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(CONNECT));
// derive propagation direction from outer interface // derive propagation direction from outer interface
EXPECT_INIT_SUCCESS(false, true, ANY); // should be pruned to FW
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
EXPECT_INIT_SUCCESS(true, false, ANY); // should be pruned to BW
EXPECT_EQ(container.pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_BACKWARDS));
EXPECT_INIT_SUCCESS(false, true, ANY, ANY); // -> -> EXPECT_INIT_SUCCESS(false, true, ANY, ANY); // -> ->
it = container.pimpl()->children().begin(); it = container.pimpl()->children().begin();
EXPECT_EQ( (*it)->pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS)); EXPECT_EQ( (*it)->pimpl()->interfaceFlags(), InterfaceFlags(PROPAGATE_FORWARDS));
@ -346,10 +382,36 @@ TEST_F(SerialTest, interface_detection) {
} }
TEST_F(SerialTest, nested_interface_detection) { TEST_F(SerialTest, nested_interface_detection) {
auto inner = std::make_unique<SerialContainer>("inner"); SerialContainer* inner;
// direction imposed from outer generator
container.clear();
inner = new SerialContainer("inner serial");
append(*inner, {ANY, ANY});
append(container, {GEN, ANY, ANY});
container.insert(Stage::pointer(inner), -2);
{SCOPED_TRACE("GEN - ANY - inner - ANY"); validateInit(true, true, {}, false);}
// direction imposed from inner generator
container.clear();
inner = new SerialContainer("inner serial");
append(*inner, {ANY, GEN, ANY});
append(container, {ANY, ANY});
container.insert(Stage::pointer(inner), -2);
{SCOPED_TRACE("ANY - inner - ANY"); validateInit(true, true, {}, false);}
container.clear();
inner = new SerialContainer("inner serial");
append(*inner, {GEN, ANY}); append(*inner, {GEN, ANY});
container.insert(std::move(inner)); container.insert(Stage::pointer(inner));
validateInit(true, true, {ANY}, false); {SCOPED_TRACE("inner - ANY"); validateInit(true, true, {ANY}, false);}
// outer and inner generators conflict with each other
container.clear();
inner = new SerialContainer("inner serial");
append(*inner, {ANY, GEN, ANY});
append(container, {GEN, ANY, ANY});
container.insert(Stage::pointer(inner), -2);
{SCOPED_TRACE("GEN - ANY - inner - ANY"); validateInit(true, true, {}, true);}
} }