From a42d6ebcd7d91ec12becbec761358bd04c803908 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 6 Jun 2012 20:38:04 +0000 Subject: [PATCH] Reworked boost::algorithm::unhex error reporting to play nicer with Boost.Exception (thanks to Emil); added tests [SVN r78838] --- include/boost/algorithm/hex.hpp | 14 ++- test/Jamfile.v2 | 1 + test/hex_test4.cpp | 145 ++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 test/hex_test4.cpp diff --git a/include/boost/algorithm/hex.hpp b/include/boost/algorithm/hex.hpp index 9e566eb..3b9ff80 100644 --- a/include/boost/algorithm/hex.hpp +++ b/include/boost/algorithm/hex.hpp @@ -51,14 +51,10 @@ namespace boost { namespace algorithm { \brief Thrown when the input sequence unexpectedly ends */ -struct hex_decode_error: virtual boost::exception, virtual std::exception {}; -struct not_enough_input : public hex_decode_error {}; -struct non_hex_input : public hex_decode_error { - non_hex_input ( char ch ) : bad_char ( ch ) {} - char bad_char; -private: - non_hex_input (); // don't allow creation w/o a char - }; +struct hex_decode_error : virtual boost::exception, virtual std::exception {}; +struct not_enough_input : virtual hex_decode_error {}; +struct non_hex_input : virtual hex_decode_error {}; +typedef boost::error_info bad_char; namespace detail { /// \cond DOXYGEN_HIDE @@ -77,7 +73,7 @@ namespace detail { if ( c >= '0' && c <= '9' ) return c - '0'; if ( c >= 'A' && c <= 'F' ) return c - 'A' + 10; if ( c >= 'a' && c <= 'f' ) return c - 'a' + 10; - BOOST_THROW_EXCEPTION (non_hex_input (c)); + BOOST_THROW_EXCEPTION (non_hex_input() << boost::algorithm::bad_char (c)); return 0; // keep dumb compilers happy } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 7e9292d..eb4af0d 100755 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -43,6 +43,7 @@ import testing ; [ run hex_test1.cpp : : : : hex_test1 ] [ run hex_test2.cpp : : : : hex_test2 ] [ run hex_test3.cpp : : : : hex_test3 ] + [ run hex_test4.cpp : : : : hex_test4 ] [ compile-fail hex_fail1.cpp ] ; } diff --git a/test/hex_test4.cpp b/test/hex_test4.cpp new file mode 100644 index 0000000..7b22b64 --- /dev/null +++ b/test/hex_test4.cpp @@ -0,0 +1,145 @@ +/* + Copyright (c) Marshall Clow 2011-2012. + + 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) + + For more information, see http://www.boost.org + +Try ostream_iterators +*/ + +#include +#include +#include + +#include +#include + +namespace ba = boost::algorithm; + +void test_short_input1 () { + std::string s; + + try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); } + catch ( const std::exception &ex ) { return; } + BOOST_TEST_MESSAGE ( "Failed to catch std::exception in test_short_input1" ); + BOOST_CHECK ( false ); + } + +void test_short_input2 () { + std::string s; + + try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); } + catch ( const ba::hex_decode_error &ex ) { return; } + BOOST_TEST_MESSAGE ( "Failed to catch ba::hex_decode_error in test_short_input2" ); + BOOST_CHECK ( false ); + } + +void test_short_input3 () { + std::string s; + + try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); } + catch ( const ba::not_enough_input &ex ) { return; } + BOOST_TEST_MESSAGE ( "Failed to catch ba::not_enough_input in test_short_input3" ); + BOOST_CHECK ( false ); + } + +// Make sure that the right thing is thrown +void test_short_input4 () { + std::string s; + + try { ba::unhex ( std::string ( "A" ), std::back_inserter(s)); } + catch ( const ba::non_hex_input &ex ) { BOOST_CHECK ( false ); } + catch ( const ba::not_enough_input &ex ) { return; } + catch ( ... ) { BOOST_CHECK ( false ); } + BOOST_CHECK ( false ); + } + +void test_short_input () { +// BOOST_TEST_MESSAGE ( "Short input tests for boost::algorithm::unhex" ); + test_short_input1 (); + test_short_input2 (); + test_short_input3 (); + test_short_input4 (); + } + + +void test_nonhex_input1 () { + std::string s; + + try { ba::unhex ( "01234FG1234", std::back_inserter(s)); } + catch ( const std::exception &ex ) { + BOOST_CHECK ( 'G' == *boost::get_error_info(ex)); + return; + } + BOOST_TEST_MESSAGE ( "Failed to catch std::exception in test_nonhex_input1" ); + BOOST_CHECK ( false ); + } + +void test_nonhex_input2 () { + std::string s; + + try { ba::unhex ( "012Z4FA1234", std::back_inserter(s)); } + catch ( const ba::hex_decode_error &ex ) { + BOOST_CHECK ( 'Z' == *boost::get_error_info(ex)); + return; + } + BOOST_TEST_MESSAGE ( "Failed to catch ba::hex_decode_error in test_nonhex_input2" ); + BOOST_CHECK ( false ); + } + +void test_nonhex_input3 () { + std::string s; + + try { ba::unhex ( "01234FA12Q4", std::back_inserter(s)); } + catch ( const ba::non_hex_input &ex ) { + BOOST_CHECK ( 'Q' == *boost::get_error_info(ex)); + return; + } + BOOST_TEST_MESSAGE ( "Failed to catch ba::non_hex_input in test_nonhex_input3" ); + BOOST_CHECK ( false ); + } + +// Make sure that the right thing is thrown +void test_nonhex_input4 () { + std::string s; + + try { ba::unhex ( "P1234FA1234", std::back_inserter(s)); } + catch ( const ba::not_enough_input &ex ) { BOOST_CHECK ( false ); } + catch ( const ba::non_hex_input &ex ) { return; } + catch ( ... ) { BOOST_CHECK ( false ); } + BOOST_CHECK ( false ); + } + +// Make sure that the right thing is thrown +void test_nonhex_input5 () { + std::string s; + + try { ba::unhex ( "012", std::back_inserter(s)); } + catch ( const ba::non_hex_input &ex ) { + BOOST_CHECK ( '\000' == *boost::get_error_info(ex)); + return; + } + BOOST_TEST_MESSAGE ( "Failed to catch ba::non_hex_input in test_nonhex_input4" ); + BOOST_CHECK ( false ); + } + +void test_nonhex_input () { +// BOOST_TEST_MESSAGE ( "Non hex input tests for for boost::algorithm::unhex" ); + test_nonhex_input1 (); + test_nonhex_input2 (); + test_nonhex_input3 (); + test_nonhex_input4 (); + test_nonhex_input5 (); + } + + + +int test_main( int , char* [] ) +{ + test_short_input (); + test_nonhex_input (); + + return 0; +}