44 #include <google/protobuf/any_test.pb.h>
46 #include <google/protobuf/map_unittest.pb.h>
48 #include <google/protobuf/unittest.pb.h>
53 #include <google/protobuf/util/message_differencer_unittest.pb.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,
82 const Message& msg1,
const Message& msg2) {
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 TEST(MessageDifferencerTest, BasicPartialEqualityTest) {
167 unittest::TestAllTypes msg1;
168 unittest::TestAllTypes msg2;
174 util::MessageDifferencer differencer;
179 TEST(MessageDifferencerTest, PartialEqualityTestExtraField) {
181 unittest::TestAllTypes msg1;
182 unittest::TestAllTypes msg2;
187 msg1.clear_optional_int32();
190 util::MessageDifferencer differencer;
195 TEST(MessageDifferencerTest, PartialEqualityTestSkipRequiredField) {
197 unittest::TestRequired msg1;
198 unittest::TestRequired msg2;
205 util::MessageDifferencer differencer;
210 TEST(MessageDifferencerTest, BasicPartialInequalityTest) {
212 unittest::TestAllTypes msg1;
213 unittest::TestAllTypes msg2;
218 msg1.set_optional_int32(-1);
221 util::MessageDifferencer differencer;
226 TEST(MessageDifferencerTest, PartialInequalityMissingFieldTest) {
228 unittest::TestAllTypes msg1;
229 unittest::TestAllTypes msg2;
234 msg2.clear_optional_int32();
237 util::MessageDifferencer differencer;
242 TEST(MessageDifferencerTest, RepeatedFieldPartialInequalityTest) {
244 unittest::TestAllTypes msg1;
245 unittest::TestAllTypes msg2;
250 msg1.add_repeated_int32(-1);
253 util::MessageDifferencer differencer;
258 TEST(MessageDifferencerTest, BasicEquivalencyTest) {
260 unittest::TestAllTypes msg1;
261 unittest::TestAllTypes msg2;
270 TEST(MessageDifferencerTest, EquivalencyNotEqualTest) {
272 unittest::TestAllTypes msg1;
273 unittest::TestAllTypes msg2;
278 msg1.clear_optional_int32();
279 msg2.set_optional_int32(0);
286 TEST(MessageDifferencerTest, BasicInequivalencyTest) {
288 unittest::TestAllTypes msg1;
289 unittest::TestAllTypes msg2;
294 msg1.set_optional_int32(-1);
300 TEST(MessageDifferencerTest, BasicEquivalencyNonSetTest) {
302 unittest::TestAllTypes msg1;
303 unittest::TestAllTypes msg2;
309 TEST(MessageDifferencerTest, BasicInequivalencyNonSetTest) {
311 unittest::TestAllTypes msg1;
312 unittest::TestAllTypes msg2;
314 msg1.set_optional_int32(-1);
320 TEST(MessageDifferencerTest, BasicPartialEquivalencyTest) {
322 unittest::TestAllTypes msg1;
323 unittest::TestAllTypes msg2;
329 util::MessageDifferencer differencer;
330 differencer.set_message_field_comparison(
336 TEST(MessageDifferencerTest, PartialEquivalencyNotEqualTest) {
338 unittest::TestAllTypes msg1;
339 unittest::TestAllTypes msg2;
344 msg1.set_optional_int32(0);
345 msg2.clear_optional_int32();
349 util::MessageDifferencer differencer;
350 differencer.set_message_field_comparison(
356 TEST(MessageDifferencerTest, PartialEquivalencyTestExtraField) {
358 unittest::TestAllTypes msg1;
359 unittest::TestAllTypes msg2;
364 msg1.clear_optional_int32();
367 util::MessageDifferencer differencer;
368 differencer.set_message_field_comparison(
374 TEST(MessageDifferencerTest, PartialEquivalencyTestSkipRequiredField) {
376 unittest::TestRequired msg1;
377 unittest::TestRequired msg2;
384 util::MessageDifferencer differencer;
385 differencer.set_message_field_comparison(
391 TEST(MessageDifferencerTest, BasicPartialInequivalencyTest) {
393 unittest::TestAllTypes msg1;
394 unittest::TestAllTypes msg2;
399 msg1.set_optional_int32(-1);
402 util::MessageDifferencer differencer;
403 differencer.set_message_field_comparison(
409 TEST(MessageDifferencerTest, BasicPartialEquivalencyNonSetTest) {
411 unittest::TestAllTypes msg1;
412 unittest::TestAllTypes msg2;
415 util::MessageDifferencer differencer;
416 differencer.set_message_field_comparison(
422 TEST(MessageDifferencerTest, BasicPartialInequivalencyNonSetTest) {
424 unittest::TestAllTypes msg1;
425 unittest::TestAllTypes msg2;
427 msg1.set_optional_int32(-1);
430 util::MessageDifferencer differencer;
431 differencer.set_message_field_comparison(
437 TEST(MessageDifferencerTest, ApproximateEqualityTest) {
439 unittest::TestAllTypes msg1;
440 unittest::TestAllTypes msg2;
449 TEST(MessageDifferencerTest, ApproximateModifiedEqualityTest) {
451 unittest::TestAllTypes msg1;
452 unittest::TestAllTypes msg2;
457 const float v1 = 2.300005f;
458 const float v2 = 2.300006f;
459 msg1.set_optional_float(
v1);
460 msg2.set_optional_float(
v2);
469 TEST(MessageDifferencerTest, ApproximateEquivalencyTest) {
471 unittest::TestAllTypes msg1;
472 unittest::TestAllTypes msg2;
481 TEST(MessageDifferencerTest, ApproximateModifiedEquivalencyTest) {
483 unittest::TestAllTypes msg1;
484 unittest::TestAllTypes msg2;
490 const float v1 = 2.300005f;
491 const float v2 = 2.300006f;
492 msg1.set_optional_float(
v1);
493 msg2.set_optional_float(
v2);
502 msg1.clear_optional_int32();
503 msg2.set_optional_int32(0);
512 TEST(MessageDifferencerTest, ApproximateInequivalencyTest) {
514 unittest::TestAllTypes msg1;
515 unittest::TestAllTypes msg2;
521 msg1.set_optional_int32(-1);
525 msg1.set_optional_int32(0);
526 msg2.set_optional_int32(0);
530 const float v1 = 2.3f;
531 const float v2 = 9.3f;
532 msg1.set_optional_float(
v1);
533 msg2.set_optional_float(
v2);
537 TEST(MessageDifferencerTest, WithinFractionOrMarginFloatTest) {
539 unittest::TestAllTypes msg1;
540 unittest::TestAllTypes msg2;
546 const float v1 = 100.0f;
547 const float v2 = 109.9f;
548 msg1.set_optional_float(
v1);
549 msg2.set_optional_float(
v2);
552 util::MessageDifferencer differencer;
555 msg1.GetDescriptor()->FindFieldByName(
"optional_float");
560 differencer.SetFractionAndMargin(fd, 0.0, 10.0);
569 differencer.SetFractionAndMargin(fd, 0.2, 0.0);
573 differencer.SetFractionAndMargin(fd, 0.01, 0.0);
577 differencer.SetFractionAndMargin(fd, 0.01, 10.0);
582 msg1.set_default_float(
v1);
583 msg2.set_default_float(
v2);
585 msg1.set_default_float(
v1);
586 msg2.set_default_float(
v1);
590 TEST(MessageDifferencerTest, WithinFractionOrMarginDoubleTest) {
592 unittest::TestAllTypes msg1;
593 unittest::TestAllTypes msg2;
599 const double v1 = 100.0;
600 const double v2 = 109.9;
601 msg1.set_optional_double(
v1);
602 msg2.set_optional_double(
v2);
605 util::MessageDifferencer differencer;
612 msg1.GetDescriptor()->FindFieldByName(
"optional_double");
613 differencer.SetFractionAndMargin(fd, 0.0, 10.0);
622 differencer.SetFractionAndMargin(fd, 0.2, 0.0);
626 differencer.SetFractionAndMargin(fd, 0.01, 0.0);
630 differencer.SetFractionAndMargin(fd, 0.01, 10.0);
635 msg1.set_default_double(
v1);
636 msg2.set_default_double(
v2);
638 msg1.set_default_double(
v1);
639 msg2.set_default_double(
v1);
643 TEST(MessageDifferencerTest, WithinDefaultFractionOrMarginDoubleTest) {
645 unittest::TestAllTypes msg1;
646 unittest::TestAllTypes msg2;
652 const double v1 = 100.0;
653 const double v2 = 109.9;
654 msg1.set_optional_double(
v1);
655 msg2.set_optional_double(
v2);
657 util::MessageDifferencer differencer;
664 util::DefaultFieldComparator field_comparitor;
665 field_comparitor.SetDefaultFractionAndMargin(0.0, 10.0);
666 differencer.set_field_comparator(&field_comparitor);
674 field_comparitor.set_float_comparison(
679 field_comparitor.SetDefaultFractionAndMargin(0.2, 0.0);
683 field_comparitor.SetDefaultFractionAndMargin(0.01, 0.0);
687 field_comparitor.SetDefaultFractionAndMargin(0.01, 10.0);
691 msg1.set_default_double(
v1);
692 msg2.set_default_double(
v2);
696 TEST(MessageDifferencerTest, BasicFieldOrderingsTest) {
698 unittest::TestFieldOrderings msg1;
699 unittest::TestFieldOrderings msg2;
708 TEST(MessageDifferencerTest, BasicFieldOrderingInequalityTest) {
710 unittest::TestFieldOrderings msg1;
711 unittest::TestFieldOrderings msg2;
716 msg1.set_my_float(15.00);
717 msg2.set_my_float(16.00);
723 TEST(MessageDifferencerTest, BasicExtensionTest) {
725 unittest::TestAllExtensions msg1;
726 unittest::TestAllExtensions msg2;
735 TEST(MessageDifferencerTest, BasicExtensionInequalityTest) {
737 unittest::TestAllExtensions msg1;
738 unittest::TestAllExtensions msg2;
743 msg1.SetExtension(unittest::optional_int32_extension, 101);
744 msg2.SetExtension(unittest::optional_int32_extension, 102);
750 TEST(MessageDifferencerTest, OneofTest) {
752 unittest::TestOneof2 msg1;
753 unittest::TestOneof2 msg2;
755 TestUtil::SetOneof1(&msg1);
756 TestUtil::SetOneof1(&msg2);
762 TEST(MessageDifferencerTest, OneofInequalityTest) {
764 unittest::TestOneof2 msg1;
765 unittest::TestOneof2 msg2;
767 TestUtil::SetOneof1(&msg1);
768 TestUtil::SetOneof2(&msg2);
774 TEST(MessageDifferencerTest, UnknownFieldPartialEqualTest) {
775 unittest::TestEmptyMessage empty1;
776 unittest::TestEmptyMessage empty2;
781 unknown1->AddVarint(243, 122);
782 unknown1->AddLengthDelimited(245,
"abc");
783 unknown1->AddGroup(246)->AddFixed32(248, 1);
784 unknown1->mutable_field(2)->mutable_group()->AddFixed32(248, 2);
786 unknown2->AddVarint(243, 122);
787 unknown2->AddLengthDelimited(245,
"abc");
788 unknown2->AddGroup(246)->AddFixed32(248, 1);
789 unknown2->mutable_field(2)->mutable_group()->AddFixed32(248, 2);
791 util::MessageDifferencer differencer;
796 TEST(MessageDifferencerTest, SpecifiedFieldsEqualityAllTest) {
797 unittest::TestAllTypes msg1;
798 unittest::TestAllTypes msg2;
803 std::vector<const FieldDescriptor*> fields1;
804 std::vector<const FieldDescriptor*> fields2;
805 msg1.GetReflection()->ListFields(msg1, &fields1);
806 msg2.GetReflection()->ListFields(msg2, &fields2);
808 util::MessageDifferencer differencer;
809 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
812 TEST(MessageDifferencerTest, SpecifiedFieldsInequalityAllTest) {
813 unittest::TestAllTypes msg1;
814 unittest::TestAllTypes msg2;
818 std::vector<const FieldDescriptor*> fields1;
819 std::vector<const FieldDescriptor*> fields2;
820 msg1.GetReflection()->ListFields(msg1, &fields1);
821 msg2.GetReflection()->ListFields(msg2, &fields2);
823 util::MessageDifferencer differencer;
824 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
827 TEST(MessageDifferencerTest, SpecifiedFieldsEmptyListAlwaysSucceeds) {
828 unittest::TestAllTypes msg1;
829 unittest::TestAllTypes msg2;
833 std::vector<const FieldDescriptor*> empty_fields;
835 util::MessageDifferencer differencer;
837 differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
841 differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
844 TEST(MessageDifferencerTest, SpecifiedFieldsCompareWithSelf) {
845 unittest::TestAllTypes msg1;
848 std::vector<const FieldDescriptor*>
fields;
849 msg1.GetReflection()->ListFields(msg1, &
fields);
851 util::MessageDifferencer differencer;
856 std::vector<const FieldDescriptor*> compare_fields;
857 for (
int i = 0;
i <
fields.size(); ++
i) {
859 compare_fields.push_back(
fields[
i]);
862 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg1, compare_fields,
869 std::vector<const FieldDescriptor*> compare_fields1;
870 std::vector<const FieldDescriptor*> compare_fields2;
871 for (
int i = 0;
i <
fields.size(); ++
i) {
873 compare_fields1.push_back(
fields[
i]);
875 compare_fields2.push_back(
fields[
i]);
878 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg1, compare_fields1,
883 TEST(MessageDifferencerTest, SpecifiedFieldsEqualityAllShuffledTest) {
887 unittest::TestAllTypes msg1;
888 unittest::TestAllTypes msg2;
893 std::vector<const FieldDescriptor*> fields1;
894 std::vector<const FieldDescriptor*> fields2;
895 msg1.GetReflection()->ListFields(msg1, &fields1);
896 msg2.GetReflection()->ListFields(msg2, &fields2);
898 std::default_random_engine rng;
899 std::shuffle(fields1.begin(), fields1.end(), rng);
900 std::shuffle(fields2.begin(), fields2.end(), rng);
902 util::MessageDifferencer differencer;
903 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
906 TEST(MessageDifferencerTest, SpecifiedFieldsSubsetEqualityTest) {
908 unittest::TestAllTypes msg1;
909 unittest::TestAllTypes msg2;
913 std::vector<const FieldDescriptor*> fields1;
914 msg1.GetReflection()->ListFields(msg1, &fields1);
916 std::vector<const FieldDescriptor*> compare_fields;
918 for (
int i = 0;
i < fields1.size(); ++
i) {
920 compare_fields.push_back(fields1[
i]);
924 util::MessageDifferencer differencer;
925 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
929 TEST(MessageDifferencerTest,
930 SpecifiedFieldsSubsetIgnoresOtherFieldDifferencesTest) {
934 unittest::TestAllTypes msg1;
935 unittest::TestAllTypes msg2;
939 std::vector<const FieldDescriptor*> fields1;
940 const Reflection* reflection = msg1.GetReflection();
941 reflection->ListFields(msg1, &fields1);
943 std::vector<const FieldDescriptor*> compare_fields;
945 for (
int i = 0;
i < fields1.size(); ++
i) {
947 compare_fields.push_back(fields1[
i]);
949 reflection->ClearField(&msg2, fields1[
i]);
953 util::MessageDifferencer differencer;
955 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
959 TEST(MessageDifferencerTest, SpecifiedFieldsDetectsDifferencesTest) {
962 unittest::TestAllTypes msg1;
963 unittest::TestAllTypes msg2;
966 TestUtil::ModifyRepeatedFields(&msg2);
968 std::vector<const FieldDescriptor*> fields1;
969 msg1.GetReflection()->ListFields(msg1, &fields1);
971 std::vector<const FieldDescriptor*> compare_fields;
973 for (
int i = 0;
i < fields1.size(); ++
i) {
974 if (fields1[
i]->is_repeated()) {
975 compare_fields.push_back(fields1[
i]);
979 util::MessageDifferencer differencer;
980 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, compare_fields,
984 TEST(MessageDifferencerTest, SpecifiedFieldsEquivalenceAllTest) {
985 unittest::TestAllTypes msg1;
986 unittest::TestAllTypes msg2;
991 std::vector<const FieldDescriptor*> fields1;
992 std::vector<const FieldDescriptor*> fields2;
993 msg1.GetReflection()->ListFields(msg1, &fields1);
994 msg2.GetReflection()->ListFields(msg2, &fields2);
996 util::MessageDifferencer differencer;
997 differencer.set_message_field_comparison(
999 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1002 TEST(MessageDifferencerTest,
1003 SpecifiedFieldsEquivalenceIgnoresOtherFieldDifferencesTest) {
1004 unittest::TestAllTypes msg1;
1005 unittest::TestAllTypes msg2;
1009 desc->FindFieldByName(
"optional_int32");
1011 desc->FindFieldByName(
"optional_int64");
1013 desc->FindFieldByName(
"default_int64");
1017 msg1.set_optional_int32(0);
1018 msg2.set_optional_int64(0);
1019 msg1.set_default_int64(default_int64_desc->default_value_int64());
1023 msg2.set_optional_uint64(23);
1025 std::vector<const FieldDescriptor*> fields1;
1026 std::vector<const FieldDescriptor*> fields2;
1027 fields1.push_back(optional_int32_desc);
1028 fields1.push_back(default_int64_desc);
1030 fields2.push_back(optional_int64_desc);
1032 util::MessageDifferencer differencer;
1033 EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1034 differencer.set_message_field_comparison(
1037 EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, fields1, fields2));
1040 TEST(MessageDifferencerTest, RepeatedFieldSmartListTest) {
1042 protobuf_unittest::TestDiffMessage msg1;
1043 protobuf_unittest::TestDiffMessage msg2;
1066 util::MessageDifferencer differencer;
1067 differencer.ReportDifferencesToString(&diff_report);
1068 differencer.set_repeated_field_comparison(
1072 "deleted: rv[0]: 1\n"
1075 "moved: rv[1] -> rv[2] : 2\n"
1077 "moved: rv[2] -> rv[4] : 3\n"
1078 "deleted: rv[3]: 9\n"
1079 "moved: rv[4] -> rv[5] : 4\n"
1080 "moved: rv[5] -> rv[6] : 5\n"
1081 "deleted: rv[6]: 7\n"
1083 "moved: rv[7] -> rv[8] : 2\n",
1091 msg1.add_rm()->set_a(1);
1092 msg1.add_rm()->set_a(2);
1093 msg1.add_rm()->set_a(3);
1094 msg1.add_rm()->set_a(4);
1095 msg1.add_rm()->set_a(5);
1096 msg2.add_rm()->set_a(2);
1097 msg2.add_rm()->set_a(6);
1098 msg2.add_rm()->set_a(4);
1099 differencer.ReportDifferencesToString(&diff_report);
1100 differencer.set_repeated_field_comparison(
1104 "deleted: rm[0]: { a: 1 }\n"
1105 "moved: rm[1] -> rm[0] : { a: 2 }\n"
1106 "deleted: rm[2]: { a: 3 }\n"
1107 "added: rm[1]: { a: 6 }\n"
1108 "moved: rm[3] -> rm[2] : { a: 4 }\n"
1109 "deleted: rm[4]: { a: 5 }\n",
1113 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest) {
1115 protobuf_unittest::TestDiffMessage msg1;
1116 protobuf_unittest::TestDiffMessage msg2;
1117 protobuf_unittest::TestField elem1_1, elem2_1, elem3_1;
1118 protobuf_unittest::TestField elem1_2, elem2_2, elem3_2;
1140 *msg1.add_rm() = elem1_1;
1141 *msg1.add_rm() = elem2_1;
1142 *msg1.add_rm() = elem3_1;
1144 *msg2.add_rm() = elem3_2;
1145 *msg2.add_rm() = elem1_2;
1146 *msg2.add_rm() = elem2_2;
1149 util::MessageDifferencer differencer;
1150 differencer.ReportDifferencesToString(&diff_report);
1151 differencer.set_repeated_field_comparison(
1155 "modified: rm[0].a -> rm[1].a: 1 -> 0\n"
1156 "modified: rm[1].b -> rm[2].b: 2 -> 0\n"
1157 "modified: rm[2].b -> rm[0].b: 3 -> 0\n",
1161 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest_IdenticalElements) {
1163 protobuf_unittest::TestDiffMessage msg1;
1164 protobuf_unittest::TestDiffMessage msg2;
1165 protobuf_unittest::TestField elem;
1171 *msg1.add_rm() = elem;
1172 *msg1.add_rm() = elem;
1173 *msg2.add_rm() = elem;
1174 *msg2.add_rm() = elem;
1176 util::MessageDifferencer differencer;
1177 differencer.set_repeated_field_comparison(
1182 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest_PreviouslyMatch) {
1184 protobuf_unittest::TestDiffMessage msg1;
1185 protobuf_unittest::TestDiffMessage msg2;
1186 protobuf_unittest::TestField elem1_1, elem1_2;
1187 protobuf_unittest::TestField elem2_1, elem2_2;
1203 *msg1.add_rm() = elem1_1;
1204 *msg1.add_rm() = elem2_1;
1205 *msg2.add_rm() = elem1_2;
1206 *msg2.add_rm() = elem2_2;
1209 util::MessageDifferencer differencer;
1210 differencer.ReportDifferencesToString(&diff_report);
1211 differencer.set_repeated_field_comparison(
1215 "modified: rm[0].c: 1 -> 0\n"
1216 "modified: rm[1].b: 1 -> 0\n",
1220 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatches) {
1222 protobuf_unittest::TestDiffMessage msg1;
1223 protobuf_unittest::TestDiffMessage msg2;
1224 protobuf_unittest::TestField elem1_1, elem2_1, elem3_1;
1225 protobuf_unittest::TestField elem2_2, elem3_2;
1246 *msg1.add_rm() = elem1_1;
1247 *msg1.add_rm() = elem2_1;
1248 *msg1.add_rm() = elem3_1;
1249 *msg2.add_rm() = elem2_2;
1250 *msg2.add_rm() = elem3_2;
1253 util::MessageDifferencer differencer;
1254 differencer.ReportDifferencesToString(&diff_report);
1255 differencer.set_repeated_field_comparison(
1259 "modified: rm[1].b -> rm[0].b: 2 -> 0\n"
1260 "modified: rm[2].b -> rm[1].b: 3 -> 0\n"
1261 "deleted: rm[0]: { c: 1 a: 1 b: 1 }\n",
1265 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatchesNoReporter) {
1266 protobuf_unittest::TestDiffMessage msg1;
1267 protobuf_unittest::TestDiffMessage msg2;
1268 protobuf_unittest::TestField elem1, elem2, elem3, elem4;
1274 *msg1.add_rm() = elem1;
1275 *msg1.add_rm() = elem2;
1276 *msg1.add_rm() = elem3;
1277 *msg2.add_rm() = elem2;
1278 *msg2.add_rm() = elem3;
1279 *msg2.add_rm() = elem4;
1281 util::MessageDifferencer differencer;
1282 differencer.set_repeated_field_comparison(
1287 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_NonMessageTypeTest) {
1289 protobuf_unittest::TestDiffMessage msg1;
1290 protobuf_unittest::TestDiffMessage msg2;
1301 util::MessageDifferencer differencer;
1302 differencer.ReportDifferencesToString(&diff_report);
1303 differencer.set_repeated_field_comparison(
1307 "moved: rw[0] -> rw[2] : \"b\"\n"
1308 "moved: rw[2] -> rw[0] : \"a\"\n",
1312 TEST(MessageDifferencerTest, RepeatedFieldSetTest_SetOfSet) {
1314 protobuf_unittest::TestDiffMessage msg1;
1315 protobuf_unittest::TestDiffMessage msg2;
1321 item = msg1.add_item();
1324 item = msg1.add_item();
1327 item = msg1.add_item();
1332 item = msg2.add_item();
1335 item = msg2.add_item();
1339 item = msg2.add_item();
1342 item = msg2.add_item();
1348 util::MessageDifferencer differencer;
1353 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Combination) {
1355 protobuf_unittest::TestDiffMessage msg1;
1356 protobuf_unittest::TestDiffMessage msg2;
1366 item = msg1.add_item();
1370 item = msg1.add_item();
1374 item = msg1.add_item();
1380 item = msg2.add_item();
1384 item = msg2.add_item();
1389 item = msg2.add_item();
1393 item = msg2.add_item();
1408 msg1.add_rw(
"nothing");
1409 msg2.add_rw(
"nothing");
1410 msg1.add_rw(
"should");
1411 msg2.add_rw(
"should");
1412 msg1.add_rw(
"change");
1413 msg2.add_rw(
"change");
1416 util::MessageDifferencer differencer1;
1417 differencer1.TreatAsMap(msg1.GetDescriptor()->FindFieldByName(
"item"),
1418 item->GetDescriptor()->FindFieldByName(
"a"));
1419 differencer1.TreatAsSet(msg1.GetDescriptor()->FindFieldByName(
"rv"));
1420 differencer1.TreatAsSet(
item->GetDescriptor()->FindFieldByName(
"ra"));
1423 util::MessageDifferencer differencer2;
1424 differencer2.TreatAsMap(msg1.GetDescriptor()->FindFieldByName(
"item"),
1425 item->GetDescriptor()->FindFieldByName(
"a"));
1427 differencer2.TreatAsList(msg1.GetDescriptor()->FindFieldByName(
"rw"));
1431 TEST(MessageDifferencerTest, RepeatedFieldMapTest_Partial) {
1432 protobuf_unittest::TestDiffMessage msg1;
1440 protobuf_unittest::TestDiffMessage msg2;
1445 item = msg2.add_item();
1448 item = msg2.add_item();
1453 util::MessageDifferencer differencer;
1454 differencer.TreatAsMap(GetFieldDescriptor(msg1,
"item"),
1455 GetFieldDescriptor(msg1,
"item.a"));
1460 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Duplicates) {
1461 protobuf_unittest::TestDiffMessage
a,
b, c;
1484 util::MessageDifferencer differencer;
1485 differencer.TreatAsSet(GetFieldDescriptor(
a,
"rv"));
1489 util::MessageDifferencer differencer1;
1495 TEST(MessageDifferencerTest, RepeatedFieldSetTest_PartialSimple) {
1496 protobuf_unittest::TestDiffMessage
a,
b, c;
1501 a.add_rm()->set_c(1);
1502 a.add_rm()->set_c(0);
1507 b.add_rm()->set_c(1);
1514 c.add_rm()->set_c(1);
1515 util::MessageDifferencer differencer;
1517 differencer.TreatAsSet(GetFieldDescriptor(
a,
"rm"));
1522 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Partial) {
1523 protobuf_unittest::TestDiffMessage msg1, msg2;
1529 msg1.add_rm()->set_a(1);
1530 msg1.add_rm()->set_b(2);
1531 msg1.add_rm()->set_c(3);
1537 protobuf_unittest::TestField*
field = msg2.add_rm();
1540 field = msg2.add_rm();
1543 field = msg2.add_rm();
1546 util::MessageDifferencer differencer;
1548 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"rm"));
1552 TEST(MessageDifferencerTest, RepeatedFieldMapTest_MultipleFieldsAsKey) {
1553 protobuf_unittest::TestDiffMessage msg1;
1554 protobuf_unittest::TestDiffMessage msg2;
1563 item = msg1.add_item();
1569 item = msg1.add_item();
1576 item = msg2.add_item();
1582 item = msg2.add_item();
1588 item = msg2.add_item();
1596 util::MessageDifferencer differencer;
1597 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"item.ra"));
1599 std::vector<const FieldDescriptor*> key_fields;
1600 key_fields.push_back(GetFieldDescriptor(msg1,
"item.a"));
1601 key_fields.push_back(GetFieldDescriptor(msg1,
"item.ra"));
1602 differencer.TreatAsMapWithMultipleFieldsAsKey(
1603 GetFieldDescriptor(msg1,
"item"), key_fields);
1609 item = msg1.add_item();
1613 item->set_b(
"hello");
1614 item = msg2.add_item();
1618 item->set_b(
"world");
1620 differencer.ReportDifferencesToString(&
output);
1623 "moved: item[0].ra[0] -> item[0].ra[1] : 5\n"
1624 "moved: item[0].ra[1] -> item[0].ra[0] : 6\n"
1625 "modified: item[0].b: \"hello\" -> \"world\"\n",
1629 TEST(MessageDifferencerTest, RepeatedFieldMapTest_MultipleFieldPathsAsKey) {
1630 protobuf_unittest::TestDiffMessage msg1;
1631 protobuf_unittest::TestDiffMessage msg2;
1636 item->mutable_m()->set_a(1);
1637 item->mutable_m()->add_rc(2);
1638 item->mutable_m()->add_rc(3);
1640 item = msg1.add_item();
1642 item->mutable_m()->set_a(2);
1643 item->mutable_m()->add_rc(1);
1644 item->mutable_m()->add_rc(3);
1646 item = msg1.add_item();
1648 item->mutable_m()->set_a(1);
1649 item->mutable_m()->add_rc(1);
1650 item->mutable_m()->add_rc(3);
1653 item = msg2.add_item();
1655 item->mutable_m()->set_a(1);
1656 item->mutable_m()->add_rc(3);
1657 item->mutable_m()->add_rc(1);
1659 item = msg2.add_item();
1661 item->mutable_m()->set_a(1);
1662 item->mutable_m()->add_rc(3);
1663 item->mutable_m()->add_rc(2);
1665 item = msg2.add_item();
1667 item->mutable_m()->set_a(2);
1668 item->mutable_m()->add_rc(3);
1669 item->mutable_m()->add_rc(1);
1673 util::MessageDifferencer differencer;
1674 differencer.TreatAsSet(GetFieldDescriptor(msg1,
"item.m.rc"));
1676 std::vector<std::vector<const FieldDescriptor*> > key_field_paths;
1677 std::vector<const FieldDescriptor*> key_field_path1;
1678 key_field_path1.push_back(GetFieldDescriptor(msg1,
"item.m"));
1679 key_field_path1.push_back(GetFieldDescriptor(msg1,
"item.m.a"));
1680 std::vector<const FieldDescriptor*> key_field_path2;
1681 key_field_path2.push_back(GetFieldDescriptor(msg1,
"item.m"));
1682 key_field_path2.push_back(GetFieldDescriptor(msg1,
"item.m.rc"));
1683 key_field_paths.push_back(key_field_path1);
1684 key_field_paths.push_back(key_field_path2);
1685 differencer.TreatAsMapWithMultipleFieldPathsAsKey(
1686 GetFieldDescriptor(msg1,
"item"), key_field_paths);
1692 item = msg1.add_item();
1693 item->mutable_m()->set_a(4);
1694 item->mutable_m()->add_rc(5);
1695 item->mutable_m()->add_rc(6);
1696 item->set_b(
"hello");
1697 item = msg2.add_item();
1698 item->mutable_m()->set_a(4);
1699 item->mutable_m()->add_rc(6);
1700 item->mutable_m()->add_rc(5);
1701 item->set_b(
"world");
1703 differencer.ReportDifferencesToString(&
output);
1706 "modified: item[0].b: \"hello\" -> \"world\"\n"
1707 "moved: item[0].m.rc[0] -> item[0].m.rc[1] : 5\n"
1708 "moved: item[0].m.rc[1] -> item[0].m.rc[0] : 6\n",
1712 TEST(MessageDifferencerTest, RepeatedFieldMapTest_IgnoredKeyFields) {
1713 protobuf_unittest::TestDiffMessage msg1;
1714 protobuf_unittest::TestDiffMessage msg2;
1719 item->set_b(
"hello");
1720 item = msg2.add_item();
1723 item->set_b(
"world");
1725 util::MessageDifferencer differencer;
1726 std::vector<const FieldDescriptor*> key_fields;
1727 key_fields.push_back(GetFieldDescriptor(msg1,
"item.a"));
1728 key_fields.push_back(GetFieldDescriptor(msg1,
"item.ra"));
1729 differencer.TreatAsMapWithMultipleFieldsAsKey(
1730 GetFieldDescriptor(msg1,
"item"), key_fields);
1732 differencer.ReportDifferencesToString(&
output);
1735 "added: item[0]: { a: 1 ra: 3 b: \"world\" }\n"
1736 "deleted: item[0]: { a: 1 ra: 2 b: \"hello\" }\n",
1740 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1744 "added: item[0]: { a: 1 ra: 3 b: \"world\" }\n"
1745 "deleted: item[0]: { a: 1 ra: 2 b: \"hello\" }\n",
1750 util::MessageDifferencer differencer2;
1751 differencer2.TreatAsMap(GetFieldDescriptor(msg1,
"item"),
1752 GetFieldDescriptor(msg1,
"item.a"));
1753 differencer2.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1755 differencer2.ReportDifferencesToString(&
output);
1758 "ignored: item[0].ra\n"
1759 "modified: item[0].b: \"hello\" -> \"world\"\n",
1763 static const char*
const kIgnoredFields[] = {
"rm.b",
"rm.m.b"};
1765 class TestIgnorer :
public util::MessageDifferencer::IgnoreCriteria {
1767 virtual bool IsIgnored(
1768 const Message& message1,
const Message& message2,
1770 const std::vector<util::MessageDifferencer::SpecificField>&
1773 for (
int i = 0;
i < parent_fields.size(); ++
i) {
1774 name += parent_fields[
i].field->name() +
".";
1778 if (
name.compare(kIgnoredFields[
i]) == 0) {
1786 TEST(MessageDifferencerTest, TreatRepeatedFieldAsSetWithIgnoredFields) {
1787 protobuf_unittest::TestDiffMessage msg1;
1788 protobuf_unittest::TestDiffMessage msg2;
1791 util::MessageDifferencer differ;
1792 differ.TreatAsSet(GetFieldDescriptor(msg1,
"rm"));
1793 differ.AddIgnoreCriteria(
new TestIgnorer);
1797 TEST(MessageDifferencerTest, TreatRepeatedFieldAsMapWithIgnoredKeyFields) {
1798 protobuf_unittest::TestDiffMessage msg1;
1799 protobuf_unittest::TestDiffMessage msg2;
1802 util::MessageDifferencer differ;
1803 differ.TreatAsMap(GetFieldDescriptor(msg1,
"rm"),
1804 GetFieldDescriptor(msg1,
"rm.m"));
1805 differ.AddIgnoreCriteria(
new TestIgnorer);
1810 class ValueProductMapKeyComparator
1811 :
public util::MessageDifferencer::MapKeyComparator {
1813 typedef util::MessageDifferencer::SpecificField SpecificField;
1814 virtual bool IsMatch(
const Message& message1,
const Message& message2,
1815 const std::vector<SpecificField>& parent_fields)
const {
1816 const Reflection* reflection1 = message1.GetReflection();
1817 const Reflection* reflection2 = message2.GetReflection();
1820 message1.GetDescriptor()->FindFieldByName(
"ra");
1822 int result1 = 1, result2 = 1;
1823 for (
int i = 0;
i < reflection1->FieldSize(message1, ra_field); ++
i) {
1824 result1 *= reflection1->GetRepeatedInt32(message1, ra_field,
i);
1826 for (
int i = 0;
i < reflection2->FieldSize(message2, ra_field); ++
i) {
1827 result2 *= reflection2->GetRepeatedInt32(message2, ra_field,
i);
1829 return result1 == result2;
1833 TEST(MessageDifferencerTest, RepeatedFieldMapTest_CustomMapKeyComparator) {
1834 protobuf_unittest::TestDiffMessage msg1;
1835 protobuf_unittest::TestDiffMessage msg2;
1841 item->set_b(
"hello");
1842 item = msg2.add_item();
1845 item->set_b(
"hello");
1846 util::MessageDifferencer differencer;
1847 ValueProductMapKeyComparator key_comparator;
1848 differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1,
"item"),
1851 differencer.ReportDifferencesToString(&
output);
1860 "modified: item[0].ra[0]: 6 -> 10\n"
1861 "modified: item[0].ra[1]: 35 -> 21\n",
1863 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.ra"));
1871 class OffsetByOneMapKeyComparator
1872 :
public util::MessageDifferencer::MapKeyComparator {
1874 typedef util::MessageDifferencer::SpecificField SpecificField;
1875 virtual bool IsMatch(
const Message& message1,
const Message& message2,
1876 const std::vector<SpecificField>& parent_fields)
const {
1877 return parent_fields.back().index + 1 == parent_fields.back().new_index;
1881 TEST(MessageDifferencerTest, RepeatedFieldMapTest_CustomIndexMapKeyComparator) {
1882 protobuf_unittest::TestDiffMessage msg1;
1883 protobuf_unittest::TestDiffMessage msg2;
1888 item = msg2.add_item();
1889 item->set_b(
"zero");
1890 item = msg2.add_item();
1892 util::MessageDifferencer differencer;
1893 OffsetByOneMapKeyComparator key_comparator;
1894 differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1,
"item"),
1897 differencer.ReportDifferencesToString(&
output);
1902 "moved: item[0] -> item[1] : { b: \"one\" }\n"
1903 "added: item[0]: { b: \"zero\" }\n",
1907 TEST(MessageDifferencerTest, RepeatedFieldSetTest_Subset) {
1908 protobuf_unittest::TestDiffMessage msg1;
1909 protobuf_unittest::TestDiffMessage msg2;
1919 util::MessageDifferencer differencer;
1937 TEST(MessageDifferencerTest, IgnoreField_Single) {
1938 protobuf_unittest::TestField msg1;
1939 protobuf_unittest::TestField msg2;
1947 util::MessageDifferencer differencer;
1948 differencer.IgnoreField(GetFieldDescriptor(msg1,
"c"));
1950 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
1953 TEST(MessageDifferencerTest, IgnoreField_Repeated) {
1954 protobuf_unittest::TestField msg1;
1955 protobuf_unittest::TestField msg2;
1965 util::MessageDifferencer differencer;
1966 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rc"));
1968 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
1971 TEST(MessageDifferencerTest, IgnoreField_Message) {
1972 protobuf_unittest::TestDiffMessage msg1;
1973 protobuf_unittest::TestDiffMessage msg2;
1975 protobuf_unittest::TestField*
field;
1977 field = msg1.add_rm();
1980 field = msg2.add_rm();
1983 util::MessageDifferencer differencer;
1984 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rm"));
1986 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
1989 TEST(MessageDifferencerTest, IgnoreField_Group) {
1990 protobuf_unittest::TestDiffMessage msg1;
1991 protobuf_unittest::TestDiffMessage msg2;
1995 item = msg1.add_item();
1998 item = msg2.add_item();
2001 util::MessageDifferencer differencer;
2002 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item"));
2004 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2007 TEST(MessageDifferencerTest, IgnoreField_Missing) {
2008 protobuf_unittest::TestField msg1;
2009 protobuf_unittest::TestField msg2;
2016 util::MessageDifferencer differencer;
2017 differencer.IgnoreField(GetFieldDescriptor(msg1,
"c"));
2019 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2020 ExpectEqualsWithDifferencer(&differencer, msg2, msg1);
2023 TEST(MessageDifferencerTest, IgnoreField_Multiple) {
2024 protobuf_unittest::TestField msg1;
2025 protobuf_unittest::TestField msg2;
2039 util::MessageDifferencer differencer;
2040 differencer.IgnoreField(c);
2045 util::MessageDifferencer differencer;
2046 differencer.IgnoreField(rc);
2051 util::MessageDifferencer differencer;
2052 differencer.IgnoreField(c);
2053 differencer.IgnoreField(rc);
2055 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2059 TEST(MessageDifferencerTest, IgnoreField_NestedMessage) {
2060 protobuf_unittest::TestDiffMessage msg1;
2061 protobuf_unittest::TestDiffMessage msg2;
2063 protobuf_unittest::TestField*
field;
2065 field = msg1.add_rm();
2069 field = msg2.add_rm();
2073 util::MessageDifferencer differencer;
2074 differencer.IgnoreField(GetFieldDescriptor(msg1,
"rm.c"));
2076 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2079 TEST(MessageDifferencerTest, IgnoreField_NestedGroup) {
2080 protobuf_unittest::TestDiffMessage msg1;
2081 protobuf_unittest::TestDiffMessage msg2;
2085 item = msg1.add_item();
2089 item = msg2.add_item();
2093 util::MessageDifferencer differencer;
2094 differencer.IgnoreField(GetFieldDescriptor(msg1,
"item.a"));
2096 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2099 TEST(MessageDifferencerTest, IgnoreField_InsideSet) {
2100 protobuf_unittest::TestDiffMessage msg1;
2101 protobuf_unittest::TestDiffMessage msg2;
2105 item = msg1.add_item();
2110 item = msg1.add_item();
2115 item = msg2.add_item();
2120 item = msg2.add_item();
2128 util::MessageDifferencer differencer;
2129 differencer.IgnoreField(
b);
2130 differencer.TreatAsSet(item_desc);
2132 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2135 TEST(MessageDifferencerTest, IgnoreField_InsideMap) {
2136 protobuf_unittest::TestDiffMessage msg1;
2137 protobuf_unittest::TestDiffMessage msg2;
2141 item = msg1.add_item();
2146 item = msg1.add_item();
2151 item = msg2.add_item();
2156 item = msg2.add_item();
2165 util::MessageDifferencer differencer;
2166 differencer.IgnoreField(
b);
2167 differencer.TreatAsMap(item_desc,
a);
2169 ExpectEqualsWithDifferencer(&differencer, msg1, msg2);
2172 TEST(MessageDifferencerTest, IgnoreField_DoesNotIgnoreKey) {
2173 protobuf_unittest::TestDiffMessage msg1;
2174 protobuf_unittest::TestDiffMessage msg2;
2178 item = msg1.add_item();
2183 item = msg2.add_item();
2191 util::MessageDifferencer differencer;
2192 differencer.IgnoreField(
a);
2193 differencer.TreatAsMap(item_desc,
a);
2198 TEST(MessageDifferencerTest, IgnoreField_TrumpsCompareWithFields) {
2199 protobuf_unittest::TestField msg1;
2200 protobuf_unittest::TestField msg2;
2213 std::vector<const FieldDescriptor*>
fields;
2217 util::MessageDifferencer differencer;
2218 differencer.IgnoreField(rc);
2227 TEST(MessageDifferencerTest, IgnoreField_SetReportIgnoresFalse) {
2228 protobuf_unittest::TestField msg1;
2229 protobuf_unittest::TestField msg2;
2245 std::vector<const FieldDescriptor*>
fields;
2252 util::MessageDifferencer differencer;
2253 differencer.set_report_ignores(
false);
2254 differencer.set_report_matches(
true);
2255 differencer.ReportDifferencesToString(&diff_report);
2256 differencer.IgnoreField(c);
2257 differencer.IgnoreField(rc);
2263 "modified: b: 2 -> 1\n");
2269 class ParentSavingFieldComparator :
public util::FieldComparator {
2271 ParentSavingFieldComparator() {}
2273 virtual ComparisonResult Compare(
const Message& message_1,
2274 const Message& message_2,
2277 const util::FieldContext* field_context) {
2278 if (field_context)
parent_fields_ = *(field_context->parent_fields());
2286 std::vector<util::MessageDifferencer::SpecificField> parent_fields() {
2296 TEST(MessageDifferencerTest, FieldContextParentFieldsTest) {
2297 protobuf_unittest::TestDiffMessage msg1;
2298 msg1.add_rm()->set_c(1);
2299 protobuf_unittest::TestDiffMessage msg2;
2300 msg2.add_rm()->set_c(1);
2302 ParentSavingFieldComparator field_comparator;
2303 util::MessageDifferencer differencer;
2304 differencer.set_field_comparator(&field_comparator);
2305 differencer.Compare(msg1, msg2);
2308 ASSERT_EQ(1, field_comparator.parent_fields().size());
2309 EXPECT_EQ(
"rm", field_comparator.parent_fields()[0].field->name());
2330 ~ComparisonTest() {}
2332 void SetSpecialFieldOption(
const Message&
message,
2333 util::MessageDifferencer* d) {
2356 util::MessageDifferencer differencer;
2357 differencer.ReportDifferencesToString(&
output);
2360 differencer.set_message_field_comparison(
2364 SetSpecialFieldOption(msg1, &differencer);
2426 TEST_F(ComparisonTest, AdditionTest) {
2427 proto1_.clear_optional_int32();
2432 TEST_F(ComparisonTest, Addition_OrderTest) {
2435 EXPECT_EQ(
"added: my_int: 1\n", RunOrder());
2438 TEST_F(ComparisonTest, DeletionTest) {
2439 proto2_.clear_optional_int32();
2444 TEST_F(ComparisonTest, Deletion_OrderTest) {
2447 EXPECT_EQ(
"deleted: my_string: \"foo\"\n", RunOrder());
2450 TEST_F(ComparisonTest, RepeatedDeletionTest) {
2451 proto2_.clear_repeated_int32();
2454 "deleted: repeated_int32[0]: 201\n"
2455 "deleted: repeated_int32[1]: 301\n",
2459 TEST_F(ComparisonTest, ModificationTest) {
2460 proto1_.set_optional_int32(-1);
2462 EXPECT_EQ(
"modified: optional_int32: -1 -> 101\n",
Run());
2466 TEST_F(ComparisonTest, EquivalencyAdditionTest) {
2469 proto1_.clear_optional_int32();
2471 EXPECT_EQ(
"modified: optional_int32: 0 -> 101\n",
Run());
2474 TEST_F(ComparisonTest, EquivalencyDeletionTest) {
2477 proto2_.clear_optional_int32();
2479 EXPECT_EQ(
"modified: optional_int32: 101 -> 0\n",
Run());
2483 TEST_F(ComparisonTest, GroupAdditionTest) {
2484 proto1_.mutable_optionalgroup()->clear_a();
2489 TEST_F(ComparisonTest, GroupDeletionTest) {
2490 proto2_.mutable_optionalgroup()->clear_a();
2495 TEST_F(ComparisonTest, GroupModificationTest) {
2496 proto1_.mutable_optionalgroup()->set_a(2);
2498 EXPECT_EQ(
"modified: optionalgroup.a: 2 -> 117\n",
Run());
2501 TEST_F(ComparisonTest, GroupFullAdditionTest) {
2502 proto1_.clear_optionalgroup();
2505 EXPECT_EQ(
"added: optionalgroup: { a: 117 }\n",
Run());
2508 TEST_F(ComparisonTest, GroupFullDeletionTest) {
2509 proto2_.clear_optionalgroup();
2511 EXPECT_EQ(
"deleted: optionalgroup: { a: 117 }\n",
Run());
2514 TEST_F(ComparisonTest, RepeatedSetOptionTest) {
2515 repeated_field_as_set();
2517 proto2_.clear_repeatedgroup();
2518 proto1_.clear_repeatedgroup();
2519 proto1_.add_repeatedgroup()->set_a(317);
2520 proto2_.add_repeatedgroup()->set_a(909);
2521 proto2_.add_repeatedgroup()->set_a(907);
2522 proto1_.add_repeatedgroup()->set_a(904);
2523 proto1_.add_repeatedgroup()->set_a(907);
2524 proto1_.add_repeatedgroup()->set_a(909);
2527 "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
2528 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2529 "deleted: repeatedgroup[0]: { a: 317 }\n"
2530 "deleted: repeatedgroup[1]: { a: 904 }\n",
2534 TEST_F(ComparisonTest, RepeatedSetOptionTest_Ex) {
2535 repeated_field_as_set();
2537 proto1ex_.ClearExtension(protobuf_unittest::repeated_nested_message_extension);
2538 proto2ex_.ClearExtension(protobuf_unittest::repeated_nested_message_extension);
2539 proto2ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2541 proto2ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2543 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2545 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2547 proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
2551 "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
2552 " (protobuf_unittest.repeated_nested_message_extension)[0] :"
2554 "deleted: (protobuf_unittest.repeated_nested_message_extension)[0]:"
2559 TEST_F(ComparisonTest, RepeatedMapFieldTest_Group) {
2560 field_as_map(
"repeatedgroup",
"a");
2561 proto1_.clear_repeatedgroup();
2562 proto2_.clear_repeatedgroup();
2564 proto1_.add_repeatedgroup()->set_a(317);
2565 proto1_.add_repeatedgroup()->set_a(904);
2566 proto1_.add_repeatedgroup()->set_a(907);
2567 proto1_.add_repeatedgroup()->set_a(909);
2569 proto2_.add_repeatedgroup()->set_a(909);
2570 proto2_.add_repeatedgroup()->set_a(318);
2571 proto2_.add_repeatedgroup()->set_a(907);
2574 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2575 "added: repeatedgroup[1]: { a: 318 }\n"
2576 "deleted: repeatedgroup[0]: { a: 317 }\n"
2577 "deleted: repeatedgroup[1]: { a: 904 }\n",
2581 TEST_F(ComparisonTest, RepeatedMapFieldTest_MessageKey) {
2583 field_as_map(
"item",
"m");
2585 protobuf_unittest::TestDiffMessage msg1;
2586 protobuf_unittest::TestDiffMessage msg2;
2591 item->mutable_m()->set_c(0);
2592 item->set_b(
"first");
2593 item = msg1.add_item();
2594 item->mutable_m()->set_c(2);
2595 item->set_b(
"second");
2596 item = msg1.add_item();
2597 item->set_b(
"null");
2598 item = msg1.add_item();
2599 item->mutable_m()->set_c(3);
2600 item->set_b(
"third");
2601 item = msg1.add_item();
2602 item->mutable_m()->set_c(2);
2603 item->set_b(
"second");
2604 item = msg2.add_item();
2605 item->mutable_m()->set_c(2);
2606 item->set_b(
"second");
2607 item = msg2.add_item();
2608 item->mutable_m()->set_c(4);
2609 item->set_b(
"fourth");
2610 item = msg2.add_item();
2611 item->mutable_m()->set_c(0);
2612 item->set_b(
"fist");
2613 item = msg2.add_item();
2614 item->set_b(
"null");
2617 "modified: item[0].b -> item[2].b: \"first\" -> \"fist\"\n"
2618 "moved: item[1] -> item[0] : { b: \"second\" m { c: 2 } }\n"
2619 "moved: item[2] -> item[3] : { b: \"null\" }\n"
2620 "added: item[1]: { b: \"fourth\" m { c: 4 } }\n"
2621 "deleted: item[3]: { b: \"third\" m { c: 3 } }\n"
2622 "deleted: item[4]: { b: \"second\" m { c: 2 } }\n",
2626 TEST_F(ComparisonTest, RepeatedFieldSetTest_SetOfSet) {
2627 repeated_field_as_set();
2629 protobuf_unittest::TestDiffMessage msg1;
2630 protobuf_unittest::TestDiffMessage msg2;
2636 item = msg1.add_item();
2639 item = msg1.add_item();
2642 item = msg1.add_item();
2647 item = msg2.add_item();
2650 item = msg2.add_item();
2653 item = msg2.add_item();
2656 item = msg2.add_item();
2663 "moved: item[0].ra[0] -> item[3].ra[2] : 1\n"
2664 "moved: item[0].ra[2] -> item[3].ra[0] : 3\n"
2665 "moved: item[0] -> item[3] : { ra: 1 ra: 2 ra: 3 }\n"
2666 "moved: item[1].ra[0] -> item[0].ra[1] : 5\n"
2667 "moved: item[1].ra[1] -> item[0].ra[0] : 6\n"
2668 "moved: item[1] -> item[0] : { ra: 5 ra: 6 }\n"
2669 "added: item[1]: { ra: 6 ra: 8 }\n"
2670 "deleted: item[3]: { ra: 6 ra: 7 ra: 8 }\n",
2674 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedKey) {
2676 repeated_field_as_set();
2677 field_as_map(
"item",
"rb");
2679 protobuf_unittest::TestDiffMessage msg1;
2680 protobuf_unittest::TestDiffMessage msg2;
2684 item->set_b(
"first");
2686 item = msg2.add_item();
2688 item->set_b(
"second");
2690 item = msg2.add_item();
2693 item->set_b(
"fist");
2696 "modified: item[0].b -> item[1].b: \"first\" -> \"fist\"\n"
2697 "moved: item[0].rb[0] -> item[1].rb[1] : \"a\"\n"
2698 "moved: item[0].rb[1] -> item[1].rb[0] : \"b\"\n"
2699 "added: item[0]: { b: \"second\" rb: \"c\" }\n",
2703 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedMessageKey) {
2704 field_as_map(
"item",
"rm");
2706 protobuf_unittest::TestDiffMessage msg1;
2707 protobuf_unittest::TestDiffMessage msg2;
2709 protobuf_unittest::TestField*
key =
item->add_rm();
2713 item = msg1.add_item();
2720 item->add_rb(
"first");
2722 item = msg2.add_item();
2723 item->CopyFrom(msg1.item(1));
2724 item->add_rb(
"second");
2727 "added: item[0].rb[1]: \"second\"\n"
2728 "deleted: item[0]: { rm { c: 2 rc: 10 rc: 10 } }\n",
2732 TEST_F(ComparisonTest, RepeatedSetOptionTest_Unknown) {
2735 repeated_field_as_set();
2742 "modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
2743 "added: 245[1]: { ... }\n",
2747 TEST_F(ComparisonTest, Matching_Unknown) {
2757 "added: 242[0]: \"cat\"\n"
2758 "added: 246[0]: { ... }\n",
2762 TEST_F(ComparisonTest, RepeatedSetFieldTest) {
2763 field_as_set(
"repeatedgroup");
2765 proto1_.clear_repeatedgroup();
2766 proto2_.clear_repeatedgroup();
2767 proto2_.add_repeatedgroup()->set_a(909);
2768 proto2_.add_repeatedgroup()->set_a(907);
2769 proto1_.add_repeatedgroup()->set_a(317);
2770 proto1_.add_repeatedgroup()->set_a(904);
2771 proto1_.add_repeatedgroup()->set_a(907);
2772 proto1_.add_repeatedgroup()->set_a(909);
2775 "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
2776 "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
2777 "deleted: repeatedgroup[0]: { a: 317 }\n"
2778 "deleted: repeatedgroup[1]: { a: 904 }\n",
2783 TEST_F(ComparisonTest, EmbeddedAdditionTest) {
2784 proto1_.mutable_optional_nested_message()->clear_bb();
2786 EXPECT_EQ(
"added: optional_nested_message.bb: 118\n",
Run());
2789 TEST_F(ComparisonTest, EmbeddedDeletionTest) {
2790 proto2_.mutable_optional_nested_message()->clear_bb();
2792 EXPECT_EQ(
"deleted: optional_nested_message.bb: 118\n",
Run());
2795 TEST_F(ComparisonTest, EmbeddedModificationTest) {
2796 proto1_.mutable_optional_nested_message()->set_bb(2);
2798 EXPECT_EQ(
"modified: optional_nested_message.bb: 2 -> 118\n",
Run());
2801 TEST_F(ComparisonTest, EmbeddedFullAdditionTest) {
2802 proto1_.clear_optional_nested_message();
2804 EXPECT_EQ(
"added: optional_nested_message: { bb: 118 }\n",
Run());
2807 TEST_F(ComparisonTest, EmbeddedPartialAdditionTest) {
2808 proto1_.clear_optional_nested_message();
2809 proto2_.mutable_optional_nested_message()->clear_bb();
2811 EXPECT_EQ(
"added: optional_nested_message: { }\n",
Run());
2814 TEST_F(ComparisonTest, EmbeddedFullDeletionTest) {
2815 proto2_.clear_optional_nested_message();
2817 EXPECT_EQ(
"deleted: optional_nested_message: { bb: 118 }\n",
Run());
2821 TEST_F(ComparisonTest, BasicRepeatedTest) {
2822 proto1_.clear_repeated_int32();
2823 proto2_.clear_repeated_int32();
2825 proto1_.add_repeated_int32(500);
2826 proto1_.add_repeated_int32(501);
2827 proto1_.add_repeated_int32(502);
2828 proto1_.add_repeated_int32(503);
2829 proto1_.add_repeated_int32(500);
2831 proto2_.add_repeated_int32(500);
2832 proto2_.add_repeated_int32(509);
2833 proto2_.add_repeated_int32(502);
2834 proto2_.add_repeated_int32(504);
2837 "modified: repeated_int32[1]: 501 -> 509\n"
2838 "modified: repeated_int32[3]: 503 -> 504\n"
2839 "deleted: repeated_int32[4]: 500\n",
2843 TEST_F(ComparisonTest, BasicRepeatedTest_SetOption) {
2844 repeated_field_as_set();
2845 proto1_.clear_repeated_int32();
2846 proto2_.clear_repeated_int32();
2848 proto1_.add_repeated_int32(501);
2849 proto1_.add_repeated_int32(502);
2850 proto1_.add_repeated_int32(503);
2851 proto1_.add_repeated_int32(500);
2852 proto1_.add_repeated_int32(500);
2854 proto2_.add_repeated_int32(500);
2855 proto2_.add_repeated_int32(509);
2856 proto2_.add_repeated_int32(503);
2857 proto2_.add_repeated_int32(502);
2858 proto2_.add_repeated_int32(504);
2861 "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
2862 "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
2863 "added: repeated_int32[1]: 509\n"
2864 "added: repeated_int32[4]: 504\n"
2865 "deleted: repeated_int32[0]: 501\n"
2866 "deleted: repeated_int32[4]: 500\n",
2870 TEST_F(ComparisonTest, BasicRepeatedTest_SetField) {
2871 field_as_set(
"repeated_int32");
2872 proto1_.clear_repeated_int32();
2873 proto2_.clear_repeated_int32();
2875 proto1_.add_repeated_int32(501);
2876 proto1_.add_repeated_int32(502);
2877 proto1_.add_repeated_int32(503);
2878 proto1_.add_repeated_int32(500);
2879 proto1_.add_repeated_int32(500);
2881 proto2_.add_repeated_int32(500);
2882 proto2_.add_repeated_int32(509);
2883 proto2_.add_repeated_int32(503);
2884 proto2_.add_repeated_int32(502);
2885 proto2_.add_repeated_int32(504);
2888 "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
2889 "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
2890 "added: repeated_int32[1]: 509\n"
2891 "added: repeated_int32[4]: 504\n"
2892 "deleted: repeated_int32[0]: 501\n"
2893 "deleted: repeated_int32[4]: 500\n",
2898 TEST_F(ComparisonTest, AddDeleteTest) {
2899 proto1_.clear_optional_int32();
2900 proto2_.clear_optional_int64();
2903 "added: optional_int32: 101\n"
2904 "deleted: optional_int64: 102\n",
2908 TEST_F(ComparisonTest, AddDelete_FieldOrderingTest) {
2913 "deleted: my_int: 1\n"
2914 "added: (protobuf_unittest.my_extension_string): \"bar\"\n",
2918 TEST_F(ComparisonTest, AllThreeTest) {
2919 proto1_.clear_optional_int32();
2920 proto2_.clear_optional_float();
2921 proto2_.set_optional_string(
"hello world!");
2924 "added: optional_int32: 101\n"
2925 "deleted: optional_float: 111\n"
2926 "modified: optional_string: \"115\" -> \"hello world!\"\n",
2930 TEST_F(ComparisonTest, SandwhichTest) {
2931 proto1_.clear_optional_int64();
2932 proto1_.clear_optional_uint32();
2934 proto2_.clear_optional_uint64();
2937 "added: optional_int64: 102\n"
2938 "added: optional_uint32: 103\n"
2939 "deleted: optional_uint64: 104\n",
2943 TEST_F(ComparisonTest, IgnoredNoChangeTest) {
2952 "added: w: \"foo\"\n",
2956 TEST_F(ComparisonTest, IgnoredAddTest) {
2964 "added: w: \"foo\"\n",
2968 TEST_F(ComparisonTest, IgnoredDeleteTest) {
2976 "added: w: \"foo\"\n",
2980 TEST_F(ComparisonTest, IgnoredModifyTest) {
2989 "added: w: \"foo\"\n",
2993 TEST_F(ComparisonTest, IgnoredRepeatedAddTest) {
3007 "added: w: \"foo\"\n",
3011 TEST_F(ComparisonTest, IgnoredRepeatedDeleteTest) {
3025 "added: w: \"foo\"\n",
3029 TEST_F(ComparisonTest, IgnoredRepeatedModifyTest) {
3042 "added: w: \"foo\"\n",
3046 TEST_F(ComparisonTest, IgnoredWholeNestedMessage) {
3055 "added: w: \"foo\"\n"
3060 TEST_F(ComparisonTest, IgnoredNestedField) {
3066 ignore_field(
"m.c");
3069 "added: w: \"foo\"\n"
3074 TEST_F(ComparisonTest, IgnoredRepeatedNested) {
3082 ignore_field(
"rm.c");
3085 "ignored: rm[0].c\n"
3086 "ignored: rm[1].c\n"
3087 "added: w: \"foo\"\n",
3091 TEST_F(ComparisonTest, IgnoredNestedRepeated) {
3098 ignore_field(
"m.rc");
3101 "added: w: \"foo\"\n"
3106 TEST_F(ComparisonTest, ExtensionTest) {
3107 proto1ex_.SetExtension(unittest::optional_int32_extension, 401);
3108 proto2ex_.SetExtension(unittest::optional_int32_extension, 402);
3110 proto1ex_.ClearExtension(unittest::optional_int64_extension);
3111 proto2ex_.SetExtension(unittest::optional_int64_extension, 403);
3114 "modified: (protobuf_unittest.optional_int32_extension): 401 -> 402\n"
3115 "added: (protobuf_unittest.optional_int64_extension): 403\n",
3119 TEST_F(ComparisonTest, MatchedUnknownFieldTagTest) {
3128 "modified: 240[0]: 122 -> 121\n"
3129 "deleted: 241[0]: 0x00000001\n"
3130 "added: 241[0]: 0x0000000000000002\n"
3131 "modified: 242[0]: \"cat\" -> \"dog\"\n",
3135 TEST_F(ComparisonTest, UnmatchedUnknownFieldTagTest) {
3141 "deleted: 243[0]: 0x00000001\n"
3142 "added: 244[0]: 2\n"
3143 "added: 244[1]: 4\n",
3147 TEST_F(ComparisonTest, DifferentSizedUnknownFieldTest) {
3157 "modified: 240[0]: 1 -> 2\n"
3158 "modified: 240[2]: 4 -> 2\n"
3159 "added: 240[3]: 5\n",
3163 TEST_F(ComparisonTest, UnknownFieldsAll) {
3177 "modified: 243[0]: 122 -> 121\n"
3178 "deleted: 244[0]: 0x0000000000172356\n"
3179 "deleted: 244[1]: 0x0000000000000098\n"
3180 "modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
3181 "deleted: 245[0].248[1]: 0x00000002\n"
3182 "added: 247[0]: { ... }\n"
3183 "deleted: 249[0]: { ... }\n"
3184 "added: 73882[0]: \"test 123\"\n",
3188 TEST_F(ComparisonTest, EquivalentIgnoresUnknown) {
3189 unittest::ForeignMessage message1, message2;
3192 message1.mutable_unknown_fields()->AddVarint(123, 456);
3194 message2.mutable_unknown_fields()->AddVarint(321, 654);
3200 TEST_F(ComparisonTest, MapTest) {
3210 EXPECT_EQ(
"modified: map_string_string.value: \"3\" -> \"0\"\n",
3214 TEST_F(ComparisonTest, MapIgnoreKeyTest) {
3224 util::MessageDifferencer differencer;
3225 differencer.IgnoreField(
3226 GetFieldDescriptor(
map_proto1_,
"map_string_string.key"));
3230 TEST_F(ComparisonTest, MapRoundTripSyncTest) {
3231 TextFormat::Parser
parser;
3232 unittest::TestMap map_reflection1;
3239 unittest::TestMap map_reflection2 = map_reflection1;
3246 TEST_F(ComparisonTest, MapEntryPartialTest) {
3247 TextFormat::Parser
parser;
3248 unittest::TestMap map1;
3249 unittest::TestMap map2;
3252 util::MessageDifferencer differencer;
3254 differencer.ReportDifferencesToString(&
output);
3257 "map_int32_foreign_message { key: 1 value { c: 1 } }", &map1));
3259 "map_int32_foreign_message { key: 1 value { c: 2 }}", &map2));
3261 EXPECT_EQ(
"modified: map_int32_foreign_message.value.c: 1 -> 2\n",
output);
3264 parser.ParseFromString(
"map_int32_foreign_message { key: 1 }", &map1));
3268 TEST_F(ComparisonTest, MapEntryPartialEmptyKeyTest) {
3269 TextFormat::Parser
parser;
3270 unittest::TestMap map1;
3271 unittest::TestMap map2;
3274 parser.ParseFromString(
"map_int32_foreign_message { key: 1 }", &map2));
3276 util::MessageDifferencer differencer;
3281 TEST_F(ComparisonTest, MapEntryMissingEmptyFieldIsOkTest) {
3282 TextFormat::Parser
parser;
3283 protobuf_unittest::TestMap msg1;
3284 protobuf_unittest::TestMap msg2;
3287 "map_string_foreign_message { key: 'key1' value {}}", &msg1));
3289 "map_string_foreign_message { key: 'key1' }", &msg2));
3291 util::MessageDifferencer differencer;
3298 class LengthMapKeyComparator
3299 :
public util::MessageDifferencer::MapKeyComparator {
3301 typedef util::MessageDifferencer::SpecificField SpecificField;
3302 virtual bool IsMatch(
const Message& message1,
const Message& message2,
3303 const std::vector<SpecificField>& parent_fields)
const {
3304 const Reflection* reflection1 = message1.GetReflection();
3305 const Reflection* reflection2 = message2.GetReflection();
3307 message1.GetDescriptor()->FindFieldByName(
"key");
3308 return reflection1->GetString(message1, key_field).size() ==
3309 reflection2->GetString(message2, key_field).size();
3313 TEST_F(ComparisonTest, MapEntryCustomMapKeyComparator) {
3314 TextFormat::Parser
parser;
3315 protobuf_unittest::TestMap msg1;
3316 protobuf_unittest::TestMap msg2;
3319 "map_string_foreign_message { key: 'key1' value { c: 1 }}", &msg1));
3321 "map_string_foreign_message { key: 'key2' value { c: 1 }}", &msg2));
3323 util::MessageDifferencer differencer;
3324 LengthMapKeyComparator key_comparator;
3325 differencer.TreatAsMapUsingKeyComparator(
3326 GetFieldDescriptor(msg1,
"map_string_foreign_message"), &key_comparator);
3328 differencer.ReportDifferencesToString(&
output);
3334 EXPECT_EQ(
"modified: map_string_foreign_message.key: \"key1\" -> \"key2\"\n",
3336 differencer.IgnoreField(
3337 GetFieldDescriptor(msg1,
"map_string_foreign_message.key"));
3345 typedef util::MessageDifferencer MessageDifferencer;
3352 std::string RunWithResult(MessageDifferencer* differencer,
3353 const Message& msg1,
const Message& msg2,
3360 io::StringOutputStream output_stream(&
output);
3361 MessageDifferencer::StreamReporter reporter(&output_stream);
3362 reporter.set_report_modified_aggregates(
true);
3363 differencer->set_report_matches(
true);
3364 differencer->ReportDifferencesTo(&reporter);
3378 TEST_F(MatchingTest, StreamReporterMatching) {
3379 protobuf_unittest::TestField msg1, msg2;
3387 MessageDifferencer differencer;
3388 differencer.set_report_matches(
true);
3389 differencer.ReportDifferencesToString(&
output);
3393 "matched: rc[0] : 13\n"
3394 "matched: rc[1] : 17\n",
3398 TEST_F(MatchingTest, DontReportMatchedWhenIgnoring) {
3399 protobuf_unittest::TestField msg1, msg2;
3407 MessageDifferencer differencer;
3408 differencer.set_report_matches(
true);
3409 differencer.ReportDifferencesToString(&
output);
3411 differencer.IgnoreField(msg1.GetDescriptor()->FindFieldByName(
"c"));
3416 "matched: rc[0] : 13\n"
3417 "matched: rc[1] : 17\n",
3421 TEST_F(MatchingTest, ReportMatchedForMovedFields) {
3422 protobuf_unittest::TestDiffMessage msg1, msg2;
3425 item->set_b(
"hello");
3426 item = msg2.add_item();
3428 item = msg2.add_item();
3430 item->set_b(
"hello");
3431 item = msg1.add_item();
3433 MessageDifferencer differencer;
3435 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3436 differencer.TreatAsSet(
desc);
3439 "matched: item[0].a -> item[1].a : 53\n"
3440 "matched: item[0].b -> item[1].b : \"hello\"\n"
3441 "moved: item[0] -> item[1] : { a: 53 b: \"hello\" }\n"
3442 "matched: item[1].a -> item[0].a : 27\n"
3443 "moved: item[1] -> item[0] : { a: 27 }\n",
3444 RunWithResult(&differencer, msg1, msg2,
true));
3447 TEST_F(MatchingTest, MatchesAppearInPostTraversalOrderForMovedFields) {
3448 protobuf_unittest::TestDiffMessage msg1, msg2;
3450 protobuf_unittest::TestField*
field;
3455 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3456 nested_desc =
desc->message_type()->FindFieldByName(
"rm");
3457 double_nested_desc = nested_desc->message_type()->FindFieldByName(
"rc");
3458 MessageDifferencer differencer;
3459 differencer.TreatAsSet(
desc);
3460 differencer.TreatAsSet(nested_desc);
3461 differencer.TreatAsSet(double_nested_desc);
3463 item = msg1.add_item();
3473 item = msg2.add_item();
3483 item = msg1.add_item();
3489 item = msg2.add_item();
3497 "matched: item[0].rm[0].c -> item[0].rm[1].c : 1\n"
3498 "moved: item[0].rm[0].rc[0] -> item[0].rm[1].rc[1] : 2\n"
3499 "moved: item[0].rm[0].rc[1] -> item[0].rm[1].rc[0] : 3\n"
3500 "moved: item[0].rm[0] -> item[0].rm[1] : { c: 1 rc: 2 rc: 3 }\n"
3501 "matched: item[0].rm[1].c -> item[0].rm[0].c : 4\n"
3502 "moved: item[0].rm[1].rc[0] -> item[0].rm[0].rc[2] : 5\n"
3503 "matched: item[0].rm[1].rc[1] -> item[0].rm[0].rc[1] : 6\n"
3504 "moved: item[0].rm[1].rc[2] -> item[0].rm[0].rc[0] : 7\n"
3505 "moved: item[0].rm[1] -> item[0].rm[0] : { c: 4 rc: 5 rc: 6 rc: 7 }\n"
3506 "matched: item[0] : { rm { c: 1 rc: 2 rc: 3 }"
3507 " rm { c: 4 rc: 5 rc: 6 rc: 7 } }\n"
3508 "matched: item[1].rm[0].c : 8\n"
3509 "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 10\n"
3510 "moved: item[1].rm[0].rc[1] -> item[1].rm[0].rc[2] : 11\n"
3511 "moved: item[1].rm[0].rc[2] -> item[1].rm[0].rc[0] : 9\n"
3512 "matched: item[1].rm[0] : { c: 8 rc: 10 rc: 11 rc: 9 }\n"
3513 "matched: item[1] : { rm { c: 8 rc: 10 rc: 11 rc: 9 } }\n",
3514 RunWithResult(&differencer, msg1, msg2,
true));
3517 TEST_F(MatchingTest, MatchAndModifiedInterleaveProperly) {
3518 protobuf_unittest::TestDiffMessage msg1, msg2;
3520 protobuf_unittest::TestField*
field;
3527 desc = msg1.GetDescriptor()->FindFieldByName(
"item");
3528 nested_key =
desc->message_type()->FindFieldByName(
"a");
3529 nested_desc =
desc->message_type()->FindFieldByName(
"rm");
3530 double_nested_key = nested_desc->message_type()->FindFieldByName(
"c");
3531 double_nested_desc = nested_desc->message_type()->FindFieldByName(
"rc");
3533 MessageDifferencer differencer;
3534 differencer.TreatAsMap(
desc, nested_key);
3535 differencer.TreatAsMap(nested_desc, double_nested_key);
3536 differencer.TreatAsSet(double_nested_desc);
3538 item = msg1.add_item();
3549 item = msg1.add_item();
3558 item = msg2.add_item();
3569 item = msg2.add_item();
3579 "matched: item[0].a : 1\n"
3580 "matched: item[0].rm[1].c -> item[0].rm[0].c : 5\n"
3581 "moved: item[0].rm[1].rc[0] -> item[0].rm[0].rc[2] : 6\n"
3582 "moved: item[0].rm[1].rc[2] -> item[0].rm[0].rc[0] : 8\n"
3583 "added: item[0].rm[0].rc[1]: 8\n"
3584 "deleted: item[0].rm[1].rc[1]: 7\n"
3585 "modified: item[0].rm[1] -> item[0].rm[0]: { c: 5 rc: 6 rc: 7 rc: 8 } ->"
3586 " { c: 5 rc: 8 rc: 8 rc: 6 }\n"
3587 "added: item[0].rm[1]: { c: 3 rc: 2 rc: 4 }\n"
3588 "deleted: item[0].rm[0]: { c: 2 rc: 3 rc: 4 }\n"
3589 "modified: item[0]: { a: 1 rm { c: 2 rc: 3 rc: 4 }"
3590 " rm { c: 5 rc: 6 rc: 7 rc: 8 } } ->"
3591 " { a: 1 rm { c: 5 rc: 8 rc: 8 rc: 6 }"
3592 " rm { c: 3 rc: 2 rc: 4 } }\n"
3593 "matched: item[1].a : 9\n"
3594 "matched: item[1].rm[0].c : 10\n"
3595 "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 11\n"
3596 "moved: item[1].rm[0].rc[1] -> item[1].rm[0].rc[0] : 12\n"
3597 "matched: item[1].rm[0] : { c: 10 rc: 11 rc: 12 }\n"
3598 "matched: item[1].rm[1].c : 13\n"
3599 "matched: item[1].rm[1] : { c: 13 }\n"
3600 "matched: item[1] : { a: 9 rm { c: 10 rc: 11 rc: 12 } rm { c: 13 } }\n",
3601 RunWithResult(&differencer, msg1, msg2,
false));
3604 TEST_F(MatchingTest, MatchingWorksWithExtensions) {
3605 protobuf_unittest::TestAllExtensions msg1, msg2;
3606 protobuf_unittest::TestAllTypes::NestedMessage* nested;
3607 using protobuf_unittest::repeated_nested_message_extension;
3615 nested_key =
desc->message_type()->FindFieldByName(
"bb");
3617 MessageDifferencer differencer;
3618 differencer.TreatAsMap(
desc, nested_key);
3620 nested = msg1.AddExtension(repeated_nested_message_extension);
3622 nested = msg1.AddExtension(repeated_nested_message_extension);
3624 nested = msg1.AddExtension(repeated_nested_message_extension);
3626 nested = msg2.AddExtension(repeated_nested_message_extension);
3628 nested = msg2.AddExtension(repeated_nested_message_extension);
3630 nested = msg2.AddExtension(repeated_nested_message_extension);
3634 "matched: (protobuf_unittest.repeated_nested_message_extension)[0].bb ->"
3635 " (protobuf_unittest.repeated_nested_message_extension)[2].bb : 7\n"
3636 "moved: (protobuf_unittest.repeated_nested_message_extension)[0] ->"
3637 " (protobuf_unittest.repeated_nested_message_extension)[2] :"
3639 "matched: (protobuf_unittest.repeated_nested_message_extension)[1].bb :"
3641 "matched: (protobuf_unittest.repeated_nested_message_extension)[1] :"
3643 "matched: (protobuf_unittest.repeated_nested_message_extension)[2].bb ->"
3644 " (protobuf_unittest.repeated_nested_message_extension)[0].bb :"
3646 "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
3647 " (protobuf_unittest.repeated_nested_message_extension)[0] :"
3649 RunWithResult(&differencer, msg1, msg2,
true));
3652 TEST(AnyTest, Simple) {
3653 protobuf_unittest::TestField value1, value2;
3657 protobuf_unittest::TestAny m1, m2;
3658 m1.mutable_any_value()->PackFrom(value1);
3659 m2.mutable_any_value()->PackFrom(value2);
3660 util::MessageDifferencer message_differencer;
3662 message_differencer.ReportDifferencesToString(&difference_string);
3664 EXPECT_EQ(
"modified: any_value.a: 20 -> 21\n", difference_string);
3667 TEST(Anytest, TreatAsSet) {
3668 protobuf_unittest::TestField value1, value2;
3674 protobuf_unittest::TestAny m1, m2;
3675 m1.add_repeated_any_value()->PackFrom(value1);
3676 m1.add_repeated_any_value()->PackFrom(value2);
3677 m2.add_repeated_any_value()->PackFrom(value2);
3678 m2.add_repeated_any_value()->PackFrom(value1);
3680 util::MessageDifferencer message_differencer;
3681 message_differencer.TreatAsSet(GetFieldDescriptor(m1,
"repeated_any_value"));
3685 TEST(Anytest, TreatAsSet_DifferentType) {
3686 protobuf_unittest::TestField value1;
3689 protobuf_unittest::TestDiffMessage value2;
3692 protobuf_unittest::TestAny m1, m2;
3693 m1.add_repeated_any_value()->PackFrom(value1);
3694 m1.add_repeated_any_value()->PackFrom(value2);
3695 m2.add_repeated_any_value()->PackFrom(value2);
3696 m2.add_repeated_any_value()->PackFrom(value1);
3698 util::MessageDifferencer message_differencer;
3699 message_differencer.TreatAsSet(GetFieldDescriptor(m1,
"repeated_any_value"));