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 <iosfwd>
8#include <cerrno>
9
10using namespace boost::system;
11
12struct X
13{
14 static int instances;
15
16 int v_;
17
18 explicit X( int v ): v_( v ) { ++instances; }
19
20 X( X const& r ) = delete;
21 X( X&& r ): v_( r.v_ ) { r.v_ = 0; ++instances; }
22
23 X& operator=( X const& ) = delete;
24
25 X& operator=( X&& r )
26 {
27 v_ = r.v_;
28 r.v_ = 0;
29
30 return *this;
31 }
32
33 ~X() { --instances; }
34};
35
36bool operator==( X const & x1, X const & x2 )
37{
38 return x1.v_ == x2.v_;
39}
40
41std::ostream& operator<<( std::ostream& os, X const & x )
42{
43 os << "X:" << x.v_;
44 return os;
45}
46
47int X::instances = 0;
48
49struct Y
50{
51 static int instances;
52
53 int v_;
54
55 explicit Y( int v = 0 ): v_( v ) { ++instances; }
56
57 Y( Y const& r ) noexcept: v_( r.v_ ) { ++instances; }
58 Y( Y&& r ) noexcept: v_( r.v_ ) { r.v_ = 0; ++instances; }
59
60 Y& operator=( Y const& ) = default;
61
62 Y& operator=( Y&& r )
63 {
64 v_ = r.v_;
65 r.v_ = 0;
66
67 return *this;
68 }
69
70 ~Y() { --instances; }
71};
72
73bool operator==( Y const & y1, Y const & y2 )
74{
75 return y1.v_ == y2.v_;
76}
77
78std::ostream& operator<<( std::ostream& os, Y const & y )
79{
80 os << "Y:" << y.v_;
81 return os;
82}
83
84int Y::instances = 0;
85
86int main()
87{
88 {
89 result<int> r1( 1 );
90 result<int> r2( 2 );
91
92 BOOST_TEST_EQ( r1, r1 );
93 BOOST_TEST_NE( r1, r2 );
94 }
95
96 {
97 result<int> r1( 1, generic_category() );
98 result<int> r2( 2, generic_category() );
99
100 BOOST_TEST_EQ( r1, r1 );
101 BOOST_TEST_NE( r1, r2 );
102 }
103
104 {
105 result<int> r1( 1 );
106 result<int> r2( 2, generic_category() );
107
108 BOOST_TEST_EQ( r1, r1 );
109 BOOST_TEST_NE( r1, r2 );
110 }
111
112 {
113 result<X, Y> r1( in_place_value, 1 );
114 result<X, Y> r2( in_place_value, 2 );
115
116 BOOST_TEST_EQ( r1, r1 );
117 BOOST_TEST_NE( r1, r2 );
118 }
119
120 {
121 result<X, Y> r1( in_place_error, 1 );
122 result<X, Y> r2( in_place_error, 2 );
123
124 BOOST_TEST_EQ( r1, r1 );
125 BOOST_TEST_NE( r1, r2 );
126 }
127
128 {
129 result<X, Y> r1( in_place_value, 1 );
130 result<X, Y> r2( in_place_error, 2 );
131
132 BOOST_TEST_EQ( r1, r1 );
133 BOOST_TEST_NE( r1, r2 );
134 }
135
136 {
137 result<void> r1;
138 result<void> r2;
139
140 BOOST_TEST_EQ( r1, r1 );
141 BOOST_TEST_EQ( r1, r2 );
142 }
143
144 {
145 result<void> r1( 1, generic_category() );
146 result<void> r2( 2, generic_category() );
147
148 BOOST_TEST_EQ( r1, r1 );
149 BOOST_TEST_NE( r1, r2 );
150 }
151
152 {
153 int x1 = 1;
154 int x2 = 2;
155
156 result<int&> r1( x1 );
157 result<int&> r2( x2 );
158
159 BOOST_TEST_EQ( r1, r1 );
160 BOOST_TEST_NE( r1, r2 );
161 }
162
163 {
164 int x1 = 1;
165 int x2 = 1;
166
167 result<int&> r1( x1 );
168 result<int&> r2( x2 );
169
170 BOOST_TEST_EQ( r1, r2 );
171 }
172
173 {
174 result<int&> r1( 1, generic_category() );
175 result<int&> r2( 2, generic_category() );
176
177 BOOST_TEST_EQ( r1, r1 );
178 BOOST_TEST_NE( r1, r2 );
179 }
180
181 {
182 int x1 = 1;
183
184 result<int&> r1( x1 );
185 result<int&> r2( 2, generic_category() );
186
187 BOOST_TEST_EQ( r1, r1 );
188 BOOST_TEST_NE( r1, r2 );
189 }
190
191 {
192 X x1( 1 );
193 X x2( 2 );
194
195 result<X&, Y> r1( x1 );
196 result<X&, Y> r2( x2 );
197
198 BOOST_TEST_EQ( r1, r1 );
199 BOOST_TEST_NE( r1, r2 );
200 }
201
202 {
203 X x1( 1 );
204 X x2( 1 );
205
206 result<X&, Y> r1( x1 );
207 result<X&, Y> r2( x2 );
208
209 BOOST_TEST_EQ( r1, r2 );
210 }
211
212 {
213 result<X&, Y> r1( in_place_error, 1 );
214 result<X&, Y> r2( in_place_error, 2 );
215
216 BOOST_TEST_EQ( r1, r1 );
217 BOOST_TEST_NE( r1, r2 );
218 }
219
220 {
221 X x1( 1 );
222
223 result<X&, Y> r1( x1 );
224 result<X&, Y> r2( in_place_error, 2 );
225
226 BOOST_TEST_EQ( r1, r1 );
227 BOOST_TEST_NE( r1, r2 );
228 }
229
230 return boost::report_errors();
231}
232

source code of boost/libs/system/test/result_eq.cpp