1#include "../SignalSlot.h"
2#include "../SignalSlotTrivial.h"
3
4#include <boost/bind.hpp>
5
6#define BOOST_TEST_MAIN
7#ifdef BOOST_TEST_DYN_LINK
8#include <boost/test/unit_test.hpp>
9#else
10#include <boost/test/included/unit_test.hpp>
11#endif
12
13class String
14{
15 public:
16  String(const char* str)
17  {
18    printf("String ctor this %p\n", this);
19  }
20
21  String(const String& rhs)
22  {
23    printf("String copy ctor this %p, rhs %p\n", this, &rhs);
24  }
25
26  String(String&& rhs)
27  {
28    printf("String move ctor this %p, rhs %p\n", this, &rhs);
29  }
30};
31
32class Foo : boost::noncopyable
33{
34 public:
35  void zero();
36  void zeroc() const;
37  void one(int);
38  void oner(int&);
39  void onec(int) const;
40  void oneString(const String& str);
41  // void oneStringRR(String&& str);
42  static void szero();
43  static void sone(int);
44  static void soneString(const String& str);
45};
46
47void Foo::zero()
48{
49  printf("Foo::zero()\n");
50}
51
52void Foo::zeroc() const
53{
54  printf("Foo::zeroc()\n");
55}
56
57void Foo::szero()
58{
59  printf("Foo::szero()\n");
60}
61
62void Foo::one(int x)
63{
64  printf("Foo::one() x=%d\n", x);
65}
66
67void Foo::onec(int x) const
68{
69  printf("Foo::onec() x=%d\n", x);
70}
71
72void Foo::sone(int x)
73{
74  printf("Foo::sone() x=%d\n", x);
75}
76
77void Foo::oneString(const String& str)
78{
79  printf("Foo::oneString\n");
80}
81
82void Foo::soneString(const String& str)
83{
84  printf("Foo::soneString\n");
85}
86
87BOOST_AUTO_TEST_CASE(testSignalSlotTrivialZero)
88{
89  SignalTrivial<void()> signal;
90
91  printf("========\n");
92  signal.call();
93
94  signal.connect(&Foo::szero);
95
96  printf("========\n");
97  signal.call();
98
99  Foo f;
100  signal.connect(boost::bind(&Foo::zero, &f));
101
102  printf("========\n");
103  signal.call();
104
105  signal.connect(boost::bind(&Foo::one, &f, 42));
106
107  printf("========\n");
108  signal.call();
109
110  const Foo cf;
111  signal.connect(boost::bind(&Foo::zeroc, &cf));
112
113  printf("========\n");
114  signal.call();
115
116  signal.connect(boost::bind(&Foo::onec, &cf, 128));
117
118  printf("========\n");
119  signal.call();
120
121  printf("========\n");
122  signal.call();
123}
124
125BOOST_AUTO_TEST_CASE(testSignalSlotTrivialOne)
126{
127  SignalTrivial<void(int)> signal;
128
129  printf("========\n");
130  signal.call(50);
131
132  signal.connect(&Foo::sone);
133
134  printf("========\n");
135  signal.call(51);
136
137  Foo f;
138  signal.connect(boost::bind(&Foo::one, &f, _1));
139
140  printf("========\n");
141  signal.call(52);
142
143  const Foo cf;
144  signal.connect(boost::bind(&Foo::onec, &cf, _1));
145
146  printf("========\n");
147  signal.call(53);
148}
149
150BOOST_AUTO_TEST_CASE(testSignalSlotTrivialString)
151{
152  SignalTrivial<void(const String&)> signal;
153  signal.call("hello");
154
155  signal.connect(&Foo::soneString);
156
157  printf("========\n");
158  signal.call("hello");
159
160  Foo f;
161  signal.connect(boost::bind(&Foo::oneString, &f, _1));
162
163  printf("========\n");
164  signal.call("hello");
165}
166
167BOOST_AUTO_TEST_CASE(testSignalSlotZero)
168{
169  muduo::Signal<void()> signal;
170
171  printf("==== testSignalSlotZero ====\n");
172  signal.call();
173
174  muduo::Slot s1 = signal.connect(&Foo::szero);
175
176  printf("========\n");
177  signal.call();
178
179  Foo f;
180  muduo::Slot s2 = signal.connect(boost::bind(&Foo::zero, &f));
181
182  printf("========\n");
183  signal.call();
184
185  muduo::Slot s3 = signal.connect(boost::bind(&Foo::one, &f, 42));
186
187  printf("========\n");
188  signal.call();
189
190  const Foo cf;
191  muduo::Slot s4 = signal.connect(boost::bind(&Foo::zeroc, &cf));
192
193  printf("========\n");
194  signal.call();
195
196  muduo::Slot s5 = signal.connect(boost::bind(&Foo::onec, &cf, 128));
197
198  printf("========\n");
199  signal.call();
200
201  s1 = muduo::Slot();
202  printf("========\n");
203  signal.call();
204
205
206  s4 = s3 = s2 = muduo::Slot();
207  printf("========\n");
208  signal.call();
209
210}
211
212BOOST_AUTO_TEST_CASE(testSignalSlotOne)
213{
214  muduo::Signal<void(int)> signal;
215
216  printf("========\n");
217  signal.call(50);
218
219  muduo::Slot s4;
220  {
221  muduo::Slot s1 = signal.connect(&Foo::sone);
222
223  printf("========\n");
224  signal.call(51);
225
226  Foo f;
227  muduo::Slot s2 = signal.connect(boost::bind(&Foo::one, &f, _1));
228
229  printf("========\n");
230  signal.call(52);
231
232  const Foo cf;
233  muduo::Slot s3 = signal.connect(boost::bind(&Foo::onec, &cf, _1));
234
235  printf("========\n");
236  signal.call(53);
237
238  s4 = s3;
239  }
240
241  printf("========\n");
242  signal.call(54);
243}
244
245BOOST_AUTO_TEST_CASE(testSignalSlotLife)
246{
247  muduo::Slot s1;
248
249  {
250  muduo::Signal<void()> signal;
251  s1 = signal.connect(&Foo::szero);
252
253  printf("========\n");
254  signal.call();
255
256  Foo f;
257  boost::function<void()> func = boost::bind(&Foo::zero, &f);
258
259  s1 = signal.connect(func);
260
261  printf("========\n");
262  signal.call();
263  }
264
265}
266
267