]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/test/test_buffered_channel_dispatch.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / fiber / test / test_buffered_channel_dispatch.cpp
1
2 // Copyright Oliver Kowalke 2013.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 #include <chrono>
8 #include <sstream>
9 #include <string>
10 #include <vector>
11
12 #include <boost/assert.hpp>
13 #include <boost/test/unit_test.hpp>
14
15 #include <boost/fiber/all.hpp>
16
17 struct moveable {
18 bool state;
19 int value;
20
21 moveable() :
22 state( false),
23 value( -1) {
24 }
25
26 moveable( int v) :
27 state( true),
28 value( v) {
29 }
30
31 moveable( moveable && other) :
32 state( other.state),
33 value( other.value) {
34 other.state = false;
35 other.value = -1;
36 }
37
38 moveable & operator=( moveable && other) {
39 if ( this == & other) return * this;
40 state = other.state;
41 other.state = false;
42 value = other.value;
43 other.value = -1;
44 return * this;
45 }
46 };
47
48 void test_zero_wm() {
49 bool thrown = false;
50 try {
51 boost::fibers::buffered_channel< int > c( 0);
52 } catch ( boost::fibers::fiber_error const&) {
53 thrown = true;
54 }
55 BOOST_CHECK( thrown);
56 }
57
58 void test_push() {
59 boost::fibers::buffered_channel< int > c( 16);
60 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
61 }
62
63 void test_push_closed() {
64 boost::fibers::buffered_channel< int > c( 16);
65 c.close();
66 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push( 1) );
67 }
68
69 void test_try_push() {
70 boost::fibers::buffered_channel< int > c( 2);
71 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
72 }
73
74 void test_try_push_closed() {
75 boost::fibers::buffered_channel< int > c( 2);
76 BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_push( 1) );
77 c.close();
78 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.try_push( 2) );
79 }
80
81 void test_try_push_full() {
82 boost::fibers::buffered_channel< int > c( 2);
83 BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_push( 1) );
84 BOOST_CHECK( boost::fibers::channel_op_status::full == c.try_push( 1) );
85 }
86
87 void test_push_wait_for() {
88 boost::fibers::buffered_channel< int > c( 2);
89 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
90 }
91
92 void test_push_wait_for_closed() {
93 boost::fibers::buffered_channel< int > c( 2);
94 c.close();
95 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
96 }
97
98 void test_push_wait_for_timeout() {
99 boost::fibers::buffered_channel< int > c( 2);
100 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
101 BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
102 }
103
104 void test_push_wait_until() {
105 boost::fibers::buffered_channel< int > c( 2);
106 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_until( 1,
107 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
108 }
109
110 void test_push_wait_until_closed() {
111 boost::fibers::buffered_channel< int > c( 2);
112 c.close();
113 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push_wait_until( 1,
114 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
115 }
116
117 void test_push_wait_until_timeout() {
118 boost::fibers::buffered_channel< int > c( 2);
119 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_until( 1,
120 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
121 BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.push_wait_until( 1,
122 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
123 }
124
125 void test_pop() {
126 boost::fibers::buffered_channel< int > c( 16);
127 int v1 = 2, v2 = 0;
128 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
129 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
130 BOOST_CHECK_EQUAL( v1, v2);
131 }
132
133 void test_pop_closed() {
134 boost::fibers::buffered_channel< int > c( 16);
135 int v1 = 2, v2 = 0;
136 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
137 c.close();
138 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
139 BOOST_CHECK_EQUAL( v1, v2);
140 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop( v2) );
141 }
142
143 void test_pop_success() {
144 boost::fibers::buffered_channel< int > c( 16);
145 int v1 = 2, v2 = 0;
146 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&v2](){
147 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
148 });
149 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,v1](){
150 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
151 });
152 f1.join();
153 f2.join();
154 BOOST_CHECK_EQUAL( v1, v2);
155 }
156
157 void test_value_pop() {
158 boost::fibers::buffered_channel< int > c( 16);
159 int v1 = 2, v2 = 0;
160 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
161 v2 = c.value_pop();
162 BOOST_CHECK_EQUAL( v1, v2);
163 }
164
165 void test_value_pop_closed() {
166 boost::fibers::buffered_channel< int > c( 16);
167 int v1 = 2, v2 = 0;
168 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
169 c.close();
170 v2 = c.value_pop();
171 BOOST_CHECK_EQUAL( v1, v2);
172 bool thrown = false;
173 try {
174 c.value_pop();
175 } catch ( boost::fibers::fiber_error const&) {
176 thrown = true;
177 }
178 BOOST_CHECK( thrown);
179 }
180
181 void test_value_pop_success() {
182 boost::fibers::buffered_channel< int > c( 16);
183 int v1 = 2, v2 = 0;
184 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&v2](){
185 v2 = c.value_pop();
186 });
187 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,v1](){
188 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
189 });
190 f1.join();
191 f2.join();
192 BOOST_CHECK_EQUAL( v1, v2);
193 }
194
195 void test_try_pop() {
196 boost::fibers::buffered_channel< int > c( 16);
197 int v1 = 2, v2 = 0;
198 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
199 BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_pop( v2) );
200 BOOST_CHECK_EQUAL( v1, v2);
201 }
202
203 void test_try_pop_closed() {
204 boost::fibers::buffered_channel< int > c( 16);
205 int v1 = 2, v2 = 0;
206 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
207 c.close();
208 BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_pop( v2) );
209 BOOST_CHECK_EQUAL( v1, v2);
210 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.try_pop( v2) );
211 }
212
213 void test_try_pop_success() {
214 boost::fibers::buffered_channel< int > c( 16);
215 int v1 = 2, v2 = 0;
216 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&v2](){
217 while ( boost::fibers::channel_op_status::success != c.try_pop( v2) ) {
218 boost::this_fiber::yield();
219 }
220 });
221 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,v1](){
222 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
223 });
224 f1.join();
225 f2.join();
226 BOOST_CHECK_EQUAL( v1, v2);
227 }
228
229 void test_pop_wait_for() {
230 boost::fibers::buffered_channel< int > c( 16);
231 int v1 = 2, v2 = 0;
232 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
233 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
234 BOOST_CHECK_EQUAL( v1, v2);
235 }
236
237 void test_pop_wait_for_closed() {
238 boost::fibers::buffered_channel< int > c( 16);
239 int v1 = 2, v2 = 0;
240 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
241 c.close();
242 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
243 BOOST_CHECK_EQUAL( v1, v2);
244 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
245 }
246
247 void test_pop_wait_for_success() {
248 boost::fibers::buffered_channel< int > c( 16);
249 int v1 = 2, v2 = 0;
250 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&v2](){
251 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
252 });
253 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,v1](){
254 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
255 });
256 f1.join();
257 f2.join();
258 BOOST_CHECK_EQUAL( v1, v2);
259 }
260
261 void test_pop_wait_for_timeout() {
262 boost::fibers::buffered_channel< int > c( 16);
263 int v = 0;
264 boost::fibers::fiber f( boost::fibers::launch::dispatch, [&c,&v](){
265 BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.pop_wait_for( v, std::chrono::seconds( 1) ) );
266 });
267 f.join();
268 }
269
270 void test_pop_wait_until() {
271 boost::fibers::buffered_channel< int > c( 16);
272 int v1 = 2, v2 = 0;
273 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
274 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
275 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
276 BOOST_CHECK_EQUAL( v1, v2);
277 }
278
279 void test_pop_wait_until_closed() {
280 boost::fibers::buffered_channel< int > c( 16);
281 int v1 = 2, v2 = 0;
282 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
283 c.close();
284 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
285 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
286 BOOST_CHECK_EQUAL( v1, v2);
287 BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop_wait_until( v2,
288 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
289 }
290
291 void test_pop_wait_until_success() {
292 boost::fibers::buffered_channel< int > c( 16);
293 int v1 = 2, v2 = 0;
294 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&v2](){
295 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
296 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
297 });
298 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,v1](){
299 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
300 });
301 f1.join();
302 f2.join();
303 BOOST_CHECK_EQUAL( v1, v2);
304 }
305
306 void test_pop_wait_until_timeout() {
307 boost::fibers::buffered_channel< int > c( 16);
308 int v = 0;
309 boost::fibers::fiber f( boost::fibers::launch::dispatch, [&c,&v](){
310 BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.pop_wait_until( v,
311 std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
312 });
313 f.join();
314 }
315
316 void test_wm_1() {
317 boost::fibers::buffered_channel< int > c( 4);
318 std::vector< boost::fibers::fiber::id > ids;
319 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&ids](){
320 ids.push_back( boost::this_fiber::get_id() );
321 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
322
323 ids.push_back( boost::this_fiber::get_id() );
324 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 2) );
325
326 ids.push_back( boost::this_fiber::get_id() );
327 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 3) );
328
329 ids.push_back( boost::this_fiber::get_id() );
330 // would be blocked because channel is full
331 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 4) );
332
333 ids.push_back( boost::this_fiber::get_id() );
334 // would be blocked because channel is full
335 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 5) );
336
337 ids.push_back( boost::this_fiber::get_id() );
338 });
339 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,&ids](){
340 ids.push_back( boost::this_fiber::get_id() );
341 BOOST_CHECK_EQUAL( 1, c.value_pop() );
342
343 // let other fiber run
344 boost::this_fiber::yield();
345
346 ids.push_back( boost::this_fiber::get_id() );
347 BOOST_CHECK_EQUAL( 2, c.value_pop() );
348
349 ids.push_back( boost::this_fiber::get_id() );
350 BOOST_CHECK_EQUAL( 3, c.value_pop() );
351
352 ids.push_back( boost::this_fiber::get_id() );
353 BOOST_CHECK_EQUAL( 4, c.value_pop() );
354
355 ids.push_back( boost::this_fiber::get_id() );
356 // would block because channel is empty
357 BOOST_CHECK_EQUAL( 5, c.value_pop() );
358
359 ids.push_back( boost::this_fiber::get_id() );
360 });
361 boost::fibers::fiber::id id1 = f1.get_id();
362 boost::fibers::fiber::id id2 = f2.get_id();
363 f1.join();
364 f2.join();
365 BOOST_CHECK_EQUAL( 12u, ids.size() );
366 BOOST_CHECK_EQUAL( id1, ids[0]);
367 BOOST_CHECK_EQUAL( id1, ids[1]);
368 BOOST_CHECK_EQUAL( id1, ids[2]);
369 BOOST_CHECK_EQUAL( id1, ids[3]);
370 BOOST_CHECK_EQUAL( id2, ids[4]);
371 BOOST_CHECK_EQUAL( id1, ids[5]);
372 BOOST_CHECK_EQUAL( id2, ids[6]);
373 BOOST_CHECK_EQUAL( id2, ids[7]);
374 BOOST_CHECK_EQUAL( id2, ids[8]);
375 BOOST_CHECK_EQUAL( id2, ids[9]);
376 BOOST_CHECK_EQUAL( id1, ids[10]);
377 BOOST_CHECK_EQUAL( id2, ids[11]);
378 }
379
380 void test_wm_2() {
381 boost::fibers::buffered_channel< int > c( 4);
382 std::vector< boost::fibers::fiber::id > ids;
383 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&c,&ids](){
384 ids.push_back( boost::this_fiber::get_id() );
385 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
386
387 ids.push_back( boost::this_fiber::get_id() );
388 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 2) );
389
390 ids.push_back( boost::this_fiber::get_id() );
391 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 3) );
392
393 ids.push_back( boost::this_fiber::get_id() );
394 // would be blocked because channel is full
395 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 4) );
396
397 ids.push_back( boost::this_fiber::get_id() );
398 // would be blocked because channel is full
399 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 5) );
400
401 ids.push_back( boost::this_fiber::get_id() );
402 });
403 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&c,&ids](){
404 ids.push_back( boost::this_fiber::get_id() );
405 BOOST_CHECK_EQUAL( 1, c.value_pop() );
406
407 // let other fiber run
408 boost::this_fiber::yield();
409
410 ids.push_back( boost::this_fiber::get_id() );
411 BOOST_CHECK_EQUAL( 2, c.value_pop() );
412
413 // let other fiber run
414 boost::this_fiber::yield();
415
416 ids.push_back( boost::this_fiber::get_id() );
417 BOOST_CHECK_EQUAL( 3, c.value_pop() );
418
419 ids.push_back( boost::this_fiber::get_id() );
420 BOOST_CHECK_EQUAL( 4, c.value_pop() );
421
422 ids.push_back( boost::this_fiber::get_id() );
423 BOOST_CHECK_EQUAL( 5, c.value_pop() );
424
425 ids.push_back( boost::this_fiber::get_id() );
426 });
427 boost::fibers::fiber::id id1 = f1.get_id();
428 boost::fibers::fiber::id id2 = f2.get_id();
429 f1.join();
430 f2.join();
431 BOOST_CHECK_EQUAL( (std::size_t)12, ids.size() );
432 BOOST_CHECK_EQUAL( id1, ids[0]);
433 BOOST_CHECK_EQUAL( id1, ids[1]);
434 BOOST_CHECK_EQUAL( id1, ids[2]);
435 BOOST_CHECK_EQUAL( id1, ids[3]);
436 BOOST_CHECK_EQUAL( id2, ids[4]);
437 BOOST_CHECK_EQUAL( id1, ids[5]);
438 BOOST_CHECK_EQUAL( id2, ids[6]);
439 BOOST_CHECK_EQUAL( id1, ids[7]);
440 BOOST_CHECK_EQUAL( id2, ids[8]);
441 BOOST_CHECK_EQUAL( id2, ids[9]);
442 BOOST_CHECK_EQUAL( id2, ids[10]);
443 BOOST_CHECK_EQUAL( id2, ids[11]);
444 }
445
446 void test_moveable() {
447 boost::fibers::buffered_channel< moveable > c( 16);
448 moveable m1( 3), m2;
449 BOOST_CHECK( m1.state);
450 BOOST_CHECK_EQUAL( 3, m1.value);
451 BOOST_CHECK( ! m2.state);
452 BOOST_CHECK_EQUAL( -1, m2.value);
453 BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( std::move( m1) ) );
454 BOOST_CHECK( ! m1.state);
455 BOOST_CHECK( ! m2.state);
456 BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( m2) );
457 BOOST_CHECK( ! m1.state);
458 BOOST_CHECK_EQUAL( -1, m1.value);
459 BOOST_CHECK( m2.state);
460 BOOST_CHECK_EQUAL( 3, m2.value);
461 }
462
463 void test_rangefor() {
464 boost::fibers::buffered_channel< int > chan{ 4 };
465 std::vector< int > vec;
466 boost::fibers::fiber f1( boost::fibers::launch::dispatch, [&chan]{
467 chan.push( 1);
468 chan.push( 1);
469 chan.push( 2);
470 chan.push( 3);
471 chan.push( 5);
472 chan.push( 8);
473 chan.push( 12);
474 chan.close();
475 });
476 boost::fibers::fiber f2( boost::fibers::launch::dispatch, [&vec,&chan]{
477 for ( int value : chan) {
478 vec.push_back( value);
479 }
480 });
481 f1.join();
482 f2.join();
483 BOOST_CHECK_EQUAL( 1, vec[0]);
484 BOOST_CHECK_EQUAL( 1, vec[1]);
485 BOOST_CHECK_EQUAL( 2, vec[2]);
486 BOOST_CHECK_EQUAL( 3, vec[3]);
487 BOOST_CHECK_EQUAL( 5, vec[4]);
488 BOOST_CHECK_EQUAL( 8, vec[5]);
489 BOOST_CHECK_EQUAL( 12, vec[6]);
490 }
491
492 boost::unit_test::test_suite * init_unit_test_suite( int, char* []) {
493 boost::unit_test::test_suite * test =
494 BOOST_TEST_SUITE("Boost.Fiber: buffered_channel test suite");
495
496 test->add( BOOST_TEST_CASE( & test_zero_wm) );
497 test->add( BOOST_TEST_CASE( & test_push) );
498 test->add( BOOST_TEST_CASE( & test_push_closed) );
499 test->add( BOOST_TEST_CASE( & test_try_push) );
500 test->add( BOOST_TEST_CASE( & test_try_push_closed) );
501 test->add( BOOST_TEST_CASE( & test_try_push_full) );
502 test->add( BOOST_TEST_CASE( & test_push_wait_for) );
503 test->add( BOOST_TEST_CASE( & test_push_wait_for_closed) );
504 test->add( BOOST_TEST_CASE( & test_push_wait_for_timeout) );
505 test->add( BOOST_TEST_CASE( & test_push_wait_until) );
506 test->add( BOOST_TEST_CASE( & test_push_wait_until_closed) );
507 test->add( BOOST_TEST_CASE( & test_push_wait_until_timeout) );
508 test->add( BOOST_TEST_CASE( & test_pop) );
509 test->add( BOOST_TEST_CASE( & test_pop_closed) );
510 test->add( BOOST_TEST_CASE( & test_pop_success) );
511 test->add( BOOST_TEST_CASE( & test_value_pop) );
512 test->add( BOOST_TEST_CASE( & test_value_pop_closed) );
513 test->add( BOOST_TEST_CASE( & test_value_pop_success) );
514 test->add( BOOST_TEST_CASE( & test_try_pop) );
515 test->add( BOOST_TEST_CASE( & test_try_pop_closed) );
516 test->add( BOOST_TEST_CASE( & test_try_pop_success) );
517 test->add( BOOST_TEST_CASE( & test_pop_wait_for) );
518 test->add( BOOST_TEST_CASE( & test_pop_wait_for_closed) );
519 test->add( BOOST_TEST_CASE( & test_pop_wait_for_success) );
520 test->add( BOOST_TEST_CASE( & test_pop_wait_for_timeout) );
521 test->add( BOOST_TEST_CASE( & test_pop_wait_until) );
522 test->add( BOOST_TEST_CASE( & test_pop_wait_until_closed) );
523 test->add( BOOST_TEST_CASE( & test_pop_wait_until_success) );
524 test->add( BOOST_TEST_CASE( & test_pop_wait_until_timeout) );
525 test->add( BOOST_TEST_CASE( & test_wm_1) );
526 test->add( BOOST_TEST_CASE( & test_wm_2) );
527 test->add( BOOST_TEST_CASE( & test_moveable) );
528 test->add( BOOST_TEST_CASE( & test_rangefor) );
529
530 return test;
531 }