2
0
mirror of https://github.com/boostorg/leaf.git synced 2026-01-29 19:42:15 +00:00
Files
leaf/test/diagnostic_information_test.cpp
2018-10-12 22:50:07 -07:00

111 lines
2.5 KiB
C++

//Copyright (c) 2018 Emil Dotchevski
//Copyright (c) 2018 Second Spectrum, Inc.
//Distributed under the Boost Software License, Version 1.0. (See accompanying
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/leaf/current_exception_diagnostic_information.hpp>
#include <boost/leaf/expect.hpp>
#include <boost/leaf/common.hpp>
#include <boost/leaf/put.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <sstream>
namespace leaf = boost::leaf;
struct
my_error:
virtual std::exception
{
char const *
what() const noexcept
{
return "my_error";
}
};
struct
printable_payload
{
friend
std::ostream &
operator<<( std::ostream & os, printable_payload const & x )
{
return os << "printed printable_payload";
}
};
struct
non_printable_payload
{
};
struct
printable_info_printable_payload
{
printable_payload value;
friend
std::ostream &
operator<<( std::ostream & os, printable_info_printable_payload const & x )
{
return os << "*** printable_info_printable_payload " << x.value << " ***";
}
};
struct
printable_info_non_printable_payload
{
non_printable_payload value;
friend
std::ostream &
operator<<( std::ostream & os, printable_info_non_printable_payload const & x )
{
return os << "*** printable_info_non_printable_payload ***";
}
};
struct
non_printable_info_printable_payload
{
printable_payload value;
};
struct
non_printable_info_non_printable_payload
{
non_printable_payload value;
};
int
main()
{
leaf::expect
<
printable_info_printable_payload,
printable_info_non_printable_payload,
non_printable_info_printable_payload,
non_printable_info_non_printable_payload,
leaf::ei_errno
> exp;
try
{
leaf::throw_exception(
my_error(),
ei_SOURCE_LOCATION,
printable_info_printable_payload(),
printable_info_non_printable_payload(),
non_printable_info_printable_payload(),
non_printable_info_non_printable_payload(),
leaf::ei_errno{ENOENT} );
}
catch(
my_error const & e )
{
handle_error( exp, e, leaf::match<>([ ]{ }) );
std::ostringstream st;
exp.print_current_exception_diagnostic_information(st);
std::string s = st.str();
BOOST_TEST(s.find("std::exception::what(): my_error")!=s.npos);
BOOST_TEST(s.find(" = N/A")!=s.npos);
BOOST_TEST(s.find(" = printed printable_payload")!=s.npos);
BOOST_TEST(s.find("*** printable_info_non_printable_payload ***")!=s.npos);
BOOST_TEST(s.find("*** printable_info_printable_payload printed printable_payload ***")!=s.npos);
std::cout << s;
}
return boost::report_errors();
}