8#include <google/protobuf/util/json_util.h>
10#include <userver/formats/json/serialize.hpp>
11#include <userver/utils/meta.hpp>
13USERVER_NAMESPACE_BEGIN
18using SupportsCheckMessageEqual =
decltype(CheckMessageEqual(std::declval<
const T&>(), std::declval<
const T&>()));
21inline constexpr bool kSupportsCheckMessageEqual = meta::IsDetected<SupportsCheckMessageEqual, T>;
24void AreProtobufRepeatedEqual(
const T& lhs,
const T& rhs) {
25 ASSERT_EQ(lhs.size(), rhs.size());
27 for (
int i = 0; i < lhs.size(); ++i) {
28 if constexpr (kSupportsCheckMessageEqual<
typename T::value_type>) {
29 CheckMessageEqual(lhs[i], rhs[i]);
31 EXPECT_EQ(lhs[i], rhs[i]);
37void AreProtobufMapsEqual(
const T& lhs,
const T& rhs) {
38 EXPECT_EQ(lhs.size(), rhs.size());
40 for (
const auto& [key, val] : lhs) {
41 ASSERT_TRUE(rhs.contains(key));
43 if constexpr (kSupportsCheckMessageEqual<
typename T::mapped_type>) {
44 CheckMessageEqual(val, rhs.at(key));
46 EXPECT_EQ(val, rhs.at(key));
51formats::json::Value PrepareJsonTestData(
const std::string& json_data) {
return formats::json::FromString(json_data); }
53formats::json::Value CreateSampleJson(
const ::google::protobuf::Message& message,
const WriteOptions& options) {
54 using StringType = std::decay_t<
decltype(message.DebugString())>;
57 ::google::protobuf::util::JsonPrintOptions native_options;
58#if GOOGLE_PROTOBUF_VERSION >= 5026001
59 native_options.always_print_fields_with_no_presence = options.always_print_fields_with_no_presence;
61 native_options.always_print_primitive_fields = options.always_print_fields_with_no_presence;
63 native_options.always_print_enums_as_ints = options.always_print_enums_as_ints;
64 native_options.preserve_proto_field_names = options.preserve_proto_field_names;
66 auto status = ::google::protobuf::util::MessageToJsonString(message, &result, native_options);
69 return formats::json::FromString(result);
71 throw SampleError(fmt::format(
"Failed to create sample JSON from protobuf message: {}", status.message()));
75void InitSampleMessage(
const std::string& json,
const ReadOptions& options, ::google::protobuf::Message& message) {
76 ::google::protobuf::util::ParseOptions native_options;
77 native_options.ignore_unknown_fields = options.ignore_unknown_fields;
79 auto status = ::google::protobuf::util::JsonStringToMessage(json, &message, native_options);
82 throw SampleError(fmt::format(
"Failed to initialize sample message from JSON: {}", status.message()));
86::google::protobuf::Value ProtoValueToNative(
const ProtoValue& data) {
88 ::google::protobuf::Value result;
90 ::google::protobuf::Value operator()(std::monostate) {
return result; }
93 result.set_null_value(::google::protobuf::NULL_VALUE);
97 ::google::protobuf::Value operator()(
double val) {
98 result.set_number_value(val);
102 ::google::protobuf::Value operator()(
const std::string& val) {
103 result.set_string_value(val);
107 ::google::protobuf::Value operator()(
bool val) {
108 result.set_bool_value(val);
112 ::google::protobuf::Value operator()(
const std::vector<
double>& val) {
113 auto& arr = *result.mutable_list_value();
115 for (
const auto& item : val) {
116 arr.add_values()->set_number_value(item);
122 ::google::protobuf::Value operator()(
const std::map<std::string, std::string>& val) {
123 auto& fields = *result.mutable_struct_value()->mutable_fields();
125 for (
const auto& [key, value] : val) {
126 fields[key].set_string_value(value);
133 return std::visit(Visitor{}, data);
136proto_json::messages::Int32Message PrepareTestData(
const Int32MessageData& message_data) {
137 proto_json::messages::Int32Message message;
138 message.set_field1(message_data.field1);
139 message.set_field2(message_data.field2);
140 message.set_field3(message_data.field3);
144void CheckMessageEqual(
const proto_json::messages::Int32Message& lhs,
const proto_json::messages::Int32Message& rhs) {
145 EXPECT_EQ(lhs.field1(), rhs.field1());
146 EXPECT_EQ(lhs.field2(), rhs.field2());
147 EXPECT_EQ(lhs.field3(), rhs.field3());
150proto_json::messages::UInt32Message PrepareTestData(
const UInt32MessageData& message_data) {
151 proto_json::messages::UInt32Message message;
152 message.set_field1(message_data.field1);
153 message.set_field2(message_data.field2);
157void CheckMessageEqual(
const proto_json::messages::UInt32Message& lhs,
const proto_json::messages::UInt32Message& rhs) {
158 EXPECT_EQ(lhs.field1(), rhs.field1());
159 EXPECT_EQ(lhs.field2(), rhs.field2());
162proto_json::messages::Int64Message PrepareTestData(
const Int64MessageData& message_data) {
163 proto_json::messages::Int64Message message;
164 message.set_field1(message_data.field1);
165 message.set_field2(message_data.field2);
166 message.set_field3(message_data.field3);
170void CheckMessageEqual(
const proto_json::messages::Int64Message& lhs,
const proto_json::messages::Int64Message& rhs) {
171 EXPECT_EQ(lhs.field1(), rhs.field1());
172 EXPECT_EQ(lhs.field2(), rhs.field2());
173 EXPECT_EQ(lhs.field3(), rhs.field3());
176proto_json::messages::UInt64Message PrepareTestData(
const UInt64MessageData& message_data) {
177 proto_json::messages::UInt64Message message;
178 message.set_field1(message_data.field1);
179 message.set_field2(message_data.field2);
183void CheckMessageEqual(
const proto_json::messages::UInt64Message& lhs,
const proto_json::messages::UInt64Message& rhs) {
184 EXPECT_EQ(lhs.field1(), rhs.field1());
185 EXPECT_EQ(lhs.field2(), rhs.field2());
188proto_json::messages::FloatMessage PrepareTestData(
const FloatMessageData& message_data) {
189 proto_json::messages::FloatMessage message;
190 message.set_field1(message_data.field1);
194void CheckMessageEqual(
const proto_json::messages::FloatMessage& lhs,
const proto_json::messages::FloatMessage& rhs) {
195 if (!std::isnan(lhs.field1())) {
196 EXPECT_EQ(lhs.field1(), rhs.field1());
198 EXPECT_TRUE(std::isnan(rhs.field1()));
202proto_json::messages::DoubleMessage PrepareTestData(
const DoubleMessageData& message_data) {
203 proto_json::messages::DoubleMessage message;
204 message.set_field1(message_data.field1);
208void CheckMessageEqual(
const proto_json::messages::DoubleMessage& lhs,
const proto_json::messages::DoubleMessage& rhs) {
209 if (!std::isnan(lhs.field1())) {
210 EXPECT_EQ(lhs.field1(), rhs.field1());
212 EXPECT_TRUE(std::isnan(rhs.field1()));
216proto_json::messages::BoolMessage PrepareTestData(
const BoolMessageData& message_data) {
217 proto_json::messages::BoolMessage message;
218 message.set_field1(message_data.field1);
222void CheckMessageEqual(
const proto_json::messages::BoolMessage& lhs,
const proto_json::messages::BoolMessage& rhs) {
223 EXPECT_EQ(lhs.field1(), rhs.field1());
226proto_json::messages::StringMessage PrepareTestData(
const StringMessageData& message_data) {
227 proto_json::messages::StringMessage message;
228 message.set_field1(message_data.field1);
232void CheckMessageEqual(
const proto_json::messages::StringMessage& lhs,
const proto_json::messages::StringMessage& rhs) {
233 EXPECT_EQ(lhs.field1(), rhs.field1());
236proto_json::messages::BytesMessage PrepareTestData(
const BytesMessageData& message_data) {
237 proto_json::messages::BytesMessage message;
238 message.set_field1(message_data.field1);
242void CheckMessageEqual(
const proto_json::messages::BytesMessage& lhs,
const proto_json::messages::BytesMessage& rhs) {
243 EXPECT_EQ(lhs.field1(), rhs.field1());
246proto_json::messages::EnumMessage PrepareTestData(
const EnumMessageData& message_data) {
247 proto_json::messages::EnumMessage message;
248 message.set_field1(message_data.field1);
252void CheckMessageEqual(
const proto_json::messages::EnumMessage& lhs,
const proto_json::messages::EnumMessage& rhs) {
253 EXPECT_EQ(lhs.field1(), rhs.field1());
256proto_json::messages::NestedMessage PrepareTestData(
const NestedMessageData& message_data) {
257 proto_json::messages::NestedMessage message;
258 if (message_data.field1) {
259 message.mutable_parent()->set_field1(message_data.field1.value());
264void CheckMessageEqual(
const proto_json::messages::NestedMessage& lhs,
const proto_json::messages::NestedMessage& rhs) {
265 EXPECT_TRUE((lhs.has_parent() && rhs.has_parent()) || (!lhs.has_parent() && !rhs.has_parent()));
266 EXPECT_EQ(lhs.parent().field1(), rhs.parent().field1());
269proto_json::messages::WrapperMessage PrepareTestData(
const WrapperMessageData& message_data) {
270 proto_json::messages::WrapperMessage message;
272 if (message_data.field1) {
273 message.mutable_field1()->set_value(message_data.field1.value());
276 if (message_data.field2) {
277 message.mutable_field2()->set_value(message_data.field2.value());
280 if (message_data.field3) {
281 message.mutable_field3()->set_value(message_data.field3.value());
284 if (message_data.field4) {
285 message.mutable_field4()->set_value(message_data.field4.value());
288 if (message_data.field5) {
289 message.mutable_field5()->set_value(message_data.field5.value());
292 if (message_data.field6) {
293 message.mutable_field6()->set_value(message_data.field6.value());
296 if (message_data.field7) {
297 message.mutable_field7()->set_value(message_data.field7.value());
300 if (message_data.field8) {
301 message.mutable_field8()->set_value(message_data.field8.value());
304 if (message_data.field9) {
305 message.mutable_field9()->set_value(message_data.field9.value());
310void CheckMessageEqual(
311 const proto_json::messages::WrapperMessage& lhs,
312 const proto_json::messages::WrapperMessage& rhs
314 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
315 EXPECT_TRUE((lhs.has_field2() && rhs.has_field2()) || (!lhs.has_field2() && !rhs.has_field2()));
316 EXPECT_TRUE((lhs.has_field3() && rhs.has_field3()) || (!lhs.has_field3() && !rhs.has_field3()));
317 EXPECT_TRUE((lhs.has_field4() && rhs.has_field4()) || (!lhs.has_field4() && !rhs.has_field4()));
318 EXPECT_TRUE((lhs.has_field5() && rhs.has_field5()) || (!lhs.has_field5() && !rhs.has_field5()));
319 EXPECT_TRUE((lhs.has_field6() && rhs.has_field6()) || (!lhs.has_field6() && !rhs.has_field6()));
320 EXPECT_TRUE((lhs.has_field7() && rhs.has_field7()) || (!lhs.has_field7() && !rhs.has_field7()));
321 EXPECT_TRUE((lhs.has_field8() && rhs.has_field8()) || (!lhs.has_field8() && !rhs.has_field8()));
322 EXPECT_TRUE((lhs.has_field9() && rhs.has_field9()) || (!lhs.has_field9() && !rhs.has_field9()));
324 EXPECT_EQ(lhs.field1().value(), rhs.field1().value());
325 EXPECT_EQ(lhs.field2().value(), rhs.field2().value());
326 EXPECT_EQ(lhs.field3().value(), rhs.field3().value());
327 EXPECT_EQ(lhs.field4().value(), rhs.field4().value());
328 EXPECT_EQ(lhs.field5().value(), rhs.field5().value());
329 EXPECT_EQ(lhs.field6().value(), rhs.field6().value());
330 EXPECT_EQ(lhs.field7().value(), rhs.field7().value());
331 EXPECT_EQ(lhs.field8().value(), rhs.field8().value());
332 EXPECT_EQ(lhs.field9().value(), rhs.field9().value());
335proto_json::messages::FieldMaskMessage PrepareTestData(
const FieldMaskMessageData& message_data) {
336 proto_json::messages::FieldMaskMessage message;
338 if (!message_data.field1) {
342 (
void)message.mutable_field1();
344 for (
const auto& path : message_data.field1.value()) {
345 message.mutable_field1()->add_paths(path);
351void CheckMessageEqual(
const ::google::protobuf::FieldMask& lhs,
const ::google::protobuf::FieldMask& rhs) {
352 std::vector<std::string> mask_lhs, mask_rhs;
354 for (
const auto& path : lhs.paths()) {
355 mask_lhs.push_back(path);
358 for (
const auto& path : rhs.paths()) {
359 mask_rhs.push_back(path);
362 std::sort(mask_lhs.begin(), mask_lhs.end());
363 std::sort(mask_rhs.begin(), mask_rhs.end());
365 EXPECT_EQ(mask_lhs, mask_rhs);
368void CheckMessageEqual(
369 const proto_json::messages::FieldMaskMessage& lhs,
370 const proto_json::messages::FieldMaskMessage& rhs
372 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
373 CheckMessageEqual(lhs.field1(), rhs.field1());
376proto_json::messages::DurationMessage PrepareTestData(
const DurationMessageData& message_data) {
377 proto_json::messages::DurationMessage message;
379 if (!message_data.do_not_set) {
380 message.mutable_field1()->set_seconds(message_data.seconds);
381 message.mutable_field1()->set_nanos(message_data.nanos);
387void CheckMessageEqual(
const ::google::protobuf::Duration& lhs,
const ::google::protobuf::Duration& rhs) {
388 EXPECT_EQ(lhs.seconds(), rhs.seconds());
389 EXPECT_EQ(lhs.nanos(), rhs.nanos());
392void CheckMessageEqual(
393 const proto_json::messages::DurationMessage& lhs,
394 const proto_json::messages::DurationMessage& rhs
396 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
397 CheckMessageEqual(lhs.field1(), rhs.field1());
400proto_json::messages::TimestampMessage PrepareTestData(
const TimestampMessageData& message_data) {
401 proto_json::messages::TimestampMessage message;
403 if (!message_data.do_not_set) {
404 message.mutable_field1()->set_seconds(message_data.seconds);
405 message.mutable_field1()->set_nanos(message_data.nanos);
411void CheckMessageEqual(
const ::google::protobuf::Timestamp& lhs,
const ::google::protobuf::Timestamp& rhs) {
412 EXPECT_EQ(lhs.seconds(), rhs.seconds());
413 EXPECT_EQ(lhs.nanos(), rhs.nanos());
416void CheckMessageEqual(
417 const proto_json::messages::TimestampMessage& lhs,
418 const proto_json::messages::TimestampMessage& rhs
420 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
421 CheckMessageEqual(lhs.field1(), rhs.field1());
424proto_json::messages::ValueMessage PrepareTestData(
const ValueMessageData& message_data) {
426 proto_json::messages::ValueMessage result;
428 proto_json::messages::ValueMessage operator()(
const ProtoValue& val) {
429 *result.mutable_field1() = ProtoValueToNative(val);
433 proto_json::messages::ValueMessage operator()(
const std::vector<ProtoValue>& val) {
434 auto& arr = *result.mutable_field1()->mutable_list_value();
436 for (
const auto& item : val) {
437 *arr.add_values() = ProtoValueToNative(item);
443 proto_json::messages::ValueMessage operator()(
const std::map<std::string, ProtoValue>& val) {
444 auto& fields = *result.mutable_field1()->mutable_struct_value()->mutable_fields();
446 for (
const auto& [key, value] : val) {
447 fields[key] = ProtoValueToNative(value);
454 if (message_data.field1) {
455 return std::visit(Visitor{}, *message_data.field1);
457 return proto_json::messages::ValueMessage{};
461void CheckMessageEqual(
const ::google::protobuf::Value& lhs,
const ::google::protobuf::Value& rhs) {
462 if (lhs.has_null_value()) {
463 ASSERT_TRUE(rhs.has_null_value());
464 EXPECT_EQ(lhs.null_value(), rhs.null_value());
465 }
else if (lhs.has_number_value()) {
466 ASSERT_TRUE(rhs.has_number_value());
467 EXPECT_EQ(lhs.number_value(), rhs.number_value());
468 }
else if (lhs.has_string_value()) {
469 ASSERT_TRUE(rhs.has_string_value());
470 EXPECT_EQ(lhs.string_value(), rhs.string_value());
471 }
else if (lhs.has_bool_value()) {
472 ASSERT_TRUE(rhs.has_bool_value());
473 EXPECT_EQ(lhs.bool_value(), rhs.bool_value());
474 }
else if (lhs.has_list_value()) {
475 ASSERT_TRUE(rhs.has_list_value());
476 CheckMessageEqual(lhs.list_value(), rhs.list_value());
477 }
else if (lhs.has_struct_value()) {
478 ASSERT_TRUE(rhs.has_struct_value());
479 CheckMessageEqual(lhs.struct_value(), rhs.struct_value());
482 !rhs.has_null_value() && !rhs.has_number_value() && !rhs.has_string_value() && !rhs.has_bool_value() &&
483 !rhs.has_list_value() && !rhs.has_struct_value()
488void CheckMessageEqual(
const ::google::protobuf::ListValue& lhs,
const ::google::protobuf::ListValue& rhs) {
489 AreProtobufRepeatedEqual(lhs.values(), rhs.values());
492void CheckMessageEqual(
const ::google::protobuf::Struct& lhs,
const ::google::protobuf::Struct& rhs) {
493 AreProtobufMapsEqual(lhs.fields(), rhs.fields());
496void CheckMessageEqual(
const proto_json::messages::ValueMessage& lhs,
const proto_json::messages::ValueMessage& rhs) {
497 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
498 CheckMessageEqual(lhs.field1(), rhs.field1());
502void CheckAnyPayloadEqual(
const ::google::protobuf::Any& lhs,
const ::google::protobuf::Any& rhs) {
503 ASSERT_TRUE(lhs.Is<T>());
504 ASSERT_TRUE(rhs.Is<T>());
506 T lhs_payload, rhs_payload;
508 ASSERT_TRUE(lhs.UnpackTo(&lhs_payload));
509 ASSERT_TRUE(rhs.UnpackTo(&rhs_payload));
511 CheckMessageEqual(lhs_payload, rhs_payload);
514proto_json::messages::AnyMessage PrepareTestData(
const AnyMessageData& message_data) {
516 ::google::protobuf::Any result;
519 auto msg = PrepareTestData(payload);
521 if (!result.PackFrom(msg)) {
522 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
529 const auto msg = PrepareTestData(payload);
531 if (!result.PackFrom(msg.field1())) {
532 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
539 const auto msg = PrepareTestData(payload);
541 if (!result.PackFrom(msg.field1())) {
542 throw std::runtime_error(
"Failed to create 'google.protobuf.Any'");
548 ::google::protobuf::Any operator()(
const RawAnyData& payload) {
549 result.set_type_url(payload.type_url);
550 result.set_value(payload.value);
555 proto_json::messages::AnyMessage result;
557 if (!message_data.field1) {
561 auto any_message = std::visit(Visitor{}, message_data.field1.value());
563 if (!message_data.add_nesting) {
564 *result.mutable_field1() = std::move(any_message);
566 ::google::protobuf::Any top;
568 if (!top.PackFrom(any_message)) {
569 throw std::runtime_error(
"Failed to create top-level 'google.protobuf.Any'");
572 *result.mutable_field1() = std::move(top);
578void CheckMessageEqual(
const ::google::protobuf::Any& lhs,
const ::google::protobuf::Any& rhs) {
579 if (lhs.Is<proto_json::messages::Int32Message>()) {
580 CheckAnyPayloadEqual<proto_json::messages::Int32Message>(lhs, rhs);
581 }
else if (lhs.Is<::google::protobuf::Duration>()) {
582 CheckAnyPayloadEqual<::google::protobuf::Duration>(lhs, rhs);
583 }
else if (lhs.Is<::google::protobuf::Value>()) {
584 CheckAnyPayloadEqual<::google::protobuf::Value>(lhs, rhs);
585 }
else if (lhs.Is<::google::protobuf::Any>()) {
586 CheckAnyPayloadEqual<::google::protobuf::Any>(lhs, rhs);
588 EXPECT_EQ(lhs.type_url(), rhs.type_url());
589 EXPECT_EQ(lhs.value(), rhs.value());
593void CheckMessageEqual(
const proto_json::messages::AnyMessage& lhs,
const proto_json::messages::AnyMessage& rhs) {
594 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
596 if (lhs.has_field1()) {
597 CheckMessageEqual(lhs.field1(), rhs.field1());
601proto_json::messages::OneofMessage PrepareTestData(
const OneofMessageData& message_data) {
602 proto_json::messages::OneofMessage result;
604 if (message_data.field1) {
605 result.set_field1(message_data.field1.value());
606 }
else if (message_data.field2) {
607 result.set_field2(message_data.field2.value());
613void CheckMessageEqual(
const proto_json::messages::OneofMessage& lhs,
const proto_json::messages::OneofMessage& rhs) {
614 if (lhs.has_field1()) {
615 EXPECT_TRUE(rhs.has_field1());
616 EXPECT_EQ(lhs.field1(), rhs.field1());
617 }
else if (lhs.has_field2()) {
618 EXPECT_TRUE(rhs.has_field2());
619 EXPECT_EQ(lhs.field2(), rhs.field2());
621 EXPECT_FALSE(rhs.has_field1() || rhs.has_field2());
625proto_json::messages::RepeatedMessage PrepareTestData(
const RepeatedMessageData& message_data) {
626 proto_json::messages::RepeatedMessage result;
628 for (
const auto& item : message_data.field1) {
629 result.add_field1(item);
632 for (
const auto& item : message_data.field2) {
633 *result.add_field2() = PrepareTestData(item);
636 for (
const auto& item : message_data.field3) {
637 *result.add_field3() = PrepareTestData(item).field1();
643void CheckMessageEqual(
644 const proto_json::messages::RepeatedMessage& lhs,
645 const proto_json::messages::RepeatedMessage& rhs
647 AreProtobufRepeatedEqual(lhs.field1(), rhs.field1());
648 AreProtobufRepeatedEqual(lhs.field2(), rhs.field2());
649 AreProtobufRepeatedEqual(lhs.field3(), rhs.field3());
652proto_json::messages::MapMessage PrepareTestData(
const MapMessageData& message_data) {
653 proto_json::messages::MapMessage result;
655 for (
const auto& [key, val] : message_data.field1) {
656 (*result.mutable_field1())[key] = val;
659 for (
const auto& [key, val] : message_data.field2) {
660 (*result.mutable_field2())[key] = val;
663 for (
const auto& [key, val] : message_data.field3) {
664 (*result.mutable_field3())[key] = val;
667 for (
const auto& [key, val] : message_data.field4) {
668 (*result.mutable_field4())[key] = val;
671 for (
const auto& [key, val] : message_data.field5) {
672 (*result.mutable_field5())[key] = val;
675 for (
const auto& [key, val] : message_data.field6) {
676 (*result.mutable_field6())[key] = PrepareTestData(val);
679 for (
const auto& [key, val] : message_data.field7) {
680 (*result.mutable_field7())[key] = PrepareTestData(val).field1();
686void CheckMessageEqual(
const proto_json::messages::MapMessage& lhs,
const proto_json::messages::MapMessage& rhs) {
687 AreProtobufMapsEqual(lhs.field1(), rhs.field1());
688 AreProtobufMapsEqual(lhs.field2(), rhs.field2());
689 AreProtobufMapsEqual(lhs.field3(), rhs.field3());
690 AreProtobufMapsEqual(lhs.field4(), rhs.field4());
691 AreProtobufMapsEqual(lhs.field5(), rhs.field5());
692 AreProtobufMapsEqual(lhs.field6(), rhs.field6());
693 AreProtobufMapsEqual(lhs.field7(), rhs.field7());
696proto_json::messages::NullValueMessage PrepareTestData(
const NullValueMessageData& message_data) {
697 proto_json::messages::NullValueMessage result;
698 result.set_field1(message_data.field1);
700 if (message_data.field2) {
701 result.set_field2(message_data.field2.value());
704 for (
const auto& item : message_data.field3) {
705 result.add_field3(item);
708 for (
const auto& [key, val] : message_data.field4) {
709 (*result.mutable_field4())[key] = val;
715void CheckMessageEqual(
716 const proto_json::messages::NullValueMessage& lhs,
717 const proto_json::messages::NullValueMessage& rhs
719 EXPECT_EQ(lhs.field1(), rhs.field1());
721 if (lhs.has_field2()) {
722 EXPECT_TRUE(rhs.has_field2());
723 EXPECT_EQ(lhs.field2(), rhs.field2());
725 EXPECT_FALSE(rhs.has_field2());
728 AreProtobufRepeatedEqual(lhs.field3(), rhs.field3());
729 AreProtobufMapsEqual(lhs.field4(), rhs.field4());
732proto_json::messages::PresenceMessage PrepareTestData(
const PresenceMessageData& message_data) {
733 proto_json::messages::PresenceMessage result;
735 result.set_field1(message_data.field1);
737 if (message_data.field2) {
738 result.set_field2(message_data.field2.value());
741 if (message_data.field3) {
742 result.mutable_field3()->set_field1(message_data.field3->field1);
743 result.mutable_field3()->set_field2(message_data.field3->field2);
744 result.mutable_field3()->set_field3(message_data.field3->field3);
747 if (!message_data.field4.empty()) {
748 for (
const auto& val : message_data.field4) {
749 result.add_field4(val);
753 if (!message_data.field5.empty()) {
754 for (
const auto& [key, val] : message_data.field5) {
755 (*result.mutable_field5())[key] = val;
762void CheckMessageEqual(
763 const proto_json::messages::PresenceMessage& lhs,
764 const proto_json::messages::PresenceMessage& rhs
766 EXPECT_EQ(lhs.field1(), rhs.field1());
768 if (lhs.has_field2()) {
769 EXPECT_TRUE(rhs.has_field2());
770 EXPECT_EQ(lhs.field2(), rhs.field2());
772 EXPECT_FALSE(rhs.has_field2());
775 if (lhs.has_field3()) {
776 EXPECT_TRUE(rhs.has_field3());
777 CheckMessageEqual(lhs.field3(), rhs.field3());
779 EXPECT_FALSE(rhs.has_field3());
782 AreProtobufRepeatedEqual(lhs.field4(), rhs.field4());
783 AreProtobufMapsEqual(lhs.field5(), rhs.field5());
787 proto_json::messages::UnknownFieldMessage result;
789 *result.mutable_field1() = PrepareTestData(message_data.field1);
791 for (
const auto& item : message_data.field2) {
792 *result.add_field2() = PrepareTestData(item);
795 for (
const auto& [key, val] : message_data.field3) {
796 (*result.mutable_field3())[key] = PrepareTestData(val);
802void CheckMessageEqual(
803 const proto_json::messages::UnknownFieldMessage& lhs,
804 const proto_json::messages::UnknownFieldMessage& rhs
806 EXPECT_TRUE((lhs.has_field1() && rhs.has_field1()) || (!lhs.has_field1() && !rhs.has_field1()));
807 CheckMessageEqual(lhs.field1(), rhs.field1());
809 AreProtobufRepeatedEqual(lhs.field2(), rhs.field2());
810 AreProtobufMapsEqual(lhs.field3(), rhs.field3());