proto.Equal: document map equality and clarify the rule for repeated fields.
PiperOrigin-RevId: 130971987
diff --git a/proto/equal.go b/proto/equal.go
index 8b16f95..2ed1cf5 100644
--- a/proto/equal.go
+++ b/proto/equal.go
@@ -54,13 +54,17 @@
in a proto3 .proto file, fields are not "set"; specifically,
zero length proto3 "bytes" fields are equal (nil == {}).
- Two repeated fields are equal iff their lengths are the same,
- and their corresponding elements are equal (a "bytes" field,
- although represented by []byte, is not a repeated field)
+ and their corresponding elements are equal. Note a "bytes" field,
+ although represented by []byte, is not a repeated field and the
+ rule for the scalar fields described above applies.
- Two unset fields are equal.
- Two unknown field sets are equal if their current
encoded state is equal.
- Two extension sets are equal iff they have corresponding
elements that are pairwise equal.
+ - Two map fields are equal iff their lengths are the same,
+ and they contain the same set of elements. Zero-length map
+ fields are equal.
- Every other combination of things are not equal.
The return value is undefined if a and b are not protocol buffers.
diff --git a/proto/equal_test.go b/proto/equal_test.go
index 7b45eaa..a2febb3 100644
--- a/proto/equal_test.go
+++ b/proto/equal_test.go
@@ -184,6 +184,18 @@
false,
},
{
+ "zero-length maps same",
+ &pb.MessageWithMap{NameMapping: map[int32]string{}},
+ &pb.MessageWithMap{NameMapping: nil},
+ true,
+ },
+ {
+ "orders in map don't matter",
+ &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken", 2: "Rob"}},
+ &pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob", 1: "Ken"}},
+ true,
+ },
+ {
"oneof same",
&pb.Communique{Union: &pb.Communique_Number{41}},
&pb.Communique{Union: &pb.Communique_Number{41}},