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