PPI: Implement Connector and Event un-registration
[senf.git] / senf / PPI / MultiConnectorMixin.test.cc
index 44d6402..b4d307e 100644 (file)
@@ -34,7 +34,6 @@
 
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
-
 namespace ppi = senf::ppi;
 namespace connector = ppi::connector;
 namespace module = ppi::module;
@@ -50,6 +49,7 @@ namespace {
           public module::MultiConnectorMixin<MyModule, connector::ActiveOutput<>, void, void>
     {
         SENF_PPI_MODULE(MyModule);
+        typedef std::vector< boost::shared_ptr<MyModule::ConnectorType> > Connectors;
     public:
         connector::PassiveInput<> input;
 
@@ -59,6 +59,9 @@ namespace {
             input.onRequest(&MyModule::request);
         }
 
+        Connectors const & connectors() const
+        { return connectors_; }
+
     private:
         void connectorSetup(std::auto_ptr<ConnectorType> c)
         {
@@ -66,6 +69,15 @@ namespace {
             connectors_.push_back(boost::shared_ptr<ConnectorType>(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());
@@ -74,7 +86,6 @@ namespace {
                 (**i)(p);
         }
 
-        typedef std::vector< boost::shared_ptr<MyModule::ConnectorType> > Connectors;
         Connectors connectors_;
                 
         friend class module::MultiConnectorMixin<MyModule, connector::ActiveOutput<>, void, void>;
@@ -91,13 +102,6 @@ namespace {
     { os << value.value; return os; }
 }
 
-BOOST_AUTO_UNIT_TEST(multiConnectorTraits)
-{
-    BOOST_STATIC_ASSERT( senf::ppi::module::detail::is_multiconnector_source<MyModule>::value );
-    BOOST_STATIC_ASSERT( ! senf::ppi::module::detail::is_multiconnector_target<MyModule>::value );
-}
-
-
 BOOST_AUTO_UNIT_TEST(multiConnectorMixin_userContainer)
 {
     debug::ActiveSource source;
@@ -117,6 +121,10 @@ 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)
@@ -130,7 +138,7 @@ BOOST_AUTO_UNIT_TEST(multiConnectorMixin_multipleModules)
     
     ppi::connect(source, join1);
     ppi::connect(join1, router);
-    ppi::connect(router, join2, 1);
+    ppi::connect(router, 1, join2);
     ppi::connect(join2, module);
     ppi::connect(module, sink);