blob: 5ae7fc89eb7232f72155b36ae09d77a844e7a4c8 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "unit_test.h"
#include "qpid/types/Variant.h"
#include "qpid/amqp_0_10/Codecs.h"
#include <boost/assign.hpp>
#include <iostream>
using namespace qpid::types;
using namespace qpid::amqp_0_10;
using boost::assign::list_of;
namespace qpid {
namespace tests {
QPID_AUTO_TEST_SUITE(VariantSuite)
QPID_AUTO_TEST_CASE(testConversions)
{
Variant value;
//string to float/double
value = "1.5";
BOOST_CHECK_EQUAL((float) 1.5, value.asFloat());
BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
//float to string or double
value = 1.5f;
BOOST_CHECK_EQUAL((float) 1.5, value.asFloat());
BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
BOOST_CHECK_EQUAL(std::string("1.5"), value.asString());
//double to string (conversion to float not valid)
value = 1.5;
BOOST_CHECK_THROW(value.asFloat(), InvalidConversion);
BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
BOOST_CHECK_EQUAL(std::string("1.5"), value.asString());
//uint8 to larger unsigned ints and string
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(std::string("7"), value.asString());
value = (uint16_t) 8;
BOOST_CHECK_EQUAL(std::string("8"), value.asString());
value = (uint32_t) 9;
BOOST_CHECK_EQUAL(std::string("9"), value.asString());
//uint32 to larger unsigned ints and string
value = (uint32_t) 9999999;
BOOST_CHECK_EQUAL((uint32_t) 9999999, value.asUint32());
BOOST_CHECK_EQUAL((uint64_t) 9999999, value.asUint64());
BOOST_CHECK_EQUAL(std::string("9999999"), value.asString());
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
value = "true";
BOOST_CHECK(value.asBool());
value = "false";
BOOST_CHECK(!value.asBool());
value = "1";
BOOST_CHECK(value.asBool());
value = "0";
BOOST_CHECK(!value.asBool());
value = "other";
BOOST_CHECK_THROW(value.asBool(), InvalidConversion);
}
QPID_AUTO_TEST_CASE(testConversionsFromString)
{
Variant value;
value = "5";
BOOST_CHECK_EQUAL(5, value.asInt16());
BOOST_CHECK_EQUAL(5u, value.asUint16());
value = "-5";
BOOST_CHECK_EQUAL(-5, value.asInt16());
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
value = "18446744073709551615";
BOOST_CHECK_EQUAL(18446744073709551615ull, value.asUint64());
BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
value = "9223372036854775808";
BOOST_CHECK_EQUAL(9223372036854775808ull, value.asUint64());
BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
value = "-9223372036854775809";
BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
value = "2147483648";
BOOST_CHECK_EQUAL(2147483648ul, value.asUint32());
BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
value = "-2147483649";
BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
value = "32768";
BOOST_CHECK_EQUAL(32768u, value.asUint16());
BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
value = "-32769";
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
value = "-2.5";
BOOST_CHECK_EQUAL(-2.5, value.asFloat());
value = "-0.875432e10";
BOOST_CHECK_EQUAL(-0.875432e10, value.asDouble());
value = "-0";
BOOST_CHECK_EQUAL(0, value.asInt16());
BOOST_CHECK_EQUAL(0u, value.asUint16());
value = "-Blah";
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
BOOST_CHECK_THROW(value.asFloat(), InvalidConversion);
BOOST_CHECK_THROW(value.asDouble(), InvalidConversion);
value = "-000";
BOOST_CHECK_EQUAL(0, value.asInt16());
BOOST_CHECK_EQUAL(0u, value.asUint16());
value = "-0010";
BOOST_CHECK_EQUAL(-10, value.asInt16());
BOOST_CHECK_THROW(value.asUint16(), 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) 3000000000ul;
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_EQUAL((uint32_t) 3000000000ul, value.asUint32());
BOOST_CHECK_EQUAL((uint64_t) 3000000000ul, 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) 3000000000ul, value.asInt64());
//uint64 (more than 32 bits) to other uints, ints
value = (uint64_t) 7000000000ull;
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
BOOST_CHECK_EQUAL((uint64_t) 7000000000ull, 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) 7000000000ull, value.asInt64());
//uint64 (more than 63 bits) to other uints, ints
value = (uint64_t) 0x8000000000000000ull;
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
BOOST_CHECK_EQUAL((uint64_t) 0x8000000000000000ull, 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) 3000000000ll;
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_EQUAL((uint32_t) 3000000000ll, value.asUint32());
BOOST_CHECK_EQUAL((uint64_t) 3000000000ll, 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) 3000000000ll, value.asInt64());
//int64 (positive in more than 32 bits)
value = (int64_t) 5000000000ll;
BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
BOOST_CHECK_EQUAL((uint64_t) 5000000000ll, 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) 5000000000ll, 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) -3000000000ll;
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) -3000000000ll, value.asInt64());
}
QPID_AUTO_TEST_CASE(testAssignment)
{
Variant value("abc");
Variant other = value;
BOOST_CHECK_EQUAL(VAR_STRING, value.getType());
BOOST_CHECK_EQUAL(other.getType(), value.getType());
BOOST_CHECK_EQUAL(other.asString(), value.asString());
const uint32_t i(1000);
value = i;
BOOST_CHECK_EQUAL(VAR_UINT32, value.getType());
BOOST_CHECK_EQUAL(VAR_STRING, other.getType());
}
QPID_AUTO_TEST_CASE(testList)
{
const std::string s("abc");
const float f(9.876f);
const int16_t x(1000);
Variant value = Variant::List();
value.asList().push_back(Variant(s));
value.asList().push_back(Variant(f));
value.asList().push_back(Variant(x));
BOOST_CHECK_EQUAL(3u, value.asList().size());
Variant::List::const_iterator i = value.asList().begin();
BOOST_CHECK(i != value.asList().end());
BOOST_CHECK_EQUAL(VAR_STRING, i->getType());
BOOST_CHECK_EQUAL(s, i->asString());
i++;
BOOST_CHECK(i != value.asList().end());
BOOST_CHECK_EQUAL(VAR_FLOAT, i->getType());
BOOST_CHECK_EQUAL(f, i->asFloat());
i++;
BOOST_CHECK(i != value.asList().end());
BOOST_CHECK_EQUAL(VAR_INT16, i->getType());
BOOST_CHECK_EQUAL(x, i->asInt16());
i++;
BOOST_CHECK(i == value.asList().end());
}
QPID_AUTO_TEST_CASE(testMap)
{
const std::string red("red");
const float pi(3.14f);
const int16_t x(1000);
const Uuid u(true);
Variant value = Variant::Map();
value.asMap()["colour"] = red;
value.asMap()["pi"] = pi;
value.asMap()["my-key"] = x;
value.asMap()["id"] = u;
BOOST_CHECK_EQUAL(4u, value.asMap().size());
BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["colour"].getType());
BOOST_CHECK_EQUAL(red, value.asMap()["colour"].asString());
BOOST_CHECK_EQUAL(VAR_FLOAT, value.asMap()["pi"].getType());
BOOST_CHECK_EQUAL(pi, value.asMap()["pi"].asFloat());
BOOST_CHECK_EQUAL(VAR_INT16, value.asMap()["my-key"].getType());
BOOST_CHECK_EQUAL(x, value.asMap()["my-key"].asInt16());
BOOST_CHECK_EQUAL(VAR_UUID, value.asMap()["id"].getType());
BOOST_CHECK_EQUAL(u, value.asMap()["id"].asUuid());
value.asMap()["my-key"] = "now it's a string";
BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["my-key"].getType());
BOOST_CHECK_EQUAL(std::string("now it's a string"), value.asMap()["my-key"].asString());
}
QPID_AUTO_TEST_CASE(testIsEqualTo)
{
BOOST_CHECK_EQUAL(Variant("abc"), Variant("abc"));
BOOST_CHECK_EQUAL(Variant(1234), Variant(1234));
Variant a = Variant::Map();
a.asMap()["colour"] = "red";
a.asMap()["pi"] = 3.14f;
a.asMap()["my-key"] = 1234;
Variant b = Variant::Map();
b.asMap()["colour"] = "red";
b.asMap()["pi"] = 3.14f;
b.asMap()["my-key"] = 1234;
BOOST_CHECK_EQUAL(a, b);
}
QPID_AUTO_TEST_CASE(testEncoding)
{
Variant a("abc");
a.setEncoding("utf8");
Variant b = a;
Variant map = Variant::Map();
map.asMap()["a"] = a;
map.asMap()["b"] = b;
BOOST_CHECK_EQUAL(a.getEncoding(), std::string("utf8"));
BOOST_CHECK_EQUAL(a.getEncoding(), b.getEncoding());
BOOST_CHECK_EQUAL(a.getEncoding(), map.asMap()["a"].getEncoding());
BOOST_CHECK_EQUAL(b.getEncoding(), map.asMap()["b"].getEncoding());
BOOST_CHECK_EQUAL(map.asMap()["a"].getEncoding(), map.asMap()["b"].getEncoding());
}
QPID_AUTO_TEST_CASE(testBufferEncoding)
{
Variant a("abc");
a.setEncoding("utf8");
std::string buffer;
Variant::Map inMap, outMap;
inMap["a"] = a;
MapCodec::encode(inMap, buffer);
MapCodec::decode(buffer, outMap);
BOOST_CHECK_EQUAL(inMap, outMap);
inMap["b"] = Variant(std::string(65535, 'X'));
inMap["b"].setEncoding("utf16");
MapCodec::encode(inMap, buffer);
MapCodec::decode(buffer, outMap);
BOOST_CHECK_EQUAL(inMap, outMap);
inMap["fail"] = Variant(std::string(65536, 'X'));
inMap["fail"].setEncoding("utf16");
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_CASE(described)
{
Variant a;
BOOST_CHECK(!a.isDescribed());
a.getDescriptors().push_back("foo");
BOOST_CHECK(a.isDescribed());
BOOST_CHECK_EQUAL(a.getDescriptors().size(), 1U);
BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo"));
a = 42;
BOOST_CHECK(a.isDescribed());
BOOST_CHECK_EQUAL(a.getDescriptors().size(), 1U);
BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo"));
a.getDescriptors().push_back(33);
BOOST_CHECK_EQUAL(a.getDescriptors().size(), 2U);
BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo"));
BOOST_CHECK_EQUAL(*(++a.getDescriptors().begin()), Variant(33));
a.getDescriptors().clear();
BOOST_CHECK(!a.isDescribed());
}
QPID_AUTO_TEST_SUITE_END()
}} // namespace qpid::tests