1 // Copyright (c) 2018-2020 Emil Dotchevski and Reverge Studios, Inc.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/leaf/detail/config.hpp>
7 #include <boost/leaf/handle_errors.hpp>
8 #include <boost/leaf/result.hpp>
9 #include <boost/leaf/common.hpp>
10 #include "lightweight_test.hpp"
13 namespace leaf
= boost::leaf
;
16 struct unexpected_test
22 virtual std::exception
24 char const * what() const noexcept
26 return "my_exception";
30 struct printable_payload
32 friend std::ostream
& operator<<( std::ostream
& os
, printable_payload
const & x
)
34 return os
<< "printed printable_payload";
38 struct non_printable_payload
42 struct printable_info_printable_payload
44 printable_payload value
;
46 friend std::ostream
& operator<<( std::ostream
& os
, printable_info_printable_payload
const & x
)
48 return os
<< "*** printable_info_printable_payload " << x
.value
<< " ***";
52 struct printable_info_non_printable_payload
54 non_printable_payload value
;
56 friend std::ostream
& operator<<( std::ostream
& os
, printable_info_non_printable_payload
const & x
)
58 return os
<< "*** printable_info_non_printable_payload ***";
62 struct non_printable_info_printable_payload
64 printable_payload value
;
67 struct non_printable_info_non_printable_payload
69 non_printable_payload value
;
75 []() -> leaf::result
<void>
77 return BOOST_LEAF_NEW_ERROR(
78 printable_info_printable_payload(),
79 printable_info_non_printable_payload(),
80 non_printable_info_printable_payload(),
81 non_printable_info_non_printable_payload(),
82 unexpected_test
<1>{1},
83 unexpected_test
<2>{2},
84 leaf::e_errno
{ENOENT
} );
87 leaf::e_source_location
,
88 printable_info_printable_payload
,
89 printable_info_non_printable_payload
,
90 non_printable_info_printable_payload
,
91 non_printable_info_non_printable_payload
,
93 leaf::error_info
const & unmatched
)
95 std::ostringstream st
;
97 std::string s
= st
.str();
98 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
103 BOOST_ERROR("Bad error dispatch");
106 std::cout
<< __LINE__
<< " ----\n";
108 leaf::try_handle_all(
109 []() -> leaf::result
<void>
111 return BOOST_LEAF_NEW_ERROR(
112 printable_info_printable_payload(),
113 printable_info_non_printable_payload(),
114 non_printable_info_printable_payload(),
115 non_printable_info_non_printable_payload(),
116 unexpected_test
<1>{1},
117 unexpected_test
<2>{2},
118 leaf::e_errno
{ENOENT
} );
121 leaf::e_source_location
,
122 printable_info_printable_payload
,
123 printable_info_non_printable_payload
,
124 non_printable_info_printable_payload
,
125 non_printable_info_non_printable_payload
,
127 leaf::diagnostic_info
const & unmatched
)
129 std::ostringstream st
;
131 std::string s
= st
.str();
132 #if BOOST_LEAF_DIAGNOSTICS
133 BOOST_TEST_NE(s
.find("leaf::diagnostic_info for Error ID = "), s
.npos
);
134 BOOST_TEST_NE(s
.find("e_source_location"), s
.npos
);
135 BOOST_TEST_NE(s
.find("*** printable_info_printable_payload printed printable_payload ***"), s
.npos
);
136 BOOST_TEST_NE(s
.find("*** printable_info_non_printable_payload ***"), s
.npos
);
137 BOOST_TEST_NE(s
.find(": printed printable_payload"), s
.npos
);
138 BOOST_TEST_NE(s
.find(": {Non-Printable}"), s
.npos
);
139 BOOST_TEST_NE(s
.find("Detected 2 attempts"), s
.npos
);
140 BOOST_TEST_NE(s
.find("unexpected_test<1>"), s
.npos
);
141 BOOST_TEST_EQ(s
.find("unexpected_test<2>"), s
.npos
);
143 BOOST_TEST_NE(s
.find("leaf::diagnostic_info requires #define BOOST_LEAF_DIAGNOSTICS 1"), s
.npos
);
144 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
150 BOOST_ERROR("Bad error dispatch");
153 std::cout
<< __LINE__
<< " ----\n";
155 leaf::try_handle_all(
156 []() -> leaf::result
<void>
158 return BOOST_LEAF_NEW_ERROR(
159 printable_info_printable_payload(),
160 printable_info_non_printable_payload(),
161 non_printable_info_printable_payload(),
162 non_printable_info_non_printable_payload(),
163 unexpected_test
<1>{1},
164 unexpected_test
<2>{2},
165 leaf::e_errno
{ENOENT
} );
168 leaf::e_source_location
,
169 printable_info_printable_payload
,
170 printable_info_non_printable_payload
,
171 non_printable_info_printable_payload
,
172 non_printable_info_non_printable_payload
,
174 leaf::verbose_diagnostic_info
const & di
)
176 std::ostringstream st
;
178 std::string s
= st
.str();
179 #if BOOST_LEAF_DIAGNOSTICS
180 BOOST_TEST_NE(s
.find("leaf::verbose_diagnostic_info for Error ID = "), s
.npos
);
181 BOOST_TEST_NE(s
.find("e_source_location"), s
.npos
);
182 BOOST_TEST_NE(s
.find("*** printable_info_printable_payload printed printable_payload ***"), s
.npos
);
183 BOOST_TEST_NE(s
.find("*** printable_info_non_printable_payload ***"), s
.npos
);
184 BOOST_TEST_NE(s
.find(": printed printable_payload"), s
.npos
);
185 BOOST_TEST_NE(s
.find(": {Non-Printable}"), s
.npos
);
186 BOOST_TEST_NE(s
.find("Unhandled error objects:"), s
.npos
);
187 BOOST_TEST_NE(s
.find("unexpected_test<1>"), s
.npos
);
188 BOOST_TEST_NE(s
.find("unexpected_test<2>"), s
.npos
);
189 BOOST_TEST_NE(s
.find(": 1"), s
.npos
);
190 BOOST_TEST_NE(s
.find(": 2"), s
.npos
);
192 BOOST_TEST_NE(s
.find("leaf::verbose_diagnostic_info requires #define BOOST_LEAF_DIAGNOSTICS 1"), s
.npos
);
193 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
199 BOOST_ERROR("Bad error dispatch");
202 std::cout
<< __LINE__
<< " ----\n";
204 ///////////////////////////////////
206 #ifndef BOOST_LEAF_NO_EXCEPTIONS
211 BOOST_LEAF_THROW_EXCEPTION( my_exception(),
212 printable_info_printable_payload(),
213 printable_info_non_printable_payload(),
214 non_printable_info_printable_payload(),
215 non_printable_info_non_printable_payload(),
216 unexpected_test
<1>{1},
217 unexpected_test
<2>{2},
218 leaf::e_errno
{ENOENT
} );
221 leaf::e_source_location
,
222 printable_info_printable_payload
,
223 printable_info_non_printable_payload
,
224 non_printable_info_printable_payload
,
225 non_printable_info_non_printable_payload
,
227 leaf::error_info
const & unmatched
)
229 std::ostringstream st
;
231 std::string s
= st
.str();
232 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
233 BOOST_TEST_NE(s
.find("Exception dynamic type: "), s
.npos
);
234 BOOST_TEST_NE(s
.find("std::exception::what(): my_exception"), s
.npos
);
238 std::cout
<< __LINE__
<< " ----\n";
243 BOOST_LEAF_THROW_EXCEPTION( my_exception(),
244 printable_info_printable_payload(),
245 printable_info_non_printable_payload(),
246 non_printable_info_printable_payload(),
247 non_printable_info_non_printable_payload(),
248 unexpected_test
<1>{1},
249 unexpected_test
<2>{2},
250 leaf::e_errno
{ENOENT
} );
253 leaf::e_source_location
,
254 printable_info_printable_payload
,
255 printable_info_non_printable_payload
,
256 non_printable_info_printable_payload
,
257 non_printable_info_non_printable_payload
,
259 leaf::diagnostic_info
const & unmatched
)
261 std::ostringstream st
;
263 std::string s
= st
.str();
264 #if BOOST_LEAF_DIAGNOSTICS
265 BOOST_TEST_NE(s
.find("leaf::diagnostic_info for Error ID = "), s
.npos
);
266 BOOST_TEST_NE(s
.find("Exception dynamic type: "), s
.npos
);
267 BOOST_TEST_NE(s
.find("std::exception::what(): my_exception"), s
.npos
);
268 BOOST_TEST_NE(s
.find("e_source_location"), s
.npos
);
269 BOOST_TEST_NE(s
.find("*** printable_info_printable_payload printed printable_payload ***"), s
.npos
);
270 BOOST_TEST_NE(s
.find("*** printable_info_non_printable_payload ***"), s
.npos
);
271 BOOST_TEST_NE(s
.find(": printed printable_payload"), s
.npos
);
272 BOOST_TEST_NE(s
.find(": {Non-Printable}"), s
.npos
);
273 BOOST_TEST_NE(s
.find("Detected 2 attempts"), s
.npos
);
274 BOOST_TEST_NE(s
.find("unexpected_test<1>"), s
.npos
);
275 BOOST_TEST_EQ(s
.find("unexpected_test<2>"), s
.npos
);
277 BOOST_TEST_NE(s
.find("leaf::diagnostic_info requires #define BOOST_LEAF_DIAGNOSTICS 1"), s
.npos
);
278 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
279 BOOST_TEST_NE(s
.find("Exception dynamic type: "), s
.npos
);
280 BOOST_TEST_NE(s
.find("std::exception::what(): my_exception"), s
.npos
);
285 std::cout
<< __LINE__
<< " ----\n";
290 BOOST_LEAF_THROW_EXCEPTION( my_exception(),
291 printable_info_printable_payload(),
292 printable_info_non_printable_payload(),
293 non_printable_info_printable_payload(),
294 non_printable_info_non_printable_payload(),
295 unexpected_test
<1>{1},
296 unexpected_test
<2>{2},
297 leaf::e_errno
{ENOENT
} );
300 leaf::e_source_location
,
301 printable_info_printable_payload
,
302 printable_info_non_printable_payload
,
303 non_printable_info_printable_payload
,
304 non_printable_info_non_printable_payload
,
306 leaf::verbose_diagnostic_info
const & di
)
308 std::ostringstream st
;
310 std::string s
= st
.str();
311 #if BOOST_LEAF_DIAGNOSTICS
312 BOOST_TEST_NE(s
.find("leaf::verbose_diagnostic_info for Error ID = "), s
.npos
);
313 BOOST_TEST_NE(s
.find("Exception dynamic type: "), s
.npos
);
314 BOOST_TEST_NE(s
.find("std::exception::what(): my_exception"), s
.npos
);
315 BOOST_TEST_NE(s
.find("e_source_location"), s
.npos
);
316 BOOST_TEST_NE(s
.find("*** printable_info_printable_payload printed printable_payload ***"), s
.npos
);
317 BOOST_TEST_NE(s
.find("*** printable_info_non_printable_payload ***"), s
.npos
);
318 BOOST_TEST_NE(s
.find(": printed printable_payload"), s
.npos
);
319 BOOST_TEST_NE(s
.find(": {Non-Printable}"), s
.npos
);
320 BOOST_TEST_NE(s
.find("Unhandled error objects:"), s
.npos
);
321 BOOST_TEST_NE(s
.find("unexpected_test<1>"), s
.npos
);
322 BOOST_TEST_NE(s
.find("unexpected_test<2>"), s
.npos
);
323 BOOST_TEST_NE(s
.find(": 1"), s
.npos
);
324 BOOST_TEST_NE(s
.find(": 2"), s
.npos
);
326 BOOST_TEST_NE(s
.find("leaf::verbose_diagnostic_info requires #define BOOST_LEAF_DIAGNOSTICS 1"), s
.npos
);
327 BOOST_TEST_NE(s
.find("leaf::error_info: Error ID = "), s
.npos
);
328 BOOST_TEST_NE(s
.find("Exception dynamic type: "), s
.npos
);
329 BOOST_TEST_NE(s
.find("std::exception::what(): my_exception"), s
.npos
);
336 return boost::report_errors();