system_category_test.cpp 2.3 KB

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