]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | // Copyright 2017, 2021 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 | explicit X( int v ): v_( v ) { ++instances; } | |
18 | ||
19 | X( int v1, int v2 ): v_( v1+v2 ) { ++instances; } | |
20 | X( int v1, int v2, int v3 ): v_( v1+v2+v3 ) { ++instances; } | |
21 | ||
22 | X( X const& ) = delete; | |
23 | X& operator=( X const& ) = delete; | |
24 | ||
25 | ~X() { --instances; } | |
26 | }; | |
27 | ||
28 | int X::instances = 0; | |
29 | ||
30 | int main() | |
31 | { | |
32 | { | |
33 | result<int> r( 0 ); | |
34 | ||
35 | BOOST_TEST( r.has_value() ); | |
36 | BOOST_TEST( !r.has_error() ); | |
37 | ||
38 | BOOST_TEST_EQ( r.value(), 0 ); | |
39 | } | |
40 | ||
41 | { | |
42 | result<int> r = 0; | |
43 | ||
44 | BOOST_TEST( r.has_value() ); | |
45 | BOOST_TEST( !r.has_error() ); | |
46 | ||
47 | BOOST_TEST_EQ( r.value(), 0 ); | |
48 | } | |
49 | ||
50 | { | |
51 | result<int, int> r( in_place_value, 1 ); | |
52 | ||
53 | BOOST_TEST( r.has_value() ); | |
54 | BOOST_TEST( !r.has_error() ); | |
55 | ||
56 | BOOST_TEST_EQ( *r, 1 ); | |
57 | } | |
58 | ||
59 | BOOST_TEST_EQ( X::instances, 0 ); | |
60 | ||
61 | { | |
62 | result<X> r( 1 ); | |
63 | ||
64 | BOOST_TEST( r.has_value() ); | |
65 | BOOST_TEST( !r.has_error() ); | |
66 | ||
67 | BOOST_TEST_EQ( r.value().v_, 1 ); | |
68 | ||
69 | BOOST_TEST_EQ( X::instances, 1 ); | |
70 | } | |
71 | ||
72 | BOOST_TEST_EQ( X::instances, 0 ); | |
73 | ||
74 | { | |
75 | result<X> r( 1, 2 ); | |
76 | ||
77 | BOOST_TEST( r.has_value() ); | |
78 | BOOST_TEST( !r.has_error() ); | |
79 | ||
80 | BOOST_TEST_EQ( r.value().v_, 1+2 ); | |
81 | ||
82 | BOOST_TEST_EQ( X::instances, 1 ); | |
83 | } | |
84 | ||
85 | BOOST_TEST_EQ( X::instances, 0 ); | |
86 | ||
87 | { | |
88 | result<X> r( 1, 2, 3 ); | |
89 | ||
90 | BOOST_TEST( r.has_value() ); | |
91 | BOOST_TEST( !r.has_error() ); | |
92 | ||
93 | BOOST_TEST_EQ( r.value().v_, 1+2+3 ); | |
94 | ||
95 | BOOST_TEST_EQ( X::instances, 1 ); | |
96 | } | |
97 | ||
98 | BOOST_TEST_EQ( X::instances, 0 ); | |
99 | ||
100 | { | |
101 | result<X, X> r( in_place_value, 1 ); | |
102 | ||
103 | BOOST_TEST( r.has_value() ); | |
104 | BOOST_TEST( !r.has_error() ); | |
105 | ||
106 | BOOST_TEST_EQ( r->v_, 1 ); | |
107 | ||
108 | BOOST_TEST_EQ( X::instances, 1 ); | |
109 | } | |
110 | ||
111 | BOOST_TEST_EQ( X::instances, 0 ); | |
112 | ||
113 | { | |
114 | BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<int>, int>)); | |
115 | BOOST_TEST_TRAIT_TRUE((std::is_convertible<int, result<int>>)); | |
116 | ||
117 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int, int>, int>)); | |
118 | BOOST_TEST_TRAIT_FALSE((std::is_constructible<result<int, float>, int>)); | |
119 | ||
120 | BOOST_TEST_TRAIT_TRUE((std::is_constructible<result<X>, int>)); | |
121 | BOOST_TEST_TRAIT_FALSE((std::is_convertible<int, result<X>>)); | |
122 | } | |
123 | ||
124 | { | |
125 | result<void> r( in_place_value ); | |
126 | ||
127 | BOOST_TEST( r.has_value() ); | |
128 | BOOST_TEST( !r.has_error() ); | |
129 | } | |
130 | ||
131 | return boost::report_errors(); | |
132 | } |