|
|
|
@ -29,10 +29,8 @@ |
|
|
|
|
#include "absl/strings/str_split.h" |
|
|
|
|
#include "absl/strings/string_view.h" |
|
|
|
|
#include "google/protobuf/any_test.pb.h" |
|
|
|
|
#include "google/protobuf/descriptor.h" |
|
|
|
|
#include "google/protobuf/map_test_util.h" |
|
|
|
|
#include "google/protobuf/map_unittest.pb.h" |
|
|
|
|
#include "google/protobuf/message.h" |
|
|
|
|
#include "google/protobuf/test_util.h" |
|
|
|
|
#include "google/protobuf/text_format.h" |
|
|
|
|
#include "google/protobuf/unittest.pb.h" |
|
|
|
@ -46,31 +44,12 @@ |
|
|
|
|
namespace google { |
|
|
|
|
namespace protobuf { |
|
|
|
|
|
|
|
|
|
namespace internal { |
|
|
|
|
class UnsetFieldsMetadataMessageDifferencerTestUtil { |
|
|
|
|
public: |
|
|
|
|
static void AddExplicitUnsetField( |
|
|
|
|
const Message& message, const Reflection& reflection, |
|
|
|
|
const FieldDescriptor& fd, |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata* metadata) { |
|
|
|
|
metadata->addresses_.insert( |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata::GetUnsetFieldAddress( |
|
|
|
|
message, reflection, fd)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
} // namespace internal
|
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
using ::google::protobuf::internal::UnsetFieldsMetadataMessageDifferencerTestUtil; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proto3_unittest::TestNoPresenceField MakeTestNoPresenceField() { |
|
|
|
|
proto3_unittest::TestNoPresenceField msg1, msg2; |
|
|
|
|
msg1.set_no_presence_bool(true); |
|
|
|
|
msg1.set_no_presence_bool2(true); |
|
|
|
|
msg1.set_no_presence_bool3(true); |
|
|
|
|
msg1.set_no_presence_string("yolo"); |
|
|
|
|
msg2 = msg1; |
|
|
|
|
*msg1.mutable_no_presence_nested() = msg2; |
|
|
|
|
*msg1.add_no_presence_repeated_nested() = msg2; |
|
|
|
@ -399,212 +378,6 @@ TEST(MessageDifferencerTest, |
|
|
|
|
EXPECT_FALSE(default_differencer.Compare(msg2, msg1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestBooleanPresenceFieldMissingWithAddress) { |
|
|
|
|
util::MessageDifferencer address_differencer; |
|
|
|
|
address_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
|
|
|
|
|
// This differencer is not setting force_compare_no_presence.
|
|
|
|
|
util::MessageDifferencer default_differencer; |
|
|
|
|
default_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
default_differencer.set_force_compare_no_presence(false); |
|
|
|
|
|
|
|
|
|
// When clearing a singular no presence field, it will be included in the
|
|
|
|
|
// comparison.
|
|
|
|
|
proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField(); |
|
|
|
|
proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField(); |
|
|
|
|
|
|
|
|
|
const Reflection* reflection1 = msg1.GetReflection(); |
|
|
|
|
const FieldDescriptor* fd1 = msg1.GetDescriptor()->FindFieldByNumber(1); |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata metadata; |
|
|
|
|
UnsetFieldsMetadataMessageDifferencerTestUtil::AddExplicitUnsetField( |
|
|
|
|
msg1, *reflection1, *fd1, &metadata); |
|
|
|
|
address_differencer.set_require_no_presence_fields(metadata); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg2.clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.set_no_presence_bool(true); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestStringPresenceFieldMissingWithAddress) { |
|
|
|
|
util::MessageDifferencer address_differencer; |
|
|
|
|
address_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
|
|
|
|
|
// This differencer is not setting force_compare_no_presence.
|
|
|
|
|
util::MessageDifferencer default_differencer; |
|
|
|
|
default_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
default_differencer.set_force_compare_no_presence(false); |
|
|
|
|
|
|
|
|
|
// When clearing a singular no presence field, it will be included in the
|
|
|
|
|
// comparison.
|
|
|
|
|
proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField(); |
|
|
|
|
proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField(); |
|
|
|
|
|
|
|
|
|
const Reflection* reflection1 = msg1.GetReflection(); |
|
|
|
|
const FieldDescriptor* fd1 = msg1.GetDescriptor()->FindFieldByNumber(4); |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata metadata; |
|
|
|
|
UnsetFieldsMetadataMessageDifferencerTestUtil::AddExplicitUnsetField( |
|
|
|
|
msg1, *reflection1, *fd1, &metadata); |
|
|
|
|
address_differencer.set_require_no_presence_fields(metadata); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.clear_no_presence_string(); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg2.clear_no_presence_string(); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.set_no_presence_string("yolo"); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Ensure multiple booleans are addressed distinctly. This is trivially the case
|
|
|
|
|
// now, but tests against possible optimizations in the future to use bitfields.
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestTwoBoolsPresenceFieldMissingWithAddress) { |
|
|
|
|
util::MessageDifferencer address_differencer; |
|
|
|
|
address_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
|
|
|
|
|
// This differencer is not setting force_compare_no_presence.
|
|
|
|
|
util::MessageDifferencer default_differencer; |
|
|
|
|
default_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
default_differencer.set_force_compare_no_presence(false); |
|
|
|
|
|
|
|
|
|
// When clearing a singular no presence field, it will be included in the
|
|
|
|
|
// comparison.
|
|
|
|
|
proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField(); |
|
|
|
|
proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField(); |
|
|
|
|
|
|
|
|
|
const Reflection* reflection1 = msg1.GetReflection(); |
|
|
|
|
const FieldDescriptor* fd1 = msg1.GetDescriptor()->FindFieldByNumber(5); |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata metadata; |
|
|
|
|
UnsetFieldsMetadataMessageDifferencerTestUtil::AddExplicitUnsetField( |
|
|
|
|
msg1, *reflection1, *fd1, &metadata); |
|
|
|
|
address_differencer.set_require_no_presence_fields(metadata); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
// Trigger on bool2.
|
|
|
|
|
msg1.clear_no_presence_bool2(); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
// Triggering on bool2 still ignores bool3.
|
|
|
|
|
msg1.set_no_presence_bool2(true); |
|
|
|
|
msg1.clear_no_presence_bool3(); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestBooleanNestedMessagePresenceFieldMissingWithAddress) { |
|
|
|
|
util::MessageDifferencer address_differencer; |
|
|
|
|
address_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
|
|
|
|
|
// This differencer is not setting force_compare_no_presence.
|
|
|
|
|
util::MessageDifferencer default_differencer; |
|
|
|
|
default_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
default_differencer.set_force_compare_no_presence(false); |
|
|
|
|
|
|
|
|
|
// When clearing a singular no presence field, it will be included in the
|
|
|
|
|
// comparison.
|
|
|
|
|
proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField(); |
|
|
|
|
proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField(); |
|
|
|
|
|
|
|
|
|
const Reflection* reflection1 = msg1.no_presence_nested().GetReflection(); |
|
|
|
|
const FieldDescriptor* fd1 = msg1.GetDescriptor()->FindFieldByNumber(1); |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata metadata; |
|
|
|
|
UnsetFieldsMetadataMessageDifferencerTestUtil::AddExplicitUnsetField( |
|
|
|
|
msg1.no_presence_nested(), *reflection1, *fd1, &metadata); |
|
|
|
|
address_differencer.set_require_no_presence_fields(metadata); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.mutable_no_presence_nested()->clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg2.mutable_no_presence_nested()->clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.mutable_no_presence_nested()->set_no_presence_bool(true); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestBooleanRepeatedMessagePresenceFieldMissingWithAddress) { |
|
|
|
|
util::MessageDifferencer address_differencer; |
|
|
|
|
address_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
|
|
|
|
|
// This differencer is not setting force_compare_no_presence.
|
|
|
|
|
util::MessageDifferencer default_differencer; |
|
|
|
|
default_differencer.set_scope(util::MessageDifferencer::PARTIAL); |
|
|
|
|
default_differencer.set_force_compare_no_presence(false); |
|
|
|
|
|
|
|
|
|
// When clearing a singular no presence field, it will be included in the
|
|
|
|
|
// comparison.
|
|
|
|
|
proto3_unittest::TestNoPresenceField msg1 = MakeTestNoPresenceField(); |
|
|
|
|
proto3_unittest::TestNoPresenceField msg2 = MakeTestNoPresenceField(); |
|
|
|
|
|
|
|
|
|
const Reflection* reflection1 = |
|
|
|
|
msg1.no_presence_repeated_nested(0).GetReflection(); |
|
|
|
|
const FieldDescriptor* fd1 = msg1.GetDescriptor()->FindFieldByNumber(1); |
|
|
|
|
TextFormat::Parser::UnsetFieldsMetadata metadata; |
|
|
|
|
UnsetFieldsMetadataMessageDifferencerTestUtil::AddExplicitUnsetField( |
|
|
|
|
msg1.no_presence_repeated_nested(0), *reflection1, *fd1, &metadata); |
|
|
|
|
address_differencer.set_require_no_presence_fields(metadata); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.mutable_no_presence_repeated_nested(0)->clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg2.mutable_no_presence_repeated_nested(0)->clear_no_presence_bool(); |
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_TRUE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
|
|
|
|
|
msg1.mutable_no_presence_repeated_nested(0)->set_no_presence_bool(true); |
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(default_differencer.Compare(msg1, msg2)); |
|
|
|
|
EXPECT_FALSE(address_differencer.Compare(msg1, msg2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(MessageDifferencerTest, |
|
|
|
|
PartialEqualityTestExtraFieldNoPresenceForceCompareReporterAware) { |
|
|
|
|
std::string output; |
|
|
|
|