11//
2- // Copyright 2014 - 2018 (C). Alex Robenko. All rights reserved.
2+ // Copyright 2014 - 2019 (C). Alex Robenko. All rights reserved.
33//
44
55// This file is free software: you can redistribute it and/or modify
@@ -45,6 +45,8 @@ public:
4545 void test13();
4646 void test14();
4747 void test15();
48+ void test16();
49+ void test17();
4850
4951private:
5052
@@ -133,6 +135,15 @@ private:
133135 comms::option::NumValueSerOffset<TOffset>
134136 >;
135137
138+ template <typename TField, std::size_t TMin = 1, std::size_t TMax = 4>
139+ using VarLenSizeField =
140+ comms::field::IntValue<
141+ TField,
142+ unsigned,
143+ comms::option::VarLength<TMin, TMax>
144+ >;
145+
146+
136147 template <typename TField>
137148 using SizeField20 = SizeField<TField, 2, 0>;
138149 using BeSizeField20 = SizeField20<BeField>;
@@ -149,6 +160,11 @@ private:
149160 using BeSizeField22 = SizeField22<BeField>;
150161 using LeSizeField22 = SizeField22<LeField>;
151162
163+ template <typename TField>
164+ using VarLenSizeFieldDef = VarLenSizeField<TField>;
165+ using BeVarLenSizeField = VarLenSizeFieldDef<BeField>;
166+ using LeVarLenSizeField = VarLenSizeFieldDef<LeField>;
167+
152168 template <typename TField, std::size_t TLen>
153169 using IdField =
154170 comms::field::EnumValue<
@@ -609,3 +625,49 @@ void MsgSizeLayerTestSuite::test15()
609625 TS_ASSERT_EQUALS(std::get<0>(fields2).value(), 3U);
610626 TS_ASSERT_EQUALS(std::get<1>(fields2).value(), MessageType1);
611627}
628+
629+ void MsgSizeLayerTestSuite::test16()
630+ {
631+ static const char Buf[] = {
632+ (char)0x84, 0x0, MessageType1, 0x01, 0x02,
633+ };
634+
635+ static const std::size_t BufSize = std::extent<decltype(Buf)>::value;
636+
637+ ProtocolStack<LeVarLenSizeField, LeIdField1, LeMsgBase> stack;
638+ auto& sizeLayer = stack.layer_size();
639+ using SizeLayerType = typename std::decay<decltype(sizeLayer)>::type;
640+ static_assert(comms::protocol::isMsgSizeLayer<SizeLayerType>(), "Invalid layer");
641+
642+ auto& idLayer = stack.layer_id();
643+ using IdLayerType = typename std::decay<decltype(idLayer)>::type;
644+ static_assert(comms::protocol::isMsgIdLayer<IdLayerType>(), "Invalid layer");
645+
646+ auto& payloadLayer = stack.layer_payload();
647+ using PayloadLayerType = typename std::decay<decltype(payloadLayer)>::type;
648+ static_assert(comms::protocol::isMsgDataLayer<PayloadLayerType>(), "Invalid layer");
649+
650+ auto msgPtr = commonReadWriteMsgTest(stack, &Buf[0], BufSize, comms::ErrorStatus::NotEnoughData);
651+ TS_ASSERT(!msgPtr)
652+ }
653+
654+ void MsgSizeLayerTestSuite::test17()
655+ {
656+ static const char Buf[] = {
657+ (char)0x81, 0x0, MessageType2
658+ };
659+
660+ static const std::size_t BufSize = std::extent<decltype(Buf)>::value;
661+
662+ using Frame = ProtocolStack<LeVarLenSizeField, LeIdField1, LeMsgBase>;
663+ Frame frame;
664+
665+ Frame::MsgPtr msg;
666+ auto readIter = &Buf[0];
667+ auto es = frame.read(msg, readIter, BufSize);
668+ TS_ASSERT_EQUALS(es, comms::ErrorStatus::Success);
669+ TS_ASSERT(msg);
670+ TS_ASSERT_EQUALS(msg->getId(), MessageType2);
671+ TS_ASSERT_EQUALS(frame.length(*msg), BufSize - 1);
672+ }
673+
0 commit comments