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