]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/signals/test/deletion_test.cpp
Add patch for failing prerm scripts
[ceph.git] / ceph / src / boost / libs / signals / test / deletion_test.cpp
CommitLineData
7c673cae
FG
1// Boost.Signals library
2
3// Copyright Douglas Gregor 2001-2003. Use, modification and
4// distribution is subject to the Boost Software License, Version
5// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7
8// For more information, see http://www.boost.org
9
10#include <boost/test/minimal.hpp>
11#include <boost/signal.hpp>
12#include <iostream>
13#include <string>
14
15static boost::BOOST_SIGNALS_NAMESPACE::connection connections[5];
16
17static std::string test_output;
18
19struct remove_connection {
20 explicit remove_connection(int v = 0, int i = -1) : value(v), idx(i) {}
21
22 void operator()() const {
23 if (idx >= 0)
24 connections[idx].disconnect();
25
26 //return value;
27 std::cout << value << " ";
28
29 test_output += static_cast<char>(value + '0');
30 }
31
32 int value;
33 int idx;
34};
35
36bool operator==(const remove_connection& x, const remove_connection& y)
37{ return x.value == y.value && x.idx == y.idx; }
38
39static void
40test_remove_self()
41{
42 boost::signal0<void> s0;
43
44 connections[0] = s0.connect(remove_connection(0));
45 connections[1] = s0.connect(remove_connection(1));
46 connections[2] = s0.connect(remove_connection(2, 2));
47 connections[3] = s0.connect(remove_connection(3));
48
49 std::cout << "Deleting 2" << std::endl;
50
51 test_output = "";
52 s0(); std::cout << std::endl;
53 BOOST_CHECK(test_output == "0123");
54
55 test_output = "";
56 s0(); std::cout << std::endl;
57 BOOST_CHECK(test_output == "013");
58
59 s0.disconnect_all_slots();
60 BOOST_CHECK(s0.empty());
61
62 connections[0] = s0.connect(remove_connection(0));
63 connections[1] = s0.connect(remove_connection(1));
64 connections[2] = s0.connect(remove_connection(2));
65 connections[3] = s0.connect(remove_connection(3, 3));
66
67 std::cout << "Deleting 3" << std::endl;
68
69 test_output = "";
70 s0(); std::cout << std::endl;
71 BOOST_CHECK(test_output == "0123");
72
73 test_output = "";
74 s0(); std::cout << std::endl;
75 BOOST_CHECK(test_output == "012");
76
77 s0.disconnect_all_slots();
78 BOOST_CHECK(s0.num_slots() == 0);
79
80 connections[0] = s0.connect(remove_connection(0, 0));
81 connections[1] = s0.connect(remove_connection(1));
82 connections[2] = s0.connect(remove_connection(2));
83 connections[3] = s0.connect(remove_connection(3));
84
85 std::cout << "Deleting 0" << std::endl;
86
87 test_output = "";
88 s0(); std::cout << std::endl;
89 BOOST_CHECK(test_output == "0123");
90
91 test_output = "";
92 s0(); std::cout << std::endl;
93 BOOST_CHECK(test_output == "123");
94
95 std::cout << "Blocking 2" << std::endl;
96
97 connections[2].block();
98 test_output = "";
99 s0(); std::cout << std::endl;
100 BOOST_CHECK(test_output == "13");
101
102 std::cout << "Unblocking 2" << std::endl;
103
104 connections[2].unblock();
105 test_output = "";
106 s0(); std::cout << std::endl;
107 BOOST_CHECK(test_output == "123");
108
109 s0.disconnect_all_slots();
110 BOOST_CHECK(s0.empty());
111
112 connections[0] = s0.connect(remove_connection(0, 0));
113 connections[1] = s0.connect(remove_connection(1, 1));
114 connections[2] = s0.connect(remove_connection(2, 2));
115 connections[3] = s0.connect(remove_connection(3, 3));
116
117 std::cout << "Mass suicide" << std::endl;
118
119 test_output = "";
120 s0(); std::cout << std::endl;
121 BOOST_CHECK(test_output == "0123");
122
123 test_output = "";
124 s0(); std::cout << std::endl;
125 BOOST_CHECK(test_output == "");
126}
127
128static void
129test_remove_prior()
130{
131 boost::signal0<void> s0;
132
133 connections[0] = s0.connect(remove_connection(0));
134 connections[1] = s0.connect(remove_connection(1, 0));
135 connections[2] = s0.connect(remove_connection(2));
136 connections[3] = s0.connect(remove_connection(3));
137
138 std::cout << "1 removes 0" << std::endl;
139
140 test_output = "";
141 s0(); std::cout << std::endl;
142 BOOST_CHECK(test_output == "0123");
143
144 test_output = "";
145 s0(); std::cout << std::endl;
146 BOOST_CHECK(test_output == "123");
147
148 s0.disconnect_all_slots();
149 BOOST_CHECK(s0.empty());
150
151 connections[0] = s0.connect(remove_connection(0));
152 connections[1] = s0.connect(remove_connection(1));
153 connections[2] = s0.connect(remove_connection(2));
154 connections[3] = s0.connect(remove_connection(3, 2));
155
156 std::cout << "3 removes 2" << std::endl;
157
158 test_output = "";
159 s0(); std::cout << std::endl;
160 BOOST_CHECK(test_output == "0123");
161
162 test_output = "";
163 s0(); std::cout << std::endl;
164 BOOST_CHECK(test_output == "013");
165}
166
167static void
168test_remove_after()
169{
170 boost::signal0<void> s0;
171
172 connections[0] = s0.connect(remove_connection(0, 1));
173 connections[1] = s0.connect(remove_connection(1));
174 connections[2] = s0.connect(remove_connection(2));
175 connections[3] = s0.connect(remove_connection(3));
176
177 std::cout << "0 removes 1" << std::endl;
178
179 test_output = "";
180 s0(); std::cout << std::endl;
181 BOOST_CHECK(test_output == "023");
182
183 test_output = "";
184 s0(); std::cout << std::endl;
185 BOOST_CHECK(test_output == "023");
186
187 s0.disconnect_all_slots();
188 BOOST_CHECK(s0.empty());
189
190 connections[0] = s0.connect(remove_connection(0));
191 connections[1] = s0.connect(remove_connection(1, 3));
192 connections[2] = s0.connect(remove_connection(2));
193 connections[3] = s0.connect(remove_connection(3));
194
195 std::cout << "1 removes 3" << std::endl;
196
197 test_output = "";
198 s0(); std::cout << std::endl;
199 BOOST_CHECK(test_output == "012");
200
201 test_output = "";
202 s0(); std::cout << std::endl;
203 BOOST_CHECK(test_output == "012");
204}
205
206static void
207test_bloodbath()
208{
209 boost::signal0<void> s0;
210
211 connections[0] = s0.connect(remove_connection(0, 1));
212 connections[1] = s0.connect(remove_connection(1, 1));
213 connections[2] = s0.connect(remove_connection(2, 0));
214 connections[3] = s0.connect(remove_connection(3, 2));
215
216 std::cout << "0 removes 1, 2 removes 0, 3 removes 2" << std::endl;
217
218 test_output = "";
219 s0(); std::cout << std::endl;
220 BOOST_CHECK(test_output == "023");
221
222 test_output = "";
223 s0(); std::cout << std::endl;
224 BOOST_CHECK(test_output == "3");
225}
226
227static void
228test_disconnect_equal()
229{
230 boost::signal0<void> s0;
231
232 connections[0] = s0.connect(remove_connection(0));
233 connections[1] = s0.connect(remove_connection(1));
234 connections[2] = s0.connect(remove_connection(2));
235 connections[3] = s0.connect(remove_connection(3));
236
237 std::cout << "Deleting 2" << std::endl;
238
239 test_output = "";
240 s0(); std::cout << std::endl;
241 BOOST_CHECK(test_output == "0123");
242
243#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
244 connections[2].disconnect();
245#else
246 s0.disconnect(remove_connection(2));
247#endif
248
249 test_output = "";
250 s0(); std::cout << std::endl;
251 BOOST_CHECK(test_output == "013");
252}
253
254int test_main(int, char* [])
255{
256 test_remove_self();
257 test_remove_prior();
258 test_remove_after();
259 test_bloodbath();
260 test_disconnect_equal();
261 return 0;
262}