Пример #1
0
void TranscodingTest(uint16_t version = bond::v1)
{
    T from = InitRandom<T>();
    typename Writer::Buffer output_buffer;

    Factory<Writer>::Call(output_buffer, version, boost::bind(
        bond::Marshal<bond::BuiltInProtocols, T, Writer>, from, _1));
    
    // Trans-marshal to Simple Protocol using runtime schema
    bond::OutputBuffer simple_buffer;
    bond::SimpleBinaryWriter<bond::OutputBuffer> simple_writer(simple_buffer, Writer::Reader::version);

    {
        bond::InputBuffer input(output_buffer.GetBuffer());
        bond::ProtocolType proto = bond::SelectProtocolAndApply(bond::GetRuntimeSchema<T>(), input, bond::MarshalTo(simple_writer)).first;

        UT_AssertAreEqual(proto, Writer::Reader::magic);
    }

    {
        // Trans-marshal back to Writer using compile-time schema
        typename Writer::Buffer writer_buffer;

        {
            bond::InputBuffer input(simple_buffer.GetBuffer());
	    Factory<Writer>::Call(writer_buffer, version, boost::bind(
                 bond::SelectProtocolAndApply<T, bond::BuiltInProtocols, bond::InputBuffer, bond::Marshaler<Writer> >, input, boost::bind(bond::MarshalTo<bond::BuiltInProtocols, Writer>, _1)));
        }

        T to;

        bond::InputBuffer input(writer_buffer.GetBuffer());
        Unmarshal(input, to);

        UT_Compare(from, to);
    }

    {
        // Trans-marshal back to Writer using runtime schema
        typename Writer::Buffer writer_buffer;

        {
            bond::InputBuffer input(simple_buffer.GetBuffer());
	    Factory<Writer>::Call(writer_buffer, version, boost::bind(
                 bond::SelectProtocolAndApply<bond::BuiltInProtocols, bond::InputBuffer, bond::Marshaler<Writer> >, bond::GetRuntimeSchema<T>(), input, boost::bind(bond::MarshalTo<bond::BuiltInProtocols, Writer>, _1)));
        }

        T to;

        bond::InputBuffer input(writer_buffer.GetBuffer());
        Unmarshal(input, to);

        UT_Compare(from, to);
    }
}
Пример #2
0
    void operator()(const T&)
    {
        typename Writer::Buffer output_buffer;
        Writer output(output_buffer);

        for(uint16_t i = 0; i < USHRT_MAX/2; ++i)
        {
            output.WriteFieldBegin(bond::get_type_id<T>::value, i);
        }

        for(uint16_t i = USHRT_MAX; i >= USHRT_MAX/2; i -= 3)
        {
            output.WriteFieldBegin(bond::get_type_id<T>::value, i);
        }

        typename Reader::Buffer input_buffer(output_buffer.GetBuffer());
        Reader input(input_buffer);
        uint16_t id;
        bond::BondDataType type;

        for(uint16_t i = 0; i < USHRT_MAX/2; ++i)
        {
            input.ReadFieldBegin(type, id);

            UT_AssertAreEqual(bond::get_type_id<T>::value, type);
            UT_AssertAreEqual(i, id);
        }

        for(uint16_t i = USHRT_MAX; i >= USHRT_MAX/2; i -= 3)
        {
            input.ReadFieldBegin(type, id);

            UT_AssertAreEqual(bond::get_type_id<T>::value, type);
            UT_AssertAreEqual(i, id);
        }
    }
Пример #3
0
void TestEncodingInteger()
{
    typename Writer::Buffer output_buffer;
    Writer output(output_buffer);

    for(uint64_t i = 0; i <= typename boost::make_unsigned<T>::type(-1); ++i)
    {
        output.Write(T(i));
    }

    typename Reader::Buffer input_buffer(output_buffer.GetBuffer());
    Reader input(input_buffer);

    for(uint64_t i = 0; i <= typename boost::make_unsigned<T>::type(-1); ++i)
    {
        T value;

        input.Read(value);

        UT_AssertAreEqual(T(i), value);
    }
}
Пример #4
0
void TestReadStruct(Writer& output, Buffer& output_buffer, uint16_t val0, int64_t val1)
{
    output.WriteStructBegin(bond::Metadata(), false);
    output.WriteFieldBegin(bond::BT_UINT16, 0);
    output.Write(val0);
    output.WriteFieldEnd();

    output.WriteFieldBegin(bond::BT_INT64, 1);
    output.Write(val1);
    output.WriteFieldEnd();
    output.WriteStructEnd();

    // read from output, using CB version 2
    typename Reader::Buffer input_buffer(output_buffer.GetBuffer());
    Reader input(input_buffer, 2);
    uint16_t id;
    bond::BondDataType type;
    uint16_t value0;
    int64_t value1;

    input.ReadStructBegin();
    input.ReadFieldBegin(type, id);
    input.Read(value0);
    input.ReadFieldEnd();
    UT_AssertAreEqual(type, bond::BT_UINT16);
    UT_AssertAreEqual(id, 0);
    UT_AssertAreEqual(val0, value0);

    input.ReadFieldBegin(type, id);
    input.Read(value1);
    input.ReadFieldEnd();
    input.ReadStructEnd();
    UT_AssertAreEqual(type, bond::BT_INT64);
    UT_AssertAreEqual(id, 1);
    UT_AssertAreEqual(val1, value1);

    // test skipping struct, using CB version 2
    typename Reader::Buffer input_buffer2(output_buffer.GetBuffer());
    Reader input2(input_buffer2, 2);   

    input2.Skip(bond::BT_STRUCT);
    UT_AssertIsTrue(input2.GetBuffer().IsEof());
}