1// thread_safe_signals library
2// basic test for alternate threading models
3
4// Copyright Frank Mori Hess 2008
5// Use, modification and
6// distribution is subject to the Boost Software License, Version
7// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10// For more information, see http://www.boost.org
11
12#include <boost/signals2.hpp>
13#define BOOST_TEST_MODULE threading_models_test
14#include <boost/test/included/unit_test.hpp>
15#include <boost/thread/mutex.hpp>
16
17// combiner that returns the number of slots invoked
18struct slot_counter {
19 typedef unsigned result_type;
20 template<typename InputIterator>
21 unsigned operator()(InputIterator first, InputIterator last) const
22 {
23 unsigned count = 0;
24 for (; first != last; ++first)
25 {
26 try
27 {
28 *first;
29 ++count;
30 }
31 catch(const boost::bad_weak_ptr &)
32 {}
33 }
34 return count;
35 }
36};
37
38void myslot()
39{
40}
41
42template<typename signal_type>
43void simple_test()
44{
45 signal_type sig;
46 sig.connect(typename signal_type::slot_type(&myslot));
47 BOOST_CHECK(sig() == 1);
48 sig.disconnect(&myslot);
49 BOOST_CHECK(sig() == 0);
50}
51
52class recursion_checking_dummy_mutex
53{
54 int recursion_count;
55public:
56 recursion_checking_dummy_mutex(): recursion_count(0)
57 {}
58 void lock()
59 {
60 BOOST_REQUIRE(recursion_count == 0);
61 ++recursion_count;
62 }
63 bool try_lock()
64 {
65 lock();
66 return true;
67 }
68 void unlock()
69 {
70 --recursion_count;
71 BOOST_REQUIRE(recursion_count == 0);
72 }
73};
74
75BOOST_AUTO_TEST_CASE(test_main)
76{
77 typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
78 boost::function<void (const boost::signals2::connection &)>, recursion_checking_dummy_mutex> sig0_rc_type;
79 simple_test<sig0_rc_type>();
80 typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
81 boost::function<void (const boost::signals2::connection &)>, boost::mutex> sig0_mt_type;
82 simple_test<sig0_mt_type>();
83 typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
84 boost::function<void (const boost::signals2::connection &)>, boost::signals2::dummy_mutex> sig0_st_type;
85 simple_test<sig0_st_type>();
86}
87

source code of boost/libs/signals2/test/threading_models_test.cpp