// Copyright (c) 2018-2020 Emil Dotchevski and Reverge Studios, Inc. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include "_test_res.hpp" #include "lightweight_test.hpp" namespace leaf = boost::leaf; struct e_wrapped_error_code { std::error_code value; }; template void test() { #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match, leaf::cat> code ) { std::error_code const & ec = code.matched(); BOOST_TEST_EQ(&ec.category(), &cat_errc_a()); BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_b::b0); }, []( leaf::match, leaf::cat> code ) { std::error_code const & ec = code.matched(); BOOST_TEST_EQ(&ec.category(), &cat_errc_b()); BOOST_TEST_EQ(ec, errc_b::b0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #endif { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( std::error_code const & ec ) { BOOST_TEST(!leaf::is_error_id(ec)); BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match, errc_a::a0> code ) { std::error_code const & ec = code.matched(); BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match code ) { std::error_code const & ec = code.matched(); BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #endif { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match, errc_a::a0> code ) { std::error_code const & ec = code.matched(); BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match, cond_x::x00> cond ) { std::error_code const & ec = cond.matched(); BOOST_TEST_EQ(ec, errc_a::a0); BOOST_TEST(ec==make_error_condition(cond_x::x00)); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> R { return make_error_code(errc_a::a0); }, []( leaf::match cond ) { std::error_code const & ec = cond.matched(); BOOST_TEST_EQ(ec, errc_a::a0); BOOST_TEST(ec==make_error_condition(cond_x::x00)); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #endif { int r = leaf::try_handle_all( []() -> R { return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code(); }, []( e_wrapped_error_code const & wec ) { std::error_code const & ec = wec.value; BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> R { return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code(); }, []( leaf::match, errc_a::a0> code ) { e_wrapped_error_code const & wec = code.matched(); std::error_code const & ec = wec.value; BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> R { return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code(); }, []( leaf::match code ) { e_wrapped_error_code const & wec = code.matched(); std::error_code const & ec = wec.value; BOOST_TEST_EQ(ec, errc_a::a0); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #endif { int r = leaf::try_handle_all( []() -> R { return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code(); }, []( leaf::match, cond_x::x00> cond ) { e_wrapped_error_code const & wec = cond.matched(); std::error_code const & ec = wec.value; BOOST_TEST_EQ(ec, errc_a::a0); BOOST_TEST(ec==make_error_condition(cond_x::x00)); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> R { return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code(); }, []( leaf::match cond ) { e_wrapped_error_code const & wec = cond.matched(); std::error_code const & ec = wec.value; BOOST_TEST_EQ(ec, errc_a::a0); BOOST_TEST(ec==make_error_condition(cond_x::x00)); return 42; }, [] { return -42; } ); BOOST_TEST_EQ(r, 42); } #endif } int main() { test>(); test>(); return boost::report_errors(); }