Skip to content

Commit

Permalink
Add a unit test for odd-sized small structs (for google#8117) (google…
Browse files Browse the repository at this point in the history
…#8363)

* add an odd sized test

* formatting

---------

Co-authored-by: Derek Bailey <[email protected]>
  • Loading branch information
2 people authored and Jochen Parmentier committed Oct 29, 2024
1 parent 3e37e6c commit ed3f7f5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 16 deletions.
31 changes: 19 additions & 12 deletions tests/alignment_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,18 @@ void AlignmentTest() {

// creating 5 structs with 2 bytes each
// 10 bytes in total for Vector data is needed
std::vector<JustSmallStruct> small_vector = {
{ 2, 1 }, { 3, 1 }, { 4, 1 }
};
std::vector<EvenSmallStruct> even_vector = { { 2, 1 }, { 3, 1 }, { 4, 1 } };
std::vector<OddSmallStruct> odd_vector = { { 6, 5, 4 },
{ 9, 8, 7 },
{ 1, 2, 3 } };
// CreateVectorOfStructs is used in the generated CreateSmallStructsDirect()
// method, but we test it directly
Offset<Vector<const JustSmallStruct *>> small_structs_offset =
builder.CreateVectorOfStructs<JustSmallStruct>(small_vector);
Offset<Vector<const EvenSmallStruct *>> even_structs_offset =
builder.CreateVectorOfStructs<EvenSmallStruct>(even_vector);
Offset<Vector<const OddSmallStruct *>> odd_structs_offset =
builder.CreateVectorOfStructs<OddSmallStruct>(odd_vector);
Offset<SmallStructs> small_structs_root =
CreateSmallStructs(builder, small_structs_offset);
CreateSmallStructs(builder, even_structs_offset, odd_structs_offset);

builder.Finish(small_structs_root);

Expand All @@ -62,13 +65,17 @@ void AlignmentTest() {
auto root_msg =
flatbuffers::GetRoot<SmallStructs>(builder.GetBufferPointer());

TEST_EQ(root_msg->small_structs()->size(), small_vector.size());
for (flatbuffers::uoffset_t i = 0; i < root_msg->small_structs()->size();
TEST_EQ(root_msg->even_structs()->size(), even_vector.size());
for (flatbuffers::uoffset_t i = 0; i < root_msg->even_structs()->size();
++i) {
TEST_EQ(small_vector[i].var_0(),
root_msg->small_structs()->Get(i)->var_0());
TEST_EQ(small_vector[i].var_1(),
root_msg->small_structs()->Get(i)->var_1());
TEST_EQ(even_vector[i].var_0(), root_msg->even_structs()->Get(i)->var_0());
TEST_EQ(even_vector[i].var_1(), root_msg->even_structs()->Get(i)->var_1());
}

TEST_EQ(root_msg->odd_structs()->size(), even_vector.size());
for (flatbuffers::uoffset_t i = 0; i < root_msg->odd_structs()->size(); ++i) {
TEST_EQ(odd_vector[i].var_0(), root_msg->odd_structs()->Get(i)->var_0());
TEST_EQ(odd_vector[i].var_1(), root_msg->odd_structs()->Get(i)->var_1());
}
}

Expand Down
17 changes: 13 additions & 4 deletions tests/alignment_test.fbs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,24 @@ table BadAlignmentRoot {
small: [BadAlignmentSmall];
}

// sizeof(JustSmallStruct) == 2
// alignof(JustSmallStruct) == 1
struct JustSmallStruct {
// sizeof(EvenSmallStruct) == 2
// alignof(EvenSmallStruct) == 1
struct EvenSmallStruct {
var_0: uint8;
var_1: uint8;
}

// sizeof(OddSmallStruct) == 3
// alignof(OddSmallStruct) == 1
struct OddSmallStruct {
var_0: uint8;
var_1: uint8;
var_2: uint8;
}

table SmallStructs {
small_structs: [JustSmallStruct];
even_structs: [EvenSmallStruct];
odd_structs: [OddSmallStruct];
}

root_type SmallStructs;

0 comments on commit ed3f7f5

Please sign in to comment.