@@ -34,12 +34,33 @@ static const int TAG_GROUP_1_IDX_1_LENGTH = sizeof(TAG_GROUP_1_IDX_1);
3434
3535static const sbe_int64_t TAG_GROUP_2_IDX_0 = -120 ;
3636static const sbe_int64_t TAG_GROUP_2_IDX_1 = 120 ;
37+ static const sbe_int64_t TAG_GROUP_2_IDX_2 = 75 ;
38+
39+ static const sbe_int64_t TAG_GROUP_2_IDX_3 = 76 ;
40+ static const sbe_int64_t TAG_GROUP_2_IDX_4 = 77 ;
41+ static const sbe_int64_t TAG_GROUP_2_IDX_5 = 78 ;
3742
3843static const char *VAR_DATA_FIELD_IDX_0 = " neg idx 0" ;
3944static const int VAR_DATA_FIELD_IDX_0_LENGTH = 9 ;
4045static const char *VAR_DATA_FIELD_IDX_1 = " idx 1 positive" ;
4146static const int VAR_DATA_FIELD_IDX_1_LENGTH = 14 ;
4247
48+ static const int NESTED_ENTRIES_COUNT = 3 ;
49+
50+ static const char *VAR_DATA_FIELD_NESTED_IDX_0 = " zero" ;
51+ static const int VAR_DATA_FIELD_NESTED_IDX_0_LENGTH = 4 ;
52+ static const char *VAR_DATA_FIELD_NESTED_IDX_1 = " one" ;
53+ static const int VAR_DATA_FIELD_NESTED_IDX_1_LENGTH = 3 ;
54+ static const char *VAR_DATA_FIELD_NESTED_IDX_2 = " two" ;
55+ static const int VAR_DATA_FIELD_NESTED_IDX_2_LENGTH = 3 ;
56+
57+ static const char *VAR_DATA_FIELD_NESTED_IDX_3 = " three" ;
58+ static const int VAR_DATA_FIELD_NESTED_IDX_3_LENGTH = 5 ;
59+ static const char *VAR_DATA_FIELD_NESTED_IDX_4 = " four" ;
60+ static const int VAR_DATA_FIELD_NESTED_IDX_4_LENGTH = 4 ;
61+ static const char *VAR_DATA_FIELD_NESTED_IDX_5 = " five" ;
62+ static const int VAR_DATA_FIELD_NESTED_IDX_5_LENGTH = 4 ;
63+
4364static const char *VAR_DATA_FIELD_1_IDX_0 = " neg idx 0" ;
4465static const int VAR_DATA_FIELD_1_IDX_0_LENGTH = 9 ;
4566static const char *VAR_DATA_FIELD_1_IDX_1 = " idx 1 positive" ;
@@ -52,6 +73,7 @@ static const int VAR_DATA_FIELD_2_IDX_1_LENGTH = 11;
5273
5374static const int expectedTestMessage1Size = 78 ;
5475static const int expectedTestMessage2Size = 107 ;
76+ static const int expectedTestMessage3Size = 145 ;
5577static const int expectedTestMessage4Size = 73 ;
5678
5779class GroupWithDataTest : public testing ::Test
@@ -106,6 +128,61 @@ class GroupWithDataTest : public testing::Test
106128 return msg2_.size ();
107129 }
108130
131+ virtual int encodeTestMessage3 (char *buffer, int offset, int bufferLength)
132+ {
133+ msg3_.wrapForEncode (buffer, offset, bufferLength);
134+
135+ msg3_.tag1 (TAG_1);
136+
137+ TestMessage3::Entries &entries = msg3_.entriesCount (ENTRIES_COUNT);
138+
139+ entries.next ()
140+ .putTagGroup1 (TAG_GROUP_1_IDX_0);
141+
142+ TestMessage3::Entries::NestedEntries &nestedEntries0 = entries.nestedEntriesCount (NESTED_ENTRIES_COUNT);
143+
144+ nestedEntries0.next ()
145+ .tagGroup2 (TAG_GROUP_2_IDX_0);
146+
147+ nestedEntries0.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_0, VAR_DATA_FIELD_NESTED_IDX_0_LENGTH);
148+
149+ nestedEntries0.next ()
150+ .tagGroup2 (TAG_GROUP_2_IDX_1);
151+
152+ nestedEntries0.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_1, VAR_DATA_FIELD_NESTED_IDX_1_LENGTH);
153+
154+ nestedEntries0.next ()
155+ .tagGroup2 (TAG_GROUP_2_IDX_2);
156+
157+ nestedEntries0.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_2, VAR_DATA_FIELD_NESTED_IDX_2_LENGTH);
158+
159+ entries.putVarDataField (VAR_DATA_FIELD_IDX_0, VAR_DATA_FIELD_IDX_0_LENGTH);
160+
161+ entries.next ()
162+ .putTagGroup1 (TAG_GROUP_1_IDX_1);
163+
164+ TestMessage3::Entries::NestedEntries &nestedEntries1 = entries.nestedEntriesCount (NESTED_ENTRIES_COUNT);
165+
166+ nestedEntries1.next ()
167+ .tagGroup2 (TAG_GROUP_2_IDX_3);
168+
169+ nestedEntries1.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_3, VAR_DATA_FIELD_NESTED_IDX_3_LENGTH);
170+
171+ nestedEntries1.next ()
172+ .tagGroup2 (TAG_GROUP_2_IDX_4);
173+
174+ nestedEntries1.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_4, VAR_DATA_FIELD_NESTED_IDX_4_LENGTH);
175+
176+ nestedEntries1.next ()
177+ .tagGroup2 (TAG_GROUP_2_IDX_5);
178+
179+ nestedEntries1.putVarDataFieldNested (VAR_DATA_FIELD_NESTED_IDX_5, VAR_DATA_FIELD_NESTED_IDX_5_LENGTH);
180+
181+ entries.putVarDataField (VAR_DATA_FIELD_IDX_1, VAR_DATA_FIELD_IDX_1_LENGTH);
182+
183+ return msg3_.size ();
184+ }
185+
109186 virtual int encodeTestMessage4 (char *buffer, int offset, int bufferLength)
110187 {
111188 msg4_.wrapForEncode (buffer, offset, bufferLength);
@@ -291,6 +368,176 @@ TEST_F(GroupWithDataTest, shouldbeAbleToEncodeAndDecodeTestMessage2Correctly)
291368 EXPECT_EQ (msg2Decoder.size (), expectedTestMessage2Size);
292369}
293370
371+ TEST_F (GroupWithDataTest, shouldBeAbleToEncodeTestMessage3Correctly)
372+ {
373+ char buffer[2048 ];
374+ const char *bp = buffer;
375+ int sz = encodeTestMessage3 (buffer, 0 , sizeof (buffer));
376+
377+ int offset = 0 ;
378+ EXPECT_EQ (*(sbe_uint32_t *)(bp + offset), TAG_1);
379+ EXPECT_EQ (TestMessage1::sbeBlockLength (), 16 );
380+ offset += 16 ; // root blockLength of 16
381+
382+ // entries
383+ EXPECT_EQ (*(sbe_uint16_t *)(bp + offset), TAG_GROUP_1_IDX_0_LENGTH);
384+ offset += sizeof (sbe_uint16_t );
385+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), ENTRIES_COUNT);
386+ offset += sizeof (sbe_uint8_t );
387+
388+ EXPECT_EQ (std::string (bp + offset, TAG_GROUP_1_IDX_0_LENGTH), std::string (TAG_GROUP_1_IDX_0, TAG_GROUP_1_IDX_0_LENGTH));
389+ offset += TAG_GROUP_1_IDX_0_LENGTH;
390+
391+ // nested entries
392+ EXPECT_EQ (*(sbe_uint16_t *)(bp + offset), sizeof (sbe_int64_t ));
393+ offset += sizeof (sbe_uint16_t );
394+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), NESTED_ENTRIES_COUNT);
395+ offset += sizeof (sbe_uint8_t );
396+
397+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_0);
398+ offset += sizeof (sbe_int64_t );
399+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_0_LENGTH);
400+ offset += sizeof (sbe_uint8_t );
401+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_0_LENGTH), VAR_DATA_FIELD_NESTED_IDX_0);
402+ offset += VAR_DATA_FIELD_NESTED_IDX_0_LENGTH;
403+
404+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_1);
405+ offset += sizeof (sbe_int64_t );
406+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_1_LENGTH);
407+ offset += sizeof (sbe_uint8_t );
408+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_1_LENGTH), VAR_DATA_FIELD_NESTED_IDX_1);
409+ offset += VAR_DATA_FIELD_NESTED_IDX_1_LENGTH;
410+
411+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_2);
412+ offset += sizeof (sbe_int64_t );
413+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_2_LENGTH);
414+ offset += sizeof (sbe_uint8_t );
415+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_2_LENGTH), VAR_DATA_FIELD_NESTED_IDX_2);
416+ offset += VAR_DATA_FIELD_NESTED_IDX_2_LENGTH;
417+
418+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_IDX_0_LENGTH);
419+ offset += sizeof (sbe_uint8_t );
420+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_IDX_0_LENGTH), VAR_DATA_FIELD_IDX_0);
421+ offset += VAR_DATA_FIELD_IDX_0_LENGTH;
422+
423+ EXPECT_EQ (std::string (bp + offset, TAG_GROUP_1_IDX_1_LENGTH), std::string (TAG_GROUP_1_IDX_1, TAG_GROUP_1_IDX_1_LENGTH));
424+ offset += TAG_GROUP_1_IDX_1_LENGTH;
425+
426+ // nested entries
427+ EXPECT_EQ (*(sbe_uint16_t *)(bp + offset), sizeof (sbe_int64_t ));
428+ offset += sizeof (sbe_uint16_t );
429+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), NESTED_ENTRIES_COUNT);
430+ offset += sizeof (sbe_uint8_t );
431+
432+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_3);
433+ offset += sizeof (sbe_int64_t );
434+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_3_LENGTH);
435+ offset += sizeof (sbe_uint8_t );
436+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_3_LENGTH), VAR_DATA_FIELD_NESTED_IDX_3);
437+ offset += VAR_DATA_FIELD_NESTED_IDX_3_LENGTH;
438+
439+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_4);
440+ offset += sizeof (sbe_int64_t );
441+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_4_LENGTH);
442+ offset += sizeof (sbe_uint8_t );
443+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_4_LENGTH), VAR_DATA_FIELD_NESTED_IDX_4);
444+ offset += VAR_DATA_FIELD_NESTED_IDX_4_LENGTH;
445+
446+ EXPECT_EQ (*(sbe_int64_t *)(bp + offset), TAG_GROUP_2_IDX_5);
447+ offset += sizeof (sbe_int64_t );
448+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_NESTED_IDX_5_LENGTH);
449+ offset += sizeof (sbe_uint8_t );
450+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_NESTED_IDX_5_LENGTH), VAR_DATA_FIELD_NESTED_IDX_5);
451+ offset += VAR_DATA_FIELD_NESTED_IDX_5_LENGTH;
452+
453+ EXPECT_EQ (*(sbe_uint8_t *)(bp + offset), VAR_DATA_FIELD_IDX_1_LENGTH);
454+ offset += sizeof (sbe_uint8_t );
455+ EXPECT_EQ (std::string (bp + offset, VAR_DATA_FIELD_IDX_1_LENGTH), VAR_DATA_FIELD_IDX_1);
456+ offset += VAR_DATA_FIELD_IDX_1_LENGTH;
457+
458+ EXPECT_EQ (sz, offset);
459+ }
460+
461+ TEST_F (GroupWithDataTest, shouldbeAbleToEncodeAndDecodeTestMessage3Correctly)
462+ {
463+ char buffer[2048 ];
464+ int sz = encodeTestMessage3 (buffer, 0 , sizeof (buffer));
465+
466+ EXPECT_EQ (sz, expectedTestMessage3Size);
467+
468+ TestMessage3 msg3Decoder (buffer, sizeof (buffer), TestMessage3::sbeBlockLength (), TestMessage3::sbeSchemaVersion ());
469+
470+ EXPECT_EQ (msg3Decoder.tag1 (), TAG_1);
471+
472+ TestMessage3::Entries &entries = msg3Decoder.entries ();
473+ EXPECT_EQ (entries.count (), ENTRIES_COUNT);
474+
475+ ASSERT_TRUE (entries.hasNext ());
476+ entries.next ();
477+
478+ EXPECT_EQ (entries.tagGroup1Length (), TAG_GROUP_1_IDX_0_LENGTH);
479+ EXPECT_EQ (std::string (entries.tagGroup1 (), entries.tagGroup1Length ()), std::string (TAG_GROUP_1_IDX_0, TAG_GROUP_1_IDX_0_LENGTH));
480+
481+ TestMessage3::Entries::NestedEntries &nestedEntries0 = entries.nestedEntries ();
482+ EXPECT_EQ (nestedEntries0.count (), NESTED_ENTRIES_COUNT);
483+
484+ ASSERT_TRUE (nestedEntries0.hasNext ());
485+ nestedEntries0.next ();
486+
487+ EXPECT_EQ (nestedEntries0.tagGroup2 (), TAG_GROUP_2_IDX_0);
488+ EXPECT_EQ (nestedEntries0.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_0_LENGTH);
489+ EXPECT_EQ (std::string (nestedEntries0.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_0_LENGTH), VAR_DATA_FIELD_NESTED_IDX_0);
490+
491+ ASSERT_TRUE (nestedEntries0.hasNext ());
492+ nestedEntries0.next ();
493+
494+ EXPECT_EQ (nestedEntries0.tagGroup2 (), TAG_GROUP_2_IDX_1);
495+ EXPECT_EQ (nestedEntries0.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_1_LENGTH);
496+ EXPECT_EQ (std::string (nestedEntries0.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_1_LENGTH), VAR_DATA_FIELD_NESTED_IDX_1);
497+
498+ ASSERT_TRUE (nestedEntries0.hasNext ());
499+ nestedEntries0.next ();
500+
501+ EXPECT_EQ (nestedEntries0.tagGroup2 (), TAG_GROUP_2_IDX_2);
502+ EXPECT_EQ (nestedEntries0.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_2_LENGTH);
503+ EXPECT_EQ (std::string (nestedEntries0.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_2_LENGTH), VAR_DATA_FIELD_NESTED_IDX_2);
504+
505+ EXPECT_EQ (entries.varDataFieldLength (), VAR_DATA_FIELD_IDX_0_LENGTH);
506+ EXPECT_EQ (std::string (entries.varDataField (), VAR_DATA_FIELD_IDX_0_LENGTH), VAR_DATA_FIELD_IDX_0);
507+
508+ ASSERT_TRUE (entries.hasNext ());
509+ entries.next ();
510+
511+ TestMessage3::Entries::NestedEntries &nestedEntries1 = entries.nestedEntries ();
512+ EXPECT_EQ (nestedEntries1.count (), NESTED_ENTRIES_COUNT);
513+
514+ ASSERT_TRUE (nestedEntries1.hasNext ());
515+ nestedEntries1.next ();
516+
517+ EXPECT_EQ (nestedEntries1.tagGroup2 (), TAG_GROUP_2_IDX_3);
518+ EXPECT_EQ (nestedEntries1.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_3_LENGTH);
519+ EXPECT_EQ (std::string (nestedEntries1.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_3_LENGTH), VAR_DATA_FIELD_NESTED_IDX_3);
520+
521+ ASSERT_TRUE (nestedEntries1.hasNext ());
522+ nestedEntries1.next ();
523+
524+ EXPECT_EQ (nestedEntries1.tagGroup2 (), TAG_GROUP_2_IDX_4);
525+ EXPECT_EQ (nestedEntries1.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_4_LENGTH);
526+ EXPECT_EQ (std::string (nestedEntries1.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_4_LENGTH), VAR_DATA_FIELD_NESTED_IDX_4);
527+
528+ ASSERT_TRUE (nestedEntries1.hasNext ());
529+ nestedEntries1.next ();
530+
531+ EXPECT_EQ (nestedEntries1.tagGroup2 (), TAG_GROUP_2_IDX_5);
532+ EXPECT_EQ (nestedEntries1.varDataFieldNestedLength (), VAR_DATA_FIELD_NESTED_IDX_5_LENGTH);
533+ EXPECT_EQ (std::string (nestedEntries1.varDataFieldNested (), VAR_DATA_FIELD_NESTED_IDX_5_LENGTH), VAR_DATA_FIELD_NESTED_IDX_5);
534+
535+ EXPECT_EQ (entries.varDataFieldLength (), VAR_DATA_FIELD_IDX_1_LENGTH);
536+ EXPECT_EQ (std::string (entries.varDataField (), VAR_DATA_FIELD_IDX_1_LENGTH), VAR_DATA_FIELD_IDX_1);
537+
538+ EXPECT_EQ (msg3Decoder.size (), expectedTestMessage3Size);
539+ }
540+
294541TEST_F (GroupWithDataTest, shouldBeAbleToEncodeTestMessage4Correctly)
295542{
296543 char buffer[2048 ];
0 commit comments