Add a unit test for odd-sized small structs (for #8117) (#8363)

* add an odd sized test

* formatting

---------

Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
nolen777
2024-08-19 21:27:32 -07:00
committed by GitHub
parent 42879f6ea6
commit 8db59321d9
2 changed files with 32 additions and 16 deletions

View File

@@ -34,15 +34,18 @@ void AlignmentTest() {
// creating 5 structs with 2 bytes each // creating 5 structs with 2 bytes each
// 10 bytes in total for Vector data is needed // 10 bytes in total for Vector data is needed
std::vector<JustSmallStruct> small_vector = { std::vector<EvenSmallStruct> even_vector = { { 2, 1 }, { 3, 1 }, { 4, 1 } };
{ 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() // CreateVectorOfStructs is used in the generated CreateSmallStructsDirect()
// method, but we test it directly // method, but we test it directly
Offset<Vector<const JustSmallStruct *>> small_structs_offset = Offset<Vector<const EvenSmallStruct *>> even_structs_offset =
builder.CreateVectorOfStructs<JustSmallStruct>(small_vector); builder.CreateVectorOfStructs<EvenSmallStruct>(even_vector);
Offset<Vector<const OddSmallStruct *>> odd_structs_offset =
builder.CreateVectorOfStructs<OddSmallStruct>(odd_vector);
Offset<SmallStructs> small_structs_root = Offset<SmallStructs> small_structs_root =
CreateSmallStructs(builder, small_structs_offset); CreateSmallStructs(builder, even_structs_offset, odd_structs_offset);
builder.Finish(small_structs_root); builder.Finish(small_structs_root);
@@ -62,13 +65,17 @@ void AlignmentTest() {
auto root_msg = auto root_msg =
flatbuffers::GetRoot<SmallStructs>(builder.GetBufferPointer()); flatbuffers::GetRoot<SmallStructs>(builder.GetBufferPointer());
TEST_EQ(root_msg->small_structs()->size(), small_vector.size()); TEST_EQ(root_msg->even_structs()->size(), even_vector.size());
for (flatbuffers::uoffset_t i = 0; i < root_msg->small_structs()->size(); for (flatbuffers::uoffset_t i = 0; i < root_msg->even_structs()->size();
++i) { ++i) {
TEST_EQ(small_vector[i].var_0(), TEST_EQ(even_vector[i].var_0(), root_msg->even_structs()->Get(i)->var_0());
root_msg->small_structs()->Get(i)->var_0()); TEST_EQ(even_vector[i].var_1(), root_msg->even_structs()->Get(i)->var_1());
TEST_EQ(small_vector[i].var_1(), }
root_msg->small_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());
} }
} }

View File

@@ -21,15 +21,24 @@ table BadAlignmentRoot {
small: [BadAlignmentSmall]; small: [BadAlignmentSmall];
} }
// sizeof(JustSmallStruct) == 2 // sizeof(EvenSmallStruct) == 2
// alignof(JustSmallStruct) == 1 // alignof(EvenSmallStruct) == 1
struct JustSmallStruct { struct EvenSmallStruct {
var_0: uint8; var_0: uint8;
var_1: uint8; var_1: uint8;
} }
// sizeof(OddSmallStruct) == 3
// alignof(OddSmallStruct) == 1
struct OddSmallStruct {
var_0: uint8;
var_1: uint8;
var_2: uint8;
}
table SmallStructs { table SmallStructs {
small_structs: [JustSmallStruct]; even_structs: [EvenSmallStruct];
odd_structs: [OddSmallStruct];
} }
root_type SmallStructs; root_type SmallStructs;