summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/signals2/test/regression_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/signals2/test/regression_test.cpp')
-rw-r--r--src/boost/libs/signals2/test/regression_test.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/boost/libs/signals2/test/regression_test.cpp b/src/boost/libs/signals2/test/regression_test.cpp
new file mode 100644
index 00000000..cd2238f7
--- /dev/null
+++ b/src/boost/libs/signals2/test/regression_test.cpp
@@ -0,0 +1,110 @@
+// thread_safe_signals library
+// Some assorted tests to expose various bugs that existed at some point,
+// to make sure they stay fixed
+
+// Copyright Frank Mori Hess 2008
+// Use, modification and
+// distribution is subject to the Boost Software License, Version
+// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org
+
+#include <boost/test/minimal.hpp>
+#include <boost/signals2.hpp>
+
+typedef boost::signals2::signal<void ()> sig0_type;
+
+// combiner that returns the number of slots invoked
+struct slot_counter {
+ typedef unsigned result_type;
+ template<typename InputIterator>
+ unsigned operator()(InputIterator first, InputIterator last) const
+ {
+ unsigned count = 0;
+ for (; first != last; ++first)
+ {
+ try
+ {
+ *first;
+ ++count;
+ }
+ catch(const boost::bad_weak_ptr &)
+ {}
+ }
+ return count;
+ }
+};
+
+void my_slot()
+{
+}
+
+void my_connecting_slot(sig0_type &sig)
+{
+ sig.connect(&my_slot);
+}
+
+void slot_connect_test()
+{
+ sig0_type sig;
+ sig.connect(sig0_type::slot_type(&my_connecting_slot, boost::ref(sig)).track(sig));
+ /* 2008-02-28: the following signal invocation triggered a (bogus) failed assertion of _shared_state.unique()
+ at detail/signal_template.hpp:285 */
+ sig();
+ BOOST_CHECK(sig.num_slots() == 2);
+ sig.disconnect(&my_slot);
+ BOOST_CHECK(sig.num_slots() == 1);
+ /* 2008-03-11: checked iterator barfed on next line, due to bad semantics of copy construction
+ for boost::signals2::detail::grouped_list */
+ sig();
+ BOOST_CHECK(sig.num_slots() == 2);
+}
+
+/* 2008-03-10: we weren't disconnecting old connection in scoped_connection assignment operator */
+void scoped_connection_test()
+{
+ typedef boost::signals2::signal<void (), slot_counter> signal_type;
+ signal_type sig;
+ {
+ boost::signals2::scoped_connection conn(sig.connect(&my_slot));
+ BOOST_CHECK(sig() == 1);
+ conn = sig.connect(&my_slot);
+ BOOST_CHECK(sig() == 1);
+ }
+ BOOST_CHECK(sig() == 0);
+}
+
+// testsignal that returns a reference type
+
+struct ref_returner
+{
+ static int i;
+
+ int& ref_return_slot()
+ {
+ return i;
+ }
+};
+
+int ref_returner::i = 0;
+
+void reference_return_test()
+{
+ boost::signals2::signal<int& ()> rTest;
+ ref_returner rr;
+ rTest.connect(boost::bind(&ref_returner::ref_return_slot, &rr));
+ int& r = *rTest();
+ BOOST_CHECK(ref_returner::i == 0);
+ r = 1;
+ BOOST_CHECK(ref_returner::i == 1);
+}
+
+int test_main(int, char*[])
+{
+ slot_connect_test();
+ scoped_connection_test();
+ reference_return_test();
+
+ return 0;
+}