X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FMultiConnectorMixin.test.cc;h=b4d307e3be1844876c65008f7cbd9f4c528f7671;hb=69b25a4904fa86324aedc7147502255ce4117885;hp=34a8b4743184bdd8ef5d6ea9b12cc5b075f1b3d5;hpb=26610f603ebdd465307b9621f532c1fe19fd5571;p=senf.git diff --git a/senf/PPI/MultiConnectorMixin.test.cc b/senf/PPI/MultiConnectorMixin.test.cc index 34a8b47..b4d307e 100644 --- a/senf/PPI/MultiConnectorMixin.test.cc +++ b/senf/PPI/MultiConnectorMixin.test.cc @@ -34,6 +34,10 @@ #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// +namespace ppi = senf::ppi; +namespace connector = ppi::connector; +namespace module = ppi::module; +namespace debug = module::debug; namespace { // We only test the user-collection case, all other cases are already handled by @@ -41,57 +45,74 @@ namespace { // Primitive duplicator class MyModule - : public senf::ppi::module::Module, - public senf::ppi::module::MultiConnectorMixin, - void, void> + : public module::Module, + public module::MultiConnectorMixin, void, void> { SENF_PPI_MODULE(MyModule); + typedef std::vector< boost::shared_ptr > Connectors; public: - senf::ppi::connector::PassiveInput<> input; + connector::PassiveInput<> input; MyModule() - { - noroute(input); - input.onRequest(&MyModule::request); - } + { + noroute(input); + input.onRequest(&MyModule::request); + } + + Connectors const & connectors() const + { return connectors_; } private: void connectorSetup(std::auto_ptr c) - { - route(input, *c); - connectors_.push_back(boost::shared_ptr(c)); - } + { + route(input, *c); + connectors_.push_back(boost::shared_ptr(c)); + } + + void connectorDestroy(ConnectorType const * c) + { + Connectors::iterator i ( + std::find_if(connectors_.begin(), connectors_.end(), + boost::bind(&Connectors::value_type::get,_1) == c)); + if (i != connectors_.end()) + connectors_.erase(i); + } void request() - { - senf::Packet p (input()); - for (Connectors::iterator i (connectors_.begin()), i_end (connectors_.end()); - i != i_end; ++i) - (**i)(p); - } + { + senf::Packet p (input()); + for (Connectors::iterator i (connectors_.begin()), i_end (connectors_.end()); + i != i_end; ++i) + (**i)(p); + } - typedef std::vector< boost::shared_ptr > Connectors; Connectors connectors_; - friend class senf::ppi::module::MultiConnectorMixin, - void, void>; - + friend class module::MultiConnectorMixin, void, void>; }; + + struct IntAnnotation { + int value; + bool operator<(IntAnnotation const & other) const { return value < other.value; } + IntAnnotation() {} + IntAnnotation(int v) : value(v) {} + }; + + std::ostream & operator<<(std::ostream & os, IntAnnotation const & value) + { os << value.value; return os; } } BOOST_AUTO_UNIT_TEST(multiConnectorMixin_userContainer) { - senf::ppi::module::debug::ActiveSource source; + debug::ActiveSource source; MyModule module; - senf::ppi::module::debug::PassiveSink sink1; - senf::ppi::module::debug::PassiveSink sink2; + debug::PassiveSink sink1; + debug::PassiveSink sink2; - senf::ppi::connect(source, module); - senf::ppi::connect(module, sink1); - senf::ppi::connect(module, sink2); - senf::ppi::init(); + ppi::connect(source, module); + ppi::connect(module, sink1); + ppi::connect(module, sink2); + ppi::init(); senf::Packet p (senf::DataPacket::create()); @@ -100,7 +121,33 @@ BOOST_AUTO_UNIT_TEST(multiConnectorMixin_userContainer) BOOST_CHECK_EQUAL( sink2.size(), 1u ); BOOST_CHECK( sink1.pop_front() == p ); BOOST_CHECK( sink2.pop_front() == p ); + + BOOST_CHECK_EQUAL( module.connectors().size(), 2u ); + sink1.input.disconnect(); + BOOST_CHECK_EQUAL( module.connectors().size(), 1u ); +} + +BOOST_AUTO_UNIT_TEST(multiConnectorMixin_multipleModules) +{ + debug::ActiveSource source; + debug::PassiveSink sink; + module::PassiveJoin join1; + module::PassiveJoin join2; + module::AnnotationRouter router; + MyModule module; + + ppi::connect(source, join1); + ppi::connect(join1, router); + ppi::connect(router, 1, join2); + ppi::connect(join2, module); + ppi::connect(module, sink); + senf::Packet p (senf::DataPacket::create()); + p.annotation().value = 1; + + source.submit(p); + BOOST_CHECK_EQUAL( sink.size(), 1u ); + BOOST_CHECK( sink.pop_front() == p ); } ///////////////////////////////cc.e////////////////////////////////////////