blob: 98c56aabf25df9b2f6d3b6893e2e0d0cd20d0336 [file] [log] [blame]
#include "vector_table_naked_ptr_test.h"
#include "test_assert.h"
#include "vector_table_naked_ptr/vector_table_naked_ptr_generated.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