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}},