diff options
-rw-r--r-- | qpid/cpp/src/qpid/types/Variant.cpp | 5 | ||||
-rw-r--r-- | qpid/cpp/src/tests/Variant.cpp | 27 |
2 files changed, 31 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/types/Variant.cpp b/qpid/cpp/src/qpid/types/Variant.cpp index 8c9837e765..7a5f36851a 100644 --- a/qpid/cpp/src/qpid/types/Variant.cpp +++ b/qpid/cpp/src/qpid/types/Variant.cpp @@ -122,7 +122,7 @@ class VariantImpl } else { T r = boost::lexical_cast<T>(s.substr(1)); if (std::numeric_limits<T>::is_signed) { - return -r; + return -r; } else { if (r==0) return 0; } @@ -804,6 +804,9 @@ Variant& Variant::parse(const std::string& s) return operator=(asInt64()); } catch (const InvalidConversion&) {} try { + return operator=(asUint64()); + } catch (const InvalidConversion&) {} + try { return operator=(asDouble()); } catch (const InvalidConversion&) {} try { diff --git a/qpid/cpp/src/tests/Variant.cpp b/qpid/cpp/src/tests/Variant.cpp index 6d629bbb4a..d2394bfbad 100644 --- a/qpid/cpp/src/tests/Variant.cpp +++ b/qpid/cpp/src/tests/Variant.cpp @@ -780,6 +780,33 @@ QPID_AUTO_TEST_CASE(testBufferEncoding) BOOST_CHECK_THROW(MapCodec::encode(inMap, buffer), std::exception); } +QPID_AUTO_TEST_CASE(parse) +{ + Variant a; + a.parse("What a fine mess"); + BOOST_CHECK(a.getType()==types::VAR_STRING); + a.parse("true"); + BOOST_CHECK(a.getType()==types::VAR_BOOL); + a.parse("FalsE"); + BOOST_CHECK(a.getType()==types::VAR_BOOL); + a.parse("3.1415926"); + BOOST_CHECK(a.getType()==types::VAR_DOUBLE); + a.parse("-7.2e-15"); + BOOST_CHECK(a.getType()==types::VAR_DOUBLE); + a.parse("9223372036854775807"); + BOOST_CHECK(a.getType()==types::VAR_INT64); + a.parse("9223372036854775808"); + BOOST_CHECK(a.getType()==types::VAR_UINT64); + a.parse("-9223372036854775807"); + BOOST_CHECK(a.getType()==types::VAR_INT64); + a.parse("-9223372036854775808"); + BOOST_CHECK(a.getType()==types::VAR_DOUBLE); + a.parse("18446744073709551615"); + BOOST_CHECK(a.getType()==types::VAR_UINT64); + a.parse("18446744073709551616"); + BOOST_CHECK(a.getType()==types::VAR_DOUBLE); +} + QPID_AUTO_TEST_SUITE_END() }} // namespace qpid::tests |