58
58
#include " google/protobuf/unittest.pb.h"
59
59
#include " google/protobuf/util/field_comparator.h"
60
60
#include " google/protobuf/util/message_differencer_unittest.pb.h"
61
+ #include " google/protobuf/util/message_differencer_unittest_proto3.pb.h"
61
62
#include " google/protobuf/wire_format.h"
63
+ #include " google/protobuf/wire_format_lite.h"
62
64
63
65
64
66
namespace google {
@@ -67,6 +69,15 @@ namespace protobuf {
67
69
namespace {
68
70
69
71
72
+ proto3_unittest::TestNoPresenceField MakeTestNoPresenceField () {
73
+ proto3_unittest::TestNoPresenceField msg1, msg2;
74
+ msg1.set_no_presence_bool (true );
75
+ msg2 = msg1;
76
+ *msg1.mutable_no_presence_nested () = msg2;
77
+ *msg1.add_no_presence_repeated_nested () = msg2;
78
+ return msg1;
79
+ }
80
+
70
81
const FieldDescriptor* GetFieldDescriptor (const Message& message,
71
82
const std::string& field_name) {
72
83
std::vector<std::string> field_path =
@@ -201,6 +212,17 @@ TEST(MessageDifferencerTest, BasicPartialEqualityTest) {
201
212
EXPECT_TRUE (differencer.Compare (msg1, msg2));
202
213
}
203
214
215
+ TEST (MessageDifferencerTest, BasicPartialEqualityTestNoPresenceForceCompare) {
216
+ util::MessageDifferencer differencer;
217
+ differencer.set_scope (util::MessageDifferencer::PARTIAL);
218
+ differencer.set_force_compare_no_presence (true );
219
+
220
+ // Create the testing protos
221
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
222
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
223
+ EXPECT_TRUE (differencer.Compare (msg1, msg2));
224
+ }
225
+
204
226
TEST (MessageDifferencerTest, PartialEqualityTestExtraField) {
205
227
// Create the testing protos
206
228
unittest::TestAllTypes msg1;
@@ -217,6 +239,165 @@ TEST(MessageDifferencerTest, PartialEqualityTestExtraField) {
217
239
EXPECT_TRUE (differencer.Compare (msg1, msg2));
218
240
}
219
241
242
+ TEST (MessageDifferencerTest,
243
+ PartialEqualityTestExtraFieldNoPresenceForceCompare) {
244
+ util::MessageDifferencer force_compare_differencer;
245
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
246
+ force_compare_differencer.set_force_compare_no_presence (true );
247
+
248
+ // This differencer is not setting force_compare_no_presence.
249
+ util::MessageDifferencer default_differencer;
250
+ default_differencer.set_scope (util::MessageDifferencer::PARTIAL);
251
+ default_differencer.set_force_compare_no_presence (false );
252
+
253
+
254
+ // Create the testing protos
255
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
256
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
257
+
258
+ // Clearing a no presence field inside a repeated field in a nested message.
259
+ msg1.mutable_no_presence_repeated_nested (0 )->clear_no_presence_bool ();
260
+ EXPECT_FALSE (force_compare_differencer.Compare (msg1, msg2));
261
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
262
+ force_compare_differencer.ReportDifferencesTo (nullptr );
263
+
264
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
265
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
266
+ }
267
+
268
+ TEST (MessageDifferencerTest,
269
+ PartialEqualityTestForceCompareWorksForRepeatedField) {
270
+ util::MessageDifferencer force_compare_differencer;
271
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
272
+ force_compare_differencer.set_force_compare_no_presence (true );
273
+
274
+ // This differencer is not setting force_compare_no_presence.
275
+ util::MessageDifferencer default_differencer;
276
+ default_differencer.set_scope (util::MessageDifferencer::PARTIAL);
277
+ default_differencer.set_force_compare_no_presence (false );
278
+
279
+ // Repeated fields always have presence, so clearing them would remove them
280
+ // from the comparison.
281
+ // Create the testing protos
282
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
283
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
284
+
285
+ msg1.clear_no_presence_repeated_nested ();
286
+ EXPECT_TRUE (force_compare_differencer.Compare (msg1, msg2));
287
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
288
+
289
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
290
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
291
+ }
292
+
293
+ TEST (MessageDifferencerTest,
294
+ PartialEqualityTestForceCompareWorksForRepeatedFieldInstance) {
295
+ util::MessageDifferencer force_compare_differencer;
296
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
297
+ force_compare_differencer.set_force_compare_no_presence (true );
298
+
299
+ // This differencer is not setting force_compare_no_presence.
300
+ util::MessageDifferencer default_differencer;
301
+ default_differencer.set_scope (util::MessageDifferencer::PARTIAL);
302
+ default_differencer.set_force_compare_no_presence (false );
303
+
304
+ // Clearing a field inside a repeated field will trigger a failure when
305
+ // forcing comparison for no presence fields.
306
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
307
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
308
+
309
+ msg1.mutable_no_presence_nested ()->clear_no_presence_bool ();
310
+ EXPECT_FALSE (force_compare_differencer.Compare (msg1, msg2));
311
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
312
+
313
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
314
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
315
+ }
316
+
317
+ TEST (MessageDifferencerTest,
318
+ PartialEqualityTestForceCompareIsNoOptForNestedMessages) {
319
+ util::MessageDifferencer force_compare_differencer;
320
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
321
+ force_compare_differencer.set_force_compare_no_presence (true );
322
+
323
+ // This differencer is not setting force_compare_no_presence.
324
+ util::MessageDifferencer default_differencer;
325
+ default_differencer.set_scope (util::MessageDifferencer::PARTIAL);
326
+ default_differencer.set_force_compare_no_presence (false );
327
+
328
+ // Nested fields always have presence, so clearing them would remove them
329
+ // from the comparison.
330
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
331
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
332
+
333
+ msg1.clear_no_presence_nested ();
334
+ EXPECT_TRUE (force_compare_differencer.Compare (msg1, msg2));
335
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
336
+
337
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
338
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
339
+
340
+ // Creating an instance of the nested field will cause the comparison to fail
341
+ // since it contains a no presence singualr field.
342
+ msg1.mutable_no_presence_nested ();
343
+ EXPECT_FALSE (force_compare_differencer.Compare (msg1, msg2));
344
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
345
+
346
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
347
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
348
+ }
349
+
350
+ TEST (MessageDifferencerTest,
351
+ PartialEqualityTestSingularNoPresenceFieldMissing) {
352
+ util::MessageDifferencer force_compare_differencer;
353
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
354
+ force_compare_differencer.set_force_compare_no_presence (true );
355
+
356
+ // This differencer is not setting force_compare_no_presence.
357
+ util::MessageDifferencer default_differencer;
358
+ default_differencer.set_scope (util::MessageDifferencer::PARTIAL);
359
+ default_differencer.set_force_compare_no_presence (false );
360
+
361
+ // When clearing a singular no presence field, it will be included in the
362
+ // comparison.
363
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
364
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
365
+
366
+ msg1.clear_no_presence_bool ();
367
+ EXPECT_FALSE (force_compare_differencer.Compare (msg1, msg2));
368
+ EXPECT_TRUE (default_differencer.Compare (msg1, msg2));
369
+
370
+ EXPECT_FALSE (force_compare_differencer.Compare (msg2, msg1));
371
+ EXPECT_FALSE (default_differencer.Compare (msg2, msg1));
372
+ }
373
+
374
+ TEST (MessageDifferencerTest,
375
+ PartialEqualityTestExtraFieldNoPresenceForceCompareReporterAware) {
376
+ std::string output;
377
+ // Before we can check the output string, we must make sure the
378
+ // StreamReporter is destroyed because its destructor will
379
+ // flush the stream.
380
+ {
381
+ io::StringOutputStream output_stream (&output);
382
+ util::MessageDifferencer::StreamReporter reporter (&output_stream);
383
+
384
+ util::MessageDifferencer force_compare_differencer;
385
+ force_compare_differencer.set_scope (util::MessageDifferencer::PARTIAL);
386
+ force_compare_differencer.set_force_compare_no_presence (true );
387
+ force_compare_differencer.ReportDifferencesTo (&reporter);
388
+
389
+ // Clearing a no presence field inside a repeated field.
390
+ proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField ();
391
+ proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField ();
392
+
393
+ msg1.mutable_no_presence_repeated_nested (0 )->clear_no_presence_bool ();
394
+ EXPECT_FALSE (force_compare_differencer.Compare (msg1, msg2));
395
+ }
396
+ EXPECT_EQ (output,
397
+ " added: no_presence_repeated_nested[0].no_presence_bool (added for "
398
+ " better PARTIAL comparison): true\n " );
399
+ }
400
+
220
401
TEST (MessageDifferencerTest, PartialEqualityTestSkipRequiredField) {
221
402
// Create the testing protos
222
403
unittest::TestRequired msg1;
0 commit comments