1 | // Copyright 2023 Klemens Morgenstern |
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // https://www.boost.org/LICENSE_1_0.txt |
4 | |
5 | #include <boost/system/result.hpp> |
6 | #include <boost/core/lightweight_test.hpp> |
7 | #include <string> |
8 | |
9 | using namespace boost::system; |
10 | |
11 | struct X |
12 | { |
13 | int v_; |
14 | |
15 | explicit X( int v = 0 ): v_( v ) {} |
16 | |
17 | X( X const& ) = delete; |
18 | X& operator=( X const& ) = delete; |
19 | |
20 | X( X && ) = default; |
21 | X& operator=( X && ) = default; |
22 | }; |
23 | |
24 | int main() |
25 | { |
26 | { |
27 | result<std::string, X> r( 1 ); |
28 | |
29 | BOOST_TEST( !r.has_value() ); |
30 | BOOST_TEST( r.has_error() ); |
31 | |
32 | BOOST_TEST_EQ( std::move( r ).error().v_, 1 ); |
33 | } |
34 | |
35 | { |
36 | BOOST_TEST(( !result<std::string, X>( 1 ).has_value() )); |
37 | BOOST_TEST(( result<std::string, X>( 1 ).has_error() )); |
38 | |
39 | BOOST_TEST_EQ( (result<std::string, X>( 1 ).error().v_), 1 ); |
40 | } |
41 | |
42 | { |
43 | result<std::string, X> r( "s" ); |
44 | |
45 | BOOST_TEST( r.has_value() ); |
46 | BOOST_TEST( !r.has_error() ); |
47 | |
48 | BOOST_TEST_EQ( std::move( r ).error().v_, 0 ); |
49 | } |
50 | |
51 | { |
52 | BOOST_TEST(( result<std::string, X>( "s" ).has_value() )); |
53 | BOOST_TEST(( !result<std::string, X>( "s" ).has_error() )); |
54 | |
55 | BOOST_TEST_EQ( (result<std::string, X>( "s" ).error().v_), 0 ); |
56 | } |
57 | |
58 | // |
59 | |
60 | { |
61 | result<void, X> r( 1 ); |
62 | |
63 | BOOST_TEST( !r.has_value() ); |
64 | BOOST_TEST( r.has_error() ); |
65 | |
66 | BOOST_TEST_EQ( std::move( r ).error().v_, 1 ); |
67 | } |
68 | |
69 | { |
70 | BOOST_TEST(( !result<void, X>( 1 ).has_value() )); |
71 | BOOST_TEST(( result<void, X>( 1 ).has_error() )); |
72 | |
73 | BOOST_TEST_EQ( (result<void, X>( 1 ).error().v_), 1 ); |
74 | } |
75 | |
76 | { |
77 | result<void, X> r; |
78 | |
79 | BOOST_TEST( r.has_value() ); |
80 | BOOST_TEST( !r.has_error() ); |
81 | |
82 | BOOST_TEST_EQ( std::move( r ).error().v_, 0 ); |
83 | } |
84 | |
85 | { |
86 | BOOST_TEST(( result<void, X>().has_value() )); |
87 | BOOST_TEST(( !result<void, X>().has_error() )); |
88 | |
89 | BOOST_TEST_EQ( (result<void, X>().error().v_), 0 ); |
90 | } |
91 | |
92 | // |
93 | |
94 | { |
95 | result<double&, X> r( 1 ); |
96 | |
97 | BOOST_TEST( !r.has_value() ); |
98 | BOOST_TEST( r.has_error() ); |
99 | |
100 | BOOST_TEST_EQ( std::move( r ).error().v_, 1 ); |
101 | } |
102 | |
103 | { |
104 | BOOST_TEST(( !result<double&, X>( 1 ).has_value() )); |
105 | BOOST_TEST(( result<double&, X>( 1 ).has_error() )); |
106 | |
107 | BOOST_TEST_EQ( (result<double&, X>( 1 ).error().v_), 1 ); |
108 | } |
109 | |
110 | { |
111 | double x = 1.0; |
112 | |
113 | result<double&, X> r( x ); |
114 | |
115 | BOOST_TEST( r.has_value() ); |
116 | BOOST_TEST( !r.has_error() ); |
117 | |
118 | BOOST_TEST_EQ( std::move( r ).error().v_, 0 ); |
119 | } |
120 | |
121 | { |
122 | double x = 1.0; |
123 | |
124 | BOOST_TEST(( result<double&, X>( x ).has_value() )); |
125 | BOOST_TEST(( !result<double&, X>( x ).has_error() )); |
126 | |
127 | BOOST_TEST_EQ( (result<double&, X>( x ).error().v_), 0 ); |
128 | } |
129 | |
130 | // |
131 | |
132 | return boost::report_errors(); |
133 | } |
134 | |