#include "vector_table_naked_ptr_test.h" #include "test_assert.h" #include "vector_table_naked_ptr.fbs.h" namespace flatbuffers { namespace tests { void VectorTableNakedPtrTest() { // --------------------------------------- // 1) Build original native objects // --------------------------------------- auto* b1 = new BT(); auto* b2 = new BT(); b1->id = 777; b2->id = 888; AT a_src; a_src.b.push_back(b1); a_src.b.push_back(b2); // --------------------------------------- // 2) Pack into FlatBuffer // --------------------------------------- flatbuffers::FlatBufferBuilder fbb; auto a_offset = A::Pack(fbb, &a_src); FinishABuffer(fbb, a_offset); const void* buf = fbb.GetBufferPointer(); const A* a_fb = GetA(buf); // --------------------------------------- // 3) Pre-allocate destination with garbage // --------------------------------------- AT a_dst; // Pre-fill with wrong pointers to ensure UnPackTo overwrites correctly a_dst.b.resize(2); a_dst.b[0] = new BT(); a_dst.b[1] = new BT(); a_dst.b[0]->id = -1; a_dst.b[1]->id = -1; // --------------------------------------- // 4) Call the function under test: UnPackTo // --------------------------------------- a_fb->UnPackTo(&a_dst, nullptr); // --------------------------------------- // 5) Validate overwrite + deep copy // --------------------------------------- TEST_ASSERT(a_dst.b.size() == 2); TEST_ASSERT(a_dst.b[0] != nullptr); TEST_ASSERT(a_dst.b[1] != nullptr); TEST_ASSERT(a_dst.b[0]->id == 777); TEST_ASSERT(a_dst.b[1]->id == 888); // Ensure original pointers were not reused TEST_ASSERT(a_dst.b[0] != b1); TEST_ASSERT(a_dst.b[1] != b2); // --------------------------------------- // 6) Clean up ownership // --------------------------------------- delete a_dst.b[0]; delete a_dst.b[1]; delete b1; delete b2; } } // namespace tests } // namespace flatbuffers