1*890232f2SAndroid Build Coastguard Worker #ifndef TEST_BUILDER_H 2*890232f2SAndroid Build Coastguard Worker #define TEST_BUILDER_H 3*890232f2SAndroid Build Coastguard Worker 4*890232f2SAndroid Build Coastguard Worker #include <set> 5*890232f2SAndroid Build Coastguard Worker #include <type_traits> 6*890232f2SAndroid Build Coastguard Worker 7*890232f2SAndroid Build Coastguard Worker #include "flatbuffers/flatbuffers.h" 8*890232f2SAndroid Build Coastguard Worker #include "monster_test_generated.h" 9*890232f2SAndroid Build Coastguard Worker #include "test_assert.h" 10*890232f2SAndroid Build Coastguard Worker 11*890232f2SAndroid Build Coastguard Worker using MyGame::Example::Color; 12*890232f2SAndroid Build Coastguard Worker using MyGame::Example::Monster; 13*890232f2SAndroid Build Coastguard Worker 14*890232f2SAndroid Build Coastguard Worker namespace flatbuffers { 15*890232f2SAndroid Build Coastguard Worker namespace grpc { 16*890232f2SAndroid Build Coastguard Worker class MessageBuilder; 17*890232f2SAndroid Build Coastguard Worker } 18*890232f2SAndroid Build Coastguard Worker } // namespace flatbuffers 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Worker template<class T, class U> struct is_same { static const bool value = false; }; 21*890232f2SAndroid Build Coastguard Worker 22*890232f2SAndroid Build Coastguard Worker template<class T> struct is_same<T, T> { static const bool value = true; }; 23*890232f2SAndroid Build Coastguard Worker 24*890232f2SAndroid Build Coastguard Worker inline std::string m1_name() { return "Cyberdemon"; } 25*890232f2SAndroid Build Coastguard Worker inline std::string m2_name() { return "Imp"; } 26*890232f2SAndroid Build Coastguard Worker inline MyGame::Example::Color m1_color() { 27*890232f2SAndroid Build Coastguard Worker return MyGame::Example::Color_Red; 28*890232f2SAndroid Build Coastguard Worker } 29*890232f2SAndroid Build Coastguard Worker inline MyGame::Example::Color m2_color() { 30*890232f2SAndroid Build Coastguard Worker return MyGame::Example::Color_Green; 31*890232f2SAndroid Build Coastguard Worker } 32*890232f2SAndroid Build Coastguard Worker inline void m1_color_check() { 33*890232f2SAndroid Build Coastguard Worker // Ensure that all compilation units see the same monster_test_generated.h. 34*890232f2SAndroid Build Coastguard Worker extern void CheckTestGeneratedIsValid(const MyGame::Example::Color&); 35*890232f2SAndroid Build Coastguard Worker CheckTestGeneratedIsValid(m1_color()); 36*890232f2SAndroid Build Coastguard Worker } 37*890232f2SAndroid Build Coastguard Worker 38*890232f2SAndroid Build Coastguard Worker flatbuffers::Offset<Monster> populate1(flatbuffers::FlatBufferBuilder &builder); 39*890232f2SAndroid Build Coastguard Worker flatbuffers::Offset<Monster> populate2(flatbuffers::FlatBufferBuilder &builder); 40*890232f2SAndroid Build Coastguard Worker 41*890232f2SAndroid Build Coastguard Worker uint8_t *release_raw_base(flatbuffers::FlatBufferBuilder &fbb, size_t &size, 42*890232f2SAndroid Build Coastguard Worker size_t &offset); 43*890232f2SAndroid Build Coastguard Worker 44*890232f2SAndroid Build Coastguard Worker void free_raw(flatbuffers::grpc::MessageBuilder &mbb, uint8_t *buf); 45*890232f2SAndroid Build Coastguard Worker void free_raw(flatbuffers::FlatBufferBuilder &fbb, uint8_t *buf); 46*890232f2SAndroid Build Coastguard Worker 47*890232f2SAndroid Build Coastguard Worker bool verify(const flatbuffers::DetachedBuffer &buf, 48*890232f2SAndroid Build Coastguard Worker const std::string &expected_name, Color color); 49*890232f2SAndroid Build Coastguard Worker bool verify(const uint8_t *buf, size_t offset, const std::string &expected_name, 50*890232f2SAndroid Build Coastguard Worker Color color); 51*890232f2SAndroid Build Coastguard Worker 52*890232f2SAndroid Build Coastguard Worker bool release_n_verify(flatbuffers::FlatBufferBuilder &fbb, 53*890232f2SAndroid Build Coastguard Worker const std::string &expected_name, Color color); 54*890232f2SAndroid Build Coastguard Worker bool release_n_verify(flatbuffers::grpc::MessageBuilder &mbb, 55*890232f2SAndroid Build Coastguard Worker const std::string &expected_name, Color color); 56*890232f2SAndroid Build Coastguard Worker 57*890232f2SAndroid Build Coastguard Worker // Invokes this function when testing the following Builder types 58*890232f2SAndroid Build Coastguard Worker // FlatBufferBuilder, TestHeapBuilder, and GrpcLikeMessageBuilder 59*890232f2SAndroid Build Coastguard Worker template<class Builder> 60*890232f2SAndroid Build Coastguard Worker void builder_move_assign_after_releaseraw_test(Builder b1) { 61*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(b1); 62*890232f2SAndroid Build Coastguard Worker b1.Finish(root_offset1); 63*890232f2SAndroid Build Coastguard Worker size_t size, offset; 64*890232f2SAndroid Build Coastguard Worker 65*890232f2SAndroid Build Coastguard Worker uint8_t *rr = b1.ReleaseRaw(size, offset); 66*890232f2SAndroid Build Coastguard Worker std::shared_ptr<uint8_t> raw( 67*890232f2SAndroid Build Coastguard Worker rr, [size](uint8_t *ptr) { 68*890232f2SAndroid Build Coastguard Worker flatbuffers::DefaultAllocator::dealloc(ptr, size); 69*890232f2SAndroid Build Coastguard Worker }); 70*890232f2SAndroid Build Coastguard Worker Builder src; 71*890232f2SAndroid Build Coastguard Worker auto root_offset2 = populate2(src); 72*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset2); 73*890232f2SAndroid Build Coastguard Worker auto src_size = src.GetSize(); 74*890232f2SAndroid Build Coastguard Worker // Move into a released builder. 75*890232f2SAndroid Build Coastguard Worker b1 = std::move(src); 76*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(b1.GetSize(), src_size); 77*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(b1, m2_name(), m2_color())); 78*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 79*890232f2SAndroid Build Coastguard Worker } 80*890232f2SAndroid Build Coastguard Worker 81*890232f2SAndroid Build Coastguard Worker void builder_move_assign_after_releaseraw_test( 82*890232f2SAndroid Build Coastguard Worker flatbuffers::grpc::MessageBuilder b1); 83*890232f2SAndroid Build Coastguard Worker 84*890232f2SAndroid Build Coastguard Worker template<class DestBuilder, class SrcBuilder = DestBuilder> 85*890232f2SAndroid Build Coastguard Worker struct BuilderTests { 86*890232f2SAndroid Build Coastguard Worker static void empty_builder_movector_test() { 87*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 88*890232f2SAndroid Build Coastguard Worker size_t src_size = src.GetSize(); 89*890232f2SAndroid Build Coastguard Worker DestBuilder dst(std::move(src)); 90*890232f2SAndroid Build Coastguard Worker size_t dst_size = dst.GetSize(); 91*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src_size, 0); 92*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src_size, dst_size); 93*890232f2SAndroid Build Coastguard Worker } 94*890232f2SAndroid Build Coastguard Worker 95*890232f2SAndroid Build Coastguard Worker static void nonempty_builder_movector_test() { 96*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 97*890232f2SAndroid Build Coastguard Worker populate1(src); 98*890232f2SAndroid Build Coastguard Worker size_t src_size = src.GetSize(); 99*890232f2SAndroid Build Coastguard Worker DestBuilder dst(std::move(src)); 100*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src_size, dst.GetSize()); 101*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 102*890232f2SAndroid Build Coastguard Worker } 103*890232f2SAndroid Build Coastguard Worker 104*890232f2SAndroid Build Coastguard Worker static void builder_movector_before_finish_test() { 105*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 106*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 107*890232f2SAndroid Build Coastguard Worker DestBuilder dst(std::move(src)); 108*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 109*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 110*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 111*890232f2SAndroid Build Coastguard Worker } 112*890232f2SAndroid Build Coastguard Worker 113*890232f2SAndroid Build Coastguard Worker static void builder_movector_after_finish_test() { 114*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 115*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 116*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset1); 117*890232f2SAndroid Build Coastguard Worker auto src_size = src.GetSize(); 118*890232f2SAndroid Build Coastguard Worker DestBuilder dst(std::move(src)); 119*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(dst.GetSize(), src_size); 120*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 121*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 122*890232f2SAndroid Build Coastguard Worker } 123*890232f2SAndroid Build Coastguard Worker 124*890232f2SAndroid Build Coastguard Worker static void builder_move_assign_before_finish_test() { 125*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 126*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 127*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 128*890232f2SAndroid Build Coastguard Worker populate2(dst); 129*890232f2SAndroid Build Coastguard Worker dst = std::move(src); 130*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 131*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 132*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 133*890232f2SAndroid Build Coastguard Worker } 134*890232f2SAndroid Build Coastguard Worker 135*890232f2SAndroid Build Coastguard Worker static void builder_move_assign_after_finish_test() { 136*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 137*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 138*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset1); 139*890232f2SAndroid Build Coastguard Worker auto src_size = src.GetSize(); 140*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 141*890232f2SAndroid Build Coastguard Worker auto root_offset2 = populate2(dst); 142*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset2); 143*890232f2SAndroid Build Coastguard Worker dst = std::move(src); 144*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(dst.GetSize(), src_size); 145*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 146*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 147*890232f2SAndroid Build Coastguard Worker } 148*890232f2SAndroid Build Coastguard Worker 149*890232f2SAndroid Build Coastguard Worker static void builder_move_assign_after_release_test() { 150*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 151*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(dst); 152*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 153*890232f2SAndroid Build Coastguard Worker { 154*890232f2SAndroid Build Coastguard Worker flatbuffers::DetachedBuffer dst_detached = dst.Release(); 155*890232f2SAndroid Build Coastguard Worker // detached buffer is deleted 156*890232f2SAndroid Build Coastguard Worker } 157*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 158*890232f2SAndroid Build Coastguard Worker auto root_offset2 = populate2(src); 159*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset2); 160*890232f2SAndroid Build Coastguard Worker auto src_size = src.GetSize(); 161*890232f2SAndroid Build Coastguard Worker // Move into a released builder. 162*890232f2SAndroid Build Coastguard Worker dst = std::move(src); 163*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(dst.GetSize(), src_size); 164*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m2_name(), m2_color())); 165*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 166*890232f2SAndroid Build Coastguard Worker } 167*890232f2SAndroid Build Coastguard Worker 168*890232f2SAndroid Build Coastguard Worker static void builder_swap_before_finish_test( 169*890232f2SAndroid Build Coastguard Worker bool run = is_same<DestBuilder, SrcBuilder>::value) { 170*890232f2SAndroid Build Coastguard Worker /// Swap is allowed only when lhs and rhs are the same concrete type. 171*890232f2SAndroid Build Coastguard Worker if (run) { 172*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 173*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 174*890232f2SAndroid Build Coastguard Worker auto size1 = src.GetSize(); 175*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 176*890232f2SAndroid Build Coastguard Worker auto root_offset2 = populate2(dst); 177*890232f2SAndroid Build Coastguard Worker auto size2 = dst.GetSize(); 178*890232f2SAndroid Build Coastguard Worker src.Swap(dst); 179*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset2); 180*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 181*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize() > size2, true); 182*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(dst.GetSize() > size1, true); 183*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color())); 184*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 185*890232f2SAndroid Build Coastguard Worker } 186*890232f2SAndroid Build Coastguard Worker } 187*890232f2SAndroid Build Coastguard Worker 188*890232f2SAndroid Build Coastguard Worker static void builder_swap_after_finish_test( 189*890232f2SAndroid Build Coastguard Worker bool run = is_same<DestBuilder, SrcBuilder>::value) { 190*890232f2SAndroid Build Coastguard Worker /// Swap is allowed only when lhs and rhs are the same concrete type. 191*890232f2SAndroid Build Coastguard Worker if (run) { 192*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 193*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(src); 194*890232f2SAndroid Build Coastguard Worker src.Finish(root_offset1); 195*890232f2SAndroid Build Coastguard Worker auto size1 = src.GetSize(); 196*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 197*890232f2SAndroid Build Coastguard Worker auto root_offset2 = populate2(dst); 198*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset2); 199*890232f2SAndroid Build Coastguard Worker auto size2 = dst.GetSize(); 200*890232f2SAndroid Build Coastguard Worker src.Swap(dst); 201*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), size2); 202*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(dst.GetSize(), size1); 203*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color())); 204*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color())); 205*890232f2SAndroid Build Coastguard Worker } 206*890232f2SAndroid Build Coastguard Worker } 207*890232f2SAndroid Build Coastguard Worker 208*890232f2SAndroid Build Coastguard Worker static void all_tests() { 209*890232f2SAndroid Build Coastguard Worker empty_builder_movector_test(); 210*890232f2SAndroid Build Coastguard Worker nonempty_builder_movector_test(); 211*890232f2SAndroid Build Coastguard Worker builder_movector_before_finish_test(); 212*890232f2SAndroid Build Coastguard Worker builder_movector_after_finish_test(); 213*890232f2SAndroid Build Coastguard Worker builder_move_assign_before_finish_test(); 214*890232f2SAndroid Build Coastguard Worker builder_move_assign_after_finish_test(); 215*890232f2SAndroid Build Coastguard Worker builder_move_assign_after_release_test(); 216*890232f2SAndroid Build Coastguard Worker builder_move_assign_after_releaseraw_test(DestBuilder()); 217*890232f2SAndroid Build Coastguard Worker builder_swap_before_finish_test(); 218*890232f2SAndroid Build Coastguard Worker builder_swap_after_finish_test(); 219*890232f2SAndroid Build Coastguard Worker } 220*890232f2SAndroid Build Coastguard Worker }; 221*890232f2SAndroid Build Coastguard Worker 222*890232f2SAndroid Build Coastguard Worker enum BuilderReuseTestSelector { 223*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE = 1, 224*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE_RAW = 2, 225*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE_MESSAGE = 3, 226*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN = 4, 227*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN = 5, 228*890232f2SAndroid Build Coastguard Worker REUSABLE_AFTER_RELEASE_MESSAGE_AND_MOVE_ASSIGN = 6 229*890232f2SAndroid Build Coastguard Worker }; 230*890232f2SAndroid Build Coastguard Worker 231*890232f2SAndroid Build Coastguard Worker typedef std::set<BuilderReuseTestSelector> TestSelector; 232*890232f2SAndroid Build Coastguard Worker 233*890232f2SAndroid Build Coastguard Worker template<class DestBuilder, class SrcBuilder> struct BuilderReuseTests { 234*890232f2SAndroid Build Coastguard Worker static void builder_reusable_after_release_test(TestSelector selector) { 235*890232f2SAndroid Build Coastguard Worker if (!selector.count(REUSABLE_AFTER_RELEASE)) { return; } 236*890232f2SAndroid Build Coastguard Worker 237*890232f2SAndroid Build Coastguard Worker DestBuilder fbb; 238*890232f2SAndroid Build Coastguard Worker std::vector<flatbuffers::DetachedBuffer> buffers; 239*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) { 240*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(fbb); 241*890232f2SAndroid Build Coastguard Worker fbb.Finish(root_offset1); 242*890232f2SAndroid Build Coastguard Worker buffers.push_back(fbb.Release()); 243*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color())); 244*890232f2SAndroid Build Coastguard Worker } 245*890232f2SAndroid Build Coastguard Worker } 246*890232f2SAndroid Build Coastguard Worker 247*890232f2SAndroid Build Coastguard Worker static void builder_reusable_after_releaseraw_test(TestSelector selector) { 248*890232f2SAndroid Build Coastguard Worker if (!selector.count(REUSABLE_AFTER_RELEASE_RAW)) { return; } 249*890232f2SAndroid Build Coastguard Worker 250*890232f2SAndroid Build Coastguard Worker DestBuilder fbb; 251*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) { 252*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(fbb); 253*890232f2SAndroid Build Coastguard Worker fbb.Finish(root_offset1); 254*890232f2SAndroid Build Coastguard Worker size_t size, offset; 255*890232f2SAndroid Build Coastguard Worker uint8_t *buf = release_raw_base(fbb, size, offset); 256*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color())); 257*890232f2SAndroid Build Coastguard Worker free_raw(fbb, buf); 258*890232f2SAndroid Build Coastguard Worker } 259*890232f2SAndroid Build Coastguard Worker } 260*890232f2SAndroid Build Coastguard Worker 261*890232f2SAndroid Build Coastguard Worker static void builder_reusable_after_release_and_move_assign_test( 262*890232f2SAndroid Build Coastguard Worker TestSelector selector) { 263*890232f2SAndroid Build Coastguard Worker if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) { return; } 264*890232f2SAndroid Build Coastguard Worker 265*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 266*890232f2SAndroid Build Coastguard Worker std::vector<flatbuffers::DetachedBuffer> buffers; 267*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) { 268*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(dst); 269*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 270*890232f2SAndroid Build Coastguard Worker buffers.push_back(dst.Release()); 271*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color())); 272*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 273*890232f2SAndroid Build Coastguard Worker dst = std::move(src); 274*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 275*890232f2SAndroid Build Coastguard Worker } 276*890232f2SAndroid Build Coastguard Worker } 277*890232f2SAndroid Build Coastguard Worker 278*890232f2SAndroid Build Coastguard Worker static void builder_reusable_after_releaseraw_and_move_assign_test( 279*890232f2SAndroid Build Coastguard Worker TestSelector selector) { 280*890232f2SAndroid Build Coastguard Worker if (!selector.count(REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN)) { return; } 281*890232f2SAndroid Build Coastguard Worker 282*890232f2SAndroid Build Coastguard Worker DestBuilder dst; 283*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) { 284*890232f2SAndroid Build Coastguard Worker auto root_offset1 = populate1(dst); 285*890232f2SAndroid Build Coastguard Worker dst.Finish(root_offset1); 286*890232f2SAndroid Build Coastguard Worker size_t size, offset; 287*890232f2SAndroid Build Coastguard Worker uint8_t *buf = release_raw_base(dst, size, offset); 288*890232f2SAndroid Build Coastguard Worker TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color())); 289*890232f2SAndroid Build Coastguard Worker free_raw(dst, buf); 290*890232f2SAndroid Build Coastguard Worker SrcBuilder src; 291*890232f2SAndroid Build Coastguard Worker dst = std::move(src); 292*890232f2SAndroid Build Coastguard Worker TEST_EQ_FUNC(src.GetSize(), 0); 293*890232f2SAndroid Build Coastguard Worker } 294*890232f2SAndroid Build Coastguard Worker } 295*890232f2SAndroid Build Coastguard Worker 296*890232f2SAndroid Build Coastguard Worker static void run_tests(TestSelector selector) { 297*890232f2SAndroid Build Coastguard Worker builder_reusable_after_release_test(selector); 298*890232f2SAndroid Build Coastguard Worker builder_reusable_after_releaseraw_test(selector); 299*890232f2SAndroid Build Coastguard Worker builder_reusable_after_release_and_move_assign_test(selector); 300*890232f2SAndroid Build Coastguard Worker builder_reusable_after_releaseraw_and_move_assign_test(selector); 301*890232f2SAndroid Build Coastguard Worker } 302*890232f2SAndroid Build Coastguard Worker }; 303*890232f2SAndroid Build Coastguard Worker 304*890232f2SAndroid Build Coastguard Worker #endif // TEST_BUILDER_H 305