]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/leaf/test/handle_all_test.cpp
1 // Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifdef BOOST_LEAF_TEST_SINGLE_HEADER
9 # include <boost/leaf/handle_errors.hpp>
10 # include <boost/leaf/pred.hpp>
11 # include <boost/leaf/result.hpp>
14 #include "_test_ec.hpp"
15 #include "lightweight_test.hpp"
17 namespace leaf
= boost::leaf
;
19 template <int> struct info
{ int value
; };
21 enum class my_error_code
29 struct e_my_error_code
{ my_error_code value
; };
31 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
32 struct e_std_error_code
{ std::error_code value
; };
36 leaf::result
<R
> f( my_error_code ec
)
38 if( ec
==my_error_code::ok
)
41 return leaf::new_error(ec
, e_my_error_code
{ec
}, info
<1>{1}, info
<2>{2}, info
<3>{3});
44 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
45 template <class R
, class Errc
>
46 leaf::result
<R
> f_errc( Errc ec
)
48 return leaf::new_error(make_error_code(ec
), info
<1>{1}, info
<2>{2}, info
<3>{3});
51 template <class R
, class Errc
>
52 leaf::result
<R
> f_errc_wrapped( Errc ec
)
54 return leaf::new_error(e_std_error_code
{make_error_code(ec
)}, info
<1>{1}, info
<2>{2}, info
<3>{3});
60 explicit move_only( int value
): value(value
) { }
63 #ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
64 move_only( move_only
const & ) = delete;
65 move_only( move_only
&& ) = default;
71 // void, try_handle_all (success)
75 [&c
]() -> leaf::result
<void>
77 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::ok
));
89 // void, try_handle_all (failure)
93 [&c
]() -> leaf::result
<void>
95 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
99 [&c
]( my_error_code ec
, info
<1> const & x
,info
<2> y
)
101 BOOST_TEST(ec
==my_error_code::error1
);
102 BOOST_TEST_EQ(x
.value
, 1);
103 BOOST_TEST_EQ(y
.value
, 2);
115 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
116 // void, try_handle_all (failure), match cond_x (single enum value)
119 leaf::try_handle_all(
120 [&c
]() -> leaf::result
<void>
122 BOOST_LEAF_AUTO(answer
, f_errc
<int>(errc_a::a0
));
126 [&c
]( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
131 [&c
]( leaf::match
<leaf::condition
<cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
133 BOOST_TEST_EQ(ec
.matched
, make_error_code(errc_a::a0
));
134 BOOST_TEST_EQ(x
.value
, 1);
135 BOOST_TEST_EQ(y
.value
, 2);
148 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
149 // void, try_handle_all (failure), match cond_x (wrapped std::error_code)
152 leaf::try_handle_all(
153 [&c
]() -> leaf::result
<void>
155 BOOST_LEAF_AUTO(answer
, f_errc_wrapped
<int>(errc_a::a0
));
159 [&c
]( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x11
> )
164 [&c
]( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
166 BOOST_TEST_EQ(ec
.matched
.value
, make_error_code(errc_a::a0
));
167 BOOST_TEST_EQ(x
.value
, 1);
168 BOOST_TEST_EQ(y
.value
, 2);
181 // void, try_handle_all (failure), match enum (single enum value)
184 leaf::try_handle_all(
185 [&c
]() -> leaf::result
<void>
187 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
191 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
> )
196 [&c
]( leaf::match
<my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
198 BOOST_TEST(ec
.matched
==my_error_code::error1
);
199 BOOST_TEST_EQ(x
.value
, 1);
200 BOOST_TEST_EQ(y
.value
, 2);
212 // void, try_handle_all (failure), match enum (multiple enum values)
215 leaf::try_handle_all(
216 [&c
]() -> leaf::result
<void>
218 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
222 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
> )
227 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
229 BOOST_TEST(ec
.matched
==my_error_code::error1
);
230 BOOST_TEST_EQ(x
.value
, 1);
231 BOOST_TEST_EQ(y
.value
, 2);
243 // void, try_handle_all (failure), match value (single value)
246 leaf::try_handle_all(
247 [&c
]() -> leaf::result
<void>
249 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
253 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
258 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
260 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
261 BOOST_TEST_EQ(x
.value
, 1);
262 BOOST_TEST_EQ(y
.value
, 2);
274 // void, try_handle_all (failure), match value (multiple values)
277 leaf::try_handle_all(
278 [&c
]() -> leaf::result
<void>
280 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
284 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
289 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
291 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
292 BOOST_TEST_EQ(x
.value
, 1);
293 BOOST_TEST_EQ(y
.value
, 2);
305 //////////////////////////////////////
307 // int, try_handle_all (success)
309 int r
= leaf::try_handle_all(
310 []() -> leaf::result
<int>
312 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::ok
));
319 BOOST_TEST_EQ(r
, 42);
322 // int, try_handle_all (failure)
324 int r
= leaf::try_handle_all(
325 []() -> leaf::result
<int>
327 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
330 []( my_error_code ec
, info
<1> const & x
, info
<2> y
)
332 BOOST_TEST(ec
==my_error_code::error1
);
333 BOOST_TEST_EQ(x
.value
, 1);
334 BOOST_TEST_EQ(y
.value
, 2);
344 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
345 // int, try_handle_all (failure), match cond_x (single enum value)
347 int r
= leaf::try_handle_all(
348 []() -> leaf::result
<int>
350 BOOST_LEAF_AUTO(answer
, f_errc
<int>(errc_a::a0
));
353 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
357 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
359 BOOST_TEST_EQ(ec
.matched
, make_error_code(errc_a::a0
));
360 BOOST_TEST_EQ(x
.value
, 1);
361 BOOST_TEST_EQ(y
.value
, 2);
372 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
373 // int, try_handle_all (failure), match cond_x (wrapped std::error_code)
375 int r
= leaf::try_handle_all(
376 []() -> leaf::result
<int>
378 BOOST_LEAF_AUTO(answer
, f_errc_wrapped
<int>(errc_a::a0
));
381 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
385 []( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
387 BOOST_TEST_EQ(ec
.matched
.value
, make_error_code(errc_a::a0
));
388 BOOST_TEST_EQ(x
.value
, 1);
389 BOOST_TEST_EQ(y
.value
, 2);
400 // int, try_handle_all (failure), match enum (single enum value)
402 int r
= leaf::try_handle_all(
403 []() -> leaf::result
<int>
405 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
408 []( leaf::match
<my_error_code
, my_error_code::error2
> )
412 []( leaf::match
<my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
414 BOOST_TEST(ec
.matched
==my_error_code::error1
);
415 BOOST_TEST_EQ(x
.value
, 1);
416 BOOST_TEST_EQ(y
.value
, 2);
426 // int, try_handle_all (failure), match enum (multiple enum values)
428 int r
= leaf::try_handle_all(
429 []() -> leaf::result
<int>
431 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
434 []( leaf::match
<my_error_code
, my_error_code::error2
> )
438 []( leaf::match
<my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
440 BOOST_TEST(ec
.matched
==my_error_code::error1
);
441 BOOST_TEST_EQ(x
.value
, 1);
442 BOOST_TEST_EQ(y
.value
, 2);
452 // int, try_handle_all (failure), match value (single value)
454 int r
= leaf::try_handle_all(
455 []() -> leaf::result
<int>
457 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
460 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
464 []( leaf::match_value
<e_my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
466 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
467 BOOST_TEST_EQ(x
.value
, 1);
468 BOOST_TEST_EQ(y
.value
, 2);
478 // int, try_handle_all (failure), match value (multiple values)
480 int r
= leaf::try_handle_all(
481 []() -> leaf::result
<int>
483 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
486 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
490 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
492 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
493 BOOST_TEST_EQ(x
.value
, 1);
494 BOOST_TEST_EQ(y
.value
, 2);
504 //////////////////////////////////////
506 // move_only, try_handle_all (success)
508 move_only r
= leaf::try_handle_all(
509 []() -> leaf::result
<move_only
>
511 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::ok
));
512 return std::move(answer
);
518 BOOST_TEST_EQ(r
.value
, 42);
521 // move_only, try_handle_all (failure)
523 move_only r
= leaf::try_handle_all(
524 []() -> leaf::result
<move_only
>
526 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::error1
));
527 return std::move(answer
);
529 []( my_error_code ec
, info
<1> const & x
, info
<2> y
)
531 BOOST_TEST(ec
==my_error_code::error1
);
532 BOOST_TEST_EQ(x
.value
, 1);
533 BOOST_TEST_EQ(y
.value
, 2);
540 BOOST_TEST_EQ(r
.value
, 1);
543 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
544 // move_only, try_handle_all (failure), match cond_x (single enum value)
546 move_only r
= leaf::try_handle_all(
547 []() -> leaf::result
<move_only
>
549 BOOST_LEAF_AUTO(answer
, f_errc
<move_only
>(errc_a::a0
));
550 return std::move(answer
);
552 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
556 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
558 BOOST_TEST_EQ(ec
.matched
, make_error_code(errc_a::a0
));
559 BOOST_TEST_EQ(x
.value
, 1);
560 BOOST_TEST_EQ(y
.value
, 2);
567 BOOST_TEST_EQ(r
.value
, 2);
571 #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR
572 // move_only, try_handle_all (failure), match cond_x (wrapped std::error_code)
574 move_only r
= leaf::try_handle_all(
575 []() -> leaf::result
<move_only
>
577 BOOST_LEAF_AUTO(answer
, f_errc_wrapped
<move_only
>(errc_a::a0
));
578 return std::move(answer
);
580 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
584 []( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
586 BOOST_TEST_EQ(ec
.matched
.value
, make_error_code(errc_a::a0
));
587 BOOST_TEST_EQ(x
.value
, 1);
588 BOOST_TEST_EQ(y
.value
, 2);
595 BOOST_TEST_EQ(r
.value
, 2);
599 // move_only, try_handle_all (failure), match enum (single enum value)
601 move_only r
= leaf::try_handle_all(
602 []() -> leaf::result
<move_only
>
604 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::error1
));
605 return std::move(answer
);
607 []( leaf::match
<my_error_code
, my_error_code::error2
> )
611 []( leaf::match
<my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
613 BOOST_TEST(ec
.matched
==my_error_code::error1
);
614 BOOST_TEST_EQ(x
.value
, 1);
615 BOOST_TEST_EQ(y
.value
, 2);
622 BOOST_TEST_EQ(r
.value
, 2);
625 // move_only, try_handle_all (failure), match enum (multiple enum values)
627 move_only r
= leaf::try_handle_all(
628 []() -> leaf::result
<move_only
>
630 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::error1
));
631 return std::move(answer
);
633 []( leaf::match
<my_error_code
, my_error_code::error2
> )
637 []( leaf::match
<my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
639 BOOST_TEST(ec
.matched
==my_error_code::error1
);
640 BOOST_TEST_EQ(x
.value
, 1);
641 BOOST_TEST_EQ(y
.value
, 2);
648 BOOST_TEST_EQ(r
.value
, 2);
651 // move_only, try_handle_all (failure), match value (single value)
653 move_only r
= leaf::try_handle_all(
654 []() -> leaf::result
<move_only
>
656 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::error1
));
657 return std::move(answer
);
659 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
663 []( leaf::match_value
<e_my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
665 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
666 BOOST_TEST_EQ(x
.value
, 1);
667 BOOST_TEST_EQ(y
.value
, 2);
674 BOOST_TEST_EQ(r
.value
, 2);
677 // move_only, try_handle_all (failure), match value (multiple values)
679 move_only r
= leaf::try_handle_all(
680 []() -> leaf::result
<move_only
>
682 BOOST_LEAF_AUTO(answer
, f
<move_only
>(my_error_code::error1
));
683 return std::move(answer
);
685 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
689 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
691 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
692 BOOST_TEST_EQ(x
.value
, 1);
693 BOOST_TEST_EQ(y
.value
, 2);
700 BOOST_TEST_EQ(r
.value
, 2);
703 return boost::report_errors();