#include #include "../c++/data.hpp" #include "../c++/simple.hpp" #include "../c++/transport.hpp" #include namespace { namespace schema { using namespace saw::schema; using ZeroDimArray = Array; using OneDimArray = Array; using TwoDimArray = Array; using ThreeDimArray = Array; using TestStruct = Struct< Member, Member >; } SAW_TEST("Transport FixedLen Struct write and slice"){ using namespace saw; ring_buffer buff{2048u}; data native; data simple; { auto& tda = native.template get<"two_dim_array">(); tda = {1,2}; tda.at(0,0).set(5); tda.at(0,1).set(3); native.template get<"number">().set(410); } codec codec; { auto eov = codec.encode(native, simple); SAW_EXPECT(eov.is_value(), "Encoding error."); } { auto& rd_buff = simple.get_buffer(); { auto eov = stream_value::encode(rd_buff.read_composite_length(), buff); SAW_EXPECT(eov.is_value(), "Buffer first write length error."); } { auto eov = buff.write_from(rd_buff); SAW_EXPECT(eov.is_value(), "Buffer copy error."); auto& val = eov.get_value(); rd_buff.read_advance(val); buff.write_advance(val); } } // Reset values native = {}; simple = {}; { auto& tda = native.template get<"two_dim_array">(); tda = {1,2}; tda.at(0,0).set(2); tda.at(0,1).set(4); native.template get<"number">().set(709); } { auto eov = codec.encode(native, simple); SAW_EXPECT(eov.is_value(), "Encoding error on second try."); } { auto& rd_buff = simple.get_buffer(); { auto eov = stream_value::encode(rd_buff.read_composite_length(), buff); SAW_EXPECT(eov.is_value(), "Buffer second write length error."); } { auto eov = buff.write_from(rd_buff); SAW_EXPECT(eov.is_value(), "Buffer copy error."); auto& val = eov.get_value(); rd_buff.read_advance(val); buff.write_advance(val); } } transport> trans; { auto eo_slice = trans.view_slice(buff); SAW_EXPECT(eo_slice.is_value(), "Buffer third write length error."); auto& slice = eo_slice.get_value(); auto arr_buff = heap(1024u); { auto eov = arr_buff->write_from(slice); SAW_EXPECT(eov.is_value(), "Failed to copy buffer."); auto& len_val = eov.get_value(); slice.read_advance(len_val); buff.read_advance(len_val); arr_buff->write_advance(len_val); } data simple_slice{std::move(arr_buff)}; native = {}; auto eov = codec.decode(simple_slice, native); SAW_EXPECT(eov.is_value(), "Decoding error on first try."); { auto& tda = native.template get<"two_dim_array">(); SAW_EXPECT(tda.at(0,0).get() == 5, "Decoded value (0,0) wrong."); SAW_EXPECT(tda.at(0,1).get() == 3, "Decoded value (0,1) wrong."); SAW_EXPECT(native.template get<"number">().get() == 410, "Decoded value number wrong."); } } { auto eo_slice = trans.view_slice(buff); SAW_EXPECT(eo_slice.is_value(), std::string{"Buffer fourth write length error: "} + std::string{eo_slice.get_error().get_category()}); auto& slice = eo_slice.get_value(); auto arr_buff = heap(1024u); { auto eov = arr_buff->write_from(slice); SAW_EXPECT(eov.is_value(), "Failed to copy buffer."); auto& len_val = eov.get_value(); slice.read_advance(len_val); buff.read_advance(len_val); arr_buff->write_advance(len_val); } data simple_slice{std::move(arr_buff)}; native = {}; auto eov = codec.decode(simple_slice, native); SAW_EXPECT(eov.is_value(), "Decoding error on second try."); { auto& tda = native.template get<"two_dim_array">(); SAW_EXPECT(tda.at(0,0).get() == 2, "Decoded value (0,0) wrong."); SAW_EXPECT(tda.at(0,1).get() == 4, "Decoded value (0,1) wrong."); SAW_EXPECT(native.template get<"number">().get() == 709, "Decoded value number wrong."); } } } }