summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qpid/cpp/src/qpid/types/Variant.cpp5
-rw-r--r--qpid/cpp/src/tests/Variant.cpp27
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