3#include <gtest/gtest.h>
5#include <google/protobuf/util/time_util.h>
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>
11#include "messages.pb.h"
17void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::Value& msg);
18void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::ListValue& msg);
19void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::Struct& msg);
21void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::Value& msg) {
22 if (msg.has_null_value()) {
23 ASSERT_TRUE(json.IsNull());
24 }
else if (msg.has_number_value()) {
25 ASSERT_TRUE(json.IsNumber());
26 EXPECT_EQ(json.As<
double>(), msg.number_value());
27 }
else if (msg.has_string_value()) {
28 ASSERT_TRUE(json.IsString());
29 EXPECT_EQ(json.As<std::string>(), msg.string_value());
30 }
else if (msg.has_bool_value()) {
31 ASSERT_TRUE(json.IsBool());
32 EXPECT_EQ(json.As<
bool>(), msg.bool_value());
33 }
else if (msg.has_list_value()) {
34 CheckJsonValue(json, msg.list_value());
35 }
else if (msg.has_struct_value()) {
36 CheckJsonValue(json, msg.struct_value());
38 ADD_FAILURE() <<
"incomparable 'google::protobuf::Value'";
42void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::ListValue& msg) {
43 ASSERT_TRUE(json.IsArray());
44 ASSERT_EQ(
static_cast<
int>(json.GetSize()), msg.values().size());
46 for (
int i = 0; i < msg.values().size(); ++i) {
47 CheckJsonValue(json[i], msg.values()[i]);
51void CheckJsonValue(
const formats::json::Value& json,
const ::google::protobuf::Struct& msg) {
52 ASSERT_TRUE(json.IsObject());
53 EXPECT_EQ(json.GetSize(), msg.fields().size());
55 for (
const auto& [key, val] : msg.fields()) {
56 ASSERT_TRUE(json.HasMember(key));
57 CheckJsonValue(json[key], val);
63ConversionFailure ReadProtoStruct(
64 ups::io::ReadContext& ctx,
65 ups::io::To<ConversionFailure>,
66 const messages::ConversionFailure& msg
68 if (msg.error_type() == messages::ConversionFailure::TYPE_EXCEPTION) {
69 throw std::runtime_error(
"conversion_failure_exception");
70 }
else if (msg.error_type() == messages::ConversionFailure::TYPE_ERROR) {
71 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
73 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
79void WriteProtoStruct(ups::io::WriteContext& ctx,
const ConversionFailure& obj, messages::ConversionFailure&) {
80 if (obj.error_type == ConversionFailureType::kException) {
81 throw std::runtime_error(
"conversion_failure_exception");
82 }
else if (obj.error_type == ConversionFailureType::kError) {
83 ctx.AddError(messages::ConversionFailure::kErrorFieldFieldNumber,
"conversion_failure_error");
85 ctx.AddError(1001,
"conversion_failure_error_with_unknown_field");
89Scalar ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Scalar>,
const messages::Scalar& msg) {
91 .f1 = ups::io::impl::ReadField<
92 bool>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF1FieldNumber, &messages::Scalar::f1)),
93 .f2 = ups::io::impl::ReadField<int32_t>(
95 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF2FieldNumber, &messages::Scalar::f2)
97 .f3 = ups::io::impl::ReadField<uint32_t>(
99 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF3FieldNumber, &messages::Scalar::f3)
101 .f4 = ups::io::impl::ReadField<int64_t>(
103 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF4FieldNumber, &messages::Scalar::f4)
105 .f5 = ups::io::impl::ReadField<uint64_t>(
107 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF5FieldNumber, &messages::Scalar::f5)
109 .f6 = ups::io::impl::ReadField<
110 float>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF6FieldNumber, &messages::Scalar::f6)),
111 .f7 = ups::io::impl::ReadField<
double>(
113 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF7FieldNumber, &messages::Scalar::f7)
115 .f8 = ups::io::impl::ReadField<std::string>(
117 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF8FieldNumber, &messages::Scalar::f8)
119 .f9 = ups::io::impl::ReadField<std::string>(
121 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF9FieldNumber, &messages::Scalar::f9)
123 .f10 = ups::io::impl::ReadField<TestEnum>(
125 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF10FieldNumber, &messages::Scalar::f10)
127 .f11 = ups::io::impl::ReadField<std::size_t>(
129 ups::io::impl::CreateFieldGetter(msg, messages::Scalar::kF11FieldNumber, &messages::Scalar::f11)
135void WriteScalarStruct(ups::io::WriteContext& ctx, T&& obj, messages::Scalar& msg) {
136 T obj_lvalue = std::forward<T>(obj);
137 ups::io::impl::WriteField(
139 std::move(obj_lvalue.f1),
140 ups::io::impl::CreateFieldSetter(
142 messages::Scalar::kF1FieldNumber,
143 &messages::Scalar::set_f1,
144 &messages::Scalar::clear_f1
147 ups::io::impl::WriteField(
149 std::move(obj_lvalue.f2),
150 ups::io::impl::CreateFieldSetter(
152 messages::Scalar::kF2FieldNumber,
153 &messages::Scalar::set_f2,
154 &messages::Scalar::clear_f2
157 ups::io::impl::WriteField(
159 std::move(obj_lvalue.f3),
160 ups::io::impl::CreateFieldSetter(
162 messages::Scalar::kF3FieldNumber,
163 &messages::Scalar::set_f3,
164 &messages::Scalar::clear_f3
167 ups::io::impl::WriteField(
169 std::move(obj_lvalue.f4),
170 ups::io::impl::CreateFieldSetter(
172 messages::Scalar::kF4FieldNumber,
173 &messages::Scalar::set_f4,
174 &messages::Scalar::clear_f4
177 ups::io::impl::WriteField(
179 std::move(obj_lvalue.f5),
180 ups::io::impl::CreateFieldSetter(
182 messages::Scalar::kF5FieldNumber,
183 &messages::Scalar::set_f5,
184 &messages::Scalar::clear_f5
187 ups::io::impl::WriteField(
189 std::move(obj_lvalue.f6),
190 ups::io::impl::CreateFieldSetter(
192 messages::Scalar::kF6FieldNumber,
193 &messages::Scalar::set_f6,
194 &messages::Scalar::clear_f6
197 ups::io::impl::WriteField(
199 std::move(obj_lvalue.f7),
200 ups::io::impl::CreateFieldSetter(
202 messages::Scalar::kF7FieldNumber,
203 &messages::Scalar::set_f7,
204 &messages::Scalar::clear_f7
207 ups::io::impl::WriteField(
209 std::move(obj_lvalue.f8),
210 ups::io::impl::CreateFieldSetter(
212 messages::Scalar::kF8FieldNumber,
213 &messages::Scalar::set_f8<
const std::string&>,
214 &messages::Scalar::set_f8<std::string>,
215 &messages::Scalar::clear_f8
218 ups::io::impl::WriteField(
220 std::move(obj_lvalue.f9),
221 ups::io::impl::CreateFieldSetter(
223 messages::Scalar::kF9FieldNumber,
224 &messages::Scalar::set_f9<
const std::string&>,
225 &messages::Scalar::set_f9<std::string>,
226 &messages::Scalar::clear_f9
229 ups::io::impl::WriteField(
231 std::move(obj_lvalue.f10),
232 ups::io::impl::CreateFieldSetter(
234 messages::Scalar::kF10FieldNumber,
235 &messages::Scalar::set_f10,
236 &messages::Scalar::clear_f10
239 ups::io::impl::WriteField(
241 std::move(obj_lvalue.f11),
242 ups::io::impl::CreateFieldSetter(
244 messages::Scalar::kF11FieldNumber,
245 &messages::Scalar::set_f11,
246 &messages::Scalar::clear_f11
251void WriteProtoStruct(ups::io::WriteContext& ctx,
const Scalar& obj, messages::Scalar& msg) {
252 WriteScalarStruct(ctx, obj, msg);
255void WriteProtoStruct(ups::io::WriteContext& ctx, Scalar&& obj, messages::Scalar& msg) {
256 WriteScalarStruct(ctx, std::move(obj), msg);
259WellKnownStd ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<WellKnownStd>,
const messages::WellKnownStd& msg) {
261 .f1 = ups::io::impl::ReadField<std::chrono::time_point<std::chrono::system_clock>>(
263 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF1FieldNumber, &messages::WellKnownStd::f1)
265 .f2 = ups::io::impl::ReadField<std::chrono::milliseconds>(
267 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF2FieldNumber, &messages::WellKnownStd::f2)
269 .f3 = ups::io::impl::ReadField<std::chrono::year_month_day>(
271 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF3FieldNumber, &messages::WellKnownStd::f3)
273 .f4 = ups::io::impl::ReadField<std::chrono::hh_mm_ss<std::chrono::microseconds>>(
275 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownStd::kF4FieldNumber, &messages::WellKnownStd::f4)
281void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownStd& msg) {
282 T obj_lvalue = std::forward<T>(obj);
283 ups::io::impl::WriteField(
285 std::move(obj_lvalue.f1),
286 ups::io::impl::CreateFieldSetter(
288 messages::WellKnownStd::kF1FieldNumber,
289 &messages::WellKnownStd::mutable_f1,
290 &messages::WellKnownStd::clear_f1
293 ups::io::impl::WriteField(
295 std::move(obj_lvalue.f2),
296 ups::io::impl::CreateFieldSetter(
298 messages::WellKnownStd::kF2FieldNumber,
299 &messages::WellKnownStd::mutable_f2,
300 &messages::WellKnownStd::clear_f2
303 ups::io::impl::WriteField(
305 std::move(obj_lvalue.f3),
306 ups::io::impl::CreateFieldSetter(
308 messages::WellKnownStd::kF3FieldNumber,
309 &messages::WellKnownStd::mutable_f3,
310 &messages::WellKnownStd::clear_f3
313 ups::io::impl::WriteField(
315 std::move(obj_lvalue.f4),
316 ups::io::impl::CreateFieldSetter(
318 messages::WellKnownStd::kF4FieldNumber,
319 &messages::WellKnownStd::mutable_f4,
320 &messages::WellKnownStd::clear_f4
325void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownStd& obj, messages::WellKnownStd& msg) {
326 WriteWellKnownStruct(ctx, obj, msg);
329void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownStd&& obj, messages::WellKnownStd& msg) {
330 WriteWellKnownStruct(ctx, std::move(obj), msg);
333WellKnownUsrv ReadProtoStruct(
334 ups::io::ReadContext& ctx,
335 ups::io::To<WellKnownUsrv>,
336 const messages::WellKnownUsrv& msg
339 .f1 = ups::io::impl::ReadField<ups::Any>(
341 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF1FieldNumber, &messages::WellKnownUsrv::f1)
343 .f2 = ups::io::impl::ReadField<ups::Timestamp>(
345 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF2FieldNumber, &messages::WellKnownUsrv::f2)
347 .f3 = ups::io::impl::ReadField<ups::Duration>(
349 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF3FieldNumber, &messages::WellKnownUsrv::f3)
351 .f4 = ups::io::impl::ReadField<ups::Date>(
353 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF4FieldNumber, &messages::WellKnownUsrv::f4)
355 .f5 = ups::io::impl::ReadField<ups::TimeOfDay>(
357 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF5FieldNumber, &messages::WellKnownUsrv::f5)
359 .f6 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::datetime::TimeOfDay<std::chrono::microseconds>>(
361 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF6FieldNumber, &messages::WellKnownUsrv::f6)
363 .f7 = ups::io::impl::ReadField<USERVER_NAMESPACE::decimal64::Decimal<3>>(
365 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownUsrv::kF7FieldNumber, &messages::WellKnownUsrv::f7)
371void WriteWellKnownStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownUsrv& msg) {
372 T obj_lvalue = std::forward<T>(obj);
373 ups::io::impl::WriteField(
375 std::move(obj_lvalue.f1),
376 ups::io::impl::CreateFieldSetter(
378 messages::WellKnownUsrv::kF1FieldNumber,
379 &messages::WellKnownUsrv::mutable_f1,
380 &messages::WellKnownUsrv::clear_f1
383 ups::io::impl::WriteField(
385 std::move(obj_lvalue.f2),
386 ups::io::impl::CreateFieldSetter(
388 messages::WellKnownUsrv::kF2FieldNumber,
389 &messages::WellKnownUsrv::mutable_f2,
390 &messages::WellKnownUsrv::clear_f2
393 ups::io::impl::WriteField(
395 std::move(obj_lvalue.f3),
396 ups::io::impl::CreateFieldSetter(
398 messages::WellKnownUsrv::kF3FieldNumber,
399 &messages::WellKnownUsrv::mutable_f3,
400 &messages::WellKnownUsrv::clear_f3
403 ups::io::impl::WriteField(
405 std::move(obj_lvalue.f4),
406 ups::io::impl::CreateFieldSetter(
408 messages::WellKnownUsrv::kF4FieldNumber,
409 &messages::WellKnownUsrv::mutable_f4,
410 &messages::WellKnownUsrv::clear_f4
413 ups::io::impl::WriteField(
415 std::move(obj_lvalue.f5),
416 ups::io::impl::CreateFieldSetter(
418 messages::WellKnownUsrv::kF5FieldNumber,
419 &messages::WellKnownUsrv::mutable_f5,
420 &messages::WellKnownUsrv::clear_f5
423 ups::io::impl::WriteField(
425 std::move(obj_lvalue.f6),
426 ups::io::impl::CreateFieldSetter(
428 messages::WellKnownUsrv::kF6FieldNumber,
429 &messages::WellKnownUsrv::mutable_f6,
430 &messages::WellKnownUsrv::clear_f6
433 ups::io::impl::WriteField(
435 std::move(obj_lvalue.f7),
436 ups::io::impl::CreateFieldSetter(
438 messages::WellKnownUsrv::kF7FieldNumber,
439 &messages::WellKnownUsrv::mutable_f7,
440 &messages::WellKnownUsrv::clear_f7
445void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownUsrv& obj, messages::WellKnownUsrv& msg) {
446 WriteWellKnownStruct(ctx, obj, msg);
449void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownUsrv&& obj, messages::WellKnownUsrv& msg) {
450 WriteWellKnownStruct(ctx, std::move(obj), msg);
453WellKnownJson ReadProtoStruct(
454 ups::io::ReadContext& ctx,
455 ups::io::To<WellKnownJson>,
456 const messages::WellKnownJson& msg
459 .f1 = ups::io::impl::ReadField<formats::json::Value>(
461 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF1FieldNumber, &messages::WellKnownJson::f1)
463 .f2 = ups::io::impl::ReadField<formats::json::Array>(
465 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF2FieldNumber, &messages::WellKnownJson::f2)
467 .f3 = ups::io::impl::ReadField<formats::json::Object>(
469 ups::io::impl::CreateFieldGetter(msg, messages::WellKnownJson::kF3FieldNumber, &messages::WellKnownJson::f3)
475void WriteWellKnownJsonStruct(ups::io::WriteContext& ctx, T&& obj, messages::WellKnownJson& msg) {
476 T obj_lvalue = std::forward<T>(obj);
477 ups::io::impl::WriteField(
479 std::move(obj_lvalue.f1),
480 ups::io::impl::CreateFieldSetter(
482 messages::WellKnownJson::kF1FieldNumber,
483 &messages::WellKnownJson::mutable_f1,
484 &messages::WellKnownJson::clear_f1
487 ups::io::impl::WriteField(
489 std::move(obj_lvalue.f2),
490 ups::io::impl::CreateFieldSetter(
492 messages::WellKnownJson::kF2FieldNumber,
493 &messages::WellKnownJson::mutable_f2,
494 &messages::WellKnownJson::clear_f2
497 ups::io::impl::WriteField(
499 std::move(obj_lvalue.f3),
500 ups::io::impl::CreateFieldSetter(
502 messages::WellKnownJson::kF3FieldNumber,
503 &messages::WellKnownJson::mutable_f3,
504 &messages::WellKnownJson::clear_f3
509void WriteProtoStruct(ups::io::WriteContext& ctx,
const WellKnownJson& obj, messages::WellKnownJson& msg) {
510 WriteWellKnownJsonStruct(ctx, obj, msg);
513void WriteProtoStruct(ups::io::WriteContext& ctx, WellKnownJson&& obj, messages::WellKnownJson& msg) {
514 WriteWellKnownJsonStruct(ctx, std::move(obj), msg);
517Optional ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Optional>,
const messages::Optional& msg) {
519 .f1 = ups::io::impl::ReadField<std::optional<int32_t>>(
521 ups::io::impl::CreateFieldGetter(
523 messages::Optional::kF1FieldNumber,
524 &messages::Optional::f1,
525 &messages::Optional::has_f1
528 .f2 = ups::io::impl::ReadField<std::optional<std::string>>(
530 ups::io::impl::CreateFieldGetter(
532 messages::Optional::kF2FieldNumber,
533 &messages::Optional::f2,
534 &messages::Optional::has_f2
537 .f3 = ups::io::impl::ReadField<std::optional<TestEnum>>(
539 ups::io::impl::CreateFieldGetter(
541 messages::Optional::kF3FieldNumber,
542 &messages::Optional::f3,
543 &messages::Optional::has_f3
546 .f4 = ups::io::impl::ReadField<std::optional<Simple>>(
548 ups::io::impl::CreateFieldGetter(
550 messages::Optional::kF4FieldNumber,
551 &messages::Optional::f4,
552 &messages::Optional::has_f4
559void WriteOptionalStruct(ups::io::WriteContext& ctx, T&& obj, messages::Optional& msg) {
560 T obj_lvalue = std::forward<T>(obj);
561 ups::io::impl::WriteField(
563 std::move(obj_lvalue.f1),
564 ups::io::impl::CreateFieldSetter(
566 messages::Optional::kF1FieldNumber,
567 &messages::Optional::set_f1,
568 &messages::Optional::clear_f1
571 ups::io::impl::WriteField(
573 std::move(obj_lvalue.f2),
574 ups::io::impl::CreateFieldSetter(
576 messages::Optional::kF2FieldNumber,
577 &messages::Optional::set_f2<
const std::string&>,
578 &messages::Optional::set_f2<std::string>,
579 &messages::Optional::clear_f2
582 ups::io::impl::WriteField(
584 std::move(obj_lvalue.f3),
585 ups::io::impl::CreateFieldSetter(
587 messages::Optional::kF3FieldNumber,
588 &messages::Optional::set_f3,
589 &messages::Optional::clear_f3
592 ups::io::impl::WriteField(
594 std::move(obj_lvalue.f4),
595 ups::io::impl::CreateFieldSetter(
597 messages::Optional::kF4FieldNumber,
598 &messages::Optional::mutable_f4,
599 &messages::Optional::clear_f4
604void WriteProtoStruct(ups::io::WriteContext& ctx,
const Optional& obj, messages::Optional& msg) {
605 WriteOptionalStruct(ctx, obj, msg);
607void WriteProtoStruct(ups::io::WriteContext& ctx, Optional&& obj, messages::Optional& msg) {
608 WriteOptionalStruct(ctx, std::move(obj), msg);
611Repeated ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Repeated>,
const messages::Repeated& msg) {
613 .f1 = ups::io::impl::ReadField<std::vector<int32_t>>(
615 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF1FieldNumber, &messages::Repeated::f1)
617 .f2 = ups::io::impl::ReadField<std::vector<std::string>>(
619 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF2FieldNumber, &messages::Repeated::f2)
621 .f3 = ups::io::impl::ReadField<std::vector<TestEnum>>(
623 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF3FieldNumber, &messages::Repeated::f3)
625 .f4 = ups::io::impl::ReadField<std::vector<Simple>>(
627 ups::io::impl::CreateFieldGetter(msg, messages::Repeated::kF4FieldNumber, &messages::Repeated::f4)
633void WriteRepeatedStruct(ups::io::WriteContext& ctx, T&& obj, messages::Repeated& msg) {
634 T obj_lvalue = std::forward<T>(obj);
635 ups::io::impl::WriteField(
637 std::move(obj_lvalue.f1),
638 ups::io::impl::CreateFieldSetter(
640 messages::Repeated::kF1FieldNumber,
641 &messages::Repeated::mutable_f1,
642 &messages::Repeated::clear_f1
645 ups::io::impl::WriteField(
647 std::move(obj_lvalue.f2),
648 ups::io::impl::CreateFieldSetter(
650 messages::Repeated::kF2FieldNumber,
651 &messages::Repeated::mutable_f2,
652 &messages::Repeated::clear_f2
655 ups::io::impl::WriteField(
657 std::move(obj_lvalue.f3),
658 ups::io::impl::CreateFieldSetter(
660 messages::Repeated::kF3FieldNumber,
661 &messages::Repeated::mutable_f3,
662 &messages::Repeated::clear_f3
665 ups::io::impl::WriteField(
667 std::move(obj_lvalue.f4),
668 ups::io::impl::CreateFieldSetter(
670 messages::Repeated::kF4FieldNumber,
671 &messages::Repeated::mutable_f4,
672 &messages::Repeated::clear_f4
677void WriteProtoStruct(ups::io::WriteContext& ctx,
const Repeated& obj, messages::Repeated& msg) {
678 WriteRepeatedStruct(ctx, obj, msg);
681void WriteProtoStruct(ups::io::WriteContext& ctx, Repeated&& obj, messages::Repeated& msg) {
682 WriteRepeatedStruct(ctx, std::move(obj), msg);
685Map ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Map>,
const messages::Map& msg) {
687 .f1 = ups::io::impl::ReadField<std::map<
689 int32_t>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF1FieldNumber, &messages::Map::f1)),
690 .f2 = ups::io::impl::ReadField<std::unordered_map<std::string, std::string>>(
692 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF2FieldNumber, &messages::Map::f2)
694 .f3 = ups::io::impl::ReadField<std::map<
696 TestEnum>>(ctx, ups::io::impl::CreateFieldGetter(msg, messages::Map::kF3FieldNumber, &messages::Map::f3)),
697 .f4 = ups::io::impl::ReadField<std::unordered_map<std::string, Simple, USERVER_NAMESPACE::utils::StrCaseHash>>(
699 ups::io::impl::CreateFieldGetter(msg, messages::Map::kF4FieldNumber, &messages::Map::f4)
705void WriteMapStruct(ups::io::WriteContext& ctx, T&& obj, messages::Map& msg) {
706 T obj_lvalue = std::forward<T>(obj);
707 ups::io::impl::WriteField(
709 std::move(obj_lvalue.f1),
710 ups::io::impl::CreateFieldSetter(
712 messages::Map::kF1FieldNumber,
713 &messages::Map::mutable_f1,
714 &messages::Map::clear_f1
717 ups::io::impl::WriteField(
719 std::move(obj_lvalue.f2),
720 ups::io::impl::CreateFieldSetter(
722 messages::Map::kF2FieldNumber,
723 &messages::Map::mutable_f2,
724 &messages::Map::clear_f2
727 ups::io::impl::WriteField(
729 std::move(obj_lvalue.f3),
730 ups::io::impl::CreateFieldSetter(
732 messages::Map::kF3FieldNumber,
733 &messages::Map::mutable_f3,
734 &messages::Map::clear_f3
737 ups::io::impl::WriteField(
739 std::move(obj_lvalue.f4),
740 ups::io::impl::CreateFieldSetter(
742 messages::Map::kF4FieldNumber,
743 &messages::Map::mutable_f4,
744 &messages::Map::clear_f4
749void WriteProtoStruct(ups::io::WriteContext& ctx,
const Map& obj, messages::Map& msg) { WriteMapStruct(ctx, obj, msg); }
751void WriteProtoStruct(ups::io::WriteContext& ctx, Map&& obj, messages::Map& msg) {
752 WriteMapStruct(ctx, std::move(obj), msg);
755Oneof ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Oneof>,
const messages::Oneof& msg) {
757 .test_oneof = ups::io::impl::ReadField<Oneof::Type>(
759 ups::io::impl::CreateFieldGetter(
761 messages::Oneof::kF1FieldNumber,
762 &messages::Oneof::f1,
763 &messages::Oneof::has_f1
765 ups::io::impl::CreateFieldGetter(
767 messages::Oneof::kF2FieldNumber,
768 &messages::Oneof::f2,
769 &messages::Oneof::has_f2
771 ups::io::impl::CreateFieldGetter(
773 messages::Oneof::kF3FieldNumber,
774 &messages::Oneof::f3,
775 &messages::Oneof::has_f3
777 ups::io::impl::CreateFieldGetter(
779 messages::Oneof::kF4FieldNumber,
780 &messages::Oneof::f4,
781 &messages::Oneof::has_f4
788void WriteOneofStruct(ups::io::WriteContext& ctx, T&& obj, messages::Oneof& msg) {
789 T obj_lvalue = std::forward<T>(obj);
790 ups::io::impl::WriteField(
792 std::move(obj_lvalue.test_oneof),
793 ups::io::impl::CreateFieldSetter(
795 messages::Oneof::kF1FieldNumber,
796 &messages::Oneof::set_f1,
797 &messages::Oneof::clear_f1
799 ups::io::impl::CreateFieldSetter(
801 messages::Oneof::kF2FieldNumber,
802 &messages::Oneof::set_f2<
const std::string&>,
803 &messages::Oneof::set_f2<std::string>,
804 &messages::Oneof::clear_f2
806 ups::io::impl::CreateFieldSetter(
808 messages::Oneof::kF3FieldNumber,
809 &messages::Oneof::set_f3,
810 &messages::Oneof::clear_f3
812 ups::io::impl::CreateFieldSetter(
814 messages::Oneof::kF4FieldNumber,
815 &messages::Oneof::mutable_f4,
816 &messages::Oneof::clear_f4
821void WriteProtoStruct(ups::io::WriteContext& ctx,
const Oneof& obj, messages::Oneof& msg) {
822 WriteOneofStruct(ctx, obj, msg);
825void WriteProtoStruct(ups::io::WriteContext& ctx, Oneof&& obj, messages::Oneof& msg) {
826 WriteOneofStruct(ctx, std::move(obj), msg);
829Indirect ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Indirect>,
const messages::Indirect& msg) {
831 .f1 = ups::io::impl::ReadField<Indirect::Box<Simple>>(
833 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF1FieldNumber, &messages::Indirect::f1)
835 .f2 = ups::io::impl::ReadField<std::optional<Indirect::Box<ups::Duration>>>(
837 ups::io::impl::CreateFieldGetter(
839 messages::Indirect::kF2FieldNumber,
840 &messages::Indirect::f2,
841 &messages::Indirect::has_f2
844 .f3 = ups::io::impl::ReadField<std::vector<Indirect::Box<Simple>>>(
846 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF3FieldNumber, &messages::Indirect::f3)
848 .f4 = ups::io::impl::ReadField<std::map<int32_t, Indirect::Box<Simple>>>(
850 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF4FieldNumber, &messages::Indirect::f4)
852 .test_oneof = ups::io::impl::ReadField<Indirect::OneofType>(
854 ups::io::impl::CreateFieldGetter(
856 messages::Indirect::kF5FieldNumber,
857 &messages::Indirect::f5,
858 &messages::Indirect::has_f5
860 ups::io::impl::CreateFieldGetter(
862 messages::Indirect::kF6FieldNumber,
863 &messages::Indirect::f6,
864 &messages::Indirect::has_f6
867 .f7 = ups::io::impl::ReadField<Indirect::Box<int32_t>>(
869 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF7FieldNumber, &messages::Indirect::f7)
871 .f8 = ups::io::impl::ReadField<Indirect::Box<std::vector<Indirect::Box<TestEnum>>>>(
873 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF8FieldNumber, &messages::Indirect::f8)
875 .f9 = ups::io::impl::ReadField<Indirect::Box<std::map<std::string, Indirect::Box<Simple>>>>(
877 ups::io::impl::CreateFieldGetter(msg, messages::Indirect::kF9FieldNumber, &messages::Indirect::f9)
883void WriteIndirectStruct(ups::io::WriteContext& ctx, T&& obj, messages::Indirect& msg) {
884 T obj_lvalue = std::forward<T>(obj);
885 ups::io::impl::WriteField(
887 std::move(obj_lvalue.f1),
888 ups::io::impl::CreateFieldSetter(
890 messages::Indirect::kF1FieldNumber,
891 &messages::Indirect::mutable_f1,
892 &messages::Indirect::clear_f1
895 ups::io::impl::WriteField(
897 std::move(obj_lvalue.f2),
898 ups::io::impl::CreateFieldSetter(
900 messages::Indirect::kF2FieldNumber,
901 &messages::Indirect::mutable_f2,
902 &messages::Indirect::clear_f2
905 ups::io::impl::WriteField(
907 std::move(obj_lvalue.f3),
908 ups::io::impl::CreateFieldSetter(
910 messages::Indirect::kF3FieldNumber,
911 &messages::Indirect::mutable_f3,
912 &messages::Indirect::clear_f3
915 ups::io::impl::WriteField(
917 std::move(obj_lvalue.f4),
918 ups::io::impl::CreateFieldSetter(
920 messages::Indirect::kF4FieldNumber,
921 &messages::Indirect::mutable_f4,
922 &messages::Indirect::clear_f4
925 ups::io::impl::WriteField(
927 std::move(obj_lvalue.test_oneof),
928 ups::io::impl::CreateFieldSetter(
930 messages::Indirect::kF5FieldNumber,
931 &messages::Indirect::mutable_f5,
932 &messages::Indirect::clear_f5
934 ups::io::impl::CreateFieldSetter(
936 messages::Indirect::kF6FieldNumber,
937 &messages::Indirect::set_f6<
const std::string&>,
938 &messages::Indirect::set_f6<std::string>,
939 &messages::Indirect::clear_f6
942 ups::io::impl::WriteField(
944 std::move(obj_lvalue.f7),
945 ups::io::impl::CreateFieldSetter(
947 messages::Indirect::kF7FieldNumber,
948 &messages::Indirect::set_f7,
949 &messages::Indirect::clear_f7
952 ups::io::impl::WriteField(
954 std::move(obj_lvalue.f8),
955 ups::io::impl::CreateFieldSetter(
957 messages::Indirect::kF8FieldNumber,
958 &messages::Indirect::mutable_f8,
959 &messages::Indirect::clear_f8
962 ups::io::impl::WriteField(
964 std::move(obj_lvalue.f9),
965 ups::io::impl::CreateFieldSetter(
967 messages::Indirect::kF9FieldNumber,
968 &messages::Indirect::mutable_f9,
969 &messages::Indirect::clear_f9
974void WriteProtoStruct(ups::io::WriteContext& ctx,
const Indirect& obj, messages::Indirect& msg) {
975 WriteIndirectStruct(ctx, obj, msg);
978void WriteProtoStruct(ups::io::WriteContext& ctx, Indirect&& obj, messages::Indirect& msg) {
979 WriteIndirectStruct(ctx, std::move(obj), msg);
982Strong ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Strong>,
const messages::Strong& msg) {
984 .f1 = ups::io::impl::ReadField<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, int32_t>>(
986 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF1FieldNumber, &messages::Strong::f1)
988 .f2 = ups::io::impl::ReadField<
989 std::optional<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, std::string>>>(
991 ups::io::impl::CreateFieldGetter(
993 messages::Strong::kF2FieldNumber,
994 &messages::Strong::f2,
995 &messages::Strong::has_f2
998 .f3 = ups::io::impl::ReadField<std::vector<USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, TestEnum>>>(
1000 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF3FieldNumber, &messages::Strong::f3)
1002 .f4 = ups::io::impl::ReadField<std::map<int32_t, USERVER_NAMESPACE::utils::StrongTypedef<Strong::Tag, Simple>>>(
1004 ups::io::impl::CreateFieldGetter(msg, messages::Strong::kF4FieldNumber, &messages::Strong::f4)
1006 .test_oneof = ups::io::impl::ReadField<Strong::OneofType>(
1008 ups::io::impl::CreateFieldGetter(
1010 messages::Strong::kF5FieldNumber,
1011 &messages::Strong::f5,
1012 &messages::Strong::has_f5
1018template <
typename T>
1019void WriteStrongStruct(ups::io::WriteContext& ctx, T&& obj, messages::Strong& msg) {
1020 T obj_lvalue = std::forward<T>(obj);
1021 ups::io::impl::WriteField(
1023 std::move(obj_lvalue.f1),
1024 ups::io::impl::CreateFieldSetter(
1026 messages::Strong::kF1FieldNumber,
1027 &messages::Strong::set_f1,
1028 &messages::Strong::clear_f1
1031 ups::io::impl::WriteField(
1033 std::move(obj_lvalue.f2),
1034 ups::io::impl::CreateFieldSetter(
1036 messages::Strong::kF2FieldNumber,
1037 &messages::Strong::set_f2<
const std::string&>,
1038 &messages::Strong::set_f2<std::string>,
1039 &messages::Strong::clear_f2
1042 ups::io::impl::WriteField(
1044 std::move(obj_lvalue.f3),
1045 ups::io::impl::CreateFieldSetter(
1047 messages::Strong::kF3FieldNumber,
1048 &messages::Strong::mutable_f3,
1049 &messages::Strong::clear_f3
1052 ups::io::impl::WriteField(
1054 std::move(obj_lvalue.f4),
1055 ups::io::impl::CreateFieldSetter(
1057 messages::Strong::kF4FieldNumber,
1058 &messages::Strong::mutable_f4,
1059 &messages::Strong::clear_f4
1062 ups::io::impl::WriteField(
1064 std::move(obj_lvalue.test_oneof),
1065 ups::io::impl::CreateFieldSetter(
1067 messages::Strong::kF1FieldNumber,
1068 &messages::Strong::mutable_f5,
1069 &messages::Strong::clear_f5
1074void WriteProtoStruct(ups::io::WriteContext& ctx,
const Strong& obj, messages::Strong& msg) {
1075 WriteStrongStruct(ctx, obj, msg);
1078void WriteProtoStruct(ups::io::WriteContext& ctx, Strong&& obj, messages::Strong& msg) {
1079 WriteStrongStruct(ctx, std::move(obj), msg);
1082Erroneous ReadProtoStruct(ups::io::ReadContext& ctx, ups::io::To<Erroneous>,
const messages::Erroneous& msg) {
1084 .f1 = ups::io::impl::ReadField<std::optional<ConversionFailure>>(
1086 ups::io::impl::CreateFieldGetter(
1088 messages::Erroneous::kF1FieldNumber,
1089 &messages::Erroneous::f1,
1090 &messages::Erroneous::has_f1
1093 .f2 = ups::io::impl::ReadField<std::vector<ConversionFailure>>(
1095 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF2FieldNumber, &messages::Erroneous::f2)
1097 .f3 = ups::io::impl::ReadField<std::unordered_map<int32_t, ConversionFailure>>(
1099 ups::io::impl::CreateFieldGetter(msg, messages::Erroneous::kF3FieldNumber, &messages::Erroneous::f3)
1101 .test_oneof = ups::io::impl::ReadField<Erroneous::OneofType>(
1103 ups::io::impl::CreateFieldGetter(
1105 messages::Erroneous::kF4FieldNumber,
1106 &messages::Erroneous::f4,
1107 &messages::Erroneous::has_f4
1113void WriteProtoStruct(ups::io::WriteContext& ctx,
const Erroneous& obj, messages::Erroneous& msg) {
1114 ups::io::impl::WriteField(
1117 ups::io::impl::CreateFieldSetter(
1119 messages::Erroneous::kF1FieldNumber,
1120 &messages::Erroneous::mutable_f1,
1121 &messages::Erroneous::clear_f1
1124 ups::io::impl::WriteField(
1127 ups::io::impl::CreateFieldSetter(
1129 messages::Erroneous::kF2FieldNumber,
1130 &messages::Erroneous::mutable_f2,
1131 &messages::Erroneous::clear_f2
1134 ups::io::impl::WriteField(
1137 ups::io::impl::CreateFieldSetter(
1139 messages::Erroneous::kF3FieldNumber,
1140 &messages::Erroneous::mutable_f3,
1141 &messages::Erroneous::clear_f3
1144 ups::io::impl::WriteField(
1147 ups::io::impl::CreateFieldSetter(
1149 messages::Erroneous::kF4FieldNumber,
1150 &messages::Erroneous::mutable_f4,
1151 &messages::Erroneous::clear_f4
1156void CheckScalarEqual(
const Scalar& obj,
const messages::Scalar& msg) {
1157 EXPECT_EQ(obj.f1, msg.f1());
1158 EXPECT_EQ(obj.f2, msg.f2());
1159 EXPECT_EQ(obj.f3, msg.f3());
1160 EXPECT_EQ(obj.f4, msg.f4());
1161 EXPECT_EQ(obj.f5, msg.f5());
1162 EXPECT_EQ(obj.f6, msg.f6());
1163 EXPECT_EQ(obj.f7, msg.f7());
1164 EXPECT_EQ(obj.f8, msg.f8());
1165 EXPECT_EQ(obj.f9, msg.f9());
1166 EXPECT_EQ(obj.f10,
static_cast<TestEnum>(msg.f10()));
1167 EXPECT_EQ(
static_cast<
int>(obj.f11), msg.f11());
1170void CheckWellKnownStdEqual(
const WellKnownStd& obj,
const messages::WellKnownStd& msg) {
1171 using TimeType = std::chrono::time_point<std::chrono::system_clock>;
1174 obj.f1.time_since_epoch(),
1175 std::chrono::duration_cast<TimeType::duration>(std::chrono::nanoseconds{
1176 ::google::protobuf::util::TimeUtil::TimestampToNanoseconds(msg.f1())
1181 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds{
1182 ::google::protobuf::util::TimeUtil::DurationToNanoseconds(msg.f2())
1186 EXPECT_EQ(
static_cast<
int>(obj.f3.year()), msg.f3().year());
1187 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.month()),
static_cast<
unsigned>(msg.f3().month()));
1188 EXPECT_EQ(
static_cast<
unsigned>(obj.f3.day()),
static_cast<
unsigned>(msg.f3().day()));
1190 EXPECT_EQ(obj.f4.hours().count(), msg.f4().hours());
1191 EXPECT_EQ(obj.f4.minutes().count(), msg.f4().minutes());
1192 EXPECT_EQ(obj.f4.seconds().count(), msg.f4().seconds());
1194 obj.f4.subseconds().count(),
1195 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f4().nanos())).count()
1199void CheckWellKnownUsrvEqual(
const WellKnownUsrv& obj,
const messages::WellKnownUsrv& msg) {
1200 EXPECT_EQ(obj.f1.GetProtobufAny().type_url(), msg.f1().type_url());
1201 EXPECT_EQ(obj.f1.GetProtobufAny().value(), msg.f1().value());
1203 EXPECT_EQ(obj.f2.Seconds().count(), msg.f2().seconds());
1204 EXPECT_EQ(obj.f2.Nanos().count(), msg.f2().nanos());
1206 EXPECT_EQ(obj.f3.Seconds().count(), msg.f3().seconds());
1207 EXPECT_EQ(obj.f3.Nanos().count(), msg.f3().nanos());
1209 EXPECT_EQ(obj.f4.YearNum(), msg.f4().year());
1210 EXPECT_EQ(obj.f4.MonthNum(), msg.f4().month());
1211 EXPECT_EQ(obj.f4.DayNum(), msg.f4().day());
1213 EXPECT_EQ(obj.f5.Hours().count(), msg.f5().hours());
1214 EXPECT_EQ(obj.f5.Minutes().count(), msg.f5().minutes());
1215 EXPECT_EQ(obj.f5.Seconds().count(), msg.f5().seconds());
1216 EXPECT_EQ(obj.f5.Nanos().count(), msg.f5().nanos());
1218 EXPECT_EQ(obj.f6.Hours().count(), msg.f6().hours());
1219 EXPECT_EQ(obj.f6.Minutes().count(), msg.f6().minutes());
1220 EXPECT_EQ(obj.f6.Seconds().count(), msg.f6().seconds());
1222 obj.f6.Subseconds().count(),
1223 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::nanoseconds(msg.f6().nanos())).count()
1226 EXPECT_EQ(obj.f7, decimal64::Decimal<3>(msg.f7().value()));
1227 EXPECT_EQ(ToString(obj.f7), msg.f7().value());
1230void CheckWellKnownJsonEqual(
const WellKnownJson& obj,
const messages::WellKnownJson& msg) {
1231 CheckJsonValue(obj.f1, msg.f1());
1232 CheckJsonValue(obj.f2.GetValue(), msg.f2());
1233 CheckJsonValue(obj.f3.GetValue(), msg.f3());
1236void CheckOptionalEqual(
const Optional& obj,
const messages::Optional& msg) {
1238 EXPECT_TRUE(msg.has_f1());
1239 EXPECT_EQ(obj.f1.value(), msg.f1());
1241 EXPECT_FALSE(msg.has_f1());
1245 EXPECT_TRUE(msg.has_f2());
1246 EXPECT_EQ(obj.f2.value(), msg.f2());
1248 EXPECT_FALSE(msg.has_f2());
1252 EXPECT_TRUE(msg.has_f3());
1253 EXPECT_EQ(obj.f3.value(),
static_cast<TestEnum>(msg.f3()));
1255 EXPECT_FALSE(msg.has_f3());
1259 EXPECT_TRUE(msg.has_f4());
1260 CheckSimpleEqual(obj.f4.value(), msg.f4());
1262 EXPECT_FALSE(msg.has_f4());
1266void CheckRepeatedEqual(
const Repeated& obj,
const messages::Repeated& msg) {
1267 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
1269 for (
int i = 0; i < msg.f1().size(); ++i) {
1270 EXPECT_EQ(obj.f1[i], msg.f1()[i]);
1273 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
1275 for (
int i = 0; i < msg.f2().size(); ++i) {
1276 EXPECT_EQ(obj.f2[i], msg.f2()[i]);
1279 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1281 for (
int i = 0; i < msg.f3().size(); ++i) {
1282 EXPECT_EQ(
static_cast<
int>(obj.f3[i]), msg.f3()[i]);
1285 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1287 for (
int i = 0; i < msg.f4().size(); ++i) {
1288 EXPECT_EQ(obj.f4[i].f1, msg.f4()[i].f1());
1292void CheckMapEqual(
const Map& obj,
const messages::Map& msg) {
1293 ASSERT_EQ(obj.f1.size(),
static_cast<std::size_t>(msg.f1().size()));
1295 for (
const auto& [key, value] : msg.f1()) {
1296 ASSERT_EQ(obj.f1.count(key), std::size_t{1});
1297 EXPECT_EQ(obj.f1.at(key), value);
1300 ASSERT_EQ(obj.f2.size(),
static_cast<std::size_t>(msg.f2().size()));
1302 for (
const auto& [key, value] : msg.f2()) {
1303 ASSERT_EQ(obj.f2.count(key), std::size_t{1});
1304 EXPECT_EQ(obj.f2.at(key), value);
1307 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1309 for (
const auto& [key, value] : msg.f3()) {
1310 ASSERT_EQ(obj.f3.count(key), std::size_t{1});
1311 EXPECT_EQ(obj.f3.at(key),
static_cast<TestEnum>(value));
1314 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1316 for (
const auto& [key, value] : msg.f4()) {
1317 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1318 CheckSimpleEqual(obj.f4.at(key), value);
1322void CheckOneofEqual(
const Oneof& obj,
const messages::Oneof& msg) {
1323 if (!obj.test_oneof.ContainsAny()) {
1324 EXPECT_EQ(msg.test_oneof_case(), messages::Oneof::TEST_ONEOF_NOT_SET);
1327 if (obj.test_oneof.Contains(0)) {
1328 EXPECT_TRUE(msg.has_f1());
1329 EXPECT_EQ(obj.test_oneof.Get<0>(), msg.f1());
1331 EXPECT_FALSE(msg.has_f1());
1334 if (obj.test_oneof.Contains(1)) {
1335 EXPECT_TRUE(msg.has_f2());
1336 EXPECT_EQ(obj.test_oneof.Get<1>(), msg.f2());
1338 EXPECT_FALSE(msg.has_f2());
1341 if (obj.test_oneof.Contains(2)) {
1342 EXPECT_TRUE(msg.has_f3());
1343 EXPECT_EQ(obj.test_oneof.Get<2>(),
static_cast<TestEnum>(msg.f3()));
1345 EXPECT_FALSE(msg.has_f3());
1348 if (obj.test_oneof.Contains(3)) {
1349 EXPECT_TRUE(msg.has_f4());
1350 CheckSimpleEqual(obj.test_oneof.Get<3>(), msg.f4());
1352 EXPECT_FALSE(msg.has_f4());
1356void CheckIndirectEqual(
const Indirect& obj,
const messages::Indirect& msg) {
1357 CheckSimpleEqual(*obj.f1, msg.f1());
1360 EXPECT_TRUE(msg.has_f2());
1361 EXPECT_EQ((*obj.f2.value()).Seconds().count(), msg.f2().seconds());
1362 EXPECT_EQ((*obj.f2.value()).Nanos().count(), msg.f2().nanos());
1364 EXPECT_FALSE(msg.has_f2());
1367 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1369 for (
int i = 0; i < msg.f3().size(); ++i) {
1370 CheckSimpleEqual(*obj.f3[i], msg.f3()[i]);
1373 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1375 for (
const auto& [key, value] : msg.f4()) {
1376 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1377 CheckSimpleEqual(*obj.f4.at(key), value);
1380 if (!obj.test_oneof.ContainsAny()) {
1381 EXPECT_EQ(msg.test_oneof_case(), messages::Indirect::TEST_ONEOF_NOT_SET);
1384 if (obj.test_oneof.Contains(0)) {
1385 EXPECT_TRUE(msg.has_f5());
1386 CheckSimpleEqual(*obj.test_oneof.Get<0>(), msg.f5());
1388 EXPECT_FALSE(msg.has_f5());
1391 if (obj.test_oneof.Contains(1)) {
1392 EXPECT_TRUE(msg.has_f6());
1393 EXPECT_EQ(*obj.test_oneof.Get<1>(), msg.f6());
1395 EXPECT_FALSE(msg.has_f6());
1398 EXPECT_EQ(*obj.f7, msg.f7());
1399 ASSERT_EQ((*obj.f8).size(),
static_cast<std::size_t>(msg.f8().size()));
1401 for (
int i = 0; i < msg.f8().size(); ++i) {
1402 EXPECT_EQ(*((*obj.f8)[i]),
static_cast<TestEnum>(msg.f8()[i]));
1405 ASSERT_EQ((*obj.f9).size(),
static_cast<std::size_t>(msg.f9().size()));
1407 for (
const auto& [key, value] : msg.f9()) {
1408 ASSERT_EQ((*obj.f9).count(key), std::size_t{1});
1409 CheckSimpleEqual(*((*obj.f9).at(key)), value);
1413void CheckStrongEqual(
const Strong& obj,
const messages::Strong& msg) {
1414 EXPECT_EQ(obj.f1.GetUnderlying(), msg.f1());
1417 EXPECT_TRUE(msg.has_f2());
1418 EXPECT_EQ(obj.f2.value().GetUnderlying(), msg.f2());
1420 EXPECT_FALSE(msg.has_f2());
1423 ASSERT_EQ(obj.f3.size(),
static_cast<std::size_t>(msg.f3().size()));
1425 for (
int i = 0; i < msg.f3().size(); ++i) {
1426 EXPECT_EQ(
static_cast<
int>(obj.f3[i].GetUnderlying()), msg.f3()[i]);
1429 ASSERT_EQ(obj.f4.size(),
static_cast<std::size_t>(msg.f4().size()));
1431 for (
const auto& [key, value] : msg.f4()) {
1432 ASSERT_EQ(obj.f4.count(key), std::size_t{1});
1433 CheckSimpleEqual(obj.f4.at(key).GetUnderlying(), value);
1436 if (!obj.test_oneof.ContainsAny()) {
1437 EXPECT_EQ(msg.test_oneof_case(), messages::Strong::TEST_ONEOF_NOT_SET);
1440 if (obj.test_oneof.Contains(0)) {
1441 EXPECT_TRUE(msg.has_f5());
1442 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Seconds().count(), msg.f5().seconds());
1443 EXPECT_EQ(obj.test_oneof.Get<0>().GetUnderlying().Nanos().count(), msg.f5().nanos());
1446 EXPECT_FALSE(msg.has_f5());