// Copyright (c) 2018-2019 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 #ifdef LEAF_NO_EXCEPTIONS #include int main() { std::cout << "Unit test not applicable." << std::endl; return 0; } #else #include #include #include "lightweight_test.hpp" namespace leaf = boost::leaf; template struct info { int value; }; struct my_exception: std::exception { }; int main() { { leaf::result r = leaf::try_handle_some( []() -> leaf::result { return 42; }, [] { return 1; } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), 42); } { leaf::result r = leaf::try_handle_some( []() -> leaf::result { throw leaf::exception( my_exception(), info<1>{1} ); }, []( leaf::catch_, info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return 42; } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), 42); } { leaf::result r = leaf::try_handle_some( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, []( info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return -42; } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), -42); } { auto handle_error = []( leaf::error_info const & error ) { return leaf::remote_handle_some( error, []( leaf::catch_, info<1> const & x ) -> leaf::result { BOOST_TEST_EQ(x.value, 1); return 42; }, []( info<1> const & x ) -> leaf::result { BOOST_TEST_EQ(x.value, 1); return -42; } ); }; { leaf::result r = leaf::remote_try_handle_some( []() -> leaf::result { return 42; }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), 42); } { leaf::result r = leaf::remote_try_handle_some( []() -> leaf::result { throw leaf::exception( my_exception(), info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), 42); } { leaf::result r = leaf::remote_try_handle_some( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), -42); } } { int r = leaf::try_handle_all( []() -> leaf::result { return 42; }, [] { return 1; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> leaf::result { throw leaf::exception( my_exception(), info<1>{1} ); }, []( leaf::catch_, info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return 42; }, [] { return 1; } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, []( info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return 42; }, [] { return 1; } ); BOOST_TEST_EQ(r, 42); } { auto handle_error = []( leaf::error_info const & error ) { return leaf::remote_handle_all( error, []( leaf::catch_, info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return 42; }, []( info<1> const & x ) { BOOST_TEST_EQ(x.value, 1); return -42; }, [] { return 1; } ); }; { int r = leaf::remote_try_handle_all( []() -> leaf::result { return 42; }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::remote_try_handle_all( []() -> leaf::result { throw leaf::exception( my_exception(), info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST_EQ(r, 42); } { int r = leaf::remote_try_handle_all( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); BOOST_TEST_EQ(r, -42); } } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::try_handle_all( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, []( info<1> const & ) -> int { LEAF_THROW(my_exception()); }, []( leaf::catch_<> ) { return 1; }, [] { return 2; } ); }, []( leaf::catch_<> ) { return 3; }, [] { return 4; } ); BOOST_TEST_EQ(r, 3); } { auto handle_error = []( leaf::error_info const & error ) { return leaf::remote_handle_all( error, []( info<1> const & ) -> int { LEAF_THROW(my_exception()); }, []( leaf::catch_<> ) { return 1; }, [] { return 2; } ); }; int r = leaf::try_handle_all( [&]() -> leaf::result { return leaf::remote_try_handle_all( [&]() -> leaf::result { return leaf::new_error( info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); }, []( leaf::catch_<> ) { return 3; }, [] { return 4; } ); BOOST_TEST_EQ(r, 3); } { int r = leaf::try_handle_all( []() -> leaf::result { return leaf::try_handle_some( []() -> leaf::result { return leaf::new_error( info<1>{1} ); }, []( info<1> const & ) -> int { LEAF_THROW(my_exception()); }, []( leaf::catch_<> ) { return 1; } ); }, []( leaf::catch_<> ) { return 3; }, [] { return 4; } ); BOOST_TEST_EQ(r, 3); } { auto handle_error = []( leaf::error_info const & error ) { return leaf::remote_handle_some( error, []( info<1> const & ) -> leaf::result { LEAF_THROW(my_exception()); }, []( leaf::catch_<> ) -> leaf::result { return 1; } ); }; int r = leaf::try_handle_all( [&]() -> leaf::result { return leaf::remote_try_handle_some( [&]() -> leaf::result { return leaf::new_error( info<1>{1} ); }, [&]( leaf::error_info const & error ) { return handle_error(error); } ); }, []( leaf::catch_<> ) { return 3; }, [] { return 4; } ); BOOST_TEST_EQ(r, 3); } return boost::report_errors(); } #endif