xref: /aosp_15_r20/external/flatbuffers/tests/test_builder.h (revision 890232f25432b36107d06881e0a25aaa6b473652)
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