diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/types/Variant.cpp | 162 | ||||
-rw-r--r-- | cpp/src/tests/Variant.cpp | 497 |
2 files changed, 651 insertions, 8 deletions
diff --git a/cpp/src/qpid/types/Variant.cpp b/cpp/src/qpid/types/Variant.cpp index 1457449b4f..e43b9997f3 100644 --- a/cpp/src/qpid/types/Variant.cpp +++ b/cpp/src/qpid/types/Variant.cpp @@ -216,10 +216,35 @@ uint8_t VariantImpl::asUint8() const { switch(type) { case VAR_UINT8: return value.ui8; - case VAR_STRING: return convertFromString<uint8_t>(); + case VAR_UINT16: + if (value.ui16 <= 0x00ff) + return uint8_t(value.ui16); + break; + case VAR_UINT32: + if (value.ui32 <= 0x000000ff) + return uint8_t(value.ui32); + break; + case VAR_UINT64: + if (value.ui64 <= 0x00000000000000ff) + return uint8_t(value.ui64); + break; + case VAR_INT8: + if (value.i8 >= 0) + return uint8_t(value.i8); + break; + case VAR_INT16: + if (value.i16 >= 0 && value.i16 <= 0x00ff) + return uint8_t(value.i16); + break; + case VAR_INT32: + if (value.i32 >= 0 && value.i32 <= 0x000000ff) + return uint8_t(value.i32); + break; case VAR_INT64: if (value.i64 >= 0 && value.i64 <= 0x00000000000000ff) return uint8_t(value.i64); + break; + case VAR_STRING: return convertFromString<uint8_t>(); default: break; } throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_UINT8))); @@ -229,9 +254,30 @@ uint16_t VariantImpl::asUint16() const switch(type) { case VAR_UINT8: return value.ui8; case VAR_UINT16: return value.ui16; + case VAR_UINT32: + if (value.ui32 <= 0x0000ffff) + return uint16_t(value.ui32); + break; + case VAR_UINT64: + if (value.ui64 <= 0x000000000000ffff) + return uint16_t(value.ui64); + break; + case VAR_INT8: + if (value.i8 >= 0) + return uint16_t(value.i8); + break; + case VAR_INT16: + if (value.i16 >= 0) + return uint16_t(value.i16); + break; + case VAR_INT32: + if (value.i32 >= 0 && value.i32 <= 0x0000ffff) + return uint16_t(value.i32); + break; case VAR_INT64: if (value.i64 >= 0 && value.i64 <= 0x000000000000ffff) return uint16_t(value.i64); + break; case VAR_STRING: return convertFromString<uint16_t>(); default: break; } @@ -243,9 +289,26 @@ uint32_t VariantImpl::asUint32() const case VAR_UINT8: return value.ui8; case VAR_UINT16: return value.ui16; case VAR_UINT32: return value.ui32; + case VAR_UINT64: + if (value.ui64 <= 0x00000000ffffffff) + return uint32_t(value.ui64); + break; + case VAR_INT8: + if (value.i8 >= 0) + return uint32_t(value.i8); + break; + case VAR_INT16: + if (value.i16 >= 0) + return uint32_t(value.i16); + break; + case VAR_INT32: + if (value.i32 >= 0) + return uint32_t(value.i32); + break; case VAR_INT64: if (value.i64 >= 0 && value.i64 <= 0x00000000ffffffff) return uint32_t(value.i64); + break; case VAR_STRING: return convertFromString<uint32_t>(); default: break; } @@ -258,17 +321,67 @@ uint64_t VariantImpl::asUint64() const case VAR_UINT16: return value.ui16; case VAR_UINT32: return value.ui32; case VAR_UINT64: return value.ui64; + case VAR_INT8: + if (value.i8 >= 0) + return uint64_t(value.i8); + break; + case VAR_INT16: + if (value.i16 >= 0) + return uint64_t(value.i16); + break; + case VAR_INT32: + if (value.i32 >= 0) + return uint64_t(value.i32); + break; + case VAR_INT64: + if (value.i64 >= 0) + return uint64_t(value.i64); + break; case VAR_STRING: return convertFromString<uint64_t>(); - default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_UINT64))); + default: break; } + throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_UINT64))); } + +#define I8_MIN -128 +#define I8_MAX 127 +#define I16_MIN -32768 +#define I16_MAX 32767 +#define I32_MIN -2147483648 +#define I32_MAX 2147483647 + int8_t VariantImpl::asInt8() const { switch(type) { case VAR_INT8: return value.i8; + case VAR_INT16: + if ((value.i16 >= I8_MIN) && (value.i16 <= I8_MAX)) + return int8_t(value.i16); + break; + case VAR_INT32: + if ((value.i32 >= I8_MIN) && (value.i32 <= I8_MAX)) + return int8_t(value.i32); + break; case VAR_INT64: - if (value.i64 <= 0x000000000000007f) + if ((value.i64 >= I8_MIN) && (value.i64 <= I8_MAX)) return int8_t(value.i64); + break; + case VAR_UINT8: + if (value.ui8 <= I8_MAX) + return int8_t(value.ui8); + break; + case VAR_UINT16: + if (value.ui16 <= I8_MAX) + return int8_t(value.ui16); + break; + case VAR_UINT32: + if (value.ui32 <= I8_MAX) + return int8_t(value.ui32); + break; + case VAR_UINT64: + if (value.ui64 <= I8_MAX) + return int8_t(value.ui64); + break; case VAR_STRING: return convertFromString<int8_t>(); default: break; } @@ -279,9 +392,27 @@ int16_t VariantImpl::asInt16() const switch(type) { case VAR_INT8: return value.i8; case VAR_INT16: return value.i16; + case VAR_INT32: + if ((value.i32 >= I16_MIN) && (value.i32 <= I16_MAX)) + return int16_t(value.i32); + break; case VAR_INT64: - if (value.i64 <= 0x0000000000007fff) + if ((value.i64 >= I16_MIN) && (value.i64 <= I16_MAX)) return int16_t(value.i64); + break; + case VAR_UINT8: return int16_t(value.ui8); + case VAR_UINT16: + if (value.ui16 <= I16_MAX) + return int16_t(value.ui16); + break; + case VAR_UINT32: + if (value.ui32 <= I16_MAX) + return int16_t(value.ui32); + break; + case VAR_UINT64: + if (value.ui64 <= I16_MAX) + return int16_t(value.ui64); + break; case VAR_STRING: return convertFromString<int16_t>(); default: break; } @@ -294,8 +425,19 @@ int32_t VariantImpl::asInt32() const case VAR_INT16: return value.i16; case VAR_INT32: return value.i32; case VAR_INT64: - if (value.i64 <= 0x000000007fffffff) + if ((value.i64 >= I32_MIN) && (value.i64 <= I32_MAX)) return int32_t(value.i64); + break; + case VAR_UINT8: return int32_t(value.ui8); + case VAR_UINT16: return int32_t(value.ui16); + case VAR_UINT32: + if (value.ui32 <= I32_MAX) + return int32_t(value.ui32); + break; + case VAR_UINT64: + if (value.ui64 <= I32_MAX) + return int32_t(value.ui64); + break; case VAR_STRING: return convertFromString<int32_t>(); default: break; } @@ -308,9 +450,17 @@ int64_t VariantImpl::asInt64() const case VAR_INT16: return value.i16; case VAR_INT32: return value.i32; case VAR_INT64: return value.i64; + case VAR_UINT8: return int64_t(value.ui8); + case VAR_UINT16: return int64_t(value.ui16); + case VAR_UINT32: return int64_t(value.ui32); + case VAR_UINT64: + if (value.ui64 <= 0x7fffffffffffffff) + return int64_t(value.ui64); + break; case VAR_STRING: return convertFromString<int64_t>(); - default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_INT64))); + default: break; } + throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_INT64))); } float VariantImpl::asFloat() const { diff --git a/cpp/src/tests/Variant.cpp b/cpp/src/tests/Variant.cpp index 0d456bc493..17ec997928 100644 --- a/cpp/src/tests/Variant.cpp +++ b/cpp/src/tests/Variant.cpp @@ -58,7 +58,6 @@ QPID_AUTO_TEST_CASE(testConversions) BOOST_CHECK_EQUAL((uint32_t) 7, value.asUint32()); BOOST_CHECK_EQUAL((uint64_t) 7, value.asUint64()); BOOST_CHECK_EQUAL(std::string("7"), value.asString()); - BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); value = (uint16_t) 8; BOOST_CHECK_EQUAL(std::string("8"), value.asString()); @@ -72,7 +71,6 @@ QPID_AUTO_TEST_CASE(testConversions) BOOST_CHECK_EQUAL(std::string("9999999"), value.asString()); BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); - BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); value = "true"; BOOST_CHECK(value.asBool()); @@ -86,6 +84,501 @@ QPID_AUTO_TEST_CASE(testConversions) BOOST_CHECK_THROW(value.asBool(), InvalidConversion); } +QPID_AUTO_TEST_CASE(testSizeConversionsUint) +{ + Variant value; + + //uint8 (in 7 bits) to other uints, ints + value = (uint8_t) 7; + BOOST_CHECK_EQUAL((uint8_t) 7, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 7, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 7, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 7, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 7, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 7, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 7, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 7, value.asInt64()); + + //uint8 (in 8 bits) to other uints, ints + value = (uint8_t) 200; + BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64()); + + + + //uint16 (in 7 bits) to other uints, ints + value = (uint16_t) 120; + BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64()); + + //uint16 (more than 7 bits) to other uints, ints + value = (uint16_t) 240; + BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64()); + + //uint16 (more than 8 bits) to other uints, ints + value = (uint16_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //uint16 (more than 15 bits) to other uints, ints + value = (uint16_t) 32770; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64()); + + + + //uint32 (in 7 bits) to other uints, ints + value = (uint32_t) 120; + BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64()); + + //uint32 (more than 7 bits) to other uints, ints + value = (uint32_t) 240; + BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64()); + + //uint32 (more than 8 bits) to other uints, ints + value = (uint32_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //uint32 (more than 15 bits) to other uints, ints + value = (uint32_t) 32770; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64()); + + //uint32 (more than 16 bits) to other uints, ints + value = (uint32_t) 66000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_EQUAL((uint32_t) 66000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 66000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 66000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 66000, value.asInt64()); + + + + //uint64 (in 7 bits) to other uints, ints + value = (uint64_t) 120; + BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64()); + + //uint64 (more than 7 bits) to other uints, ints + value = (uint64_t) 240; + BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64()); + + //uint64 (more than 8 bits) to other uints, ints + value = (uint64_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //uint64 (more than 15 bits) to other uints, ints + value = (uint64_t) 32770; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64()); + + //uint64 (more than 16 bits) to other uints, ints + value = (uint64_t) 66000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_EQUAL((uint32_t) 66000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 66000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 66000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 66000, value.asInt64()); + + //uint64 (more than 31 bits) to other uints, ints + value = (uint64_t) 3000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_EQUAL((uint32_t) 3000000000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 3000000000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_EQUAL((int64_t) 3000000000, value.asInt64()); + + //uint64 (more than 32 bits) to other uints, ints + value = (uint64_t) 7000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_EQUAL((uint64_t) 7000000000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_EQUAL((int64_t) 7000000000, value.asInt64()); + + //uint64 (more than 63 bits) to other uints, ints + value = (uint64_t) 0x8000000000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_EQUAL((uint64_t) 0x8000000000000000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt64(), InvalidConversion); +} + +QPID_AUTO_TEST_CASE(testSizeConversionsInt) +{ + Variant value; + + //int8 (positive in 7 bits) + value = (int8_t) 100; + BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64()); + + //int8 (negative) + value = (int8_t) -100; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64()); + + + + //int16 (positive in 7 bits) + value = (int16_t) 100; + BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64()); + + //int16 (positive in 8 bits) + value = (int16_t) 200; + BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64()); + + //int16 (positive in more than 8 bits) + value = (int16_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //int16 (negative in 7 bits) + value = (int16_t) -100; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64()); + + //int16 (negative in more than 7 bits) + value = (int16_t) -1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64()); + + + + //int32 (positive in 7 bits) + value = (int32_t) 100; + BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64()); + + //int32 (positive in 8 bits) + value = (int32_t) 200; + BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64()); + + //int32 (positive in more than 8 bits) + value = (int32_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //int32 (positive in more than 15 bits) + value = (int32_t) 40000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 40000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 40000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 40000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 40000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 40000, value.asInt64()); + + //int32 (negative in 7 bits) + value = (int32_t) -100; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64()); + + //int32 (negative in more than 7 bits) + value = (int32_t) -1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64()); + + //int32 (negative in more than 15 bits) + value = (int32_t) -40000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) -40000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -40000, value.asInt64()); + + + + //int64 (positive in 7 bits) + value = (int64_t) 100; + BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64()); + BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64()); + + //int64 (positive in 8 bits) + value = (int64_t) 200; + BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8()); + BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64()); + + //int64 (positive in more than 8 bits) + value = (int64_t) 1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64()); + + //int64 (positive in more than 15 bits) + value = (int64_t) 40000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_EQUAL((uint16_t) 40000, value.asUint16()); + BOOST_CHECK_EQUAL((uint32_t) 40000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 40000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) 40000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) 40000, value.asInt64()); + + //int64 (positive in more than 31 bits) + value = (int64_t) 3000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_EQUAL((uint32_t) 3000000000, value.asUint32()); + BOOST_CHECK_EQUAL((uint64_t) 3000000000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_EQUAL((int64_t) 3000000000, value.asInt64()); + + //int64 (positive in more than 32 bits) + value = (int64_t) 5000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_EQUAL((uint64_t) 5000000000, value.asUint64()); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_EQUAL((int64_t) 5000000000, value.asInt64()); + + //int64 (negative in 7 bits) + value = (int64_t) -100; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8()); + BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64()); + + //int64 (negative in more than 7 bits) + value = (int64_t) -1000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16()); + BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64()); + + //int64 (negative in more than 15 bits) + value = (int64_t) -40000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_EQUAL((int32_t) -40000, value.asInt32()); + BOOST_CHECK_EQUAL((int64_t) -40000, value.asInt64()); + + //int64 (negative in more than 31 bits) + value = (int64_t) -3000000000; + BOOST_CHECK_THROW(value.asUint8(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); + BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt8(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); + BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); + BOOST_CHECK_EQUAL((int64_t) -3000000000, value.asInt64()); +} + QPID_AUTO_TEST_CASE(testAssignment) { Variant value("abc"); |