userver: /data/code/userver/libraries/proto-structs/tests/structs.cpp Source File
Loading...
Searching...
No Matches
structs.cpp
1#include "structs.hpp"
2
3#include <gtest/gtest.h>
4
5#include <google/protobuf/util/time_util.h>
6
7#include <userver/proto-structs/io/impl/read.hpp>
8#include <userver/proto-structs/io/impl/write.hpp>
9#include <userver/proto-structs/io/supported_types_conv.hpp>
10
11#include "messages.pb.h"
12
13namespace structs {
14
15ConversionFailure
16ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<ConversionFailure>, const messages::ConversionFailure& msg) {
17 if (msg.error_type() == messages::ConversionFailure::TYPE_EXCEPTION) {
18 throw std::runtime_error("conversion_failure_exception");
19 } else if (msg.error_type() == messages::ConversionFailure::TYPE_ERROR) {
20 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber, "conversion_failure_error");
21 } else {
22 ctx.AddError(1001, "conversion_failure_error_with_unknown_field");
23 }
24
25 return {};
26}
27
28void WriteProtoStruct(ups::io::WriteContext& ctx, const ConversionFailure& obj, messages::ConversionFailure&) {
29 if (obj.error_type == ConversionFailureType::kException) {
30 throw std::runtime_error("conversion_failure_exception");
31 } else if (obj.error_type == ConversionFailureType::kError) {
32 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber, "conversion_failure_error");
33 } else {
34 ctx.AddError(1001, "conversion_failure_error_with_unknown_field");
35 }
36}
37
38Scalar ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Scalar>, const messages::Scalar& msg) {
39 return {
40 .f1 = ups::io::impl::ReadField<bool>(
41 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::f1)
42 ),
43 .f2 = ups::io::impl::ReadField<int32_t>(
44 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::f2)
45 ),
46 .f3 = ups::io::impl::ReadField<uint32_t>(
47 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::f3)
48 ),
49 .f4 = ups::io::impl::ReadField<int64_t>(
50 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::f4)
51 ),
52 .f5 = ups::io::impl::ReadField<uint64_t>(
53 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::f5)
54 ),
55 .f6 = ups::io::impl::ReadField<float>(
56 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::f6)
57 ),
58 .f7 = ups::io::impl::ReadField<double>(
59 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::f7)
60 ),
61 .f8 = ups::io::impl::ReadField<std::string>(
62 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF8FieldNumber, &messages::Scalar::f8)
63 ),
64 .f9 = ups::io::impl::ReadField<std::string>(
65 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF9FieldNumber, &messages::Scalar::f9)
66 ),
67 .f10 = ups::io::impl::ReadField<TestEnum>(
68 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::f10)
69 ),
70 .f11 = ups::io::impl::ReadField<std::size_t>(
71 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::f11)
72 )};
73}
74
75template <typename T>
76void WriteScalarStruct(ups::io::WriteContext& ctx, T&& obj, messages::Scalar& msg) {
77 ups::io::impl::WriteField(
78 ctx,
79 std::forward<T>(obj).f1,
80 ups::io::impl::CreateFieldSetter(
81 msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::set_f1, &messages::Scalar::clear_f1
82 )
83 );
84 ups::io::impl::WriteField(
85 ctx,
86 std::forward<T>(obj).f2,
87 ups::io::impl::CreateFieldSetter(
88 msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::set_f2, &messages::Scalar::clear_f2
89 )
90 );
91 ups::io::impl::WriteField(
92 ctx,
93 std::forward<T>(obj).f3,
94 ups::io::impl::CreateFieldSetter(
95 msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::set_f3, &messages::Scalar::clear_f3
96 )
97 );
98 ups::io::impl::WriteField(
99 ctx,
100 std::forward<T>(obj).f4,
101 ups::io::impl::CreateFieldSetter(
102 msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::set_f4, &messages::Scalar::clear_f4
103 )
104 );
105 ups::io::impl::WriteField(
106 ctx,
107 std::forward<T>(obj).f5,
108 ups::io::impl::CreateFieldSetter(
109 msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::set_f5, &messages::Scalar::clear_f5
110 )
111 );
112 ups::io::impl::WriteField(
113 ctx,
114 std::forward<T>(obj).f6,
115 ups::io::impl::CreateFieldSetter(
116 msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::set_f6, &messages::Scalar::clear_f6
117 )
118 );
119 ups::io::impl::WriteField(
120 ctx,
121 std::forward<T>(obj).f7,
122 ups::io::impl::CreateFieldSetter(
123 msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::set_f7, &messages::Scalar::clear_f7
124 )
125 );
126 ups::io::impl::WriteField(
127 ctx,
128 std::forward<T>(obj).f8,
129 ups::io::impl::CreateFieldSetter(
130 msg,
131 messages::Scalar::kF8FieldNumber,
132 &messages::Scalar::set_f8<const std::string&>,
133 &messages::Scalar::set_f8<std::string>,
134 &messages::Scalar::clear_f8
135 )
136 );
137 ups::io::impl::WriteField(
138 ctx,
139 std::forward<T>(obj).f9,
140 ups::io::impl::CreateFieldSetter(
141 msg,
142 messages::Scalar::kF9FieldNumber,
143 &messages::Scalar::set_f9<const std::string&>,
144 &messages::Scalar::set_f9<std::string>,
145 &messages::Scalar::clear_f9
146 )
147 );
148 ups::io::impl::WriteField(
149 ctx,
150 std::forward<T>(obj).f10,
151 ups::io::impl::CreateFieldSetter(
152 msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::set_f10, &messages::Scalar::clear_f10
153 )
154 );
155 ups::io::impl::WriteField(
156 ctx,
157 std::forward<T>(obj).f11,
158 ups::io::impl::CreateFieldSetter(
159 msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::set_f11, &messages::Scalar::clear_f11
160 )
161 );
162}
163
164void WriteProtoStruct(ups::io::WriteContext& ctx, const Scalar& obj, messages::Scalar& msg) {
165 WriteScalarStruct(ctx, obj, msg);
166}
167
168void WriteProtoStruct(ups::io::WriteContext& ctx, Scalar&& obj, messages::Scalar& msg) {
169 WriteScalarStruct(ctx, std::move(obj), msg);
170}
171
172WellKnownStd ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownStd>, const messages::WellKnownStd& msg) {
173 return {
174 .f1 = ups::io::impl::ReadField<std::chrono::time_point<std::chrono::system_clock>>(
175 ctx,
176 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF1FieldNumber, &messages::WellKnownStd::f1)
177 ),
178 .f2 = ups::io::impl::ReadField<std::chrono::milliseconds>(
179 ctx,
180 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF2FieldNumber, &messages::WellKnownStd::f2)
181 ),
182 .f3 = ups::io::impl::ReadField<std::chrono::year_month_day>(
183 ctx,
184 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF3FieldNumber, &messages::WellKnownStd::f3)
185 ),
186 .f4 = ups::io::impl::ReadField<std::chrono::hh_mm_ss<std::chrono::microseconds>>(
187 ctx,
188 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF4FieldNumber, &messages::WellKnownStd::f4)
189 )};
190}
191
192template <typename T>
193void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownStd& msg) {
194 ups::io::impl::WriteField(
195 ctx,
196 std::forward<T>(obj).f1,
197 ups::io::impl::CreateFieldSetter(
198 msg,
199 messages::WellKnownStd::kF1FieldNumber,
200 &messages::WellKnownStd::mutable_f1,
201 &messages::WellKnownStd::clear_f1
202 )
203 );
204 ups::io::impl::WriteField(
205 ctx,
206 std::forward<T>(obj).f2,
207 ups::io::impl::CreateFieldSetter(
208 msg,
209 messages::WellKnownStd::kF2FieldNumber,
210 &messages::WellKnownStd::mutable_f2,
211 &messages::WellKnownStd::clear_f2
212 )
213 );
214 ups::io::impl::WriteField(
215 ctx,
216 std::forward<T>(obj).f3,
217 ups::io::impl::CreateFieldSetter(
218 msg,
219 messages::WellKnownStd::kF3FieldNumber,
220 &messages::WellKnownStd::mutable_f3,
221 &messages::WellKnownStd::clear_f3
222 )
223 );
224 ups::io::impl::WriteField(
225 ctx,
226 std::forward<T>(obj).f4,
227 ups::io::impl::CreateFieldSetter(
228 msg,
229 messages::WellKnownStd::kF4FieldNumber,
230 &messages::WellKnownStd::mutable_f4,
231 &messages::WellKnownStd::clear_f4
232 )
233 );
234}
235
236void WriteProtoStruct(ups::io::WriteContext& ctx, const WellKnownStd& obj, messages::WellKnownStd& msg) {
237 WriteWellKnownStruct(ctx, obj, msg);
238}
239
240void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownStd&& obj, messages::WellKnownStd& msg) {
241 WriteWellKnownStruct(ctx, std::move(obj), msg);
242}
243
244WellKnownUsrv
245ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownUsrv>, const messages::WellKnownUsrv& msg) {
246 return {
247 .f1 = ups::io::impl::ReadField<ups::Any>(
248 ctx,
249 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF1FieldNumber, &messages::WellKnownUsrv::f1)
250 ),
251 .f2 = ups::io::impl::ReadField<ups::Timestamp>(
252 ctx,
253 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF2FieldNumber, &messages::WellKnownUsrv::f2)
254 ),
255 .f3 = ups::io::impl::ReadField<ups::Duration>(
256 ctx,
257 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF3FieldNumber, &messages::WellKnownUsrv::f3)
258 ),
259 .f4 = ups::io::impl::ReadField<ups::Date>(
260 ctx,
261 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF4FieldNumber, &messages::WellKnownUsrv::f4)
262 ),
263 .f5 = ups::io::impl::ReadField<ups::TimeOfDay>(
264 ctx,
265 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF5FieldNumber, &messages::WellKnownUsrv::f5)
266 ),
267 .f6 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::datetime::TimeOfDay<std::chrono::microseconds>>(
268 ctx,
269 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF6FieldNumber, &messages::WellKnownUsrv::f6)
270 ),
271 .f7 = ups::io::impl::ReadField<USERVER_NAMESPACE::decimal64::Decimal<3>>(
272 ctx,
273 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF7FieldNumber, &messages::WellKnownUsrv::f7)
274 )};
275}
276
277template <typename T>
278void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownUsrv& msg) {
279 ups::io::impl::WriteField(
280 ctx,
281 std::forward<T>(obj).f1,
282 ups::io::impl::CreateFieldSetter(
283 msg,
284 messages::WellKnownUsrv::kF1FieldNumber,
285 &messages::WellKnownUsrv::mutable_f1,
286 &messages::WellKnownUsrv::clear_f1
287 )
288 );
289 ups::io::impl::WriteField(
290 ctx,
291 std::forward<T>(obj).f2,
292 ups::io::impl::CreateFieldSetter(
293 msg,
294 messages::WellKnownUsrv::kF2FieldNumber,
295 &messages::WellKnownUsrv::mutable_f2,
296 &messages::WellKnownUsrv::clear_f2
297 )
298 );
299 ups::io::impl::WriteField(
300 ctx,
301 std::forward<T>(obj).f3,
302 ups::io::impl::CreateFieldSetter(
303 msg,
304 messages::WellKnownUsrv::kF3FieldNumber,
305 &messages::WellKnownUsrv::mutable_f3,
306 &messages::WellKnownUsrv::clear_f3
307 )
308 );
309 ups::io::impl::WriteField(
310 ctx,
311 std::forward<T>(obj).f4,
312 ups::io::impl::CreateFieldSetter(
313 msg,
314 messages::WellKnownUsrv::kF4FieldNumber,
315 &messages::WellKnownUsrv::mutable_f4,
316 &messages::WellKnownUsrv::clear_f4
317 )
318 );
319 ups::io::impl::WriteField(
320 ctx,
321 std::forward<T>(obj).f5,
322 ups::io::impl::CreateFieldSetter(
323 msg,
324 messages::WellKnownUsrv::kF5FieldNumber,
325 &messages::WellKnownUsrv::mutable_f5,
326 &messages::WellKnownUsrv::clear_f5
327 )
328 );
329 ups::io::impl::WriteField(
330 ctx,
331 std::forward<T>(obj).f6,
332 ups::io::impl::CreateFieldSetter(
333 msg,
334 messages::WellKnownUsrv::kF6FieldNumber,
335 &messages::WellKnownUsrv::mutable_f6,
336 &messages::WellKnownUsrv::clear_f6
337 )
338 );
339 ups::io::impl::WriteField(
340 ctx,
341 std::forward<T>(obj).f7,
342 ups::io::impl::CreateFieldSetter(
343 msg,
344 messages::WellKnownUsrv::kF7FieldNumber,
345 &messages::WellKnownUsrv::mutable_f7,
346 &messages::WellKnownUsrv::clear_f7
347 )
348 );
349}
350
351void WriteProtoStruct(ups::io::WriteContext& ctx, const WellKnownUsrv& obj, messages::WellKnownUsrv& msg) {
352 WriteWellKnownStruct(ctx, obj, msg);
353}
354
355void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownUsrv&& obj, messages::WellKnownUsrv& msg) {
356 WriteWellKnownStruct(ctx, std::move(obj), msg);
357}
358
359Optional ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Optional>, const messages::Optional& msg) {
360 return {
361 .f1 = ups::io::impl::ReadField<std::optional<int32_t>>(
362 ctx,
363 ups::io::impl::CreateFieldGetter(
364 msg, messages::Optional::kF1FieldNumber, &messages::Optional::f1, &messages::Optional::has_f1
365 )
366 ),
367 .f2 = ups::io::impl::ReadField<std::optional<std::string>>(
368 ctx,
369 ups::io::impl::CreateFieldGetter(
370 msg, messages::Optional::kF2FieldNumber, &messages::Optional::f2, &messages::Optional::has_f2
371 )
372 ),
373 .f3 = ups::io::impl::ReadField<std::optional<TestEnum>>(
374 ctx,
375 ups::io::impl::CreateFieldGetter(
376 msg, messages::Optional::kF3FieldNumber, &messages::Optional::f3, &messages::Optional::has_f3
377 )
378 ),
379 .f4 = ups::io::impl::ReadField<std::optional<Simple>>(
380 ctx,
381 ups::io::impl::CreateFieldGetter(
382 msg, messages::Optional::kF4FieldNumber, &messages::Optional::f4, &messages::Optional::has_f4
383 )
384 )};
385}
386
387template <typename T>
388void WriteOptionalStruct(ups::io::WriteContext& ctx, T&& obj, messages::Optional& msg) {
389 ups::io::impl::WriteField(
390 ctx,
391 std::forward<T>(obj).f1,
392 ups::io::impl::CreateFieldSetter(
393 msg, messages::Optional::kF1FieldNumber, &messages::Optional::set_f1, &messages::Optional::clear_f1
394 )
395 );
396 ups::io::impl::WriteField(
397 ctx,
398 std::forward<T>(obj).f2,
399 ups::io::impl::CreateFieldSetter(
400 msg,
401 messages::Optional::kF2FieldNumber,
402 &messages::Optional::set_f2<const std::string&>,
403 &messages::Optional::set_f2<std::string>,
404 &messages::Optional::clear_f2
405 )
406 );
407 ups::io::impl::WriteField(
408 ctx,
409 std::forward<T>(obj).f3,
410 ups::io::impl::CreateFieldSetter(
411 msg, messages::Optional::kF3FieldNumber, &messages::Optional::set_f3, &messages::Optional::clear_f3
412 )
413 );
414 ups::io::impl::WriteField(
415 ctx,
416 std::forward<T>(obj).f4,
417 ups::io::impl::CreateFieldSetter(
418 msg, messages::Optional::kF4FieldNumber, &messages::Optional::mutable_f4, &messages::Optional::clear_f4
419 )
420 );
421}
422
423void WriteProtoStruct(ups::io::WriteContext& ctx, const Optional& obj, messages::Optional& msg) {
424 WriteOptionalStruct(ctx, obj, msg);
425}
426void WriteProtoStruct(ups::io::WriteContext& ctx, Optional&& obj, messages::Optional& msg) {
427 WriteOptionalStruct(ctx, std::move(obj), msg);
428}
429
430Repeated ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Repeated>, const messages::Repeated& msg) {
431 return {
432 .f1 = ups::io::impl::ReadField<std::vector<int32_t>>(
433 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::f1)
434 ),
435 .f2 = ups::io::impl::ReadField<std::vector<std::string>>(
436 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::f2)
437 ),
438 .f3 = ups::io::impl::ReadField<std::vector<TestEnum>>(
439 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::f3)
440 ),
441 .f4 = ups::io::impl::ReadField<std::vector<Simple>>(
442 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::f4)
443 )};
444}
445
446template <typename T>
447void WriteRepeatedStruct(ups::io::WriteContext& ctx, T&& obj, messages::Repeated& msg) {
448 ups::io::impl::WriteField(
449 ctx,
450 std::forward<T>(obj).f1,
451 ups::io::impl::CreateFieldSetter(
452 msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::mutable_f1, &messages::Repeated::clear_f1
453 )
454 );
455 ups::io::impl::WriteField(
456 ctx,
457 std::forward<T>(obj).f2,
458 ups::io::impl::CreateFieldSetter(
459 msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::mutable_f2, &messages::Repeated::clear_f2
460 )
461 );
462 ups::io::impl::WriteField(
463 ctx,
464 std::forward<T>(obj).f3,
465 ups::io::impl::CreateFieldSetter(
466 msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::mutable_f3, &messages::Repeated::clear_f3
467 )
468 );
469 ups::io::impl::WriteField(
470 ctx,
471 std::forward<T>(obj).f4,
472 ups::io::impl::CreateFieldSetter(
473 msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::mutable_f4, &messages::Repeated::clear_f4
474 )
475 );
476}
477
478void WriteProtoStruct(ups::io::WriteContext& ctx, const Repeated& obj, messages::Repeated& msg) {
479 WriteRepeatedStruct(ctx, obj, msg);
480}
481
482void WriteProtoStruct(ups::io::WriteContext& ctx, Repeated&& obj, messages::Repeated& msg) {
483 WriteRepeatedStruct(ctx, std::move(obj), msg);
484}
485
486Map ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Map>, const messages::Map& msg) {
487 return {
488 .f1 = ups::io::impl::ReadField<std::map<int32_t, int32_t>>(
489 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF1FieldNumber, &messages::Map::f1)
490 ),
491 .f2 = ups::io::impl::ReadField<std::unordered_map<std::string, std::string>>(
492 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF2FieldNumber, &messages::Map::f2)
493 ),
494 .f3 = ups::io::impl::ReadField<std::map<bool, TestEnum>>(
495 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF3FieldNumber, &messages::Map::f3)
496 ),
497 .f4 = ups::io::impl::ReadField<std::unordered_map<std::string, Simple, USERVER_NAMESPACE::utils::StrCaseHash>>(
498 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF4FieldNumber, &messages::Map::f4)
499 )};
500}
501
502template <typename T>
503void WriteMapStruct(ups::io::WriteContext& ctx, T&& obj, messages::Map& msg) {
504 ups::io::impl::WriteField(
505 ctx,
506 std::forward<T>(obj).f1,
507 ups::io::impl::CreateFieldSetter(
508 msg, messages::Map::kF1FieldNumber, &messages::Map::mutable_f1, &messages::Map::clear_f1
509 )
510 );
511 ups::io::impl::WriteField(
512 ctx,
513 std::forward<T>(obj).f2,
514 ups::io::impl::CreateFieldSetter(
515 msg, messages::Map::kF2FieldNumber, &messages::Map::mutable_f2, &messages::Map::clear_f2
516 )
517 );
518 ups::io::impl::WriteField(
519 ctx,
520 std::forward<T>(obj).f3,
521 ups::io::impl::CreateFieldSetter(
522 msg, messages::Map::kF3FieldNumber, &messages::Map::mutable_f3, &messages::Map::clear_f3
523 )
524 );
525 ups::io::impl::WriteField(
526 ctx,
527 std::forward<T>(obj).f4,
528 ups::io::impl::CreateFieldSetter(
529 msg, messages::Map::kF4FieldNumber, &messages::Map::mutable_f4, &messages::Map::clear_f4
530 )
531 );
532}
533
534void WriteProtoStruct(ups::io::WriteContext& ctx, const Map& obj, messages::Map& msg) { WriteMapStruct(ctx, obj, msg); }
535
536void WriteProtoStruct(ups::io::WriteContext& ctx, Map&& obj, messages::Map& msg) {
537 WriteMapStruct(ctx, std::move(obj), msg);
538}
539
540Oneof ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Oneof>, const messages::Oneof& msg) {
541 return {
542 .test_oneof = ups::io::impl::ReadField<Oneof::Type>(
543 ctx,
544 ups::io::impl::CreateFieldGetter(
545 msg, messages::Oneof::kF1FieldNumber, &messages::Oneof::f1, &messages::Oneof::has_f1
546 ),
547 ups::io::impl::CreateFieldGetter(
548 msg, messages::Oneof::kF2FieldNumber, &messages::Oneof::f2, &messages::Oneof::has_f2
549 ),
550 ups::io::impl::CreateFieldGetter(
551 msg, messages::Oneof::kF3FieldNumber, &messages::Oneof::f3, &messages::Oneof::has_f3
552 ),
553 ups::io::impl::CreateFieldGetter(
554 msg, messages::Oneof::kF4FieldNumber, &messages::Oneof::f4, &messages::Oneof::has_f4
555 )
556 )};
557}
558
559template <typename T>
560void WriteOneofStruct(ups::io::WriteContext& ctx, T&& obj, messages::Oneof& msg) {
561 ups::io::impl::WriteField(
562 ctx,
563 std::forward<T>(obj).test_oneof,
564 ups::io::impl::CreateFieldSetter(
565 msg, messages::Oneof::kF1FieldNumber, &messages::Oneof::set_f1, &messages::Oneof::clear_f1
566 ),
567 ups::io::impl::CreateFieldSetter(
568 msg,
569 messages::Oneof::kF2FieldNumber,
570 &messages::Oneof::set_f2<const std::string&>,
571 &messages::Oneof::set_f2<std::string>,
572 &messages::Oneof::clear_f2
573 ),
574 ups::io::impl::CreateFieldSetter(
575 msg, messages::Oneof::kF3FieldNumber, &messages::Oneof::set_f3, &messages::Oneof::clear_f3
576 ),
577 ups::io::impl::CreateFieldSetter(
578 msg, messages::Oneof::kF4FieldNumber, &messages::Oneof::mutable_f4, &messages::Oneof::clear_f4
579 )
580 );
581}
582
583void WriteProtoStruct(ups::io::WriteContext& ctx, const Oneof& obj, messages::Oneof& msg) {
584 WriteOneofStruct(ctx, obj, msg);
585}
586
587void WriteProtoStruct(ups::io::WriteContext& ctx, Oneof&& obj, messages::Oneof& msg) {
588 WriteOneofStruct(ctx, std::move(obj), msg);
589}
590
591Indirect ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Indirect>, const messages::Indirect& msg) {
592 return {
593 .f1 = ups::io::impl::ReadField<Indirect::Box<Simple>>(
594 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::f1)
595 ),
596 .f2 = ups::io::impl::ReadField<std::optional<Indirect::Box<ups::Duration>>>(
597 ctx,
598 ups::io::impl::CreateFieldGetter(
599 msg, messages::Indirect::kF2FieldNumber, &messages::Indirect::f2, &messages::Indirect::has_f2
600 )
601 ),
602 .f3 = ups::io::impl::ReadField<std::vector<Indirect::Box<Simple>>>(
603 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::f3)
604 ),
605 .f4 = ups::io::impl::ReadField<std::map<int32_t, Indirect::Box<Simple>>>(
606 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::f4)
607 ),
608 .test_oneof = ups::io::impl::ReadField<Indirect::OneofType>(
609 ctx,
610 ups::io::impl::CreateFieldGetter(
611 msg, messages::Indirect::kF5FieldNumber, &messages::Indirect::f5, &messages::Indirect::has_f5
612 ),
613 ups::io::impl::CreateFieldGetter(
614 msg, messages::Indirect::kF6FieldNumber, &messages::Indirect::f6, &messages::Indirect::has_f6
615 )
616 ),
617 .f7 = ups::io::impl::ReadField<Indirect::Box<int32_t>>(
618 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::f7)
619 ),
620 .f8 = ups::io::impl::ReadField<Indirect::Box<std::vector<Indirect::Box<TestEnum>>>>(
621 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::f8)
622 ),
623 .f9 = ups::io::impl::ReadField<Indirect::Box<std::map<std::string, Indirect::Box<Simple>>>>(
624 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::f9)
625 )};
626}
627
628template <typename T>
629void WriteIndirectStruct(ups::io::WriteContext& ctx, T&& obj, messages::Indirect& msg) {
630 ups::io::impl::WriteField(
631 ctx,
632 std::forward<T>(obj).f1,
633 ups::io::impl::CreateFieldSetter(
634 msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::mutable_f1, &messages::Indirect::clear_f1
635 )
636 );
637 ups::io::impl::WriteField(
638 ctx,
639 std::forward<T>(obj).f2,
640 ups::io::impl::CreateFieldSetter(
641 msg, messages::Indirect::kF2FieldNumber, &messages::Indirect::mutable_f2, &messages::Indirect::clear_f2
642 )
643 );
644 ups::io::impl::WriteField(
645 ctx,
646 std::forward<T>(obj).f3,
647 ups::io::impl::CreateFieldSetter(
648 msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::mutable_f3, &messages::Indirect::clear_f3
649 )
650 );
651 ups::io::impl::WriteField(
652 ctx,
653 std::forward<T>(obj).f4,
654 ups::io::impl::CreateFieldSetter(
655 msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::mutable_f4, &messages::Indirect::clear_f4
656 )
657 );
658 ups::io::impl::WriteField(
659 ctx,
660 std::forward<T>(obj).test_oneof,
661 ups::io::impl::CreateFieldSetter(
662 msg, messages::Indirect::kF5FieldNumber, &messages::Indirect::mutable_f5, &messages::Indirect::clear_f5
663 ),
664 ups::io::impl::CreateFieldSetter(
665 msg,
666 messages::Indirect::kF6FieldNumber,
667 &messages::Indirect::set_f6<const std::string&>,
668 &messages::Indirect::set_f6<std::string>,
669 &messages::Indirect::clear_f6
670 )
671 );
672 ups::io::impl::WriteField(
673 ctx,
674 std::forward<T>(obj).f7,
675 ups::io::impl::CreateFieldSetter(
676 msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::set_f7, &messages::Indirect::clear_f7
677 )
678 );
679 ups::io::impl::WriteField(
680 ctx,
681 std::forward<T>(obj).f8,
682 ups::io::impl::CreateFieldSetter(
683 msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::mutable_f8, &messages::Indirect::clear_f8
684 )
685 );
686 ups::io::impl::WriteField(
687 ctx,
688 std::forward<T>(obj).f9,
689 ups::io::impl::CreateFieldSetter(
690 msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::mutable_f9, &messages::Indirect::clear_f9
691 )
692 );
693}
694
695void WriteProtoStruct(ups::io::WriteContext& ctx, const Indirect& obj, messages::Indirect& msg) {
696 WriteIndirectStruct(ctx, obj, msg);
697}
698
699void WriteProtoStruct(ups::io::WriteContext& ctx, Indirect&& obj, messages::Indirect& msg) {
700 WriteIndirectStruct(ctx, std::move(obj), msg);
701}
702
703Strong ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Strong>, const messages::Strong& msg) {
704 return {
705 .f1 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, int32_t>>(
706 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF1FieldNumber, &messages::Strong::f1)
707 ),
708 .f2 =
709 ups::io::impl::ReadField<std::optional<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, std::string>>>(
710 ctx,
711 ups::io::impl::CreateFieldGetter(
712 msg, messages::Strong::kF2FieldNumber, &messages::Strong::f2, &messages::Strong::has_f2
713 )
714 ),
715 .f3 = ups::io::impl::ReadField<std::vector<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, TestEnum>>>(
716 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF3FieldNumber, &messages::Strong::f3)
717 ),
718 .f4 = ups::io::impl::ReadField<std::map<int32_t, USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, Simple>>>(
719 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF4FieldNumber, &messages::Strong::f4)
720 ),
721 .test_oneof = ups::io::impl::ReadField<Strong::OneofType>(
722 ctx,
723 ups::io::impl::CreateFieldGetter(
724 msg, messages::Strong::kF5FieldNumber, &messages::Strong::f5, &messages::Strong::has_f5
725 )
726 )};
727}
728
729template <typename T>
730void WriteStrongStruct(ups::io::WriteContext& ctx, T&& obj, messages::Strong& msg) {
731 ups::io::impl::WriteField(
732 ctx,
733 std::forward<T>(obj).f1,
734 ups::io::impl::CreateFieldSetter(
735 msg, messages::Strong::kF1FieldNumber, &messages::Strong::set_f1, &messages::Strong::clear_f1
736 )
737 );
738 ups::io::impl::WriteField(
739 ctx,
740 std::forward<T>(obj).f2,
741 ups::io::impl::CreateFieldSetter(
742 msg,
743 messages::Strong::kF2FieldNumber,
744 &messages::Strong::set_f2<const std::string&>,
745 &messages::Strong::set_f2<std::string>,
746 &messages::Strong::clear_f2
747 )
748 );
749 ups::io::impl::WriteField(
750 ctx,
751 std::forward<T>(obj).f3,
752 ups::io::impl::CreateFieldSetter(
753 msg, messages::Strong::kF3FieldNumber, &messages::Strong::mutable_f3, &messages::Strong::clear_f3
754 )
755 );
756 ups::io::impl::WriteField(
757 ctx,
758 std::forward<T>(obj).f4,
759 ups::io::impl::CreateFieldSetter(
760 msg, messages::Strong::kF4FieldNumber, &messages::Strong::mutable_f4, &messages::Strong::clear_f4
761 )
762 );
763 ups::io::impl::WriteField(
764 ctx,
765 std::forward<T>(obj).test_oneof,
766 ups::io::impl::CreateFieldSetter(
767 msg, messages::Strong::kF1FieldNumber, &messages::Strong::mutable_f5, &messages::Strong::clear_f5
768 )
769 );
770}
771
772void WriteProtoStruct(ups::io::WriteContext& ctx, const Strong& obj, messages::Strong& msg) {
773 WriteStrongStruct(ctx, obj, msg);
774}
775
776void WriteProtoStruct(ups::io::WriteContext& ctx, Strong&& obj, messages::Strong& msg) {
777 WriteStrongStruct(ctx, std::move(obj), msg);
778}
779
780Erroneous ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Erroneous>, const messages::Erroneous& msg) {
781 return {
782 .f1 = ups::io::impl::ReadField<std::optional<ConversionFailure>>(
783 ctx,
784 ups::io::impl::CreateFieldGetter(
785 msg, messages::Erroneous::kF1FieldNumber, &messages::Erroneous::f1, &messages::Erroneous::has_f1
786 )
787 ),
788 .f2 = ups::io::impl::ReadField<std::vector<ConversionFailure>>(
789 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::f2)
790 ),
791 .f3 = ups::io::impl::ReadField<std::unordered_map<int32_t, ConversionFailure>>(
792 ctx, ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::f3)
793 ),
794 .test_oneof = ups::io::impl::ReadField<Erroneous::OneofType>(
795 ctx,
796 ups::io::impl::CreateFieldGetter(
797 msg, messages::Erroneous::kF4FieldNumber, &messages::Erroneous::f4, &messages::Erroneous::has_f4
798 )
799 )};
800}
801
802void WriteProtoStruct(ups::io::WriteContext& ctx, const Erroneous& obj, messages::Erroneous& msg) {
803 ups::io::impl::WriteField(
804 ctx,
805 obj.f1,
806 ups::io::impl::CreateFieldSetter(
807 msg, messages::Erroneous::kF1FieldNumber, &messages::Erroneous::mutable_f1, &messages::Erroneous::clear_f1
808 )
809 );
810 ups::io::impl::WriteField(
811 ctx,
812 obj.f2,
813 ups::io::impl::CreateFieldSetter(
814 msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::mutable_f2, &messages::Erroneous::clear_f2
815 )
816 );
817 ups::io::impl::WriteField(
818 ctx,
819 obj.f3,
820 ups::io::impl::CreateFieldSetter(
821 msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::mutable_f3, &messages::Erroneous::clear_f3
822 )
823 );
824 ups::io::impl::WriteField(
825 ctx,
826 obj.test_oneof,
827 ups::io::impl::CreateFieldSetter(
828 msg, messages::Erroneous::kF4FieldNumber, &messages::Erroneous::mutable_f4, &messages::Erroneous::clear_f4
829 )
830 );
831}
832
833void CheckScalarEqual(const Scalar& obj, const messages::Scalar& msg) {
834 EXPECT_EQ(obj.f1, msg.f1());
835 EXPECT_EQ(obj.f2, msg.f2());
836 EXPECT_EQ(obj.f3, msg.f3());
837 EXPECT_EQ(obj.f4, msg.f4());
838 EXPECT_EQ(obj.f5, msg.f5());
839 EXPECT_EQ(obj.f6, msg.f6());
840 EXPECT_EQ(obj.f7, msg.f7());
841 EXPECT_EQ(obj.f8, msg.f8());
842 EXPECT_EQ(obj.f9, msg.f9());
843 EXPECT_EQ(obj.f10, static_cast<TestEnum>(msg.f10()));
844 EXPECT_EQ(static_cast<int>(obj.f11), msg.f11());
845}
846
847void CheckWellKnownStdEqual(const WellKnownStd& obj, const messages::WellKnownStd& msg) {
848 using TimeType = std::chrono::time_point<std::chrono::system_clock>;
849
850 EXPECT_EQ(
851 obj.f1.time_since_epoch(),
852 std::chrono::duration_cast<TimeType::duration>(std::chrono::nanoseconds{
853 ::google::protobuf::util::TimeUtil::TimestampToNanoseconds(msg.f1())})
854 );
855 EXPECT_EQ(
856 obj.f2,
857 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds{
858 ::google::protobuf::util::TimeUtil::DurationToNanoseconds(msg.f2())})
859 );
860
861 EXPECT_EQ(static_cast<int>(obj.f3.year()), msg.f3().year());
862 EXPECT_EQ(static_cast<unsigned>(obj.f3.month()), static_cast<unsigned>(msg.f3().month()));
863 EXPECT_EQ(static_cast<unsigned>(obj.f3.day()), static_cast<unsigned>(msg.f3().day()));
864
865 EXPECT_EQ(obj.f4.hours().count(), msg.f4().hours());
866 EXPECT_EQ(obj.f4.minutes().count(), msg.f4().minutes());
867 EXPECT_EQ(obj.f4.seconds().count(), msg.f4().seconds());
868 EXPECT_EQ(
869 obj.f4.subseconds().count(),
870 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f4().nanos())).count()
871 );
872}
873
874void CheckWellKnownUsrvEqual(const WellKnownUsrv& obj, const messages::WellKnownUsrv& msg) {
875 EXPECT_EQ(obj.f1.GetProtobufAny().type_url(), msg.f1().type_url());
876 EXPECT_EQ(obj.f1.GetProtobufAny().value(), msg.f1().value());
877
878 EXPECT_EQ(obj.f2.Seconds().count(), msg.f2().seconds());
879 EXPECT_EQ(obj.f2.Nanos().count(), msg.f2().nanos());
880
881 EXPECT_EQ(obj.f3.Seconds().count(), msg.f3().seconds());
882 EXPECT_EQ(obj.f3.Nanos().count(), msg.f3().nanos());
883
884 EXPECT_EQ(obj.f4.YearNum(), msg.f4().year());
885 EXPECT_EQ(obj.f4.MonthNum(), msg.f4().month());
886 EXPECT_EQ(obj.f4.DayNum(), msg.f4().day());
887
888 EXPECT_EQ(obj.f5.Hours().count(), msg.f5().hours());
889 EXPECT_EQ(obj.f5.Minutes().count(), msg.f5().minutes());
890 EXPECT_EQ(obj.f5.Seconds().count(), msg.f5().seconds());
891 EXPECT_EQ(obj.f5.Nanos().count(), msg.f5().nanos());
892
893 EXPECT_EQ(obj.f6.Hours().count(), msg.f6().hours());
894 EXPECT_EQ(obj.f6.Minutes().count(), msg.f6().minutes());
895 EXPECT_EQ(obj.f6.Seconds().count(), msg.f6().seconds());
896 EXPECT_EQ(
897 obj.f6.Subseconds().count(),
898 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f6().nanos())).count()
899 );
900
901 EXPECT_EQ(obj.f7, decimal64::Decimal<3>(msg.f7().value()));
902 EXPECT_EQ(ToString(obj.f7), msg.f7().value());
903}
904
905void CheckOptionalEqual(const Optional& obj, const messages::Optional& msg) {
906 if (obj.f1) {
907 EXPECT_TRUE(msg.has_f1());
908 EXPECT_EQ(obj.f1.value(), msg.f1());
909 } else {
910 EXPECT_FALSE(msg.has_f1());
911 }
912
913 if (obj.f2) {
914 EXPECT_TRUE(msg.has_f2());
915 EXPECT_EQ(obj.f2.value(), msg.f2());
916 } else {
917 EXPECT_FALSE(msg.has_f2());
918 }
919
920 if (obj.f3) {
921 EXPECT_TRUE(msg.has_f3());
922 EXPECT_EQ(obj.f3.value(), static_cast<TestEnum>(msg.f3()));
923 } else {
924 EXPECT_FALSE(msg.has_f3());
925 }
926
927 if (obj.f4) {
928 EXPECT_TRUE(msg.has_f4());
929 CheckSimpleEqual(obj.f4.value(), msg.f4());
930 } else {
931 EXPECT_FALSE(msg.has_f4());
932 }
933}
934
935void CheckRepeatedEqual(const Repeated& obj, const messages::Repeated& msg) {
936 ASSERT_EQ(obj.f1.size(), static_cast<std::size_t>(msg.f1().size()));
937
938 for (int i = 0; i < msg.f1().size(); ++i) {
939 EXPECT_EQ(obj.f1[i], msg.f1()[i]);
940 }
941
942 ASSERT_EQ(obj.f2.size(), static_cast<std::size_t>(msg.f2().size()));
943
944 for (int i = 0; i < msg.f2().size(); ++i) {
945 EXPECT_EQ(obj.f2[i], msg.f2()[i]);
946 }
947
948 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
949
950 for (int i = 0; i < msg.f3().size(); ++i) {
951 EXPECT_EQ(static_cast<int>(obj.f3[i]), msg.f3()[i]);
952 }
953
954 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
955
956 for (int i = 0; i < msg.f4().size(); ++i) {
957 EXPECT_EQ(obj.f4[i].f1, msg.f4()[i].f1());
958 }
959}
960
961void CheckMapEqual(const Map& obj, const messages::Map& msg) {
962 ASSERT_EQ(obj.f1.size(), static_cast<std::size_t>(msg.f1().size()));
963
964 for (const auto& [key, value] : msg.f1()) {
965 ASSERT_EQ(obj.f1.count(key), std::size_t{1});
966 EXPECT_EQ(obj.f1.at(key), value);
967 }
968
969 ASSERT_EQ(obj.f2.size(), static_cast<std::size_t>(msg.f2().size()));
970
971 for (const auto& [key, value] : msg.f2()) {
972 ASSERT_EQ(obj.f2.count(key), std::size_t{1});
973 EXPECT_EQ(obj.f2.at(key), value);
974 }
975
976 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
977
978 for (const auto& [key, value] : msg.f3()) {
979 ASSERT_EQ(obj.f3.count(key), std::size_t{1});
980 EXPECT_EQ(obj.f3.at(key), static_cast<TestEnum>(value));
981 }
982
983 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
984
985 for (const auto& [key, value] : msg.f4()) {
986 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
987 CheckSimpleEqual(obj.f4.at(key), value);
988 }
989}
990
991void CheckOneofEqual(const Oneof& obj, const messages::Oneof& msg) {
992 if (!obj.test_oneof.ContainsAny()) {
993 EXPECT_EQ(msg.test_oneof_case(), messages::Oneof::TEST_ONEOF_NOT_SET);
994 }
995
996 if (obj.test_oneof.Contains(0)) {
997 EXPECT_TRUE(msg.has_f1());
998 EXPECT_EQ(obj.test_oneof.Get<0>(), msg.f1());
999 } else {
1000 EXPECT_FALSE(msg.has_f1());
1001 }
1002
1003 if (obj.test_oneof.Contains(1)) {
1004 EXPECT_TRUE(msg.has_f2());
1005 EXPECT_EQ(obj.test_oneof.Get<1>(), msg.f2());
1006 } else {
1007 EXPECT_FALSE(msg.has_f2());
1008 }
1009
1010 if (obj.test_oneof.Contains(2)) {
1011 EXPECT_TRUE(msg.has_f3());
1012 EXPECT_EQ(obj.test_oneof.Get<2>(), static_cast<TestEnum>(msg.f3()));
1013 } else {
1014 EXPECT_FALSE(msg.has_f3());
1015 }
1016
1017 if (obj.test_oneof.Contains(3)) {
1018 EXPECT_TRUE(msg.has_f4());
1019 CheckSimpleEqual(obj.test_oneof.Get<3>(), msg.f4());
1020 } else {
1021 EXPECT_FALSE(msg.has_f4());
1022 }
1023}
1024
1025void CheckIndirectEqual(const Indirect& obj, const messages::Indirect& msg) {
1026 CheckSimpleEqual(*obj.f1, msg.f1());
1027
1028 if (obj.f2) {
1029 EXPECT_TRUE(msg.has_f2());
1030 EXPECT_EQ((*obj.f2.value()).Seconds().count(), msg.f2().seconds());
1031 EXPECT_EQ((*obj.f2.value()).Nanos().count(), msg.f2().nanos());
1032 } else {
1033 EXPECT_FALSE(msg.has_f2());
1034 }
1035
1036 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1037
1038 for (int i = 0; i < msg.f3().size(); ++i) {
1039 CheckSimpleEqual(*obj.f3[i], msg.f3()[i]);
1040 }
1041
1042 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1043
1044 for (const auto& [key, value] : msg.f4()) {
1045 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1046 CheckSimpleEqual(*obj.f4.at(key), value);
1047 }
1048
1049 if (!obj.test_oneof.ContainsAny()) {
1050 EXPECT_EQ(msg.test_oneof_case(), messages::Indirect::TEST_ONEOF_NOT_SET);
1051 }
1052
1053 if (obj.test_oneof.Contains(0)) {
1054 EXPECT_TRUE(msg.has_f5());
1055 CheckSimpleEqual(*obj.test_oneof.Get<0>(), msg.f5());
1056 } else {
1057 EXPECT_FALSE(msg.has_f5());
1058 }
1059
1060 if (obj.test_oneof.Contains(1)) {
1061 EXPECT_TRUE(msg.has_f6());
1062 EXPECT_EQ(*obj.test_oneof.Get<1>(), msg.f6());
1063 } else {
1064 EXPECT_FALSE(msg.has_f6());
1065 }
1066
1067 EXPECT_EQ(*obj.f7, msg.f7());
1068 ASSERT_EQ((*obj.f8).size(), static_cast<std::size_t>(msg.f8().size()));
1069
1070 for (int i = 0; i < msg.f8().size(); ++i) {
1071 EXPECT_EQ(*((*obj.f8)[i]), static_cast<TestEnum>(msg.f8()[i]));
1072 }
1073
1074 ASSERT_EQ((*obj.f9).size(), static_cast<std::size_t>(msg.f9().size()));
1075
1076 for (const auto& [key, value] : msg.f9()) {
1077 ASSERT_EQ((*obj.f9).count(key), std::size_t{1});
1078 CheckSimpleEqual(*((*obj.f9).at(key)), value);
1079 }
1080}
1081
1082void CheckStrongEqual(const Strong& obj, const messages::Strong& msg) {
1083 EXPECT_EQ(obj.f1.GetUnderlying(), msg.f1());
1084
1085 if (obj.f2) {
1086 EXPECT_TRUE(msg.has_f2());
1087 EXPECT_EQ(obj.f2.value().GetUnderlying(), msg.f2());
1088 } else {
1089 EXPECT_FALSE(msg.has_f2());
1090 }
1091
1092 ASSERT_EQ(obj.f3.size(), static_cast<std::size_t>(msg.f3().size()));
1093
1094 for (int i = 0; i < msg.f3().size(); ++i) {
1095 EXPECT_EQ(static_cast<int>(obj.f3[i].GetUnderlying()), msg.f3()[i]);
1096 }
1097
1098 ASSERT_EQ(obj.f4.size(), static_cast<std::size_t>(msg.f4().size()));
1099
1100 for (const auto& [key, value] : msg.f4()) {
1101 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1102 CheckSimpleEqual(obj.f4.at(key).GetUnderlying(), value);
1103 }
1104
1105 if (!obj.test_oneof.ContainsAny()) {
1106 EXPECT_EQ(msg.test_oneof_case(), messages::Strong::TEST_ONEOF_NOT_SET);
1107 }
1108
1109 if (obj.test_oneof.Contains(0)) {
1110 EXPECT_TRUE(msg.has_f5());
1111 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Seconds().count(), msg.f5().seconds());
1112 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Nanos().count(), msg.f5().nanos());
1113
1114 } else {
1115 EXPECT_FALSE(msg.has_f5());
1116 }
1117}
1118
1119} // namespace structs