9#include <google/protobuf/util/json_util.h>
11#include <userver/formats/json/serialize.hpp>
12#include <userver/protobuf/string.hpp>
14USERVER_NAMESPACE_BEGIN
16namespace protobuf::json::tests {
19concept SupportsCheckMessageEqual =
requires(
const T& lhs,
const T& rhs) { CheckMessageEqual(lhs, rhs); };
22void AreProtobufRepeatedEqual(
const T& lhs,
const T& rhs) {
23 ASSERT_EQ(lhs.size(), rhs.size());
25 for (
int i = 0; i < lhs.size(); ++i) {
26 if constexpr (SupportsCheckMessageEqual<
typename T::value_type>) {
27 CheckMessageEqual(lhs[i], rhs[i]);
29 EXPECT_EQ(lhs[i], rhs[i]);
35void AreProtobufMapsEqual(
const T& lhs,
const T& rhs) {
36 EXPECT_EQ(lhs.size(), rhs.size());
38 for (
const auto& [key, val] : lhs) {
39 ASSERT_TRUE(rhs.contains(key));
41 if constexpr (SupportsCheckMessageEqual<
typename T::mapped_type>) {
42 CheckMessageEqual(val, rhs.at(key));
44 EXPECT_EQ(val, rhs.at(key));
51formats::
json::
Value CreateSampleJson(
const ::google::protobuf::Message& message,
const PrintOptions& options) {
52 using StringType = std::decay_t<
decltype(message.DebugString())>;
55 ::google::protobuf::util::JsonPrintOptions native_options;
56#if GOOGLE_PROTOBUF_VERSION
>= 5026000
57 native_options.always_print_fields_with_no_presence = options.always_print_fields_with_no_presence;
64 auto status = ::google::protobuf::util::MessageToJsonString(message, &result, native_options);
70 "Failed to create sample JSON from protobuf message: {}",
71 protobuf::impl::ToStringView(status.message())
76void InitSampleMessage(
const std::string& json, ::google::protobuf::Message& message,
const ParseOptions& options) {
77 ::google::protobuf::util::JsonParseOptions native_options;
81 auto status = ::google::protobuf::util::JsonStringToMessage(json, &message, native_options);
85 "Failed to initialize sample message from JSON: {}",
86 protobuf::impl::ToStringView(status.message())
91 }
catch (
const std::exception& e) {
92 throw SampleError(fmt::format(
"Failed to initialize sample message from JSON: {}", e.what()));
96::google::protobuf::Value ProtoValueToNative(
const ProtoValue& data) {
98 ::google::protobuf::Value result;
100 ::google::protobuf::Value operator()(std::monostate)
const {
return result; }
103 result.set_null_value(::google::protobuf::NULL_VALUE);
107 ::google::protobuf::Value operator()(
double val) {
108 result.set_number_value(val);
112 ::google::protobuf::Value operator()(
const std::string& val) {
113 result.set_string_value(val);
117 ::google::protobuf::Value operator()(
bool val) {
118 result.set_bool_value(val);
122 ::google::protobuf::Value operator()(
const std::vector<
double>& val) {
123 auto& arr = *result.mutable_list_value();
125 for (
const auto& item : val) {
126 arr.add_values()->set_number_value(item);
132 ::google::protobuf::Value operator()(
const std::map<std::string, std::string>& val) {
133 auto& fields = *result.mutable_struct_value()->mutable_fields();
135 for (
const auto& [key, value] : val) {
136 fields[key].set_string_value(value);
143 return std::visit(Visitor{}, data);
146proto_json::messages::Int32Message PrepareTestData(
const Int32MessageData& message_data) {
147 proto_json::messages::Int32Message message;
148 message.set_field1(message_data.field1);
149 message.set_field2(message_data.field2);
150 message.set_field3(message_data.field3);
154void CheckMessageEqual(
const proto_json::messages::Int32Message& lhs,
const proto_json::messages::Int32Message& rhs) {
155 EXPECT_EQ(lhs.field1(), rhs.field1());
156 EXPECT_EQ(lhs.field2(), rhs.field2());
157 EXPECT_EQ(lhs.field3(), rhs.field3());
160proto_json::messages::UInt32Message PrepareTestData(
const UInt32MessageData& message_data) {
161 proto_json::messages::UInt32Message message;
162 message.set_field1(message_data.field1);
163 message.set_field2(message_data.field2);
167void CheckMessageEqual(
const proto_json::messages::UInt32Message& lhs,
const proto_json::messages::UInt32Message& rhs) {
168 EXPECT_EQ(lhs.field1(), rhs.field1());
169 EXPECT_EQ(lhs.field2(), rhs.field2());
172proto_json::messages::Int64Message PrepareTestData(
const Int64MessageData& message_data) {
173 proto_json::messages::Int64Message message;
174 message.set_field1(message_data.field1);
175 message.set_field2(message_data.field2);
176 message.set_field3(message_data.field3);
180void CheckMessageEqual(
const proto_json::messages::Int64Message& lhs,
const proto_json::messages::Int64Message& rhs) {
181 EXPECT_EQ(lhs.field1(), rhs.field1());
182 EXPECT_EQ(lhs.field2(), rhs.field2());
183 EXPECT_EQ(lhs.field3(), rhs.field3());
186proto_json::messages::UInt64Message PrepareTestData(
const UInt64MessageData& message_data) {
187 proto_json::messages::UInt64Message message;
188 message.set_field1(message_data.field1);
189 message.set_field2(message_data.field2);
193void CheckMessageEqual(
const proto_json::messages::UInt64Message& lhs,
const proto_json::messages::UInt64Message& rhs) {
194 EXPECT_EQ(lhs.field1(), rhs.field1());
195 EXPECT_EQ(lhs.field2(), rhs.field2());
198proto_json::messages::FloatMessage PrepareTestData(
const FloatMessageData& message_data) {
199 proto_json::messages::FloatMessage message;
200 message.set_field1(message_data.field1);
204void CheckMessageEqual(
const proto_json::messages::FloatMessage& lhs,
const proto_json::messages::FloatMessage& rhs) {
205 if (!std::isnan(lhs.field1())) {
206 EXPECT_EQ(lhs.field1(), rhs.field1());
208 EXPECT_TRUE(std::isnan(rhs.field1()));
212proto_json::messages::DoubleMessage PrepareTestData(
const DoubleMessageData& message_data) {
213 proto_json::messages::DoubleMessage message;
214 message.set_field1(message_data.field1);
218void CheckMessageEqual(
const proto_json::messages::DoubleMessage& lhs,
const proto_json::messages::DoubleMessage& rhs) {
219 if (!std::isnan(lhs.field1())) {
220 EXPECT_EQ(lhs.field1(), rhs.field1());
222 EXPECT_TRUE(std::isnan(rhs.field1()));
226proto_json::messages::BoolMessage PrepareTestData(
const BoolMessageData& message_data) {
227 proto_json::messages::BoolMessage message;
228 message.set_field1(message_data.field1);
232void CheckMessageEqual(
const proto_json::messages::BoolMessage& lhs,
const proto_json::messages::BoolMessage& rhs) {
233 EXPECT_EQ(lhs.field1(), rhs.field1());
236proto_json::messages::StringMessage PrepareTestData(
const StringMessageData& message_data) {
237 proto_json::messages::StringMessage message;
238 message.set_field1(message_data.field1);
242void CheckMessageEqual(
const proto_json::messages::StringMessage& lhs,
const proto_json::messages::StringMessage& rhs) {
243 EXPECT_EQ(lhs.field1(), rhs.field1());
246proto_json::messages::BytesMessage PrepareTestData(
const BytesMessageData& message_data) {
247 proto_json::messages::BytesMessage message;
248 message.set_field1(message_data.field1);
252void CheckMessageEqual(
const proto_json::messages::BytesMessage& lhs,
const proto_json::messages::BytesMessage& rhs) {
253 EXPECT_EQ(lhs.field1(), rhs.field1());
256proto_json::messages::EnumMessage PrepareTestData(
const EnumMessageData& message_data) {
257 proto_json::messages::EnumMessage message;
258 message.set_field1(message_data.field1);
260 if (message_data.field2) {
261 message.set_field2(message_data.field2.value());
267void CheckMessageEqual(
const proto_json::messages::EnumMessage& lhs,
const proto_json::messages::EnumMessage& rhs) {
268 EXPECT_EQ(lhs.field1(), rhs.field1());
269 EXPECT_EQ(lhs.has_field2(), rhs.has_field2());
270 EXPECT_EQ(lhs.field2(), rhs.field2());
273proto_json::messages::NestedMessage PrepareTestData(
const NestedMessageData& message_data) {
274 proto_json::messages::NestedMessage message;
275 if (message_data.field1) {
276 message.mutable_parent()->set_field1(message_data.field1.value());
281void CheckMessageEqual(
const proto_json::messages::NestedMessage& lhs,
const proto_json::messages::NestedMessage& rhs) {
282 EXPECT_EQ(lhs.has_parent(), rhs.has_parent());
283 EXPECT_EQ(lhs.parent().field1(), rhs.parent().field1());
286proto_json::messages::WrapperMessage PrepareTestData(
const WrapperMessageData& message_data) {
287 proto_json::messages::WrapperMessage message;
289 if (message_data.field1) {
290 message.mutable_field1()->set_value(message_data.field1.value());
293 if (message_data.field2) {
294 message.mutable_field2()->set_value(message_data.field2.value());
297 if (message_data.field3) {
298 message.mutable_field3()->set_value(message_data.field3.value());
301 if (message_data.field4) {
302 message.mutable_field4()->set_value(message_data.field4.value());
305 if (message_data.field5) {
306 message.mutable_field5()->set_value(message_data.field5.value());
309 if (message_data.field6) {
310 message.mutable_field6()->set_value(message_data.field6.value());
313 if (message_data.field7) {
314 message.mutable_field7()->set_value(message_data.field7.value());
317 if (message_data.field8) {
318 message.mutable_field8()->set_value(message_data.field8.value());
321 if (message_data.field9) {
322 message.mutable_field9()->set_value(message_data.field9.value());
327void CheckMessageEqual(
328 const proto_json::messages::WrapperMessage& lhs,
329 const proto_json::messages::WrapperMessage& rhs
331 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
332 EXPECT_EQ(lhs.has_field2(), rhs.has_field2());
333 EXPECT_EQ(lhs.has_field3(), rhs.has_field3());
334 EXPECT_EQ(lhs.has_field4(), rhs.has_field4());
335 EXPECT_EQ(lhs.has_field5(), rhs.has_field5());
336 EXPECT_EQ(lhs.has_field6(), rhs.has_field6());
337 EXPECT_EQ(lhs.has_field7(), rhs.has_field7());
338 EXPECT_EQ(lhs.has_field8(), rhs.has_field8());
339 EXPECT_EQ(lhs.has_field9(), rhs.has_field9());
341 EXPECT_EQ(lhs.field1().value(), rhs.field1().value());
342 EXPECT_EQ(lhs.field2().value(), rhs.field2().value());
343 EXPECT_EQ(lhs.field3().value(), rhs.field3().value());
344 EXPECT_EQ(lhs.field4().value(), rhs.field4().value());
345 EXPECT_EQ(lhs.field5().value(), rhs.field5().value());
346 EXPECT_EQ(lhs.field6().value(), rhs.field6().value());
347 EXPECT_EQ(lhs.field7().value(), rhs.field7().value());
348 EXPECT_EQ(lhs.field8().value(), rhs.field8().value());
349 EXPECT_EQ(lhs.field9().value(), rhs.field9().value());
352proto_json::messages::FieldMaskMessage PrepareTestData(
const FieldMaskMessageData& message_data) {
353 proto_json::messages::FieldMaskMessage message;
355 if (!message_data.field1) {
359 (
void)message.mutable_field1();
361 for (
const auto& path : message_data.field1.value()) {
362 message.mutable_field1()->add_paths(path);
368void CheckMessageEqual(
const ::google::protobuf::FieldMask& lhs,
const ::google::protobuf::FieldMask& rhs) {
369 std::vector<std::string> mask_lhs;
370 std::vector<std::string> mask_rhs;
372 for (
const auto& path : lhs.paths()) {
373 mask_lhs.push_back(path);
376 for (
const auto& path : rhs.paths()) {
377 mask_rhs.push_back(path);
380 std::ranges::sort(mask_lhs);
381 std::ranges::sort(mask_rhs);
383 EXPECT_EQ(mask_lhs, mask_rhs);
386void CheckMessageEqual(
387 const proto_json::messages::FieldMaskMessage& lhs,
388 const proto_json::messages::FieldMaskMessage& rhs
390 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
391 CheckMessageEqual(lhs.field1(), rhs.field1());
394proto_json::messages::DurationMessage PrepareTestData(
const DurationMessageData& message_data) {
395 proto_json::messages::DurationMessage message;
397 if (!message_data.do_not_set) {
398 message.mutable_field1()->set_seconds(message_data.seconds);
399 message.mutable_field1()->set_nanos(message_data.nanos);
405void CheckMessageEqual(
const ::google::protobuf::Duration& lhs,
const ::google::protobuf::Duration& rhs) {
406 EXPECT_EQ(lhs.seconds(), rhs.seconds());
407 EXPECT_EQ(lhs.nanos(), rhs.nanos());
410void CheckMessageEqual(
411 const proto_json::messages::DurationMessage& lhs,
412 const proto_json::messages::DurationMessage& rhs
414 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
415 CheckMessageEqual(lhs.field1(), rhs.field1());
418proto_json::messages::TimestampMessage PrepareTestData(
const TimestampMessageData& message_data) {
419 proto_json::messages::TimestampMessage message;
421 if (!message_data.do_not_set) {
422 message.mutable_field1()->set_seconds(message_data.seconds);
423 message.mutable_field1()->set_nanos(message_data.nanos);
429void CheckMessageEqual(
const ::google::protobuf::Timestamp& lhs,
const ::google::protobuf::Timestamp& rhs) {
430 EXPECT_EQ(lhs.seconds(), rhs.seconds());
431 EXPECT_EQ(lhs.nanos(), rhs.nanos());
434void CheckMessageEqual(
435 const proto_json::messages::TimestampMessage& lhs,
436 const proto_json::messages::TimestampMessage& rhs
438 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
439 CheckMessageEqual(lhs.field1(), rhs.field1());
442proto_json::messages::ValueMessage PrepareTestData(
const ValueMessageData& message_data) {
444 proto_json::messages::ValueMessage result;
446 proto_json::messages::ValueMessage operator()(
const ProtoValue& val) {
447 *result.mutable_field1() = ProtoValueToNative(val);
451 proto_json::messages::ValueMessage operator()(
const std::vector<ProtoValue>& val) {
452 auto& arr = *result.mutable_field1()->mutable_list_value();
454 for (
const auto& item : val) {
455 *arr.add_values() = ProtoValueToNative(item);
461 proto_json::messages::ValueMessage operator()(
const std::map<std::string, ProtoValue>& val) {
462 auto& fields = *result.mutable_field1()->mutable_struct_value()->mutable_fields();
464 for (
const auto& [key, value] : val) {
465 fields[key] = ProtoValueToNative(value);
472 if (message_data.field1) {
473 return std::visit(Visitor{}, *message_data.field1);
475 return proto_json::messages::ValueMessage{};
479void CheckMessageEqual(
const ::google::protobuf::Value& lhs,
const ::google::protobuf::Value& rhs) {
480 if (lhs.has_null_value()) {
481 ASSERT_TRUE(rhs.has_null_value());
482 EXPECT_EQ(lhs.null_value(), rhs.null_value());
483 }
else if (lhs.has_number_value()) {
484 ASSERT_TRUE(rhs.has_number_value());
485 EXPECT_EQ(lhs.number_value(), rhs.number_value());
486 }
else if (lhs.has_string_value()) {
487 ASSERT_TRUE(rhs.has_string_value());
488 EXPECT_EQ(lhs.string_value(), rhs.string_value());
489 }
else if (lhs.has_bool_value()) {
490 ASSERT_TRUE(rhs.has_bool_value());
491 EXPECT_EQ(lhs.bool_value(), rhs.bool_value());
492 }
else if (lhs.has_list_value()) {
493 ASSERT_TRUE(rhs.has_list_value());
494 CheckMessageEqual(lhs.list_value(), rhs.list_value());
495 }
else if (lhs.has_struct_value()) {
496 ASSERT_TRUE(rhs.has_struct_value());
497 CheckMessageEqual(lhs.struct_value(), rhs.struct_value());
500 !rhs.has_null_value() && !rhs.has_number_value() && !rhs.has_string_value() && !rhs.has_bool_value() &&
501 !rhs.has_list_value() && !rhs.has_struct_value()
506void CheckMessageEqual(
const ::google::protobuf::ListValue& lhs,
const ::google::protobuf::ListValue& rhs) {
507 AreProtobufRepeatedEqual(lhs.values(), rhs.values());
510void CheckMessageEqual(
const ::google::protobuf::Struct& lhs,
const ::google::protobuf::Struct& rhs) {
511 AreProtobufMapsEqual(lhs.fields(), rhs.fields());
514void CheckMessageEqual(
const proto_json::messages::ValueMessage& lhs,
const proto_json::messages::ValueMessage& rhs) {
515 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
516 CheckMessageEqual(lhs.field1(), rhs.field1());
520void CheckAnyPayloadEqual(
const ::google::protobuf::Any& lhs,
const ::google::protobuf::Any& rhs) {
521 ASSERT_TRUE(lhs.Is<T>());
522 ASSERT_TRUE(rhs.Is<T>());
527 ASSERT_TRUE(lhs.UnpackTo(&lhs_payload));
528 ASSERT_TRUE(rhs.UnpackTo(&rhs_payload));
530 CheckMessageEqual(lhs_payload, rhs_payload);
533proto_json::messages::AnyMessage PrepareTestData(
const AnyMessageData& message_data) {
535 ::google::protobuf::Any result;
538 auto msg = PrepareTestData(payload);
540 if (!result.PackFrom(msg)) {
541 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
548 const auto msg = PrepareTestData(payload);
550 if (!result.PackFrom(msg.field1())) {
551 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
558 const auto msg = PrepareTestData(payload);
560 if (!result.PackFrom(msg.field1())) {
561 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
567 ::google::protobuf::Any operator()(
const RawAnyData& payload) {
568 result.set_type_url(payload.type_url);
569 result.set_value(payload.value);
574 proto_json::messages::AnyMessage result;
576 if (!message_data.field1) {
580 auto any_message = std::visit(Visitor{}, message_data.field1.value());
582 if (!message_data.add_nesting) {
583 *result.mutable_field1() = std::move(any_message);
585 ::google::protobuf::Any top;
587 if (!top.PackFrom(any_message)) {
588 throw std::runtime_error(
"Failed to create top-level 'google.protobuf.Any'");
591 *result.mutable_field1() = std::move(top);
597void CheckMessageEqual(
const ::google::protobuf::Any& lhs,
const ::google::protobuf::Any& rhs) {
598 if (lhs.Is<proto_json::messages::Int32Message>()) {
599 CheckAnyPayloadEqual<proto_json::messages::Int32Message>(lhs, rhs);
600 }
else if (lhs.Is<::google::protobuf::Duration>()) {
601 CheckAnyPayloadEqual<::google::protobuf::Duration>(lhs, rhs);
602 }
else if (lhs.Is<::google::protobuf::Value>()) {
603 CheckAnyPayloadEqual<::google::protobuf::Value>(lhs, rhs);
604 }
else if (lhs.Is<::google::protobuf::Any>()) {
605 CheckAnyPayloadEqual<::google::protobuf::Any>(lhs, rhs);
607 EXPECT_EQ(lhs.type_url(), rhs.type_url());
608 EXPECT_EQ(lhs.value(), rhs.value());
612void CheckMessageEqual(
const proto_json::messages::AnyMessage& lhs,
const proto_json::messages::AnyMessage& rhs) {
613 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
615 if (lhs.has_field1()) {
616 CheckMessageEqual(lhs.field1(), rhs.field1());
620proto_json::messages::OneofMessage PrepareTestData(
const OneofMessageData& message_data) {
621 proto_json::messages::OneofMessage result;
623 if (message_data.field1) {
624 result.set_field1(message_data.field1.value());
625 }
else if (message_data.field2) {
626 result.set_field2(message_data.field2.value());
632void CheckMessageEqual(
const proto_json::messages::OneofMessage& lhs,
const proto_json::messages::OneofMessage& rhs) {
633 if (lhs.has_field1()) {
634 EXPECT_TRUE(rhs.has_field1());
635 EXPECT_EQ(lhs.field1(), rhs.field1());
636 }
else if (lhs.has_field2()) {
637 EXPECT_TRUE(rhs.has_field2());
638 EXPECT_EQ(lhs.field2(), rhs.field2());
640 EXPECT_FALSE(rhs.has_field1() || rhs.has_field2());
644proto_json::messages::RepeatedMessage PrepareTestData(
const RepeatedMessageData& message_data) {
645 proto_json::messages::RepeatedMessage result;
647 for (
const auto& item : message_data.field1) {
648 result.add_field1(item);
651 for (
const auto& item : message_data.field2) {
652 *result.add_field2() = PrepareTestData(item);
655 for (
const auto& item : message_data.field3) {
656 *result.add_field3() = PrepareTestData(item).field1();
659 for (
const auto& item : message_data.field4) {
660 *result.add_field4() = ProtoValueToNative(item);
663 for (
const auto& item : message_data.field5) {
664 result.add_field5(item);
667 for (
const auto& item : message_data.field6) {
668 result.add_field6(item);
671 for (
const auto& item : message_data.field7) {
672 result.add_field7(item);
675 for (
const auto& item : message_data.field8) {
676 result.add_field8(item);
679 for (
const auto& item : message_data.field9) {
680 result.add_field9(item);
683 for (
const auto& item : message_data.field10) {
684 result.add_field10(item);
687 for (
const auto& item : message_data.field11) {
688 result.add_field11(item);
691 for (
const auto& item : message_data.field12) {
692 result.add_field12(item);
698void CheckMessageEqual(
699 const proto_json::messages::RepeatedMessage& lhs,
700 const proto_json::messages::RepeatedMessage& rhs
702 AreProtobufRepeatedEqual(lhs.field1(), rhs.field1());
703 AreProtobufRepeatedEqual(lhs.field2(), rhs.field2());
704 AreProtobufRepeatedEqual(lhs.field3(), rhs.field3());
705 AreProtobufRepeatedEqual(lhs.field4(), rhs.field4());
706 AreProtobufRepeatedEqual(lhs.field5(), rhs.field5());
707 AreProtobufRepeatedEqual(lhs.field6(), rhs.field6());
708 AreProtobufRepeatedEqual(lhs.field7(), rhs.field7());
709 AreProtobufRepeatedEqual(lhs.field8(), rhs.field8());
710 AreProtobufRepeatedEqual(lhs.field9(), rhs.field9());
711 AreProtobufRepeatedEqual(lhs.field10(), rhs.field10());
712 AreProtobufRepeatedEqual(lhs.field11(), rhs.field11());
713 AreProtobufRepeatedEqual(lhs.field12(), rhs.field12());
716proto_json::messages::MapMessage PrepareTestData(
const MapMessageData& message_data) {
717 proto_json::messages::MapMessage result;
719 for (
const auto& [key, val] : message_data.field1) {
720 (*result.mutable_field1())[key] = val;
723 for (
const auto& [key, val] : message_data.field2) {
724 (*result.mutable_field2())[key] = val;
727 for (
const auto& [key, val] : message_data.field3) {
728 (*result.mutable_field3())[key] = val;
731 for (
const auto& [key, val] : message_data.field4) {
732 (*result.mutable_field4())[key] = val;
735 for (
const auto& [key, val] : message_data.field5) {
736 (*result.mutable_field5())[key] = val;
739 for (
const auto& [key, val] : message_data.field6) {
740 (*result.mutable_field6())[key] = PrepareTestData(val);
743 for (
const auto& [key, val] : message_data.field7) {
744 (*result.mutable_field7())[key] = PrepareTestData(val).field1();
747 for (
const auto& [key, val] : message_data.field8) {
748 (*result.mutable_field8())[key] = ProtoValueToNative(val);
754void CheckMessageEqual(
const proto_json::messages::MapMessage& lhs,
const proto_json::messages::MapMessage& rhs) {
755 AreProtobufMapsEqual(lhs.field1(), rhs.field1());
756 AreProtobufMapsEqual(lhs.field2(), rhs.field2());
757 AreProtobufMapsEqual(lhs.field3(), rhs.field3());
758 AreProtobufMapsEqual(lhs.field4(), rhs.field4());
759 AreProtobufMapsEqual(lhs.field5(), rhs.field5());
760 AreProtobufMapsEqual(lhs.field6(), rhs.field6());
761 AreProtobufMapsEqual(lhs.field7(), rhs.field7());
762 AreProtobufMapsEqual(lhs.field8(), rhs.field8());
765proto_json::messages::NullValueMessage PrepareTestData(
const NullValueMessageData& message_data) {
766 proto_json::messages::NullValueMessage result;
767 result.set_field1(message_data.field1);
769 if (message_data.field2) {
770 result.set_field2(message_data.field2.value());
773 for (
const auto& item : message_data.field3) {
774 result.add_field3(item);
777 for (
const auto& [key, val] : message_data.field4) {
778 (*result.mutable_field4())[key] = val;
784void CheckMessageEqual(
785 const proto_json::messages::NullValueMessage& lhs,
786 const proto_json::messages::NullValueMessage& rhs
788 EXPECT_EQ(lhs.field1(), rhs.field1());
790 if (lhs.has_field2()) {
791 EXPECT_TRUE(rhs.has_field2());
792 EXPECT_EQ(lhs.field2(), rhs.field2());
794 EXPECT_FALSE(rhs.has_field2());
797 AreProtobufRepeatedEqual(lhs.field3(), rhs.field3());
798 AreProtobufMapsEqual(lhs.field4(), rhs.field4());
801proto_json::messages::PresenceMessage PrepareTestData(
const PresenceMessageData& message_data) {
802 proto_json::messages::PresenceMessage result;
804 result.set_field1(message_data.field1);
806 if (message_data.field2) {
807 result.set_field2(message_data.field2.value());
810 if (message_data.field3) {
811 result.mutable_field3()->set_field1(message_data.field3->field1);
812 result.mutable_field3()->set_field2(message_data.field3->field2);
813 result.mutable_field3()->set_field3(message_data.field3->field3);
816 if (!message_data.field4.empty()) {
817 for (
const auto& val : message_data.field4) {
818 result.add_field4(val);
822 if (!message_data.field5.empty()) {
823 for (
const auto& [key, val] : message_data.field5) {
824 (*result.mutable_field5())[key] = val;
831void CheckMessageEqual(
832 const proto_json::messages::PresenceMessage& lhs,
833 const proto_json::messages::PresenceMessage& rhs
835 EXPECT_EQ(lhs.field1(), rhs.field1());
837 if (lhs.has_field2()) {
838 EXPECT_TRUE(rhs.has_field2());
839 EXPECT_EQ(lhs.field2(), rhs.field2());
841 EXPECT_FALSE(rhs.has_field2());
844 if (lhs.has_field3()) {
845 EXPECT_TRUE(rhs.has_field3());
846 CheckMessageEqual(lhs.field3(), rhs.field3());
848 EXPECT_FALSE(rhs.has_field3());
851 AreProtobufRepeatedEqual(lhs.field4(), rhs.field4());
852 AreProtobufMapsEqual(lhs.field5(), rhs.field5());
856 proto_json::messages::UnknownFieldMessage result;
858 *result.mutable_field1() = PrepareTestData(message_data.field1);
860 for (
const auto& item : message_data.field2) {
861 *result.add_field2() = PrepareTestData(item);
864 for (
const auto& [key, val] : message_data.field3) {
865 (*result.mutable_field3())[key] = PrepareTestData(val);
871void CheckMessageEqual(
872 const proto_json::messages::UnknownFieldMessage& lhs,
873 const proto_json::messages::UnknownFieldMessage& rhs
875 EXPECT_EQ(lhs.has_field1(), rhs.has_field1());
876 CheckMessageEqual(lhs.field1(), rhs.field1());
878 AreProtobufRepeatedEqual(lhs.field2(), rhs.field2());
879 AreProtobufMapsEqual(lhs.field3(), rhs.field3());