]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/libs/leaf/test/error_code_test.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / leaf / test / error_code_test.cpp
diff --git a/ceph/src/boost/libs/leaf/test/error_code_test.cpp b/ceph/src/boost/libs/leaf/test/error_code_test.cpp
new file mode 100644 (file)
index 0000000..1d4b029
--- /dev/null
@@ -0,0 +1,597 @@
+// 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 <boost/leaf/handle_errors.hpp>
+#include <boost/leaf/pred.hpp>
+#include <boost/leaf/result.hpp>
+#include "_test_res.hpp"
+#include "lightweight_test.hpp"
+
+namespace leaf = boost::leaf;
+
+struct e_wrapped_error_code { std::error_code value; };
+
+template <class R>
+void test()
+{
+#if __cplusplus >= 201703L
+    {
+        int r = leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            []( leaf::match<std::error_code, leaf::category<errc_a>, leaf::category<errc_b>> 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<std::error_code, leaf::category<errc_a>, leaf::category<errc_b>> 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);
+    }
+    {
+        int r = leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_b::b0);
+            },
+            []( leaf::match<std::error_code, leaf::category<errc_a>, errc_b::b0> 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 errc_a::a0; // testing without make_error_code
+            },
+            []( 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<leaf::condition<errc_a>, 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<std::error_code, 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);
+    }
+#endif
+    {
+        int r = leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            []( leaf::match<leaf::condition<errc_a>, 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<leaf::condition<cond_x>, 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<std::error_code, 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);
+    }
+#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_value<leaf::condition<e_wrapped_error_code, errc_a>, 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_value<e_wrapped_error_code, 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);
+    }
+#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_value<leaf::condition<e_wrapped_error_code, cond_x>, 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_value<e_wrapped_error_code, 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);
+    }
+#endif
+}
+
+template <class R>
+void test_void()
+{
+#if __cplusplus >= 201703L
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<std::error_code, leaf::category<errc_a>, leaf::category<errc_b>> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(&ec.category(), &cat_errc_a());
+                BOOST_TEST_EQ(ec, errc_a::a0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_b::b0);
+            },
+            [&]( leaf::match<std::error_code, leaf::category<errc_a>, leaf::category<errc_b>> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(&ec.category(), &cat_errc_b());
+                BOOST_TEST_EQ(ec, errc_b::b0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_b::b0);
+            },
+            [&]( leaf::match<std::error_code, leaf::category<errc_a>, errc_b::b0> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(&ec.category(), &cat_errc_b());
+                BOOST_TEST_EQ(ec, errc_b::b0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#endif
+
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            [&]() -> R
+            {
+                return errc_a::a0; // testing without make_error_code
+            },
+            [&]( std::error_code const & ec )
+            {
+                BOOST_TEST(!leaf::is_error_id(ec));
+                BOOST_TEST_EQ(ec, errc_a::a0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<leaf::condition<errc_a>, errc_a::a0> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(ec, errc_a::a0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#if __cplusplus >= 201703L
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<std::error_code, errc_a::a0> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(ec, errc_a::a0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#endif
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<leaf::condition<errc_a>, errc_a::a0> code )
+            {
+                std::error_code const & ec = code.matched;
+                BOOST_TEST_EQ(ec, errc_a::a0);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<leaf::condition<cond_x>, 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));
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#if __cplusplus >= 201703L
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return make_error_code(errc_a::a0);
+            },
+            [&]( leaf::match<std::error_code, 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));
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#endif
+
+    {
+        int r = 0;
+        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);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code();
+            },
+            [&]( leaf::match_value<leaf::condition<e_wrapped_error_code, errc_a>, 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);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#if __cplusplus >= 201703L
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code();
+            },
+            [&]( leaf::match_value<e_wrapped_error_code, 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);
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#endif
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code();
+            },
+            [&]( leaf::match_value<leaf::condition<e_wrapped_error_code, cond_x>, 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));
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#if __cplusplus >= 201703L
+    {
+        int r = 0;
+        leaf::try_handle_all(
+            []() -> R
+            {
+                return leaf::new_error( e_wrapped_error_code { make_error_code(errc_a::a0) } ).to_error_code();
+            },
+            [&]( leaf::match_value<e_wrapped_error_code, 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));
+                r = 42;
+            },
+            [&]
+            {
+                r = -42;
+            } );
+        BOOST_TEST_EQ(r, 42);
+    }
+#endif
+}
+
+int main()
+{
+    test<leaf::result<int>>();
+    test<test_res<int, std::error_code>>();
+    test_void<leaf::result<void>>();
+    test_void<test_res<void, std::error_code>>();
+    return boost::report_errors();
+}