]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/leaf/test/handle_all_test.cpp
1 // Copyright (c) 2018-2020 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 #include <boost/leaf/handle_errors.hpp>
7 #include <boost/leaf/pred.hpp>
8 #include <boost/leaf/result.hpp>
9 #include "_test_ec.hpp"
10 #include "lightweight_test.hpp"
12 namespace leaf
= boost::leaf
;
14 template <int> struct info
{ int value
; };
16 enum class my_error_code
24 struct e_my_error_code
{ my_error_code value
; };
26 struct e_std_error_code
{ std::error_code value
; };
29 leaf::result
<R
> f( my_error_code ec
)
31 if( ec
==my_error_code::ok
)
34 return leaf::new_error(ec
, e_my_error_code
{ec
}, info
<1>{1}, info
<2>{2}, info
<3>{3});
37 template <class R
, class Errc
>
38 leaf::result
<R
> f_errc( Errc ec
)
40 return leaf::new_error(make_error_code(ec
), info
<1>{1}, info
<2>{2}, info
<3>{3});
43 template <class R
, class Errc
>
44 leaf::result
<R
> f_errc_wrapped( Errc ec
)
46 return leaf::new_error(e_std_error_code
{make_error_code(ec
)}, info
<1>{1}, info
<2>{2}, info
<3>{3});
51 // void, try_handle_all (success)
55 [&c
]() -> leaf::result
<void>
57 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::ok
));
69 // void, try_handle_all (failure)
73 [&c
]() -> leaf::result
<void>
75 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
79 [&c
]( my_error_code ec
, info
<1> const & x
,info
<2> y
)
81 BOOST_TEST(ec
==my_error_code::error1
);
82 BOOST_TEST_EQ(x
.value
, 1);
83 BOOST_TEST_EQ(y
.value
, 2);
95 // void, try_handle_all (failure), match cond_x (single enum value)
99 [&c
]() -> leaf::result
<void>
101 BOOST_LEAF_AUTO(answer
, f_errc
<int>(errc_a::a0
));
105 [&c
]( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
110 [&c
]( leaf::match
<leaf::condition
<cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
112 BOOST_TEST_EQ(ec
.matched
, make_error_code(errc_a::a0
));
113 BOOST_TEST_EQ(x
.value
, 1);
114 BOOST_TEST_EQ(y
.value
, 2);
126 // void, try_handle_all (failure), match cond_x (wrapped std::error_code)
129 leaf::try_handle_all(
130 [&c
]() -> leaf::result
<void>
132 BOOST_LEAF_AUTO(answer
, f_errc_wrapped
<int>(errc_a::a0
));
136 [&c
]( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x11
> )
141 [&c
]( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
143 BOOST_TEST_EQ(ec
.matched
.value
, make_error_code(errc_a::a0
));
144 BOOST_TEST_EQ(x
.value
, 1);
145 BOOST_TEST_EQ(y
.value
, 2);
157 // void, try_handle_all (failure), match enum (single enum value)
160 leaf::try_handle_all(
161 [&c
]() -> leaf::result
<void>
163 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
167 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
> )
172 [&c
]( leaf::match
<my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
174 BOOST_TEST(ec
.matched
==my_error_code::error1
);
175 BOOST_TEST_EQ(x
.value
, 1);
176 BOOST_TEST_EQ(y
.value
, 2);
188 // void, try_handle_all (failure), match enum (multiple enum values)
191 leaf::try_handle_all(
192 [&c
]() -> leaf::result
<void>
194 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
198 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
> )
203 [&c
]( leaf::match
<my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
205 BOOST_TEST(ec
.matched
==my_error_code::error1
);
206 BOOST_TEST_EQ(x
.value
, 1);
207 BOOST_TEST_EQ(y
.value
, 2);
219 // void, try_handle_all (failure), match value (single value)
222 leaf::try_handle_all(
223 [&c
]() -> leaf::result
<void>
225 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
229 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
234 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
236 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
237 BOOST_TEST_EQ(x
.value
, 1);
238 BOOST_TEST_EQ(y
.value
, 2);
250 // void, try_handle_all (failure), match value (multiple values)
253 leaf::try_handle_all(
254 [&c
]() -> leaf::result
<void>
256 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
260 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
265 [&c
]( leaf::match_value
<e_my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
267 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
268 BOOST_TEST_EQ(x
.value
, 1);
269 BOOST_TEST_EQ(y
.value
, 2);
281 //////////////////////////////////////
283 // int, try_handle_all (success)
285 int r
= leaf::try_handle_all(
286 []() -> leaf::result
<int>
288 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::ok
));
295 BOOST_TEST_EQ(r
, 42);
298 // int, try_handle_all (failure)
300 int r
= leaf::try_handle_all(
301 []() -> leaf::result
<int>
303 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
306 []( my_error_code ec
, info
<1> const & x
, info
<2> y
)
308 BOOST_TEST(ec
==my_error_code::error1
);
309 BOOST_TEST_EQ(x
.value
, 1);
310 BOOST_TEST_EQ(y
.value
, 2);
320 // int, try_handle_all (failure), match cond_x (single enum value)
322 int r
= leaf::try_handle_all(
323 []() -> leaf::result
<int>
325 BOOST_LEAF_AUTO(answer
, f_errc
<int>(errc_a::a0
));
328 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
332 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
334 BOOST_TEST_EQ(ec
.matched
, make_error_code(errc_a::a0
));
335 BOOST_TEST_EQ(x
.value
, 1);
336 BOOST_TEST_EQ(y
.value
, 2);
346 // int, try_handle_all (failure), match cond_x (wrapped std::error_code)
348 int r
= leaf::try_handle_all(
349 []() -> leaf::result
<int>
351 BOOST_LEAF_AUTO(answer
, f_errc_wrapped
<int>(errc_a::a0
));
354 []( leaf::match
<leaf::condition
<cond_x
>, cond_x::x11
> )
358 []( leaf::match_value
<leaf::condition
<e_std_error_code
, cond_x
>, cond_x::x00
> ec
, info
<1> const & x
, info
<2> y
)
360 BOOST_TEST_EQ(ec
.matched
.value
, make_error_code(errc_a::a0
));
361 BOOST_TEST_EQ(x
.value
, 1);
362 BOOST_TEST_EQ(y
.value
, 2);
372 // int, try_handle_all (failure), match enum (single enum value)
374 int r
= leaf::try_handle_all(
375 []() -> leaf::result
<int>
377 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
380 []( leaf::match
<my_error_code
, my_error_code::error2
> )
384 []( leaf::match
<my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
386 BOOST_TEST(ec
.matched
==my_error_code::error1
);
387 BOOST_TEST_EQ(x
.value
, 1);
388 BOOST_TEST_EQ(y
.value
, 2);
398 // int, try_handle_all (failure), match enum (multiple enum values)
400 int r
= leaf::try_handle_all(
401 []() -> leaf::result
<int>
403 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
406 []( leaf::match
<my_error_code
, my_error_code::error2
> )
410 []( leaf::match
<my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
412 BOOST_TEST(ec
.matched
==my_error_code::error1
);
413 BOOST_TEST_EQ(x
.value
, 1);
414 BOOST_TEST_EQ(y
.value
, 2);
424 // int, try_handle_all (failure), match value (single value)
426 int r
= leaf::try_handle_all(
427 []() -> leaf::result
<int>
429 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
432 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
436 []( leaf::match_value
<e_my_error_code
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
438 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
439 BOOST_TEST_EQ(x
.value
, 1);
440 BOOST_TEST_EQ(y
.value
, 2);
450 // int, try_handle_all (failure), match value (multiple values)
452 int r
= leaf::try_handle_all(
453 []() -> leaf::result
<int>
455 BOOST_LEAF_AUTO(answer
, f
<int>(my_error_code::error1
));
458 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
> )
462 []( leaf::match_value
<e_my_error_code
, my_error_code::error2
, my_error_code::error1
> ec
, info
<1> const & x
, info
<2> y
)
464 BOOST_TEST(ec
.matched
.value
==my_error_code::error1
);
465 BOOST_TEST_EQ(x
.value
, 1);
466 BOOST_TEST_EQ(y
.value
, 2);
476 return boost::report_errors();