diff --git a/test/testxcode.cpp b/test/testxcode.cpp index 3665727..0047a92 100644 --- a/test/testxcode.cpp +++ b/test/testxcode.cpp @@ -138,7 +138,7 @@ void testDeserialize1() } TypeDef simpledef(TypeCode::Struct, "simple_t", { - Member(TypeCode::Float64A, "value"), + Member(TypeCode::UInt64A, "value"), Member(TypeCode::Struct, "timeStamp", "time_t", { Member(TypeCode::UInt64, "secondsPastEpoch"), Member(TypeCode::UInt32, "nanoseconds"), @@ -185,7 +185,7 @@ void testSimpleDef() " anya : 8 [8]\n" " choice : 9 [9]\n" " achoice : 10 [10]\n" - "[1] double[] parent=[0] [1:2)\n" + "[1] uint64_t[] parent=[0] [1:2)\n" "[2] struct time_t parent=[0] [2:5)\n" " nanoseconds -> 2 [4]\n" " secondsPastEpoch -> 1 [3]\n" @@ -225,6 +225,16 @@ void testSerialize2() { testDiag("%s", __func__); + { + auto val = simpledef.create(); + + val["value"] = shared_array({1u, 0xdeadbeef, 2u}).castTo(); + + testToBytes(true, [&val](Buffer& buf) { + to_wire_valid(buf, val); + }, "\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xde\xad\xbe\xef\x00\x00\x00\x00\x00\x00\x00\x02"); + } + { auto val = simpledef.create(); @@ -321,6 +331,19 @@ void testDeserialize2() { testDiag("%s", __func__); + { + TypeStore ctxt; + auto val = simpledef.create(); + testFromBytes(true, "\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xde\xad\xbe\xef\x00\x00\x00\x00\x00\x00\x00\x02", + [&val, &ctxt](Buffer& buf) { + from_wire_valid(buf, ctxt, val); + }); + testOk1(!!val["value"].isMarked()); + testOk1(!val["arbitrary.sarr"].isMarked()); + testArrEq(val["value"].as>().castTo(), + shared_array({1u, 0xdeadbeef, 2u})); + } + { TypeStore ctxt; auto val = simpledef.create(); @@ -495,6 +518,40 @@ void testDecode1() ); } +template +void testArrayXCodeT(const char(&encoded)[N], std::initializer_list values) +{ + shared_array expected(values); + + auto code = TypeCode(ScalarMap::code).arrayOf(); + TypeDef def(TypeCode::Struct, {Member(code, "value")}); + + testToBytes(true, [&expected, &def](Buffer& buf) { + auto val = def.create(); + val["value"] = expected.template castTo(); + to_wire_valid(buf, val); + }, encoded); + + TypeStore ctxt; + auto val2 = def.create(); + + testFromBytes(true, encoded, + [&ctxt, &val2](Buffer& buf) { + from_wire_valid(buf, ctxt, val2); + }); + + testArrEq(expected, val2["value"].as>().castTo()); +} + +void testArrayXCode() +{ + testDiag("%s", __func__); + + testArrayXCodeT("\x01\x02\x00", {}); + testArrayXCodeT("\x01\x02\x02\x00\x01\xff\xff", {1u, 0xffff}); + testArrayXCodeT("\x01\x02\x02\x05hello\x05world", {"hello", "world"}); +} + /* epics:nt/NTScalarArray:1.0 * double[] value * alarm_t alarm @@ -863,7 +920,7 @@ void testEmptyRequest() FixedBuf buf(false, msg); from_wire(buf, descs1, registry); testOk1(buf.good()); - testEq(buf.size(), 0u)<<"remaining of "<