encoding/textpb: fix handling of group field name

Group field name in textproto should be the type name.  Its field name
is derived from lowercasing its type name.

Change-Id: Ia12aafe934d3a59f3e07d09fe7939cfa6595a7b8
Reviewed-on: https://go-review.googlesource.com/c/157821
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/textpb/decode.go b/encoding/textpb/decode.go
index c2bfc0e..f7b10ad 100644
--- a/encoding/textpb/decode.go
+++ b/encoding/textpb/decode.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"strings"
 
 	"github.com/golang/protobuf/v2/internal/encoding/text"
 	"github.com/golang/protobuf/v2/internal/errors"
@@ -103,6 +104,10 @@
 		case text.Name:
 			name, _ = tkey.Name()
 			fd = fieldDescs.ByName(name)
+			if fd == nil {
+				// Check if this is a group field.
+				fd = fieldDescs.ByName(pref.Name(strings.ToLower(string(name))))
+			}
 		case text.String:
 			// TODO: Handle Any expansions here as well.
 
diff --git a/encoding/textpb/decode_test.go b/encoding/textpb/decode_test.go
index 00d8215..9911362 100644
--- a/encoding/textpb/decode_test.go
+++ b/encoding/textpb/decode_test.go
@@ -417,7 +417,7 @@
 		inputMessage: &pb2.Nests{},
 		inputText: `
 opt_nested: {}
-optgroup: {}
+OptGroup: {}
 `,
 		wantMessage: &pb2.Nests{
 			OptNested: &pb2.Nested{},
@@ -585,11 +585,11 @@
 		desc:         "repeated group fields",
 		inputMessage: &pb2.Nests{},
 		inputText: `
-rptgroup: {
+RptGroup: {
   rpt_bool: true
   rpt_bool: false
 }
-rptgroup: {}
+RptGroup: {}
 `,
 		wantMessage: &pb2.Nests{
 			Rptgroup: []*pb2.Nests_RptGroup{
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index fbbdd0f..57a35c6 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -153,6 +153,10 @@
 		if !nerr.Merge(err) {
 			return msgFields, err
 		}
+		// Use type name for group field name.
+		if fd.Kind() == pref.GroupKind {
+			tname = text.ValueOf(fd.MessageType().Name())
+		}
 		msgFields = append(msgFields, [2]text.Value{tname, tval})
 	}
 
diff --git a/encoding/textpb/encode_test.go b/encoding/textpb/encode_test.go
index 83cbbc5..9871e75 100644
--- a/encoding/textpb/encode_test.go
+++ b/encoding/textpb/encode_test.go
@@ -316,7 +316,7 @@
 			Optgroup:  &pb2.Nests_OptGroup{},
 		},
 		want: `opt_nested: {}
-optgroup: {}
+OptGroup: {}
 `,
 	}, {
 		desc: "proto2 nested messages",
@@ -349,13 +349,13 @@
 				},
 			},
 		},
-		want: `optgroup: {
+		want: `OptGroup: {
   opt_bool: true
   opt_string: "inside a group"
   opt_nested: {
     opt_string: "nested message inside a group"
   }
-  optnestedgroup: {
+  OptNestedGroup: {
     opt_enum: TENTH
   }
 }