1 | // Copyright 2017, 2021, 2022 Peter Dimov. |
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 <boost/core/lightweight_test_trait.hpp> |
8 | |
9 | using namespace boost::system; |
10 | |
11 | struct X |
12 | { |
13 | static int instances; |
14 | |
15 | int v_; |
16 | |
17 | X(): v_() { ++instances; } |
18 | |
19 | X( int v ): v_( v ) { ++instances; } |
20 | |
21 | X( X const& r ): v_( r.v_ ) { ++instances; } |
22 | |
23 | X& operator=( X const& ) = delete; |
24 | |
25 | ~X() { --instances; } |
26 | }; |
27 | |
28 | bool operator==( X const & x1, X const & x2 ) |
29 | { |
30 | return x1.v_ == x2.v_; |
31 | } |
32 | |
33 | std::ostream& operator<<( std::ostream& os, X const & x ) |
34 | { |
35 | os << "X:" << x.v_; |
36 | return os; |
37 | } |
38 | |
39 | int X::instances = 0; |
40 | |
41 | int main() |
42 | { |
43 | { |
44 | result<int> r( 5 ); |
45 | result<long> r2 = r; |
46 | |
47 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 5 ); |
48 | } |
49 | |
50 | { |
51 | result<int> const r( 6 ); |
52 | result<long> r2 = r; |
53 | |
54 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 6 ); |
55 | } |
56 | |
57 | { |
58 | result<long> r2 = result<int>( 7 ); |
59 | |
60 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 7 ); |
61 | } |
62 | |
63 | BOOST_TEST_EQ( X::instances, 0 ); |
64 | |
65 | { |
66 | result<int> r( 5 ); |
67 | result<X> r2 = r; |
68 | |
69 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 5 ); |
70 | BOOST_TEST_EQ( X::instances, 1 ); |
71 | } |
72 | |
73 | BOOST_TEST_EQ( X::instances, 0 ); |
74 | |
75 | { |
76 | result<int> const r( 6 ); |
77 | result<X> r2 = r; |
78 | |
79 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 6 ); |
80 | BOOST_TEST_EQ( X::instances, 1 ); |
81 | } |
82 | |
83 | BOOST_TEST_EQ( X::instances, 0 ); |
84 | |
85 | { |
86 | result<X> r2 = result<int>( 7 ); |
87 | |
88 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 7 ); |
89 | BOOST_TEST_EQ( X::instances, 1 ); |
90 | } |
91 | |
92 | BOOST_TEST_EQ( X::instances, 0 ); |
93 | |
94 | { |
95 | auto ec = make_error_code( e: errc::invalid_argument ); |
96 | |
97 | result<int> r( ec ); |
98 | result<long> r2 = r; |
99 | |
100 | BOOST_TEST( !r2 ); |
101 | BOOST_TEST_EQ( r2.error(), ec ); |
102 | } |
103 | |
104 | { |
105 | auto ec = make_error_code( e: errc::invalid_argument ); |
106 | |
107 | result<int> r( ec ); |
108 | result<long> r2 = r; |
109 | |
110 | BOOST_TEST( !r2 ); |
111 | BOOST_TEST_EQ( r2.error(), ec ); |
112 | } |
113 | |
114 | { |
115 | auto ec = make_error_code( e: errc::invalid_argument ); |
116 | |
117 | result<long> r2 = result<int>( ec ); |
118 | |
119 | BOOST_TEST( !r2 ); |
120 | BOOST_TEST_EQ( r2.error(), ec ); |
121 | } |
122 | |
123 | BOOST_TEST_EQ( X::instances, 0 ); |
124 | |
125 | { |
126 | result<char const*, int> r( "test" ); |
127 | result<std::string, X> r2 = r; |
128 | |
129 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); |
130 | BOOST_TEST_EQ( X::instances, 0 ); |
131 | } |
132 | |
133 | BOOST_TEST_EQ( X::instances, 0 ); |
134 | |
135 | { |
136 | result<char const*, int> const r( "test" ); |
137 | result<std::string, X> r2 = r; |
138 | |
139 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); |
140 | BOOST_TEST_EQ( X::instances, 0 ); |
141 | } |
142 | |
143 | BOOST_TEST_EQ( X::instances, 0 ); |
144 | |
145 | { |
146 | result<std::string, X> r2 = result<char const*, int>( "test" ); |
147 | |
148 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); |
149 | BOOST_TEST_EQ( X::instances, 0 ); |
150 | } |
151 | |
152 | BOOST_TEST_EQ( X::instances, 0 ); |
153 | |
154 | { |
155 | result<char const*, int> r( 5 ); |
156 | result<std::string, X> r2 = r; |
157 | |
158 | BOOST_TEST( !r2 ); |
159 | BOOST_TEST_EQ( r2.error(), X(5) ); |
160 | BOOST_TEST_EQ( X::instances, 1 ); |
161 | } |
162 | |
163 | BOOST_TEST_EQ( X::instances, 0 ); |
164 | |
165 | { |
166 | result<char const*, int> const r( 6 ); |
167 | result<std::string, X> r2 = r; |
168 | |
169 | BOOST_TEST( !r2 ); |
170 | BOOST_TEST_EQ( r2.error(), X(6) ); |
171 | BOOST_TEST_EQ( X::instances, 1 ); |
172 | } |
173 | |
174 | { |
175 | result<std::string, X> r2 = result<char const*, int>( 7 ); |
176 | |
177 | BOOST_TEST( !r2 ); |
178 | BOOST_TEST_EQ( r2.error(), X(7) ); |
179 | BOOST_TEST_EQ( X::instances, 1 ); |
180 | } |
181 | |
182 | BOOST_TEST_EQ( X::instances, 0 ); |
183 | |
184 | // |
185 | |
186 | { |
187 | result<void, int> r; |
188 | result<void, X> r2 = r; |
189 | |
190 | BOOST_TEST( r2 ); |
191 | BOOST_TEST_EQ( X::instances, 0 ); |
192 | } |
193 | |
194 | BOOST_TEST_EQ( X::instances, 0 ); |
195 | |
196 | { |
197 | result<void, int> const r; |
198 | result<void, X> r2 = r; |
199 | |
200 | BOOST_TEST( r2 ); |
201 | BOOST_TEST_EQ( X::instances, 0 ); |
202 | } |
203 | |
204 | BOOST_TEST_EQ( X::instances, 0 ); |
205 | |
206 | { |
207 | result<void, X> r2 = result<void, int>(); |
208 | |
209 | BOOST_TEST( r2 ); |
210 | BOOST_TEST_EQ( X::instances, 0 ); |
211 | } |
212 | |
213 | BOOST_TEST_EQ( X::instances, 0 ); |
214 | |
215 | { |
216 | result<void, int> r( 5 ); |
217 | result<void, X> r2 = r; |
218 | |
219 | BOOST_TEST( !r2 ); |
220 | BOOST_TEST_EQ( r2.error(), X(5) ); |
221 | BOOST_TEST_EQ( X::instances, 1 ); |
222 | } |
223 | |
224 | BOOST_TEST_EQ( X::instances, 0 ); |
225 | |
226 | { |
227 | result<void, int> const r( 6 ); |
228 | result<void, X> r2 = r; |
229 | |
230 | BOOST_TEST( !r2 ); |
231 | BOOST_TEST_EQ( r2.error(), X(6) ); |
232 | BOOST_TEST_EQ( X::instances, 1 ); |
233 | } |
234 | |
235 | { |
236 | result<void, X> r2 = result<void, int>( 7 ); |
237 | |
238 | BOOST_TEST( !r2 ); |
239 | BOOST_TEST_EQ( r2.error(), X(7) ); |
240 | BOOST_TEST_EQ( X::instances, 1 ); |
241 | } |
242 | |
243 | BOOST_TEST_EQ( X::instances, 0 ); |
244 | |
245 | // |
246 | |
247 | { |
248 | int x = 5; |
249 | |
250 | result<int&> r( x ); |
251 | result<int const&> r2 = r; |
252 | |
253 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 5 ); |
254 | } |
255 | |
256 | { |
257 | int x = 6; |
258 | |
259 | result<int&> const r( x ); |
260 | result<int const&> r2 = r; |
261 | |
262 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 6 ); |
263 | } |
264 | |
265 | { |
266 | int x = 7; |
267 | |
268 | result<int const&> r2 = result<int&>( x ); |
269 | |
270 | BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, 7 ); |
271 | } |
272 | |
273 | { |
274 | BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<long>, result<int>>)); |
275 | BOOST_TEST_TRAIT_TRUE((std::is_convertible<result<int>, result<long>>)); |
276 | |
277 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int>, result<void*>>)); |
278 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<void*>, result<int>>)); |
279 | |
280 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int>, result<void>>)); |
281 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<void>, result<int>>)); |
282 | |
283 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<void>, result<int>>)); |
284 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<int>, result<void>>)); |
285 | |
286 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int, void*>, result<int, int>>)); |
287 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<int, int>, result<int, void*>>)); |
288 | |
289 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<void, void*>, result<void, int>>)); |
290 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<void, int>, result<void, void*>>)); |
291 | |
292 | BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<int const&>, result<int&>>)); |
293 | BOOST_TEST_TRAIT_TRUE((std::is_convertible<result<int&>, result<int const&>>)); |
294 | |
295 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&>, result<int>>)); |
296 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<int>, result<int const&>>)); |
297 | |
298 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&>, result<long&>>)); |
299 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<long&>, result<int const&>>)); |
300 | |
301 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int const&>, result<long const&>>)); |
302 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<result<long const&>, result<int const&>>)); |
303 | } |
304 | |
305 | return boost::report_errors(); |
306 | } |
307 | |