1 /*
2 * A simple test for so_has_subscription method.
3 */
4
5 #include <iostream>
6 #include <map>
7 #include <exception>
8 #include <stdexcept>
9 #include <cstdlib>
10 #include <thread>
11 #include <chrono>
12
13 #include <so_5/all.hpp>
14
15 #include <test/3rd_party/various_helpers/time_limited_execution.hpp>
16 #include <test/3rd_party/various_helpers/ensure.hpp>
17
18 class a_test_t : public so_5::agent_t
19 {
20 struct sig_1 : public so_5::signal_t {};
21 struct sig_2 : public so_5::signal_t {};
22
23 struct msg_1 : public so_5::message_t {};
24 struct msg_2 : public so_5::message_t {};
25 struct msg_3 : public so_5::message_t {};
26 struct msg_4 : public so_5::message_t {};
27 struct msg_5 : public so_5::message_t {};
28
29 struct umsg_1 {};
30 struct umsg_2 {};
31 struct umsg_3 {};
32 struct umsg_4 {};
33 struct umsg_5 {};
34 struct umsg_6 {};
35
36 struct ret_msg_1 : public so_5::message_t {};
37 struct ret_msg_2 : public so_5::message_t {};
38 struct ret_msg_3 : public so_5::message_t {};
39 struct ret_msg_4 : public so_5::message_t {};
40 struct ret_msg_5 : public so_5::message_t {};
41
42 struct ret_umsg_1 {};
43 struct ret_umsg_2 {};
44 struct ret_umsg_3 {};
45 struct ret_umsg_4 {};
46 struct ret_umsg_5 {};
47 struct ret_umsg_6 {};
48
49 public :
a_test_t(context_t ctx)50 a_test_t( context_t ctx )
51 : so_5::agent_t( ctx )
52 {}
53
54 virtual void
so_define_agent()55 so_define_agent() override
56 {
57 so_subscribe_self()
58 .event( &a_test_t::on_sig_1 )
59 .event( &a_test_t::on_sig_2 )
60 .event( &a_test_t::on_msg_1 )
61 .event( &a_test_t::on_msg_2 )
62 .event( &a_test_t::on_msg_3 )
63 .event( &a_test_t::on_msg_4 )
64 .event( &a_test_t::on_msg_5 )
65 .event( &a_test_t::on_umsg_1 )
66 .event( &a_test_t::on_umsg_2 )
67 .event( &a_test_t::on_umsg_3 )
68 .event( &a_test_t::on_umsg_4 )
69 .event( &a_test_t::on_umsg_5 )
70 .event( &a_test_t::on_umsg_6 )
71 .event( &a_test_t::on_ret_msg_1 )
72 .event( &a_test_t::on_ret_msg_2 )
73 .event( &a_test_t::on_ret_msg_3 )
74 .event( &a_test_t::on_ret_msg_4 )
75 .event( &a_test_t::on_ret_msg_5 )
76 .event( &a_test_t::on_ret_umsg_1 )
77 .event( &a_test_t::on_ret_umsg_2 )
78 .event( &a_test_t::on_ret_umsg_3 )
79 .event( &a_test_t::on_ret_umsg_4 )
80 .event( &a_test_t::on_ret_umsg_5 )
81 .event( &a_test_t::on_ret_umsg_6 )
82 ;
83
84 #define ENSURE_SUBSCRIBED(handler) \
85 ensure( so_has_subscription(so_direct_mbox(), \
86 so_default_state(), \
87 &a_test_t:: handler), \
88 #handler " must be subscribed" )
89
90 ENSURE_SUBSCRIBED(on_sig_1);
91 ENSURE_SUBSCRIBED(on_sig_2);
92 ENSURE_SUBSCRIBED(on_msg_1);
93 ENSURE_SUBSCRIBED(on_msg_2);
94 ENSURE_SUBSCRIBED(on_msg_3);
95 ENSURE_SUBSCRIBED(on_msg_4);
96 ENSURE_SUBSCRIBED(on_msg_5);
97
98 ENSURE_SUBSCRIBED(on_umsg_1);
99 ENSURE_SUBSCRIBED(on_umsg_2);
100 ENSURE_SUBSCRIBED(on_umsg_3);
101 ENSURE_SUBSCRIBED(on_umsg_4);
102 ENSURE_SUBSCRIBED(on_umsg_5);
103 ENSURE_SUBSCRIBED(on_umsg_6);
104
105 ENSURE_SUBSCRIBED(on_ret_msg_1);
106 ENSURE_SUBSCRIBED(on_ret_msg_2);
107 ENSURE_SUBSCRIBED(on_ret_msg_3);
108 ENSURE_SUBSCRIBED(on_ret_msg_4);
109 ENSURE_SUBSCRIBED(on_ret_msg_5);
110
111 ENSURE_SUBSCRIBED(on_ret_umsg_1);
112 ENSURE_SUBSCRIBED(on_ret_umsg_2);
113 ENSURE_SUBSCRIBED(on_ret_umsg_3);
114 ENSURE_SUBSCRIBED(on_ret_umsg_4);
115 ENSURE_SUBSCRIBED(on_ret_umsg_5);
116 ENSURE_SUBSCRIBED(on_ret_umsg_6);
117
118 #undef ENSURE_SUBSCRIBED
119
120 so_drop_subscription(
121 so_direct_mbox(), so_default_state(), &a_test_t::on_sig_1 );
122 so_drop_subscription(
123 so_direct_mbox(), so_default_state(), &a_test_t::on_sig_2 );
124
125 so_drop_subscription(
126 so_direct_mbox(), so_default_state(), &a_test_t::on_msg_1 );
127 so_drop_subscription(
128 so_direct_mbox(), so_default_state(), &a_test_t::on_msg_2 );
129 so_drop_subscription(
130 so_direct_mbox(), so_default_state(), &a_test_t::on_msg_3 );
131 so_drop_subscription(
132 so_direct_mbox(), so_default_state(), &a_test_t::on_msg_4 );
133 so_drop_subscription(
134 so_direct_mbox(), so_default_state(), &a_test_t::on_msg_5 );
135
136 so_drop_subscription(
137 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_1 );
138 so_drop_subscription(
139 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_2 );
140 so_drop_subscription(
141 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_3 );
142 so_drop_subscription(
143 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_4 );
144 so_drop_subscription(
145 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_5 );
146 so_drop_subscription(
147 so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_6 );
148
149 so_drop_subscription(
150 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_1 );
151 so_drop_subscription(
152 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_2 );
153 so_drop_subscription(
154 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_3 );
155 so_drop_subscription(
156 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_4 );
157 so_drop_subscription(
158 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_5 );
159
160 so_drop_subscription(
161 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_1 );
162 so_drop_subscription(
163 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_2 );
164 so_drop_subscription(
165 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_3 );
166 so_drop_subscription(
167 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_4 );
168 so_drop_subscription(
169 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_5 );
170 so_drop_subscription(
171 so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_6 );
172
173 #define ENSURE_UNSUBSCRIBED(handler) \
174 ensure( !so_has_subscription(so_direct_mbox(), \
175 so_default_state(), \
176 &a_test_t:: handler), \
177 #handler " must not be subscribed" )
178
179 ENSURE_UNSUBSCRIBED(on_sig_1);
180 ENSURE_UNSUBSCRIBED(on_sig_2);
181 ENSURE_UNSUBSCRIBED(on_msg_1);
182 ENSURE_UNSUBSCRIBED(on_msg_2);
183 ENSURE_UNSUBSCRIBED(on_msg_3);
184 ENSURE_UNSUBSCRIBED(on_msg_4);
185 ENSURE_UNSUBSCRIBED(on_msg_5);
186
187 ENSURE_UNSUBSCRIBED(on_umsg_1);
188 ENSURE_UNSUBSCRIBED(on_umsg_2);
189 ENSURE_UNSUBSCRIBED(on_umsg_3);
190 ENSURE_UNSUBSCRIBED(on_umsg_4);
191 ENSURE_UNSUBSCRIBED(on_umsg_5);
192 ENSURE_UNSUBSCRIBED(on_umsg_6);
193
194 ENSURE_UNSUBSCRIBED(on_ret_msg_1);
195 ENSURE_UNSUBSCRIBED(on_ret_msg_2);
196 ENSURE_UNSUBSCRIBED(on_ret_msg_3);
197 ENSURE_UNSUBSCRIBED(on_ret_msg_4);
198 ENSURE_UNSUBSCRIBED(on_ret_msg_5);
199
200 ENSURE_UNSUBSCRIBED(on_ret_umsg_1);
201 ENSURE_UNSUBSCRIBED(on_ret_umsg_2);
202 ENSURE_UNSUBSCRIBED(on_ret_umsg_3);
203 ENSURE_UNSUBSCRIBED(on_ret_umsg_4);
204 ENSURE_UNSUBSCRIBED(on_ret_umsg_5);
205 ENSURE_UNSUBSCRIBED(on_ret_umsg_6);
206
207 #undef ENSURE_UNSUBSCRIBED
208 }
209
210 virtual void
so_evt_start()211 so_evt_start() override
212 {
213 so_deregister_agent_coop_normally();
214 }
215
216 private:
217 void
on_sig_1(const mhood_t<sig_1> &) const218 on_sig_1(const mhood_t<sig_1> &) const {}
219
220 void
on_sig_2(mhood_t<sig_2>) const221 on_sig_2(mhood_t<sig_2>) const {}
222
223 void
on_msg_1(const msg_1 &) const224 on_msg_1(const msg_1 &) const {}
225
226 void
on_msg_2(const mhood_t<msg_2> &) const227 on_msg_2(const mhood_t<msg_2> &) const {}
228
229 void
on_msg_3(mhood_t<msg_3>) const230 on_msg_3(mhood_t<msg_3>) const {}
231
232 void
on_msg_4(mutable_mhood_t<msg_4>) const233 on_msg_4(mutable_mhood_t<msg_4>) const {}
234
235 void
on_msg_5(const mutable_mhood_t<msg_5> &) const236 on_msg_5(const mutable_mhood_t<msg_5> &) const {}
237
238 void
on_umsg_1(const umsg_1 &) const239 on_umsg_1(const umsg_1 &) const {}
240
241 void
on_umsg_2(const mhood_t<umsg_2> &) const242 on_umsg_2(const mhood_t<umsg_2> &) const {}
243
244 void
on_umsg_3(mhood_t<umsg_3>) const245 on_umsg_3(mhood_t<umsg_3>) const {}
246
247 void
on_umsg_4(mutable_mhood_t<umsg_4>) const248 on_umsg_4(mutable_mhood_t<umsg_4>) const {}
249
250 void
on_umsg_5(const mutable_mhood_t<umsg_5> &) const251 on_umsg_5(const mutable_mhood_t<umsg_5> &) const {}
252
253 void
on_umsg_6(umsg_6) const254 on_umsg_6(umsg_6) const {}
255
256 int
on_ret_msg_1(const ret_msg_1 &) const257 on_ret_msg_1(const ret_msg_1 &) const
258 {
259 return 0;
260 }
261
262 int
on_ret_msg_2(const mhood_t<ret_msg_2> &) const263 on_ret_msg_2(const mhood_t<ret_msg_2> &) const
264 {
265 return 0;
266 }
267
268 int
on_ret_msg_3(mhood_t<ret_msg_3>) const269 on_ret_msg_3(mhood_t<ret_msg_3>) const
270 {
271 return 0;
272 }
273
274 int
on_ret_msg_4(mutable_mhood_t<ret_msg_4>) const275 on_ret_msg_4(mutable_mhood_t<ret_msg_4>) const
276 {
277 return 0;
278 }
279
280 int
on_ret_msg_5(const mutable_mhood_t<ret_msg_5> &) const281 on_ret_msg_5(const mutable_mhood_t<ret_msg_5> &) const
282 {
283 return 0;
284 }
285
286 int
on_ret_umsg_1(const ret_umsg_1 &) const287 on_ret_umsg_1(const ret_umsg_1 &) const
288 {
289 return 0;
290 }
291
292 int
on_ret_umsg_2(const mhood_t<ret_umsg_2> &) const293 on_ret_umsg_2(const mhood_t<ret_umsg_2> &) const
294 {
295 return 0;
296 }
297
298 int
on_ret_umsg_3(mhood_t<ret_umsg_3>) const299 on_ret_umsg_3(mhood_t<ret_umsg_3>) const
300 {
301 return 0;
302 }
303
304 int
on_ret_umsg_4(mutable_mhood_t<ret_umsg_4>) const305 on_ret_umsg_4(mutable_mhood_t<ret_umsg_4>) const
306 {
307 return 0;
308 }
309
310 int
on_ret_umsg_5(const mutable_mhood_t<ret_umsg_5> &) const311 on_ret_umsg_5(const mutable_mhood_t<ret_umsg_5> &) const
312 {
313 return 0;
314 }
315
316 int
on_ret_umsg_6(ret_umsg_6) const317 on_ret_umsg_6(ret_umsg_6) const
318 {
319 return 0;
320 }
321 };
322
323 int
main()324 main()
325 {
326 try
327 {
328 run_with_time_limit(
329 []()
330 {
331 so_5::launch( []( so_5::environment_t & env ) {
332 env.introduce_coop( []( so_5::coop_t & coop ) {
333 coop.make_agent< a_test_t >();
334 } );
335 } );
336 },
337 20,
338 "so_has_subscription test" );
339 }
340 catch( const std::exception & ex )
341 {
342 std::cerr << "Error: " << ex.what() << std::endl;
343 return 1;
344 }
345
346 return 0;
347 }
348
349