// Copyright 2018-2022 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) #ifdef BOOST_LEAF_TEST_SINGLE_HEADER # include "leaf.hpp" #else # include # include # include #endif #include "_test_ec.hpp" #include "lightweight_test.hpp" #include namespace leaf = boost::leaf; enum class my_error { e1=1, e2, e3 }; struct e_my_error { int value; }; #if __cplusplus >= 201703L template constexpr bool cmp_my_error( my_error const & e ) noexcept { return e == value; }; template constexpr bool e_my_error_gt( e_my_error const & e ) noexcept { return e.value > S; } #endif struct my_exception: std::exception { int value; bool operator==(int); }; template bool test(E const & e ) { if( M::evaluate(e) ) { M m{e}; BOOST_TEST(e == m.matched); return true; } else return false; } int main() { { int e = 42; BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>(e) )); BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>>(e) )); BOOST_TEST(( test>>(e) )); BOOST_TEST(( !test>>(e) )); } { my_error e = my_error::e1; BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>(e) )); BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>>(e) )); BOOST_TEST(( test>>(e) )); BOOST_TEST(( !test>>(e) )); } #if BOOST_LEAF_CFG_STD_SYSTEM_ERROR { std::error_code e = errc_a::a0; BOOST_TEST(( test, cond_x::x00>>(e) )); BOOST_TEST(( !test, cond_x::x11>>(e) )); BOOST_TEST(( test, cond_x::x11, cond_x::x00>>(e) )); BOOST_TEST(( !test, cond_x::x00>>>(e) )); BOOST_TEST(( test, cond_x::x11>>>(e) )); BOOST_TEST(( !test, cond_x::x11, cond_x::x00>>>(e) )); #if __cplusplus >= 201703L BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>(e) )); BOOST_TEST(( test>(e) )); BOOST_TEST(( !test>>(e) )); BOOST_TEST(( test>>(e) )); BOOST_TEST(( !test>>(e) )); #endif } #endif #if __cplusplus >= 201703L { my_error e = my_error::e1; BOOST_TEST(( test>>(e) )); BOOST_TEST(( !test>>(e) )); } #endif { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(my_error::e1); }, []( leaf::match ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 1); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(my_error::e1); }, []( leaf::match ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 2); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(my_error::e1); }, []( leaf::if_not> ) { return 1; }, []( my_error ) { return 2; }, [] { return 3; } ); BOOST_TEST_EQ(r, 2); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(); }, []( leaf::if_not> ) { return 1; }, []( my_error ) { return 2; }, [] { return 3; } ); BOOST_TEST_EQ(r, 3); } #if __cplusplus >= 201703L { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(my_error::e1); }, []( leaf::match> ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 1); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(my_error::e1); }, []( leaf::match> ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 2); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(e_my_error{42}); }, []( leaf::match> ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 1); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error(e_my_error{42}); }, []( leaf::match> ) { return 1; }, [] { return 2; } ); BOOST_TEST_EQ(r, 2); } #endif return boost::report_errors(); }