1
2// Copyright 2018 Peter Dimov.
3//
4// Distributed under the Boost Software License, Version 1.0.
5//
6// See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt
8
9// See library home page at http://www.boost.org/libs/system
10
11#include <boost/system/error_code.hpp>
12#include <boost/core/lightweight_test.hpp>
13#include <boost/core/snprintf.hpp>
14#include <cstring>
15#include <cstdio>
16
17//
18
19#if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)
20
21#include <boost/config/pragma_message.hpp>
22
23BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_WINDOWS_API && BOOST_SYSTEM_USE_UTF8" )
24
25int main() {}
26
27#else
28
29#if defined(BOOST_WINDOWS_API)
30
31#include <windows.h>
32
33std::string sys_strerror( int ev )
34{
35 void * lpMsgBuf = 0;
36
37 DWORD retval = FormatMessageA(
38 FORMAT_MESSAGE_ALLOCATE_BUFFER |
39 FORMAT_MESSAGE_FROM_SYSTEM |
40 FORMAT_MESSAGE_IGNORE_INSERTS,
41 NULL,
42 ev,
43 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
44 (LPSTR) &lpMsgBuf,
45 0,
46 NULL
47 );
48
49 struct local_free
50 {
51 void * p_;
52
53 ~local_free()
54 {
55 LocalFree( p_ );
56 }
57 };
58
59 local_free lf_ = { lpMsgBuf };
60 (void)lf_;
61
62 if( retval == 0 )
63 {
64 char buffer[ 38 ];
65
66 boost::core::snprintf( buffer, sizeof( buffer ), "Unknown error (%d)", ev );
67 return buffer;
68 }
69
70 std::string str( static_cast<char const*>( lpMsgBuf ) );
71
72 while( !str.empty() && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
73 {
74 str.erase( str.size()-1 );
75 }
76
77 if( !str.empty() && str[str.size()-1] == '.' )
78 {
79 str.erase( str.size()-1 );
80 }
81
82 return str;
83}
84
85#else
86
87std::string sys_strerror( int ev )
88{
89 return std::strerror( errnum: ev );
90}
91
92#endif
93
94//
95
96namespace sys = boost::system;
97
98static void test_message( sys::error_category const & cat, int ev )
99{
100 BOOST_TEST_EQ( cat.message( ev ), sys_strerror( ev ) );
101
102 char buffer[ 4096 ]; // yes, really
103 BOOST_TEST_CSTR_EQ( cat.message( ev, buffer, sizeof( buffer ) ), sys_strerror( ev ).c_str() );
104}
105
106int main()
107{
108 sys::error_category const & cat = sys::system_category();
109
110 // message
111
112 for( int i = -2; i < 16000; ++i )
113 {
114 test_message( cat, ev: i );
115 }
116
117 return boost::report_errors();
118}
119
120#endif // #if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)
121

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