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); } }
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); } }
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); } }
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()); }