42 #include <google/protobuf/stubs/common.h>
44 #include <google/protobuf/stubs/strutil.h>
46 #include <google/protobuf/stubs/logging.h>
47 #include <google/protobuf/any_test.pb.h>
48 #include <google/protobuf/map_test_util.h>
49 #include <google/protobuf/map_unittest.pb.h>
50 #include <google/protobuf/test_util.h>
51 #include <google/protobuf/unittest.pb.h>
52 #include <google/protobuf/io/coded_stream.h>
53 #include <google/protobuf/io/zero_copy_stream_impl.h>
54 #include <google/protobuf/text_format.h>
55 #include <google/protobuf/wire_format.h>
56 #include <google/protobuf/util/message_differencer_unittest.pb.h>
57 #include <google/protobuf/util/field_comparator.h>
58 #include <google/protobuf/util/message_differencer.h>
59 #include <google/protobuf/testing/googletest.h>
60 #include <gtest/gtest.h>
70 std::vector<std::string> field_path =
71 Split(field_name,
".",
true);
74 for (
int i = 0;
i < field_path.size();
i++) {
81 void ExpectEqualsWithDifferencer(util::MessageDifferencer* differencer,
90 TEST(MessageDifferencerTest, BasicEqualityTest) {
92 unittest::TestAllTypes msg1;
93 unittest::TestAllTypes msg2;
102 TEST(MessageDifferencerTest, BasicInequalityTest) {
104 unittest::TestAllTypes msg1;
105 unittest::TestAllTypes msg2;
110 msg1.set_optional_int32(-1);
116 TEST(MessageDifferencerTest, RepeatedFieldInequalityTest) {
118 unittest::TestAllTypes msg1;
119 unittest::TestAllTypes msg2;
124 msg1.add_repeated_int32(-1);
130 TEST(MessageDifferencerTest, RepeatedFieldSetOptimizationTest) {
131 util::MessageDifferencer differencer;
132 protobuf_unittest::TestDiffMessage msg1;
133 protobuf_unittest::TestDiffMessage msg2;
136 differencer.TreatAsSet(item1->GetDescriptor()->FindFieldByName(
"ra"));
137 differencer.TreatAsSet(item2->GetDescriptor()->FindFieldByName(
"ra"));
138 for (
int i = 0;
i < 1000;
i++) {
151 TEST(MessageDifferencerTest, MapFieldEqualityTest) {
153 unittest::TestMap msg1;
154 unittest::TestMap msg2;
157 tester.SetMapFieldsViaReflection(&msg1);
158 tester.SetMapFieldsViaReflection(&msg2);
159 tester.SwapMapsViaReflection(&msg1);
165 MapTestUtil::GetMapEntries(msg1, 0);
169 (*msg1.mutable_map_int32_int32())[1] = 2;
170 (*msg2.mutable_map_int32_int32())[1] = 3;
176 (*msg1.mutable_map_string_string())[
"1"] =
"";
177 (*msg2.mutable_map_string_string())[
"2"] =
"";
183 (*msg1.mutable_map_int32_foreign_message())[1].set_c(1);
184 (*msg2.mutable_map_int32_foreign_message())[1].set_c(2);
188 TEST(MessageDifferencerTest, BasicPartialEqualityTest) {
190 unittest::TestAllTypes msg1;
191 unittest::TestAllTypes msg2;
197 util::MessageDifferencer differencer;
202 TEST(MessageDifferencerTest, PartialEqualityTestExtraField) {
204 unittest::TestAllTypes msg1;
205 unittest::TestAllTypes msg2;
210 msg1.clear_optional_int32();
213 util::MessageDifferencer differencer;
218 TEST(MessageDifferencerTest, PartialEqualityTestSkipRequiredField) {
220 unittest::TestRequired msg1;
221 unittest::TestRequired msg2;
228 util::MessageDifferencer differencer;
233 TEST(MessageDifferencerTest, BasicPartialInequalityTest) {
235 unittest::TestAllTypes msg1;
236 unittest::TestAllTypes msg2;
241 msg1.set_optional_int32(-1);
244 util::MessageDifferencer differencer;
249 TEST(MessageDifferencerTest, PartialInequalityMissingFieldTest) {
251 unittest::TestAllTypes msg1;
252 unittest::TestAllTypes msg2;
257 msg2.clear_optional_int32();
260 util::MessageDifferencer differencer;
265 TEST(MessageDifferencerTest, RepeatedFieldPartialInequalityTest) {
267 unittest::TestAllTypes msg1;
268 unittest::TestAllTypes msg2;
273 msg1.add_repeated_int32(-1);
276 util::MessageDifferencer differencer;
281 TEST(MessageDifferencerTest, BasicEquivalencyTest) {
283 unittest::TestAllTypes msg1;
284 unittest::TestAllTypes msg2;
293 TEST(MessageDifferencerTest, EquivalencyNotEqualTest) {
295 unittest::TestAllTypes msg1;
296 unittest::TestAllTypes msg2;
301 msg1.clear_optional_int32();
302 msg2.set_optional_int32(0);
309 TEST(MessageDifferencerTest, BasicInequivalencyTest) {
311 unittest::TestAllTypes msg1;
312 unittest::TestAllTypes msg2;
317 msg1.set_optional_int32(-1);
323 TEST(MessageDifferencerTest, BasicEquivalencyNonSetTest) {
325 unittest::TestAllTypes msg1;
326 unittest::TestAllTypes msg2;
332 TEST(MessageDifferencerTest, BasicInequivalencyNonSetTest) {
334 unittest::TestAllTypes msg1;
335 unittest::TestAllTypes msg2;
337 msg1.set_optional_int32(-1);
343 TEST(MessageDifferencerTest, BasicPartialEquivalencyTest) {
345 unittest::TestAllTypes msg1;
346 unittest::TestAllTypes msg2;
352 util::MessageDifferencer differencer;
353 differencer.set_message_field_comparison(
359 TEST(MessageDifferencerTest, PartialEquivalencyNotEqualTest) {
361 unittest::TestAllTypes msg1;
362 unittest::TestAllTypes msg2;
367 msg1.set_optional_int32(0);
368 msg2.clear_optional_int32();
372 util::MessageDifferencer differencer;
373 differencer.set_message_field_comparison(
379 TEST(MessageDifferencerTest, PartialEquivalencyTestExtraField) {
381 unittest::TestAllTypes msg1;
382 unittest::TestAllTypes msg2;
387 msg1.clear_optional_int32();
390 util::MessageDifferencer differencer;
391 differencer.set_message_field_comparison(
397 TEST(MessageDifferencerTest, PartialEquivalencyTestSkipRequiredField) {
399 unittest::TestRequired msg1;
400 unittest::TestRequired msg2;
407 util::MessageDifferencer differencer;
408 differencer.set_message_field_comparison(
414 TEST(MessageDifferencerTest, BasicPartialInequivalencyTest) {
416 unittest::TestAllTypes msg1;
417 unittest::TestAllTypes msg2;
422 msg1.set_optional_int32(-1);
425 util::MessageDifferencer differencer;
426 differencer.set_message_field_comparison(
432 TEST(MessageDifferencerTest, BasicPartialEquivalencyNonSetTest) {
434 unittest::TestAllTypes msg1;
435 unittest::TestAllTypes msg2;
438 util::MessageDifferencer differencer;
439 differencer.set_message_field_comparison(
445 TEST(MessageDifferencerTest, BasicPartialInequivalencyNonSetTest) {
447 unittest::TestAllTypes msg1;
448 unittest::TestAllTypes msg2;
450 msg1.set_optional_int32(-1);
453 util::MessageDifferencer differencer;
454 differencer.set_message_field_comparison(
460 TEST(MessageDifferencerTest, ApproximateEqualityTest) {
462 unittest::TestAllTypes msg1;
463 unittest::TestAllTypes msg2;
472 TEST(MessageDifferencerTest, ApproximateModifiedEqualityTest) {
474 unittest::TestAllTypes msg1;
475 unittest::TestAllTypes msg2;
480 const float v1 = 2.300005f;
481 const float v2 = 2.300006f;
482 msg1.set_optional_float(v1);
483 msg2.set_optional_float(v2);
486 ASSERT_NE(v1, v2) <<
"Should not be the same: " << v1 <<
", " << v2;
487 ASSERT_FLOAT_EQ(v1, v2) <<
"Should be approx. equal: " << v1 <<
", " << v2;
492 TEST(MessageDifferencerTest, ApproximateEquivalencyTest) {
494 unittest::TestAllTypes msg1;
495 unittest::TestAllTypes msg2;
504 TEST(MessageDifferencerTest, ApproximateModifiedEquivalencyTest) {
506 unittest::TestAllTypes msg1;
507 unittest::TestAllTypes msg2;
513 const float v1 = 2.300005f;
514 const float v2 = 2.300006f;
515 msg1.set_optional_float(v1);
516 msg2.set_optional_float(v2);
519 ASSERT_NE(v1, v2) <<
"Should not be the same: " << v1 <<
", " << v2;
520 ASSERT_FLOAT_EQ(v1, v2) <<
"Should be approx. equal: " << v1 <<
", " << v2;
525 msg1.clear_optional_int32();
526 msg2.set_optional_int32(0);
535 TEST(MessageDifferencerTest, ApproximateInequivalencyTest) {
537 unittest::TestAllTypes msg1;
538 unittest::TestAllTypes msg2;
544 msg1.set_optional_int32(-1);
548 msg1.set_optional_int32(0);
549 msg2.set_optional_int32(0);
553 const float v1 = 2.3f;
554 const float v2 = 9.3f;
555 msg1.set_optional_float(v1);
556 msg2.set_optional_float(v2);
560 TEST(MessageDifferencerTest, WithinFractionOrMarginFloatTest) {
562 unittest::TestAllTypes msg1;
563 unittest::TestAllTypes msg2;
569 const float v1 = 100.0f;
570 const float v2 = 109.9f;
571 msg1.set_optional_float(v1);
572 msg2.set_optional_float(v2);
575 util::MessageDifferencer differencer;
578 msg1.GetDescriptor()->FindFieldByName(
"optional_float");
583 differencer.SetFractionAndMargin(fd, 0.0, 10.0);
592 differencer.SetFractionAndMargin(fd, 0.2, 0.0);
596 differencer.SetFractionAndMargin(fd, 0.01, 0.0);
600 differencer.SetFractionAndMargin(fd, 0.01, 10.0);
605 msg1.set_default_float(v1);
606 msg2.set_default_float(v2);
608 msg1.set_default_float(v1);
609 msg2.set_default_float(v1);
613 TEST(MessageDifferencerTest, WithinFractionOrMarginDoubleTest) {
615 unittest::TestAllTypes msg1;
616 unittest::TestAllTypes msg2;
622 const double v1 = 100.0;
623 const double v2 = 109.9;
624 msg1.set_optional_double(v1);
625 msg2.set_optional_double(v2);
628 util::MessageDifferencer differencer;
635 msg1.GetDescriptor()->FindFieldByName(
"optional_double");
636 differencer.SetFractionAndMargin(fd, 0.0, 10.0);
645 differencer.SetFractionAndMargin(fd, 0.2, 0.0);
649 differencer.SetFractionAndMargin(fd, 0.01, 0.0);
653 differencer.SetFractionAndMargin(fd, 0.01, 10.0);
658 msg1.set_default_double(v1);
659 msg2.set_default_double(v2);
661 msg1.set_default_double(v1);
662 msg2.set_default_double(v1);
666 TEST(MessageDifferencerTest, WithinDefaultFractionOrMarginDoubleTest) {
668 unittest::TestAllTypes msg1;
669 unittest::TestAllTypes msg2;
675 const double v1 = 100.0;
676 const double v2 = 109.9;
677 msg1.set_optional_double(v1);
678 msg2.set_optional_double(v2);
680 util::MessageDifferencer differencer;
687 util::DefaultFieldComparator field_comparator;
688 field_comparator.SetDefaultFractionAndMargin(0.0, 10.0);
689 differencer.set_field_comparator(&field_comparator);
697 field_comparator.set_float_comparison(
702 field_comparator.SetDefaultFractionAndMargin(0.2, 0.0);
706 field_comparator.SetDefaultFractionAndMargin(0.01, 0.0);
710 field_comparator.SetDefaultFractionAndMargin(0.01, 10.0);
714 msg1.set_default_double(v1);
715 msg2.set_default_double(v2);
719 TEST(MessageDifferencerTest, BasicFieldOrderingsTest) {
721 unittest::TestFieldOrderings msg1;
722 unittest::TestFieldOrderings msg2;
731 TEST(MessageDifferencerTest, BasicFieldOrderingInequalityTest) {
733 unittest::TestFieldOrderings msg1;
734 unittest::TestFieldOrderings msg2;
739 msg1.set_my_float(15.00);
740 msg2.set_my_float(16.00);
746 TEST(MessageDifferencerTest, BasicExtensionTest) {
748 unittest::TestAllExtensions msg1;
749 unittest::TestAllExtensions msg2;
758 TEST(MessageDifferencerTest, BasicExtensionInequalityTest) {
760 unittest::TestAllExtensions msg1;
761 unittest::TestAllExtensions msg2;
766 msg1.SetExtension(unittest::optional_int32_extension, 101);
767 msg2.SetExtension(unittest::optional_int32_extension, 102);
773 TEST(MessageDifferencerTest, OneofTest) {
775 unittest::TestOneof2 msg1;
776 unittest::TestOneof2 msg2;
778 TestUtil::SetOneof1(&msg1);
779 TestUtil::SetOneof1(&msg2);
785 TEST(MessageDifferencerTest, OneofInequalityTest) {
787 unittest::TestOneof2 msg1;
788 unittest::TestOneof2 msg2;
790 TestUtil::SetOneof1(&msg1);
791 TestUtil::SetOneof2(&msg2);
797 TEST(MessageDifferencerTest, UnknownFieldPartialEqualTest) {
798 unittest::TestEmptyMessage empty1;
799 unittest::TestEmptyMessage empty2;
804 unknown1->AddVarint(243, 122);
805 unknown1->AddLengthDelimited(245,
"abc");
806 unknown1->AddGroup(246)->AddFixed32(248, 1);
807 unknown1->mutable_field(2)->mutable_group()->AddFixed32(248, 2);
809 unknown2->AddVarint(243, 122);
810 unknown2->AddLengthDelimited(245,
"abc");
811 unknown2->AddGroup(246)->AddFixed32(248, 1);
812 unknown2->mutable_field(2)->mutable_group()->AddFixed32(248, 2);
814 util::MessageDifferencer differencer;
819 TEST(MessageDifferencerTest, SpecifiedFieldsEqualityAllTest) {
820 unittest::TestAllTypes msg1;
821 unittest::TestAllTypes msg2;
826 std::vector<const FieldDescriptor*> fields1;
827 std::vector<const FieldDescriptor*> fields2;
828 msg1.GetReflection()->ListFields(msg1, &fields1);
829 msg2.GetReflection()->ListFields(msg2, &fields2);
831 util::MessageDifferencer differencer;
832 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
835 TEST(MessageDifferencerTest, SpecifiedFieldsInequalityAllTest) {
836 unittest::TestAllTypes msg1;
837 unittest::TestAllTypes msg2;
841 std::vector<const FieldDescriptor*> fields1;
842 std::vector<const FieldDescriptor*> fields2;
843 msg1.GetReflection()->ListFields(msg1, &fields1);
844 msg2.GetReflection()->ListFields(msg2, &fields2);
846 util::MessageDifferencer differencer;
847 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
850 TEST(MessageDifferencerTest, SpecifiedFieldsEmptyListAlwaysSucceeds) {
851 unittest::TestAllTypes msg1;
852 unittest::TestAllTypes msg2;
856 std::vector<const FieldDescriptor*> empty_fields;
858 util::MessageDifferencer differencer;
860 differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
864 differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
867 TEST(MessageDifferencerTest, SpecifiedFieldsCompareWithSelf) {
868 unittest::TestAllTypes msg1;
871 std::vector<const FieldDescriptor*>
fields;
872 msg1.GetReflection()->ListFields(msg1, &
fields);
874 util::MessageDifferencer differencer;
879 std::vector<const FieldDescriptor*> compare_fields;
880 for (
int i = 0;
i <
fields.size(); ++
i) {
882 compare_fields.push_back(
fields[i]);
885 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg1, compare_fields,
892 std::vector<const FieldDescriptor*> compare_fields1;
893 std::vector<const FieldDescriptor*> compare_fields2;
894 for (
int i = 0;
i <
fields.size(); ++
i) {
896 compare_fields1.push_back(
fields[i]);
898 compare_fields2.push_back(
fields[i]);
901 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg1, compare_fields1,
906 TEST(MessageDifferencerTest, SpecifiedFieldsEqualityAllShuffledTest) {
910 unittest::TestAllTypes msg1;
911 unittest::TestAllTypes msg2;
916 std::vector<const FieldDescriptor*> fields1;
917 std::vector<const FieldDescriptor*> fields2;
918 msg1.GetReflection()->ListFields(msg1, &fields1);
919 msg2.GetReflection()->ListFields(msg2, &fields2);
921 std::default_random_engine rng;
922 std::shuffle(fields1.begin(), fields1.end(), rng);
923 std::shuffle(fields2.begin(), fields2.end(), rng);
925 util::MessageDifferencer differencer;
926 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
929 TEST(MessageDifferencerTest, SpecifiedFieldsSubsetEqualityTest) {
931 unittest::TestAllTypes msg1;
932 unittest::TestAllTypes msg2;
936 std::vector<const FieldDescriptor*> fields1;
937 msg1.GetReflection()->ListFields(msg1, &fields1);
939 std::vector<const FieldDescriptor*> compare_fields;
941 for (
int i = 0;
i < fields1.size(); ++
i) {
943 compare_fields.push_back(fields1[i]);
947 util::MessageDifferencer differencer;
948 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
952 TEST(MessageDifferencerTest,
953 SpecifiedFieldsSubsetIgnoresOtherFieldDifferencesTest) {
957 unittest::TestAllTypes msg1;
958 unittest::TestAllTypes msg2;
962 std::vector<const FieldDescriptor*> fields1;
963 const Reflection* reflection = msg1.GetReflection();
964 reflection->ListFields(msg1, &fields1);
966 std::vector<const FieldDescriptor*> compare_fields;
968 for (
int i = 0;
i < fields1.size(); ++
i) {
970 compare_fields.push_back(fields1[i]);
972 reflection->ClearField(&msg2, fields1[i]);
976 util::MessageDifferencer differencer;
978 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
982 TEST(MessageDifferencerTest, SpecifiedFieldsDetectsDifferencesTest) {
985 unittest::TestAllTypes msg1;
986 unittest::TestAllTypes msg2;
989 TestUtil::ModifyRepeatedFields(&msg2);
991 std::vector<const FieldDescriptor*> fields1;
992 msg1.GetReflection()->ListFields(msg1, &fields1);
994 std::vector<const FieldDescriptor*> compare_fields;
996 for (
int i = 0;
i < fields1.size(); ++
i) {
997 if (fields1[i]->is_repeated()) {
998 compare_fields.push_back(fields1[i]);
1002 util::MessageDifferencer differencer;
1003 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, compare_fields,
1007 TEST(MessageDifferencerTest, SpecifiedFieldsEquivalenceAllTest) {
1008 unittest::TestAllTypes msg1;
1009 unittest::TestAllTypes msg2;
1014 std::vector<const FieldDescriptor*> fields1;
1015 std::vector<const FieldDescriptor*> fields2;
1016 msg1.GetReflection()->ListFields(msg1, &fields1);
1017 msg2.GetReflection()->ListFields(msg2, &fields2);
1019 util::MessageDifferencer differencer;
1020 differencer.set_message_field_comparison(
1022 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1025 TEST(MessageDifferencerTest,
1026 SpecifiedFieldsEquivalenceIgnoresOtherFieldDifferencesTest) {
1027 unittest::TestAllTypes msg1;
1028 unittest::TestAllTypes msg2;
1032 desc->FindFieldByName(
"optional_int32");
1034 desc->FindFieldByName(
"optional_int64");
1036 desc->FindFieldByName(
"default_int64");
1040 msg1.set_optional_int32(0);
1041 msg2.set_optional_int64(0);
1042 msg1.set_default_int64(default_int64_desc->default_value_int64());
1046 msg2.set_optional_uint64(23);
1048 std::vector<const FieldDescriptor*> fields1;
1049 std::vector<const FieldDescriptor*> fields2;
1050 fields1.push_back(optional_int32_desc);
1051 fields1.push_back(default_int64_desc);
1053 fields2.push_back(optional_int64_desc);
1055 util::MessageDifferencer differencer;
1056 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1057 differencer.set_message_field_comparison(
1060 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1063 TEST(MessageDifferencerTest, RepeatedFieldTreatmentChangeListToSet) {
1064 protobuf_unittest::TestDiffMessage msg1;
1065 protobuf_unittest::TestDiffMessage msg2;
1072 util::MessageDifferencer differencer;
1073 differencer.TreatAsList(
1075 differencer.TreatAsSet(
1081 TEST(MessageDifferencerTest, RepeatedFieldTreatmentChangeSetToList) {
1082 protobuf_unittest::TestDiffMessage msg1;
1083 protobuf_unittest::TestDiffMessage msg2;
1090 util::MessageDifferencer differencer;
1091 differencer.TreatAsSet(
1093 differencer.TreatAsList(
1099 TEST(MessageDifferencerTest, RepeatedFieldSmartListTest) {
1101 protobuf_unittest::TestDiffMessage msg1;
1102 protobuf_unittest::TestDiffMessage msg2;
1125 util::MessageDifferencer differencer;
1126 differencer.ReportDifferencesToString(&diff_report);
1127 differencer.set_repeated_field_comparison(
1131 "deleted: rv[0]: 1\n"
1134 "moved: rv[1] -> rv[2] : 2\n"
1136 "moved: rv[2] -> rv[4] : 3\n"
1137 "deleted: rv[3]: 9\n"
1138 "moved: rv[4] -> rv[5] : 4\n"
1139 "moved: rv[5] -> rv[6] : 5\n"
1140 "deleted: rv[6]: 7\n"
1142 "moved: rv[7] -> rv[8] : 2\n",
1150 msg1.add_rm()->set_a(1);
1151 msg1.add_rm()->set_a(2);
1152 msg1.add_rm()->set_a(3);
1153 msg1.add_rm()->set_a(4);
1154 msg1.add_rm()->set_a(5);
1155 msg2.add_rm()->set_a(2);
1156 msg2.add_rm()->set_a(6);
1157 msg2.add_rm()->set_a(4);
1158 differencer.ReportDifferencesToString(&diff_report);
1159 differencer.set_repeated_field_comparison(
1163 "deleted: rm[0]: { a: 1 }\n"
1164 "moved: rm[1] -> rm[0] : { a: 2 }\n"
1165 "deleted: rm[2]: { a: 3 }\n"
1166 "added: rm[1]: { a: 6 }\n"
1167 "moved: rm[3] -> rm[2] : { a: 4 }\n"
1168 "deleted: rm[4]: { a: 5 }\n",
1172 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest) {
1174 protobuf_unittest::TestDiffMessage msg1;
1175 protobuf_unittest::TestDiffMessage msg2;
1176 protobuf_unittest::TestField elem1_1, elem2_1, elem3_1;
1177 protobuf_unittest::TestField elem1_2, elem2_2, elem3_2;
1199 *msg1.add_rm() = elem1_1;
1200 *msg1.add_rm() = elem2_1;
1201 *msg1.add_rm() = elem3_1;
1203 *msg2.add_rm() = elem3_2;
1204 *msg2.add_rm() = elem1_2;
1205 *msg2.add_rm() = elem2_2;
1208 util::MessageDifferencer differencer;
1209 differencer.ReportDifferencesToString(&diff_report);
1210 differencer.set_repeated_field_comparison(
1214 "modified: rm[0].a -> rm[1].a: 1 -> 0\n"
1215 "modified: rm[1].b -> rm[2].b: 2 -> 0\n"
1216 "modified: rm[2].b -> rm[0].b: 3 -> 0\n",
1220 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest_IdenticalElements) {
1222 protobuf_unittest::TestDiffMessage msg1;
1223 protobuf_unittest::TestDiffMessage msg2;
1224 protobuf_unittest::TestField
elem;
1230 *msg1.add_rm() =
elem;
1231 *msg1.add_rm() =
elem;
1232 *msg2.add_rm() =
elem;
1233 *msg2.add_rm() =
elem;
1235 util::MessageDifferencer differencer;
1236 differencer.set_repeated_field_comparison(
1241 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest_PreviouslyMatch) {
1243 protobuf_unittest::TestDiffMessage msg1;
1244 protobuf_unittest::TestDiffMessage msg2;
1245 protobuf_unittest::TestField elem1_1, elem1_2;
1246 protobuf_unittest::TestField elem2_1, elem2_2;
1262 *msg1.add_rm() = elem1_1;
1263 *msg1.add_rm() = elem2_1;
1264 *msg2.add_rm() = elem1_2;
1265 *msg2.add_rm() = elem2_2;
1268 util::MessageDifferencer differencer;
1269 differencer.ReportDifferencesToString(&diff_report);
1270 differencer.set_repeated_field_comparison(
1274 "modified: rm[0].c: 1 -> 0\n"
1275 "modified: rm[1].b: 1 -> 0\n",
1279 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatches) {
1281 protobuf_unittest::TestDiffMessage msg1;
1282 protobuf_unittest::TestDiffMessage msg2;
1283 protobuf_unittest::TestField elem1_1, elem2_1, elem3_1;
1284 protobuf_unittest::TestField elem2_2, elem3_2;
1305 *msg1.add_rm() = elem1_1;
1306 *msg1.add_rm() = elem2_1;
1307 *msg1.add_rm() = elem3_1;
1308 *msg2.add_rm() = elem2_2;
1309 *msg2.add_rm() = elem3_2;
1312 util::MessageDifferencer differencer;
1313 differencer.ReportDifferencesToString(&diff_report);
1314 differencer.set_repeated_field_comparison(
1318 "modified: rm[1].b -> rm[0].b: 2 -> 0\n"
1319 "modified: rm[2].b -> rm[1].b: 3 -> 0\n"
1320 "deleted: rm[0]: { c: 1 a: 1 b: 1 }\n",
1324 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatchesNoReporter) {
1325 protobuf_unittest::TestDiffMessage msg1;
1326 protobuf_unittest::TestDiffMessage msg2;
1327 protobuf_unittest::TestField elem1, elem2, elem3, elem4;
1333 *msg1.add_rm() = elem1;
1334 *msg1.add_rm() = elem2;
1335 *msg1.add_rm() = elem3;
1336 *msg2.add_rm() = elem2;
1337 *msg2.add_rm() = elem3;
1338 *msg2.add_rm() = elem4;
1340 util::MessageDifferencer differencer;
1341 differencer.set_repeated_field_comparison(
1346 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_NonMessageTypeTest) {
1348 protobuf_unittest::TestDiffMessage msg1;
1349 protobuf_unittest::TestDiffMessage msg2;
1360 util::MessageDifferencer differencer;
1361 differencer.ReportDifferencesToString(&diff_report);
1362 differencer.set_repeated_field_comparison(
1366 "moved: rw[0] -> rw[2] : \"b\"\n"
1367 "moved: rw[2] -> rw[0] : \"a\"\n",
1371 TEST(MessageDifferencerTest, RepeatedFieldSetTest_SetOfSet) {
1373 protobuf_unittest::TestDiffMessage msg1;
1374 protobuf_unittest::TestDiffMessage msg2;
1380 item = msg1.add_item();
1383 item = msg1.add_item();
1386 item = msg1.add_item();
1391 item = msg2.add_item();
1394 item = msg2.add_item();
1398 item = msg2.add_item();
1401 item = msg2.add_item();
1407 util::MessageDifferencer differencer;
1412 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Combination) {
1414 protobuf_unittest::TestDiffMessage msg1;
1415 protobuf_unittest::TestDiffMessage msg2;
1425 item = msg1.add_item();
1429 item = msg1.add_item();
1433 item = msg1.add_item();
1439 item = msg2.add_item();
1443 item = msg2.add_item();
1448 item = msg2.add_item();
1452 item = msg2.add_item();
1467 msg1.add_rw(
"nothing");
1468 msg2.add_rw(
"nothing");
1469 msg1.add_rw(
"should");
1470 msg2.add_rw(
"should");
1471 msg1.add_rw(
"change");
1472 msg2.add_rw(
"change");
1475 util::MessageDifferencer differencer1;
1476 differencer1.TreatAsMap(msg1.GetDescriptor()->FindFieldByName(
"item"),
1477 item->GetDescriptor()->FindFieldByName(
"a"));
1478 differencer1.TreatAsSet(msg1.GetDescriptor()->FindFieldByName(
"rv"));
1479 differencer1.TreatAsSet(item->GetDescriptor()->FindFieldByName(
"ra"));
1482 util::MessageDifferencer differencer2;
1483 differencer2.TreatAsMap(msg1.GetDescriptor()->FindFieldByName(
"item"),
1484 item->GetDescriptor()->FindFieldByName(
"a"));
1486 differencer2.TreatAsList(msg1.GetDescriptor()->FindFieldByName(
"rw"));
1490 TEST(MessageDifferencerTest, RepeatedFieldMapTest_Partial) {
1491 protobuf_unittest::TestDiffMessage msg1;
1499 protobuf_unittest::TestDiffMessage msg2;
1504 item = msg2.add_item();
1507 item = msg2.add_item();
1512 util::MessageDifferencer differencer;
1513 differencer.TreatAsMap(GetFieldDescriptor(msg1,
"item"),
1514 GetFieldDescriptor(msg1,
"item.a"));
1519 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Duplicates) {
1520 protobuf_unittest::TestDiffMessage
a,
b,
c;
1543 util::MessageDifferencer differencer;
1544 differencer.TreatAsSet(GetFieldDescriptor(a,
"rv"));
1548 util::MessageDifferencer differencer1;
1554 TEST(MessageDifferencerTest, RepeatedFieldSetTest_PartialSimple) {
1555 protobuf_unittest::TestDiffMessage
a,
b,
c;
1560 a.add_rm()->set_c(1);
1561 a.add_rm()->set_c(0);
1566 b.add_rm()->set_c(1);
1573 c.add_rm()->set_c(1);
1574 util::MessageDifferencer differencer;
1576 differencer.TreatAsSet(GetFieldDescriptor(a,
"rm"));
1581 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Partial) {
1582 protobuf_unittest::TestDiffMessage msg1, msg2;
1588 msg1.add_rm()->set_a(1);
1589 msg1.add_rm()->set_b(2);
1590 msg1.add_rm()->set_c(3);
1596 protobuf_unittest::TestField*
field = msg2.add_rm();
1599 field = msg2.add_rm();
1602 field = msg2.add_rm();
1605 util::MessageDifferencer differencer;
1607 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"rm"));
1611 TEST(MessageDifferencerTest, RepeatedFieldMapTest_MultipleFieldsAsKey) {
1612 protobuf_unittest::TestDiffMessage msg1;
1613 protobuf_unittest::TestDiffMessage msg2;
1622 item = msg1.add_item();
1628 item = msg1.add_item();
1635 item = msg2.add_item();
1641 item = msg2.add_item();
1647 item = msg2.add_item();
1655 util::MessageDifferencer differencer;
1656 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"item.ra"));
1658 std::vector<const FieldDescriptor*> key_fields;
1659 key_fields.push_back(GetFieldDescriptor(msg1,
"item.a"));
1660 key_fields.push_back(GetFieldDescriptor(msg1,
"item.ra"));
1661 differencer.TreatAsMapWithMultipleFieldsAsKey(
1662 GetFieldDescriptor(msg1,
"item"), key_fields);
1668 item = msg1.add_item();
1672 item->set_b(
"hello");
1673 item = msg2.add_item();
1677 item->set_b(
"world");
1679 differencer.ReportDifferencesToString(&
output);
1682 "moved: item[0].ra[0] -> item[0].ra[1] : 5\n"
1683 "moved: item[0].ra[1] -> item[0].ra[0] : 6\n"
1684 "modified: item[0].b: \"hello\" -> \"world\"\n",
1688 TEST(MessageDifferencerTest, RepeatedFieldMapTest_MultipleFieldPathsAsKey) {
1689 protobuf_unittest::TestDiffMessage msg1;
1690 protobuf_unittest::TestDiffMessage msg2;
1695 item->mutable_m()->set_a(1);
1696 item->mutable_m()->add_rc(2);
1697 item->mutable_m()->add_rc(3);
1699 item = msg1.add_item();
1701 item->mutable_m()->set_a(2);
1702 item->mutable_m()->add_rc(1);
1703 item->mutable_m()->add_rc(3);
1705 item = msg1.add_item();
1707 item->mutable_m()->set_a(1);
1708 item->mutable_m()->add_rc(1);
1709 item->mutable_m()->add_rc(3);
1712 item = msg2.add_item();
1714 item->mutable_m()->set_a(1);
1715 item->mutable_m()->add_rc(3);
1716 item->mutable_m()->add_rc(1);
1718 item = msg2.add_item();
1720 item->mutable_m()->set_a(1);
1721 item->mutable_m()->add_rc(3);
1722 item->mutable_m()->add_rc(2);
1724 item = msg2.add_item();
1726 item->mutable_m()->set_a(2);
1727 item->mutable_m()->add_rc(3);
1728 item->mutable_m()->add_rc(1);
1732 util::MessageDifferencer differencer;
1733 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"item.m.rc"));
1735 std::vector<std::vector<const FieldDescriptor*> > key_field_paths;
1736 std::vector<const FieldDescriptor*> key_field_path1;
1737 key_field_path1.push_back(GetFieldDescriptor(msg1,
"item.m"));
1738 key_field_path1.push_back(GetFieldDescriptor(msg1,
"item.m.a"));
1739 std::vector<const FieldDescriptor*> key_field_path2;
1740 key_field_path2.push_back(GetFieldDescriptor(msg1,
"item.m"));
1741 key_field_path2.push_back(GetFieldDescriptor(msg1,
"item.m.rc"));
1742 key_field_paths.push_back(key_field_path1);
1743 key_field_paths.push_back(key_field_path2);
1744 differencer.TreatAsMapWithMultipleFieldPathsAsKey(
1745 GetFieldDescriptor(msg1,
"item"), key_field_paths);
1751 item = msg1.add_item();
1752 item->mutable_m()->set_a(4);
1753 item->mutable_m()->add_rc(5);
1754 item->mutable_m()->add_rc(6);
1755 item->set_b(
"hello");
1756 item = msg2.add_item();
1757 item->mutable_m()->set_a(4);
1758 item->mutable_m()->add_rc(6);
1759 item->mutable_m()->add_rc(5);
1760 item->set_b(
"world");
1762 differencer.ReportDifferencesToString(&
output);
1765 "modified: item[0].b: \"hello\" -> \"world\"\n"
1766 "moved: item[0].m.rc[0] -> item[0].m.rc[1] : 5\n"
1767 "moved: item[0].m.rc[1] -> item[0].m.rc[0] : 6\n",
1771 TEST(MessageDifferencerTest, RepeatedFieldMapTest_IgnoredKeyFields) {
1772 protobuf_unittest::TestDiffMessage msg1;
1773 protobuf_unittest::TestDiffMessage msg2;
1778 item->set_b(
"hello");
1779 item = msg2.add_item();
1782 item->set_b(
"world");
1784 util::MessageDifferencer differencer;
1785 std::vector<const FieldDescriptor*> key_fields;
1786 key_fields.push_back(GetFieldDescriptor(msg1,
"item.a"));
1787 key_fields.push_back(GetFieldDescriptor(msg1,
"item.ra"));
1788 differencer.TreatAsMapWithMultipleFieldsAsKey(
1789 GetFieldDescriptor(msg1,
"item"), key_fields);
1791 differencer.ReportDifferencesToString(&
output);
1794 "added: item[0]: { a: 1 ra: 3 b: \"world\" }\n"
1795 "deleted: item[0]: { a: 1 ra: 2 b: \"hello\" }\n",
1799 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1803 "added: item[0]: { a: 1 ra: 3 b: \"world\" }\n"
1804 "deleted: item[0]: { a: 1 ra: 2 b: \"hello\" }\n",
1809 util::MessageDifferencer differencer2;
1810 differencer2.TreatAsMap(GetFieldDescriptor(msg1,
"item"),
1811 GetFieldDescriptor(msg1,
"item.a"));
1812 differencer2.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1814 differencer2.ReportDifferencesToString(&
output);
1817 "ignored: item[0].ra\n"
1818 "modified: item[0].b: \"hello\" -> \"world\"\n",
1822 TEST(MessageDifferencerTest, PrintMapKeysTest) {
1829 protobuf_unittest::TestDiffMessage msg1;
1830 protobuf_unittest::TestDiffMessage msg2;
1832 item->mutable_mp()->insert({{
"key_a", 1}, {
"key_b", 2}, {
"key_c", 3}});
1833 item = msg2.add_item();
1834 item->mutable_mp()->insert({{
"key_a", 1}, {
"key_b", 3}, {
"key_d", 4}});
1836 util::MessageDifferencer differencer;
1838 differencer.ReportDifferencesToString(&
diff);
1841 "modified: item[0].mp[key_b]: 2 -> 3\n"
1842 "added: item[0].mp[key_d]: 4\n"
1843 "deleted: item[0].mp[key_c]: 3\n",
1848 any2.PackFrom(msg2);
1850 differencer.ReportDifferencesToString(&diff_with_any);
1853 "modified: item[0].mp[key_b]: 2 -> 3\n"
1854 "added: item[0].mp[key_d]: 4\n"
1855 "deleted: item[0].mp[key_c]: 3\n",
1859 static const char*
const kIgnoredFields[] = {
"rm.b",
"rm.m.b"};
1861 class TestIgnorer :
public util::MessageDifferencer::IgnoreCriteria {
1863 virtual bool IsIgnored(
1866 const std::vector<util::MessageDifferencer::SpecificField>&
1869 for (
int i = 0;
i < parent_fields.size(); ++
i) {
1870 name += parent_fields[
i].field->name() +
".";
1874 if (
name.compare(kIgnoredFields[i]) == 0) {
1882 TEST(MessageDifferencerTest, TreatRepeatedFieldAsSetWithIgnoredFields) {
1883 protobuf_unittest::TestDiffMessage msg1;
1884 protobuf_unittest::TestDiffMessage msg2;
1887 util::MessageDifferencer differ;
1888 differ.TreatAsSet(GetFieldDescriptor(msg1,
"rm"));
1889 differ.AddIgnoreCriteria(
new TestIgnorer);
1893 TEST(MessageDifferencerTest, TreatRepeatedFieldAsMapWithIgnoredKeyFields) {
1894 protobuf_unittest::TestDiffMessage msg1;
1895 protobuf_unittest::TestDiffMessage msg2;
1898 util::MessageDifferencer differ;
1899 differ.TreatAsMap(GetFieldDescriptor(msg1,
"rm"),
1900 GetFieldDescriptor(msg1,
"rm.m"));
1901 differ.AddIgnoreCriteria(
new TestIgnorer);
1906 class ValueProductMapKeyComparator
1907 :
public util::MessageDifferencer::MapKeyComparator {
1909 typedef util::MessageDifferencer::SpecificField SpecificField;
1911 const std::vector<SpecificField>& parent_fields)
const {
1912 const Reflection* reflection1 = message1.GetReflection();
1913 const Reflection* reflection2 = message2.GetReflection();
1916 message1.GetDescriptor()->FindFieldByName(
"ra");
1918 int result1 = 1, result2 = 1;
1919 for (
int i = 0;
i < reflection1->FieldSize(message1, ra_field); ++
i) {
1920 result1 *= reflection1->GetRepeatedInt32(message1, ra_field, i);
1922 for (
int i = 0;
i < reflection2->FieldSize(message2, ra_field); ++
i) {
1923 result2 *= reflection2->GetRepeatedInt32(message2, ra_field, i);
1925 return result1 == result2;
1929 TEST(MessageDifferencerTest, RepeatedFieldMapTest_CustomMapKeyComparator) {
1930 protobuf_unittest::TestDiffMessage msg1;
1931 protobuf_unittest::TestDiffMessage msg2;
1937 item->set_b(
"hello");
1938 item = msg2.add_item();
1941 item->set_b(
"hello");
1942 util::MessageDifferencer differencer;
1943 ValueProductMapKeyComparator key_comparator;
1944 differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1,
"item"),
1947 differencer.ReportDifferencesToString(&
output);
1956 "modified: item[0].ra[0]: 6 -> 10\n"
1957 "modified: item[0].ra[1]: 35 -> 21\n",
1959 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1967 class OffsetByOneMapKeyComparator
1968 :
public util::MessageDifferencer::MapKeyComparator {
1970 typedef util::MessageDifferencer::SpecificField SpecificField;
1972 const std::vector<SpecificField>& parent_fields)
const {
1973 return parent_fields.back().index + 1 == parent_fields.back().new_index;
1977 TEST(MessageDifferencerTest, RepeatedFieldMapTest_CustomIndexMapKeyComparator) {
1978 protobuf_unittest::TestDiffMessage msg1;
1979 protobuf_unittest::TestDiffMessage msg2;
1984 item = msg2.add_item();
1985 item->set_b(
"zero");
1986 item = msg2.add_item();
1988 util::MessageDifferencer differencer;
1989 OffsetByOneMapKeyComparator key_comparator;
1990 differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1,
"item"),
1993 differencer.ReportDifferencesToString(&
output);
1998 "moved: item[0] -> item[1] : { b: \"one\" }\n"
1999 "added: item[0]: { b: \"zero\" }\n",
2003 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Subset) {
2004 protobuf_unittest::TestDiffMessage msg1;
2005 protobuf_unittest::TestDiffMessage msg2;
2015 util::MessageDifferencer differencer;
2033 TEST(MessageDifferencerTest, IgnoreField_Single) {
2034 protobuf_unittest::TestField msg1;
2035 protobuf_unittest::TestField msg2;
2043 util::MessageDifferencer differencer;
2044 differencer.IgnoreField(GetFieldDescriptor(msg1,
"c"));
2046 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2049 TEST(MessageDifferencerTest, IgnoreField_Repeated) {
2050 protobuf_unittest::TestField msg1;
2051 protobuf_unittest::TestField msg2;
2061 util::MessageDifferencer differencer;
2062 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rc"));
2064 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2067 TEST(MessageDifferencerTest, IgnoreField_Message) {
2068 protobuf_unittest::TestDiffMessage msg1;
2069 protobuf_unittest::TestDiffMessage msg2;
2071 protobuf_unittest::TestField*
field;
2073 field = msg1.add_rm();
2076 field = msg2.add_rm();
2079 util::MessageDifferencer differencer;
2080 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rm"));
2082 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2085 TEST(MessageDifferencerTest, IgnoreField_Group) {
2086 protobuf_unittest::TestDiffMessage msg1;
2087 protobuf_unittest::TestDiffMessage msg2;
2091 item = msg1.add_item();
2094 item = msg2.add_item();
2097 util::MessageDifferencer differencer;
2098 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item"));
2100 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2103 TEST(MessageDifferencerTest, IgnoreField_Missing) {
2104 protobuf_unittest::TestField msg1;
2105 protobuf_unittest::TestField msg2;
2112 util::MessageDifferencer differencer;
2113 differencer.IgnoreField(GetFieldDescriptor(msg1,
"c"));
2115 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2116 ExpectEqualsWithDifferencer(&differencer, msg2, msg1);
2119 TEST(MessageDifferencerTest, IgnoreField_Multiple) {
2120 protobuf_unittest::TestField msg1;
2121 protobuf_unittest::TestField msg2;
2135 util::MessageDifferencer differencer;
2136 differencer.IgnoreField(c);
2141 util::MessageDifferencer differencer;
2142 differencer.IgnoreField(rc);
2147 util::MessageDifferencer differencer;
2148 differencer.IgnoreField(c);
2149 differencer.IgnoreField(rc);
2151 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2155 TEST(MessageDifferencerTest, IgnoreField_NestedMessage) {
2156 protobuf_unittest::TestDiffMessage msg1;
2157 protobuf_unittest::TestDiffMessage msg2;
2159 protobuf_unittest::TestField*
field;
2161 field = msg1.add_rm();
2165 field = msg2.add_rm();
2169 util::MessageDifferencer differencer;
2170 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rm.c"));
2172 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2175 TEST(MessageDifferencerTest, IgnoreField_NestedGroup) {
2176 protobuf_unittest::TestDiffMessage msg1;
2177 protobuf_unittest::TestDiffMessage msg2;
2181 item = msg1.add_item();
2185 item = msg2.add_item();
2189 util::MessageDifferencer differencer;
2190 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.a"));
2192 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2195 TEST(MessageDifferencerTest, IgnoreField_InsideSet) {
2196 protobuf_unittest::TestDiffMessage msg1;
2197 protobuf_unittest::TestDiffMessage msg2;
2201 item = msg1.add_item();
2206 item = msg1.add_item();
2211 item = msg2.add_item();
2216 item = msg2.add_item();
2224 util::MessageDifferencer differencer;
2225 differencer.IgnoreField(
b);
2226 differencer.TreatAsSet(item_desc);
2228 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2231 TEST(MessageDifferencerTest, IgnoreField_InsideMap) {
2232 protobuf_unittest::TestDiffMessage msg1;
2233 protobuf_unittest::TestDiffMessage msg2;
2237 item = msg1.add_item();
2242 item = msg1.add_item();
2247 item = msg2.add_item();
2252 item = msg2.add_item();
2261 util::MessageDifferencer differencer;
2262 differencer.IgnoreField(
b);
2263 differencer.TreatAsMap(item_desc, a);
2265 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2268 TEST(MessageDifferencerTest, IgnoreField_DoesNotIgnoreKey) {
2269 protobuf_unittest::TestDiffMessage msg1;
2270 protobuf_unittest::TestDiffMessage msg2;
2274 item = msg1.add_item();
2279 item = msg2.add_item();
2287 util::MessageDifferencer differencer;
2288 differencer.IgnoreField(a);
2289 differencer.TreatAsMap(item_desc, a);
2294 TEST(MessageDifferencerTest, IgnoreField_TrumpsCompareWithFields) {
2295 protobuf_unittest::TestField msg1;
2296 protobuf_unittest::TestField msg2;
2309 std::vector<const FieldDescriptor*>
fields;
2313 util::MessageDifferencer differencer;
2314 differencer.IgnoreField(rc);
2323 TEST(MessageDifferencerTest, IgnoreField_SetReportIgnoresFalse) {
2324 protobuf_unittest::TestField msg1;
2325 protobuf_unittest::TestField msg2;
2341 std::vector<const FieldDescriptor*>
fields;
2348 util::MessageDifferencer differencer;
2349 differencer.set_report_ignores(
false);
2350 differencer.set_report_matches(
true);
2351 differencer.ReportDifferencesToString(&diff_report);
2352 differencer.IgnoreField(c);
2353 differencer.IgnoreField(rc);
2359 "modified: b: 2 -> 1\n");
2365 class ParentSavingFieldComparator :
public util::FieldComparator {
2367 ParentSavingFieldComparator() {}
2373 const util::FieldContext* field_context) {
2374 if (field_context)
parent_fields_ = *(field_context->parent_fields());
2382 std::vector<util::MessageDifferencer::SpecificField> parent_fields() {
2392 TEST(MessageDifferencerTest, FieldContextParentFieldsTest) {
2393 protobuf_unittest::TestDiffMessage msg1;
2394 msg1.add_rm()->set_c(1);
2395 protobuf_unittest::TestDiffMessage msg2;
2396 msg2.add_rm()->set_c(1);
2398 ParentSavingFieldComparator field_comparator;
2399 util::MessageDifferencer differencer;
2400 differencer.set_field_comparator(&field_comparator);
2401 differencer.Compare(msg1, msg2);
2404 ASSERT_EQ(1, field_comparator.parent_fields().size());
2405 EXPECT_EQ(
"rm", field_comparator.parent_fields()[0].field->name());
2426 ~ComparisonTest() {}
2429 util::MessageDifferencer* d) {
2452 util::MessageDifferencer differencer;
2453 differencer.ReportDifferencesToString(&
output);
2456 differencer.set_message_field_comparison(
2460 SetSpecialFieldOption(msg1, &differencer);
2522 TEST_F(ComparisonTest, AdditionTest) {
2523 proto1_.clear_optional_int32();
2528 TEST_F(ComparisonTest, Addition_OrderTest) {
2531 EXPECT_EQ(
"added: my_int: 1\n", RunOrder());
2534 TEST_F(ComparisonTest, DeletionTest) {
2535 proto2_.clear_optional_int32();
2540 TEST_F(ComparisonTest, Deletion_OrderTest) {
2543 EXPECT_EQ(
"deleted: my_string: \"foo\"\n", RunOrder());
2546 TEST_F(ComparisonTest, RepeatedDeletionTest) {
2547 proto2_.clear_repeated_int32();
2550 "deleted: repeated_int32[0]: 201\n"
2551 "deleted: repeated_int32[1]: 301\n",
2555 TEST_F(ComparisonTest, ModificationTest) {
2556 proto1_.set_optional_int32(-1);
2558 EXPECT_EQ(
"modified: optional_int32: -1 -> 101\n",
Run());
2562 TEST_F(ComparisonTest, EquivalencyAdditionTest) {
2565 proto1_.clear_optional_int32();
2567 EXPECT_EQ(
"modified: optional_int32: 0 -> 101\n",
Run());
2570 TEST_F(ComparisonTest, EquivalencyDeletionTest) {
2573 proto2_.clear_optional_int32();
2575 EXPECT_EQ(
"modified: optional_int32: 101 -> 0\n",
Run());
2579 TEST_F(ComparisonTest, GroupAdditionTest) {
2580 proto1_.mutable_optionalgroup()->clear_a();
2585 TEST_F(ComparisonTest, GroupDeletionTest) {
2586 proto2_.mutable_optionalgroup()->clear_a();
2591 TEST_F(ComparisonTest, GroupModificationTest) {
2592 proto1_.mutable_optionalgroup()->set_a(2);
2594 EXPECT_EQ(
"modified: optionalgroup.a: 2 -> 117\n",
Run());
2597 TEST_F(ComparisonTest, GroupFullAdditionTest) {
2598 proto1_.clear_optionalgroup();
2601 EXPECT_EQ(
"added: optionalgroup: { a: 117 }\n",
Run());
2604 TEST_F(ComparisonTest, GroupFullDeletionTest) {
2605 proto2_.clear_optionalgroup();
2607 EXPECT_EQ(
"deleted: optionalgroup: { a: 117 }\n",
Run());
2610 TEST_F(ComparisonTest, RepeatedSetOptionTest) {
2611 repeated_field_as_set();
2613 proto2_.clear_repeatedgroup();
2614 proto1_.clear_repeatedgroup();
2615 proto1_.add_repeatedgroup()->set_a(317);
2616 proto2_.add_repeatedgroup()->set_a(909);
2617 proto2_.add_repeatedgroup()->set_a(907);
2618 proto1_.add_repeatedgroup()->set_a(904);
2619 proto1_.add_repeatedgroup()->set_a(907);
2620 proto1_.add_repeatedgroup()->set_a(909);
2623 "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
2624 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2625 "deleted: repeatedgroup[0]: { a: 317 }\n"
2626 "deleted: repeatedgroup[1]: { a: 904 }\n",
2630 TEST_F(ComparisonTest, RepeatedSetOptionTest_Ex) {
2631 repeated_field_as_set();
2633 proto1ex_.ClearExtension(protobuf_unittest::repeated_nested_message_extension);
2634 proto2ex_.ClearExtension(protobuf_unittest::repeated_nested_message_extension);
2635 proto2ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2637 proto2ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2639 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2641 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2643 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2647 "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
2648 " (protobuf_unittest.repeated_nested_message_extension)[0] :"
2650 "deleted: (protobuf_unittest.repeated_nested_message_extension)[0]:"
2655 TEST_F(ComparisonTest, RepeatedMapFieldTest_Group) {
2656 field_as_map(
"repeatedgroup",
"a");
2657 proto1_.clear_repeatedgroup();
2658 proto2_.clear_repeatedgroup();
2660 proto1_.add_repeatedgroup()->set_a(317);
2661 proto1_.add_repeatedgroup()->set_a(904);
2662 proto1_.add_repeatedgroup()->set_a(907);
2663 proto1_.add_repeatedgroup()->set_a(909);
2665 proto2_.add_repeatedgroup()->set_a(909);
2666 proto2_.add_repeatedgroup()->set_a(318);
2667 proto2_.add_repeatedgroup()->set_a(907);
2670 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2671 "added: repeatedgroup[1]: { a: 318 }\n"
2672 "deleted: repeatedgroup[0]: { a: 317 }\n"
2673 "deleted: repeatedgroup[1]: { a: 904 }\n",
2677 TEST_F(ComparisonTest, RepeatedMapFieldTest_MessageKey) {
2679 field_as_map(
"item",
"m");
2681 protobuf_unittest::TestDiffMessage msg1;
2682 protobuf_unittest::TestDiffMessage msg2;
2687 item->mutable_m()->set_c(0);
2688 item->set_b(
"first");
2689 item = msg1.add_item();
2690 item->mutable_m()->set_c(2);
2691 item->set_b(
"second");
2692 item = msg1.add_item();
2693 item->set_b(
"null");
2694 item = msg1.add_item();
2695 item->mutable_m()->set_c(3);
2696 item->set_b(
"third");
2697 item = msg1.add_item();
2698 item->mutable_m()->set_c(2);
2699 item->set_b(
"second");
2700 item = msg2.add_item();
2701 item->mutable_m()->set_c(2);
2702 item->set_b(
"second");
2703 item = msg2.add_item();
2704 item->mutable_m()->set_c(4);
2705 item->set_b(
"fourth");
2706 item = msg2.add_item();
2707 item->mutable_m()->set_c(0);
2708 item->set_b(
"fist");
2709 item = msg2.add_item();
2710 item->set_b(
"null");
2713 "modified: item[0].b -> item[2].b: \"first\" -> \"fist\"\n"
2714 "moved: item[1] -> item[0] : { b: \"second\" m { c: 2 } }\n"
2715 "moved: item[2] -> item[3] : { b: \"null\" }\n"
2716 "added: item[1]: { b: \"fourth\" m { c: 4 } }\n"
2717 "deleted: item[3]: { b: \"third\" m { c: 3 } }\n"
2718 "deleted: item[4]: { b: \"second\" m { c: 2 } }\n",
2722 TEST_F(ComparisonTest, RepeatedFieldSetTest_SetOfSet) {
2723 repeated_field_as_set();
2725 protobuf_unittest::TestDiffMessage msg1;
2726 protobuf_unittest::TestDiffMessage msg2;
2732 item = msg1.add_item();
2735 item = msg1.add_item();
2738 item = msg1.add_item();
2743 item = msg2.add_item();
2746 item = msg2.add_item();
2749 item = msg2.add_item();
2752 item = msg2.add_item();
2759 "moved: item[0].ra[0] -> item[3].ra[2] : 1\n"
2760 "moved: item[0].ra[2] -> item[3].ra[0] : 3\n"
2761 "moved: item[0] -> item[3] : { ra: 1 ra: 2 ra: 3 }\n"
2762 "moved: item[1].ra[0] -> item[0].ra[1] : 5\n"
2763 "moved: item[1].ra[1] -> item[0].ra[0] : 6\n"
2764 "moved: item[1] -> item[0] : { ra: 5 ra: 6 }\n"
2765 "added: item[1]: { ra: 6 ra: 8 }\n"
2766 "deleted: item[3]: { ra: 6 ra: 7 ra: 8 }\n",
2770 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedKey) {
2772 repeated_field_as_set();
2773 field_as_map(
"item",
"rb");
2775 protobuf_unittest::TestDiffMessage msg1;
2776 protobuf_unittest::TestDiffMessage msg2;
2780 item->set_b(
"first");
2782 item = msg2.add_item();
2784 item->set_b(
"second");
2786 item = msg2.add_item();
2789 item->set_b(
"fist");
2792 "modified: item[0].b -> item[1].b: \"first\" -> \"fist\"\n"
2793 "moved: item[0].rb[0] -> item[1].rb[1] : \"a\"\n"
2794 "moved: item[0].rb[1] -> item[1].rb[0] : \"b\"\n"
2795 "added: item[0]: { b: \"second\" rb: \"c\" }\n",
2799 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedMessageKey) {
2800 field_as_map(
"item",
"rm");
2802 protobuf_unittest::TestDiffMessage msg1;
2803 protobuf_unittest::TestDiffMessage msg2;
2805 protobuf_unittest::TestField*
key = item->add_rm();
2809 item = msg1.add_item();
2810 key = item->add_rm();
2814 key = item->add_rm();
2816 item->add_rb(
"first");
2818 item = msg2.add_item();
2819 item->CopyFrom(msg1.item(1));
2820 item->add_rb(
"second");
2823 "added: item[0].rb[1]: \"second\"\n"
2824 "deleted: item[0]: { rm { c: 2 rc: 10 rc: 10 } }\n",
2828 TEST_F(ComparisonTest, RepeatedSetOptionTest_Unknown) {
2831 repeated_field_as_set();
2838 "modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
2839 "added: 245[1]: { ... }\n",
2843 TEST_F(ComparisonTest, Matching_Unknown) {
2853 "added: 242[0]: \"cat\"\n"
2854 "added: 246[0]: { ... }\n",
2858 TEST_F(ComparisonTest, RepeatedSetFieldTest) {
2859 field_as_set(
"repeatedgroup");
2861 proto1_.clear_repeatedgroup();
2862 proto2_.clear_repeatedgroup();
2863 proto2_.add_repeatedgroup()->set_a(909);
2864 proto2_.add_repeatedgroup()->set_a(907);
2865 proto1_.add_repeatedgroup()->set_a(317);
2866 proto1_.add_repeatedgroup()->set_a(904);
2867 proto1_.add_repeatedgroup()->set_a(907);
2868 proto1_.add_repeatedgroup()->set_a(909);
2871 "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
2872 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2873 "deleted: repeatedgroup[0]: { a: 317 }\n"
2874 "deleted: repeatedgroup[1]: { a: 904 }\n",
2879 TEST_F(ComparisonTest, EmbeddedAdditionTest) {
2880 proto1_.mutable_optional_nested_message()->clear_bb();
2882 EXPECT_EQ(
"added: optional_nested_message.bb: 118\n",
Run());
2885 TEST_F(ComparisonTest, EmbeddedDeletionTest) {
2886 proto2_.mutable_optional_nested_message()->clear_bb();
2888 EXPECT_EQ(
"deleted: optional_nested_message.bb: 118\n",
Run());
2891 TEST_F(ComparisonTest, EmbeddedModificationTest) {
2892 proto1_.mutable_optional_nested_message()->set_bb(2);
2894 EXPECT_EQ(
"modified: optional_nested_message.bb: 2 -> 118\n",
Run());
2897 TEST_F(ComparisonTest, EmbeddedFullAdditionTest) {
2898 proto1_.clear_optional_nested_message();
2900 EXPECT_EQ(
"added: optional_nested_message: { bb: 118 }\n",
Run());
2903 TEST_F(ComparisonTest, EmbeddedPartialAdditionTest) {
2904 proto1_.clear_optional_nested_message();
2905 proto2_.mutable_optional_nested_message()->clear_bb();
2907 EXPECT_EQ(
"added: optional_nested_message: { }\n",
Run());
2910 TEST_F(ComparisonTest, EmbeddedFullDeletionTest) {
2911 proto2_.clear_optional_nested_message();
2913 EXPECT_EQ(
"deleted: optional_nested_message: { bb: 118 }\n",
Run());
2917 TEST_F(ComparisonTest, BasicRepeatedTest) {
2918 proto1_.clear_repeated_int32();
2919 proto2_.clear_repeated_int32();
2921 proto1_.add_repeated_int32(500);
2922 proto1_.add_repeated_int32(501);
2923 proto1_.add_repeated_int32(502);
2924 proto1_.add_repeated_int32(503);
2925 proto1_.add_repeated_int32(500);
2927 proto2_.add_repeated_int32(500);
2928 proto2_.add_repeated_int32(509);
2929 proto2_.add_repeated_int32(502);
2930 proto2_.add_repeated_int32(504);
2933 "modified: repeated_int32[1]: 501 -> 509\n"
2934 "modified: repeated_int32[3]: 503 -> 504\n"
2935 "deleted: repeated_int32[4]: 500\n",
2939 TEST_F(ComparisonTest, BasicRepeatedTest_SetOption) {
2940 repeated_field_as_set();
2941 proto1_.clear_repeated_int32();
2942 proto2_.clear_repeated_int32();
2944 proto1_.add_repeated_int32(501);
2945 proto1_.add_repeated_int32(502);
2946 proto1_.add_repeated_int32(503);
2947 proto1_.add_repeated_int32(500);
2948 proto1_.add_repeated_int32(500);
2950 proto2_.add_repeated_int32(500);
2951 proto2_.add_repeated_int32(509);
2952 proto2_.add_repeated_int32(503);
2953 proto2_.add_repeated_int32(502);
2954 proto2_.add_repeated_int32(504);
2957 "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
2958 "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
2959 "added: repeated_int32[1]: 509\n"
2960 "added: repeated_int32[4]: 504\n"
2961 "deleted: repeated_int32[0]: 501\n"
2962 "deleted: repeated_int32[4]: 500\n",
2966 TEST_F(ComparisonTest, BasicRepeatedTest_SetField) {
2967 field_as_set(
"repeated_int32");
2968 proto1_.clear_repeated_int32();
2969 proto2_.clear_repeated_int32();
2971 proto1_.add_repeated_int32(501);
2972 proto1_.add_repeated_int32(502);
2973 proto1_.add_repeated_int32(503);
2974 proto1_.add_repeated_int32(500);
2975 proto1_.add_repeated_int32(500);
2977 proto2_.add_repeated_int32(500);
2978 proto2_.add_repeated_int32(509);
2979 proto2_.add_repeated_int32(503);
2980 proto2_.add_repeated_int32(502);
2981 proto2_.add_repeated_int32(504);
2984 "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
2985 "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
2986 "added: repeated_int32[1]: 509\n"
2987 "added: repeated_int32[4]: 504\n"
2988 "deleted: repeated_int32[0]: 501\n"
2989 "deleted: repeated_int32[4]: 500\n",
2994 TEST_F(ComparisonTest, AddDeleteTest) {
2995 proto1_.clear_optional_int32();
2996 proto2_.clear_optional_int64();
2999 "added: optional_int32: 101\n"
3000 "deleted: optional_int64: 102\n",
3004 TEST_F(ComparisonTest, AddDelete_FieldOrderingTest) {
3009 "deleted: my_int: 1\n"
3010 "added: (protobuf_unittest.my_extension_string): \"bar\"\n",
3014 TEST_F(ComparisonTest, AllThreeTest) {
3015 proto1_.clear_optional_int32();
3016 proto2_.clear_optional_float();
3017 proto2_.set_optional_string(
"hello world!");
3020 "added: optional_int32: 101\n"
3021 "deleted: optional_float: 111\n"
3022 "modified: optional_string: \"115\" -> \"hello world!\"\n",
3026 TEST_F(ComparisonTest, SandwhichTest) {
3027 proto1_.clear_optional_int64();
3028 proto1_.clear_optional_uint32();
3030 proto2_.clear_optional_uint64();
3033 "added: optional_int64: 102\n"
3034 "added: optional_uint32: 103\n"
3035 "deleted: optional_uint64: 104\n",
3039 TEST_F(ComparisonTest, IgnoredNoChangeTest) {
3048 "added: w: \"foo\"\n",
3052 TEST_F(ComparisonTest, IgnoredAddTest) {
3060 "added: w: \"foo\"\n",
3064 TEST_F(ComparisonTest, IgnoredDeleteTest) {
3072 "added: w: \"foo\"\n",
3076 TEST_F(ComparisonTest, IgnoredModifyTest) {
3085 "added: w: \"foo\"\n",
3089 TEST_F(ComparisonTest, IgnoredRepeatedAddTest) {
3103 "added: w: \"foo\"\n",
3107 TEST_F(ComparisonTest, IgnoredRepeatedDeleteTest) {
3121 "added: w: \"foo\"\n",
3125 TEST_F(ComparisonTest, IgnoredRepeatedModifyTest) {
3138 "added: w: \"foo\"\n",
3142 TEST_F(ComparisonTest, IgnoredWholeNestedMessage) {
3151 "added: w: \"foo\"\n"
3156 TEST_F(ComparisonTest, IgnoredNestedField) {
3162 ignore_field(
"m.c");
3165 "added: w: \"foo\"\n"
3170 TEST_F(ComparisonTest, IgnoredRepeatedNested) {
3178 ignore_field(
"rm.c");
3181 "ignored: rm[0].c\n"
3182 "ignored: rm[1].c\n"
3183 "added: w: \"foo\"\n",
3187 TEST_F(ComparisonTest, IgnoredNestedRepeated) {
3194 ignore_field(
"m.rc");
3197 "added: w: \"foo\"\n"
3202 TEST_F(ComparisonTest, ExtensionTest) {
3203 proto1ex_.SetExtension(unittest::optional_int32_extension, 401);
3204 proto2ex_.SetExtension(unittest::optional_int32_extension, 402);
3206 proto1ex_.ClearExtension(unittest::optional_int64_extension);
3207 proto2ex_.SetExtension(unittest::optional_int64_extension, 403);
3210 "modified: (protobuf_unittest.optional_int32_extension): 401 -> 402\n"
3211 "added: (protobuf_unittest.optional_int64_extension): 403\n",
3215 TEST_F(ComparisonTest, MatchedUnknownFieldTagTest) {
3224 "modified: 240[0]: 122 -> 121\n"
3225 "deleted: 241[0]: 0x00000001\n"
3226 "added: 241[0]: 0x0000000000000002\n"
3227 "modified: 242[0]: \"cat\" -> \"dog\"\n",
3231 TEST_F(ComparisonTest, UnmatchedUnknownFieldTagTest) {
3237 "deleted: 243[0]: 0x00000001\n"
3238 "added: 244[0]: 2\n"
3239 "added: 244[1]: 4\n",
3243 TEST_F(ComparisonTest, DifferentSizedUnknownFieldTest) {
3253 "modified: 240[0]: 1 -> 2\n"
3254 "modified: 240[2]: 4 -> 2\n"
3255 "added: 240[3]: 5\n",
3259 TEST_F(ComparisonTest, UnknownFieldsAll) {
3273 "modified: 243[0]: 122 -> 121\n"
3274 "deleted: 244[0]: 0x0000000000172356\n"
3275 "deleted: 244[1]: 0x0000000000000098\n"
3276 "modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
3277 "deleted: 245[0].248[1]: 0x00000002\n"
3278 "added: 247[0]: { ... }\n"
3279 "deleted: 249[0]: { ... }\n"
3280 "added: 73882[0]: \"test 123\"\n",
3284 TEST_F(ComparisonTest, EquivalentIgnoresUnknown) {
3285 unittest::ForeignMessage message1, message2;
3288 message1.mutable_unknown_fields()->AddVarint(123, 456);
3290 message2.mutable_unknown_fields()->AddVarint(321, 654);
3296 TEST_F(ComparisonTest, MapTest) {
3308 EXPECT_EQ(
"modified: map_string_string[key3]: \"3\" -> \"0\"\n",
3312 TEST_F(ComparisonTest, MapIgnoreKeyTest) {
3324 util::MessageDifferencer differencer;
3325 differencer.IgnoreField(
3326 GetFieldDescriptor(
map_proto1_,
"map_string_string.key"));
3330 TEST_F(ComparisonTest, MapRoundTripSyncTest) {
3331 TextFormat::Parser
parser;
3332 unittest::TestMap map_reflection1;
3339 unittest::TestMap map_reflection2 = map_reflection1;
3346 TEST_F(ComparisonTest, MapEntryPartialTest) {
3347 TextFormat::Parser
parser;
3348 unittest::TestMap map1;
3349 unittest::TestMap map2;
3352 util::MessageDifferencer differencer;
3354 differencer.ReportDifferencesToString(&
output);
3357 "map_int32_foreign_message { key: 1 value { c: 1 } }", &map1));
3359 "map_int32_foreign_message { key: 1 value { c: 2 }}", &map2));
3361 EXPECT_EQ(
"modified: map_int32_foreign_message[1].c: 1 -> 2\n",
output);
3364 parser.ParseFromString(
"map_int32_foreign_message { key: 1 }", &map1));
3368 TEST_F(ComparisonTest, MapEntryPartialEmptyKeyTest) {
3369 TextFormat::Parser
parser;
3370 unittest::TestMap map1;
3371 unittest::TestMap map2;
3374 parser.ParseFromString(
"map_int32_foreign_message { key: 1 }", &map2));
3376 util::MessageDifferencer differencer;
3380 map1.SerializeToString(&serialized_value);
3381 map1.ParseFromString(serialized_value);
3385 TEST_F(ComparisonTest, MapEntryMissingEmptyFieldIsOkTest) {
3386 TextFormat::Parser
parser;
3387 protobuf_unittest::TestMap msg1;
3388 protobuf_unittest::TestMap msg2;
3391 "map_string_foreign_message { key: 'key1' value {}}", &msg1));
3393 "map_string_foreign_message { key: 'key1' }", &msg2));
3395 util::MessageDifferencer differencer;
3402 class LengthMapKeyComparator
3403 :
public util::MessageDifferencer::MapKeyComparator {
3405 typedef util::MessageDifferencer::SpecificField SpecificField;
3407 const std::vector<SpecificField>& parent_fields)
const {
3408 const Reflection* reflection1 = message1.GetReflection();
3409 const Reflection* reflection2 = message2.GetReflection();
3411 message1.GetDescriptor()->FindFieldByName(
"key");
3412 return reflection1->GetString(message1, key_field).size() ==
3413 reflection2->GetString(message2, key_field).size();
3417 TEST_F(ComparisonTest, MapEntryCustomMapKeyComparator) {
3418 TextFormat::Parser
parser;
3419 protobuf_unittest::TestMap msg1;
3420 protobuf_unittest::TestMap msg2;
3423 "map_string_foreign_message { key: 'key1' value { c: 1 }}", &msg1));
3425 "map_string_foreign_message { key: 'key2' value { c: 1 }}", &msg2));
3427 util::MessageDifferencer differencer;
3428 LengthMapKeyComparator key_comparator;
3429 differencer.TreatAsMapUsingKeyComparator(
3430 GetFieldDescriptor(msg1,
"map_string_foreign_message"), &key_comparator);
3432 differencer.ReportDifferencesToString(&
output);
3439 "modified: map_string_foreign_message[key1].key: \"key1\" -> \"key2\"\n",
3441 differencer.IgnoreField(
3442 GetFieldDescriptor(msg1,
"map_string_foreign_message.key"));
3450 typedef util::MessageDifferencer MessageDifferencer;
3457 std::string RunWithResult(MessageDifferencer* differencer,
3466 MessageDifferencer::StreamReporter reporter(&output_stream);
3467 reporter.set_report_modified_aggregates(
true);
3468 differencer->set_report_matches(
true);
3469 differencer->ReportDifferencesTo(&reporter);
3483 TEST_F(MatchingTest, StreamReporterMatching) {
3484 protobuf_unittest::TestField msg1, msg2;
3492 MessageDifferencer differencer;
3493 differencer.set_report_matches(
true);
3494 differencer.ReportDifferencesToString(&
output);
3498 "matched: rc[0] : 13\n"
3499 "matched: rc[1] : 17\n",
3503 TEST_F(MatchingTest, DontReportMatchedWhenIgnoring) {
3504 protobuf_unittest::TestField msg1, msg2;
3512 MessageDifferencer differencer;
3513 differencer.set_report_matches(
true);
3514 differencer.ReportDifferencesToString(&
output);
3516 differencer.IgnoreField(msg1.GetDescriptor()->FindFieldByName(
"c"));
3521 "matched: rc[0] : 13\n"
3522 "matched: rc[1] : 17\n",
3526 TEST_F(MatchingTest, ReportMatchedForMovedFields) {
3527 protobuf_unittest::TestDiffMessage msg1, msg2;
3530 item->set_b(
"hello");
3531 item = msg2.add_item();
3533 item = msg2.add_item();
3535 item->set_b(
"hello");
3536 item = msg1.add_item();
3538 MessageDifferencer differencer;
3540 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3541 differencer.TreatAsSet(
desc);
3544 "matched: item[0].a -> item[1].a : 53\n"
3545 "matched: item[0].b -> item[1].b : \"hello\"\n"
3546 "moved: item[0] -> item[1] : { a: 53 b: \"hello\" }\n"
3547 "matched: item[1].a -> item[0].a : 27\n"
3548 "moved: item[1] -> item[0] : { a: 27 }\n",
3549 RunWithResult(&differencer, msg1, msg2,
true));
3553 TEST_F(MatchingTest, MatchesAppearInPostTraversalOrderForMovedFields) {
3554 protobuf_unittest::TestDiffMessage msg1, msg2;
3556 protobuf_unittest::TestField*
field;
3561 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3562 nested_desc =
desc->message_type()->FindFieldByName(
"rm");
3563 double_nested_desc = nested_desc->message_type()->FindFieldByName(
"rc");
3564 MessageDifferencer differencer;
3565 differencer.TreatAsSet(
desc);
3566 differencer.TreatAsSet(nested_desc);
3567 differencer.TreatAsSet(double_nested_desc);
3569 item = msg1.add_item();
3570 field = item->add_rm();
3574 field = item->add_rm();
3579 item = msg2.add_item();
3580 field = item->add_rm();
3585 field = item->add_rm();
3589 item = msg1.add_item();
3590 field = item->add_rm();
3595 item = msg2.add_item();
3596 field = item->add_rm();
3603 "matched: item[0].rm[0].c -> item[0].rm[1].c : 1\n"
3604 "moved: item[0].rm[0].rc[0] -> item[0].rm[1].rc[1] : 2\n"
3605 "moved: item[0].rm[0].rc[1] -> item[0].rm[1].rc[0] : 3\n"
3606 "moved: item[0].rm[0] -> item[0].rm[1] : { c: 1 rc: 2 rc: 3 }\n"
3607 "matched: item[0].rm[1].c -> item[0].rm[0].c : 4\n"
3608 "moved: item[0].rm[1].rc[0] -> item[0].rm[0].rc[2] : 5\n"
3609 "matched: item[0].rm[1].rc[1] -> item[0].rm[0].rc[1] : 6\n"
3610 "moved: item[0].rm[1].rc[2] -> item[0].rm[0].rc[0] : 7\n"
3611 "moved: item[0].rm[1] -> item[0].rm[0] : { c: 4 rc: 5 rc: 6 rc: 7 }\n"
3612 "matched: item[0] : { rm { c: 1 rc: 2 rc: 3 }"
3613 " rm { c: 4 rc: 5 rc: 6 rc: 7 } }\n"
3614 "matched: item[1].rm[0].c : 8\n"
3615 "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 10\n"
3616 "moved: item[1].rm[0].rc[1] -> item[1].rm[0].rc[2] : 11\n"
3617 "moved: item[1].rm[0].rc[2] -> item[1].rm[0].rc[0] : 9\n"
3618 "matched: item[1].rm[0] : { c: 8 rc: 10 rc: 11 rc: 9 }\n"
3619 "matched: item[1] : { rm { c: 8 rc: 10 rc: 11 rc: 9 } }\n",
3620 RunWithResult(&differencer, msg1, msg2,
true));
3623 TEST_F(MatchingTest, MatchAndModifiedInterleaveProperly) {
3624 protobuf_unittest::TestDiffMessage msg1, msg2;
3626 protobuf_unittest::TestField*
field;
3633 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3634 nested_key =
desc->message_type()->FindFieldByName(
"a");
3635 nested_desc =
desc->message_type()->FindFieldByName(
"rm");
3636 double_nested_key = nested_desc->message_type()->FindFieldByName(
"c");
3637 double_nested_desc = nested_desc->message_type()->FindFieldByName(
"rc");
3639 MessageDifferencer differencer;
3640 differencer.TreatAsMap(
desc, nested_key);
3641 differencer.TreatAsMap(nested_desc, double_nested_key);
3642 differencer.TreatAsSet(double_nested_desc);
3644 item = msg1.add_item();
3646 field = item->add_rm();
3650 field = item->add_rm();
3655 item = msg1.add_item();
3657 field = item->add_rm();
3661 field = item->add_rm();
3664 item = msg2.add_item();
3666 field = item->add_rm();
3671 field = item->add_rm();
3675 item = msg2.add_item();
3677 field = item->add_rm();
3681 field = item->add_rm();
3685 "matched: item[0].a : 1\n"
3686 "matched: item[0].rm[1].c -> item[0].rm[0].c : 5\n"
3687 "moved: item[0].rm[1].rc[0] -> item[0].rm[0].rc[2] : 6\n"
3688 "moved: item[0].rm[1].rc[2] -> item[0].rm[0].rc[0] : 8\n"
3689 "added: item[0].rm[0].rc[1]: 8\n"
3690 "deleted: item[0].rm[1].rc[1]: 7\n"
3691 "modified: item[0].rm[1] -> item[0].rm[0]: { c: 5 rc: 6 rc: 7 rc: 8 } ->"
3692 " { c: 5 rc: 8 rc: 8 rc: 6 }\n"
3693 "added: item[0].rm[1]: { c: 3 rc: 2 rc: 4 }\n"
3694 "deleted: item[0].rm[0]: { c: 2 rc: 3 rc: 4 }\n"
3695 "modified: item[0]: { a: 1 rm { c: 2 rc: 3 rc: 4 }"
3696 " rm { c: 5 rc: 6 rc: 7 rc: 8 } } ->"
3697 " { a: 1 rm { c: 5 rc: 8 rc: 8 rc: 6 }"
3698 " rm { c: 3 rc: 2 rc: 4 } }\n"
3699 "matched: item[1].a : 9\n"
3700 "matched: item[1].rm[0].c : 10\n"
3701 "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 11\n"
3702 "moved: item[1].rm[0].rc[1] -> item[1].rm[0].rc[0] : 12\n"
3703 "matched: item[1].rm[0] : { c: 10 rc: 11 rc: 12 }\n"
3704 "matched: item[1].rm[1].c : 13\n"
3705 "matched: item[1].rm[1] : { c: 13 }\n"
3706 "matched: item[1] : { a: 9 rm { c: 10 rc: 11 rc: 12 } rm { c: 13 } }\n",
3707 RunWithResult(&differencer, msg1, msg2,
false));
3710 TEST_F(MatchingTest, MatchingWorksWithExtensions) {
3711 protobuf_unittest::TestAllExtensions msg1, msg2;
3712 protobuf_unittest::TestAllTypes::NestedMessage*
nested;
3713 using protobuf_unittest::repeated_nested_message_extension;
3719 desc =
descriptor->FindExtensionByName(
"repeated_nested_message_extension");
3721 nested_key =
desc->message_type()->FindFieldByName(
"bb");
3723 MessageDifferencer differencer;
3724 differencer.TreatAsMap(
desc, nested_key);
3726 nested = msg1.AddExtension(repeated_nested_message_extension);
3728 nested = msg1.AddExtension(repeated_nested_message_extension);
3730 nested = msg1.AddExtension(repeated_nested_message_extension);
3732 nested = msg2.AddExtension(repeated_nested_message_extension);
3734 nested = msg2.AddExtension(repeated_nested_message_extension);
3736 nested = msg2.AddExtension(repeated_nested_message_extension);
3740 "matched: (protobuf_unittest.repeated_nested_message_extension)[0].bb ->"
3741 " (protobuf_unittest.repeated_nested_message_extension)[2].bb : 7\n"
3742 "moved: (protobuf_unittest.repeated_nested_message_extension)[0] ->"
3743 " (protobuf_unittest.repeated_nested_message_extension)[2] :"
3745 "matched: (protobuf_unittest.repeated_nested_message_extension)[1].bb :"
3747 "matched: (protobuf_unittest.repeated_nested_message_extension)[1] :"
3749 "matched: (protobuf_unittest.repeated_nested_message_extension)[2].bb ->"
3750 " (protobuf_unittest.repeated_nested_message_extension)[0].bb :"
3752 "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
3753 " (protobuf_unittest.repeated_nested_message_extension)[0] :"
3755 RunWithResult(&differencer, msg1, msg2,
true));
3758 TEST(AnyTest, Simple) {
3759 protobuf_unittest::TestField value1, value2;
3763 protobuf_unittest::TestAny m1, m2;
3764 m1.mutable_any_value()->PackFrom(value1);
3765 m2.mutable_any_value()->PackFrom(value2);
3766 util::MessageDifferencer message_differencer;
3768 message_differencer.ReportDifferencesToString(&difference_string);
3770 EXPECT_EQ(
"modified: any_value.a: 20 -> 21\n", difference_string);
3773 TEST(Anytest, TreatAsSet) {
3774 protobuf_unittest::TestField value1, value2;
3780 protobuf_unittest::TestAny m1, m2;
3781 m1.add_repeated_any_value()->PackFrom(value1);
3782 m1.add_repeated_any_value()->PackFrom(value2);
3783 m2.add_repeated_any_value()->PackFrom(value2);
3784 m2.add_repeated_any_value()->PackFrom(value1);
3786 util::MessageDifferencer message_differencer;
3787 message_differencer.TreatAsSet(GetFieldDescriptor(m1,
"repeated_any_value"));
3791 TEST(Anytest, TreatAsSet_DifferentType) {
3792 protobuf_unittest::TestField value1;
3795 protobuf_unittest::TestDiffMessage value2;
3798 protobuf_unittest::TestAny m1, m2;
3799 m1.add_repeated_any_value()->PackFrom(value1);
3800 m1.add_repeated_any_value()->PackFrom(value2);
3801 m2.add_repeated_any_value()->PackFrom(value2);
3802 m2.add_repeated_any_value()->PackFrom(value1);
3804 util::MessageDifferencer message_differencer;
3805 message_differencer.TreatAsSet(GetFieldDescriptor(m1,
"repeated_any_value"));