2 // Copyright 2017 Peter Dimov.
4 // Distributed under the Boost Software License, Version 1.0.
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
9 // See library home page at http://www.boost.org/libs/system
11 // Avoid spurious VC++ warnings
12 # define _CRT_SECURE_NO_WARNINGS
14 #include <boost/config.hpp>
17 #if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR)
22 << "The version of the C++ standard library being used does not"
23 " support header <system_error> so interoperation will not be tested.\n";
28 #include <boost/system/error_code.hpp>
29 #include <boost/core/lightweight_test.hpp>
30 #include <system_error>
35 static void test_generic_category()
37 boost::system::error_category
const & bt
= boost::system::generic_category();
38 std::error_category
const & st
= bt
;
40 BOOST_TEST_CSTR_EQ( bt
.name(), st
.name() );
44 BOOST_TEST_EQ( bt
.message( ev
), st
.message( ev
) );
47 boost::system::error_code
bc( ev
, bt
);
49 BOOST_TEST_EQ( bc
.value(), ev
);
50 BOOST_TEST_EQ( &bc
.category(), &bt
);
52 std::error_code
sc( bc
);
54 BOOST_TEST_EQ( sc
.value(), ev
);
55 BOOST_TEST_EQ( &sc
.category(), &st
);
59 boost::system::error_condition bn
= bt
.default_error_condition( ev
);
61 BOOST_TEST_EQ( bn
.value(), ev
);
62 BOOST_TEST_EQ( &bn
.category(), &bt
);
64 BOOST_TEST( bt
.equivalent( ev
, bn
) );
66 std::error_condition
sn( bn
);
68 BOOST_TEST_EQ( sn
.value(), ev
);
69 BOOST_TEST_EQ( &sn
.category(), &st
);
71 BOOST_TEST( st
.equivalent( ev
, sn
) );
75 static void test_system_category()
77 boost::system::error_category
const & bt
= boost::system::system_category();
78 std::error_category
const & st
= bt
;
80 BOOST_TEST_CSTR_EQ( bt
.name(), st
.name() );
84 BOOST_TEST_EQ( bt
.message( ev
), st
.message( ev
) );
87 boost::system::error_code
bc( ev
, bt
);
89 BOOST_TEST_EQ( bc
.value(), ev
);
90 BOOST_TEST_EQ( &bc
.category(), &bt
);
92 std::error_code
sc( bc
);
94 BOOST_TEST_EQ( sc
.value(), ev
);
95 BOOST_TEST_EQ( &sc
.category(), &st
);
99 boost::system::error_condition bn
= bt
.default_error_condition( ev
);
100 BOOST_TEST( bt
.equivalent( ev
, bn
) );
102 std::error_condition
sn( bn
);
103 BOOST_TEST( st
.equivalent( ev
, sn
) );
109 BOOST_TEST_EQ( bt
.message( ev
), st
.message( ev
) );
112 boost::system::error_code
bc( ev
, bt
);
114 BOOST_TEST_EQ( bc
.value(), ev
);
115 BOOST_TEST_EQ( &bc
.category(), &bt
);
117 std::error_code
sc( bc
);
119 BOOST_TEST_EQ( sc
.value(), ev
);
120 BOOST_TEST_EQ( &sc
.category(), &st
);
124 boost::system::error_condition bn
= bt
.default_error_condition( ev
);
125 BOOST_TEST( bt
.equivalent( ev
, bn
) );
127 std::error_condition
sn( bn
);
128 BOOST_TEST( st
.equivalent( ev
, sn
) );
133 // test_user_category
135 class user_category_impl
: public boost::system::error_category
139 virtual const char * name() const BOOST_NOEXCEPT
144 virtual std::string
message( int ev
) const
147 std::sprintf( buffer
, "user message %d", ev
);
152 virtual boost::system::error_condition
default_error_condition( int ev
) const BOOST_NOEXCEPT
156 return boost::system::error_condition( EMFILE
, boost::system::generic_category() );
160 return boost::system::error_condition( EACCES
, boost::system::generic_category() );
164 return boost::system::error_condition( ev
, *this );
168 virtual bool equivalent( int code
, const boost::system::error_condition
& condition
) const BOOST_NOEXCEPT
170 if( code
== 4 && condition
== make_error_condition( boost::system::errc::too_many_files_open_in_system
) )
175 if( code
== 4 && condition
== make_error_condition( boost::system::errc::too_many_files_open
) )
180 return default_error_condition( code
) == condition
;
183 // virtual bool equivalent( const error_code & code, int condition ) const BOOST_NOEXCEPT;
186 boost::system::error_category
const & user_category()
188 static user_category_impl cat_
;
192 static void test_user_category()
194 boost::system::error_category
const & bt
= user_category();
195 std::error_category
const & st
= bt
;
197 BOOST_TEST_CSTR_EQ( bt
.name(), st
.name() );
201 BOOST_TEST_EQ( bt
.message( ev
), st
.message( ev
) );
204 boost::system::error_code
bc( ev
, bt
);
206 BOOST_TEST_EQ( bc
.value(), ev
);
207 BOOST_TEST_EQ( &bc
.category(), &bt
);
209 std::error_code
sc( bc
);
211 BOOST_TEST_EQ( sc
.value(), ev
);
212 BOOST_TEST_EQ( &sc
.category(), &st
);
216 boost::system::error_condition bn
= bt
.default_error_condition( ev
);
217 BOOST_TEST( bt
.equivalent( ev
, bn
) );
219 std::error_condition
sn( bn
);
220 BOOST_TEST( st
.equivalent( ev
, sn
) );
226 BOOST_TEST_EQ( bt
.message( ev
), st
.message( ev
) );
229 boost::system::error_code
bc( ev
, bt
);
231 BOOST_TEST_EQ( bc
.value(), ev
);
232 BOOST_TEST_EQ( &bc
.category(), &bt
);
234 std::error_code
sc( bc
);
236 BOOST_TEST_EQ( sc
.value(), ev
);
237 BOOST_TEST_EQ( &sc
.category(), &st
);
241 boost::system::error_condition bn
= bt
.default_error_condition( ev
);
242 BOOST_TEST( bt
.equivalent( ev
, bn
) );
244 std::error_condition
sn( bn
);
245 BOOST_TEST( st
.equivalent( ev
, sn
) );
249 boost::system::error_condition bn
= make_error_condition( boost::system::errc::too_many_files_open_in_system
);
250 BOOST_TEST( bt
.equivalent( ev
, bn
) );
252 std::error_condition
sn( bn
);
253 BOOST_TEST( st
.equivalent( ev
, sn
) );
257 boost::system::error_condition bn
= make_error_condition( boost::system::errc::too_many_files_open
);
258 BOOST_TEST( bt
.equivalent( ev
, bn
) );
260 std::error_condition
sn( bn
);
261 BOOST_TEST( st
.equivalent( ev
, sn
) );
266 // test_user2_category
275 class user2_category_impl
: public boost::system::error_category
279 virtual const char * name() const BOOST_NOEXCEPT
284 virtual std::string
message( int ev
) const
287 std::sprintf( buffer
, "user2 message %d", ev
);
292 virtual boost::system::error_condition
default_error_condition( int ev
) const BOOST_NOEXCEPT
294 return boost::system::error_condition( ev
, *this );
297 virtual bool equivalent( int code
, const boost::system::error_condition
& condition
) const BOOST_NOEXCEPT
299 return default_error_condition( code
) == condition
;
302 virtual bool equivalent( const boost::system::error_code
& code
, int condition
) const BOOST_NOEXCEPT
304 if( code
.category() == *this )
306 return condition
== code
.value();
308 else if( condition
== my_enoent
)
310 return code
== boost::system::errc::no_such_file_or_directory
;
312 else if( condition
== my_einval
)
314 return code
== boost::system::errc::invalid_argument
;
323 boost::system::error_category
const & user2_category()
325 static user2_category_impl cat_
;
329 static void test_user2_category()
331 boost::system::error_category
const & bt
= user2_category();
332 std::error_category
const & st
= bt
;
336 boost::system::error_condition
bn( ev
, bt
);
338 BOOST_TEST_EQ( bn
.value(), ev
);
339 BOOST_TEST_EQ( &bn
.category(), &bt
);
341 boost::system::error_code bc
= make_error_code( boost::system::errc::no_such_file_or_directory
);
343 BOOST_TEST( bc
== bn
);
345 std::error_condition
sn( bn
);
347 BOOST_TEST_EQ( sn
.value(), ev
);
348 BOOST_TEST_EQ( &sn
.category(), &st
);
350 std::error_code
sc( bc
);
352 BOOST_TEST( sc
== sn
);
360 << "The version of the C++ standard library being used"
361 " supports header <system_error> so interoperation will be tested.\n";
362 test_generic_category();
363 test_system_category();
364 test_user_category();
365 test_user2_category();
367 return boost::report_errors();