diff --git a/tests/monsterdata_test.golden b/tests/monsterdata_test.golden index 73afc4241..f978ed236 100644 --- a/tests/monsterdata_test.golden +++ b/tests/monsterdata_test.golden @@ -6,8 +6,8 @@ test1: 3, test2: Green, test3: { - a: 5, - b: 6 + a: 10, + b: 20 } }, hp: 80, @@ -17,7 +17,12 @@ 1, 2, 3, - 4 + 4, + 5, + 6, + 7, + 8, + 9 ], test_type: Monster, test: { @@ -34,8 +39,22 @@ } ], testarrayofstring: [ - "test1", - "test2" + "bob", + "fred", + "bob", + "fred" + ], + testarrayoftables: [ + { + hp: 1000, + name: "Barney" + }, + { + name: "Fred" + }, + { + name: "Wilma" + } ], testhashs32_fnv1: -579221183, testhashu32_fnv1: 3715746113, diff --git a/tests/test.cpp b/tests/test.cpp index 3141a9685..732806d24 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -145,10 +145,33 @@ flatbuffers::DetachedBuffer CreateFlatBufferTest(std::string &buffer) { abilities.push_back(Ability(1, 10)); auto vecofstructs = builder.CreateVectorOfSortedStructs(&abilities); + // Create a nested FlatBuffer. + // Nested FlatBuffers are stored in a ubyte vector, which can be convenient + // since they can be memcpy'd around much easier than other FlatBuffer + // values. They have little overhead compared to storing the table directly. + // As a test, create a mostly empty Monster buffer: + flatbuffers::FlatBufferBuilder nested_builder; + auto nmloc = CreateMonster(nested_builder, nullptr, 0, 0, + nested_builder.CreateString("NestedMonster")); + FinishMonsterBuffer(nested_builder, nmloc); + // Now we can store the buffer in the parent. Note that by default, vectors + // are only aligned to their elements or size field, so in this case if the + // buffer contains 64-bit elements, they may not be correctly aligned. We fix + // that with: + builder.ForceVectorAlignment(nested_builder.GetSize(), sizeof(uint8_t), + nested_builder.GetBufferMinAlignment()); + // If for whatever reason you don't have the nested_builder available, you + // can substitute flatbuffers::largest_scalar_t (64-bit) for the alignment, or + // the largest force_align value in your schema if you're using it. + auto nested_flatbuffer_vector = + builder.CreateVector(nested_builder.GetBufferPointer(), + nested_builder.GetSize()); + // shortcut for creating monster with all fields set: auto mloc = CreateMonster(builder, &vec, 150, 80, name, inventory, Color_Blue, Any_Monster, mlocs[1].Union(), // Store a union. - testv, vecofstrings, vecoftables, 0, 0, 0, false, + testv, vecofstrings, vecoftables, 0, + nested_flatbuffer_vector, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.14159f, 3.0f, 0.0f, vecofstrings2, vecofstructs); @@ -272,6 +295,16 @@ void AccessFlatBufferTest(const uint8_t *flatbuf, size_t length, TEST_EQ(static_cast(nullptr), vecofstructs->LookupByKey(5)); } + // Test nested FlatBuffers if available: + auto nested_buffer = monster->testnestedflatbuffer(); + if (nested_buffer) { + // nested_buffer is a vector of bytes you can memcpy. However, if you + // actually want to access the nested data, this is a convenient + // accessor that directly gives you the root table: + auto nested_monster = monster->testnestedflatbuffer_nested_root(); + TEST_EQ_STR(nested_monster->name()->c_str(), "NestedMonster"); + } + // Since Flatbuffers uses explicit mechanisms to override the default // compiler alignment, double check that the compiler indeed obeys them: // (Test consists of a short and byte): @@ -487,6 +520,9 @@ void ParseAndGenerateTextTest() { parser.builder_.GetSize()); TEST_EQ(VerifyMonsterBuffer(verifier), true); + AccessFlatBufferTest(parser.builder_.GetBufferPointer(), + parser.builder_.GetSize(), false); + // to ensure it is correct, we now generate text back from the binary, // and compare the two: std::string jsongen;