Bladeren bron

encoding/textpb: move test protos under encoding/testprotos

These test proto definitions will be reused for encoding/jsonpb package
and hence move these one directory up.

Also, add and simplify some tests.

Change-Id: I5297546fd9b853a7fd3e72dfab2fdc7237332c9c
Reviewed-on: https://go-review.googlesource.com/c/162537
Reviewed-by: Damien Neil <dneil@google.com>
Herbie Ong 7 jaren geleden
bovenliggende
commit
8170d69313

File diff suppressed because it is too large
+ 209 - 393
encoding/testprotos/pb2/test.pb.go


+ 44 - 62
encoding/textpb/testprotos/pb2/test.proto → encoding/testprotos/pb2/test.proto

@@ -1,4 +1,4 @@
-// Copyright 2018 The Go Authors. All rights reserved.
+// Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
@@ -6,7 +6,7 @@
 syntax = "proto2";
 
 package pb2;
-option go_package = "github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb2";
+option go_package = "github.com/golang/protobuf/v2/encoding/testprotos/pb2";
 
 import "google/protobuf/any.proto";
 import "google/protobuf/empty.proto";
@@ -18,7 +18,6 @@ import "google/protobuf/wrappers.proto";
 // Scalars contains optional scalar fields.
 message Scalars {
   optional bool opt_bool = 1;
-
   optional int32 opt_int32 = 2;
   optional int64 opt_int64 = 3;
   optional uint32 opt_uint32 = 4;
@@ -30,6 +29,10 @@ message Scalars {
   optional sfixed32 opt_sfixed32 = 10;
   optional sfixed64 opt_sfixed64 = 11;
 
+  // Textproto marshal outputs fields in the same order as this proto
+  // definition regardless of field number. Following fields are intended to
+  // test that assumption.
+
   optional float opt_float = 20;
   optional double opt_double = 21;
 
@@ -37,24 +40,10 @@ message Scalars {
   optional string opt_string = 13;
 }
 
-// Message contains repeated fields.
-message Repeats {
-  repeated bool rpt_bool = 1;
-  repeated int32 rpt_int32 = 2;
-  repeated int64 rpt_int64 = 3;
-  repeated uint32 rpt_uint32 = 4;
-  repeated uint64 rpt_uint64 = 5;
-  repeated float rpt_float = 6;
-  repeated double rpt_double = 7;
-  repeated string rpt_string = 15;
-  repeated bytes rpt_bytes = 14;
-}
-
 enum Enum {
-  UNKNOWN = 0;
-  FIRST = 1;
-  SECOND = 2;
-  TENTH = 10;
+  ONE = 1;
+  TWO = 2;
+  TEN = 10;
 }
 
 // Message contains enum fields.
@@ -71,46 +60,53 @@ message Enums {
   repeated NestedEnum rpt_nested_enum = 4;
 }
 
+// Message contains repeated fields.
+message Repeats {
+  repeated bool rpt_bool = 1;
+  repeated int32 rpt_int32 = 2;
+  repeated int64 rpt_int64 = 3;
+  repeated uint32 rpt_uint32 = 4;
+  repeated uint64 rpt_uint64 = 5;
+  repeated float rpt_float = 6;
+  repeated double rpt_double = 7;
+  repeated string rpt_string = 8;
+  repeated bytes rpt_bytes = 9;
+}
+
+// Message type used as submessage.
+message Nested {
+  optional string opt_string = 1;
+  optional Nested opt_nested = 2;
+}
+
 // Message contains message and group fields.
 message Nests {
   optional Nested opt_nested = 1;
   optional group OptGroup = 2 {
-    optional bool opt_bool = 1;
-    optional string opt_string = 2;
-    optional Nested opt_nested = 3;
+    optional string opt_string = 1;
+    optional Nested opt_nested = 2;
 
-    optional group OptNestedGroup = 4 {
-      optional Enum opt_enum = 1;
+    optional group OptNestedGroup = 3 {
+      optional fixed32 opt_fixed32 = 1;
     }
   }
 
-  repeated Nested rpt_nested = 3;
-  repeated group RptGroup = 4 {
-    repeated bool rpt_bool = 1;
+  repeated Nested rpt_nested = 4;
+  repeated group RptGroup = 5 {
+    repeated string rpt_string = 1;
   }
 
   reserved "reserved_field";
 }
 
-// Message type used as submessage.
-message Nested {
-  optional string opt_string = 1;
-  optional Nested opt_nested = 2;
-}
-
 // Message contains required fields.
 message Requireds {
   required bool req_bool = 1;
-  required fixed32 req_fixed32 = 2;
-  required fixed64 req_fixed64 = 3;
-  required sfixed32 req_sfixed32 = 4;
-  required sfixed64 req_sfixed64 = 5;
-  required float req_float = 6;
-  required double req_double = 7;
-  required string req_string = 8;
-  required bytes req_bytes = 9;
-  required Enum req_enum = 10;
-  required Nested req_nested = 11;
+  required sfixed64 req_sfixed64 = 2;
+  required double req_double = 3;
+  required string req_string = 4;
+  required Enum req_enum = 5;
+  required Nested req_nested = 6;
 }
 
 // Message contains both required and optional fields.
@@ -119,24 +115,6 @@ message PartialRequired {
   optional string opt_string = 2;
 }
 
-// Message contains oneof field.
-message Oneofs {
-  oneof union {
-    string str = 1;
-    Nested msg = 2;
-  }
-}
-
-// Message contains map fields.
-message Maps {
-  map<int32, string> int32_to_str = 1;
-  map<sfixed64, bool> sfixed64_to_bool = 2;
-  map<bool, uint32> bool_to_uint32 = 3;
-  map<uint64, Enum> uint64_to_enum = 4;
-  map<string, Nested> str_to_nested = 5;
-  map<string, Oneofs> str_to_oneofs = 6;
-}
-
 // Following messages are for testing required field nested in optional, repeated and map fields.
 
 message NestedWithRequired {
@@ -147,6 +125,10 @@ message IndirectRequired {
   optional NestedWithRequired opt_nested = 1;
   repeated NestedWithRequired rpt_nested = 2;
   map<string, NestedWithRequired> str_to_nested = 3;
+
+  oneof union {
+    NestedWithRequired oneof_nested = 4;
+  }
 }
 
 // Following messages are for testing extensions.

+ 760 - 0
encoding/testprotos/pb3/test.pb.go

@@ -0,0 +1,760 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: encoding/testprotos/pb3/test.proto
+
+package pb3
+
+import (
+	bytes "bytes"
+	gzip "compress/gzip"
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
+	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
+	reflect "reflect"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type Enum int32
+
+const (
+	Enum_ZERO Enum = 0
+	Enum_ONE  Enum = 1
+	Enum_TWO  Enum = 2
+	Enum_TEN  Enum = 10
+)
+
+func (e Enum) Type() protoreflect.EnumType {
+	return xxx_Test_protoFile_enumTypes[0]
+}
+func (e Enum) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(e)
+}
+
+var Enum_name = map[int32]string{
+	0:  "ZERO",
+	1:  "ONE",
+	2:  "TWO",
+	10: "TEN",
+}
+
+var Enum_value = map[string]int32{
+	"ZERO": 0,
+	"ONE":  1,
+	"TWO":  2,
+	"TEN":  10,
+}
+
+func (x Enum) String() string {
+	return proto.EnumName(Enum_name, int32(x))
+}
+
+func (Enum) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{0}
+}
+
+type Enums_NestedEnum int32
+
+const (
+	Enums_CERO Enums_NestedEnum = 0
+	Enums_UNO  Enums_NestedEnum = 1
+	Enums_DOS  Enums_NestedEnum = 2
+	Enums_DIEZ Enums_NestedEnum = 10
+)
+
+func (e Enums_NestedEnum) Type() protoreflect.EnumType {
+	return xxx_Test_protoFile_enumTypes[1]
+}
+func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(e)
+}
+
+var Enums_NestedEnum_name = map[int32]string{
+	0:  "CERO",
+	1:  "UNO",
+	2:  "DOS",
+	10: "DIEZ",
+}
+
+var Enums_NestedEnum_value = map[string]int32{
+	"CERO": 0,
+	"UNO":  1,
+	"DOS":  2,
+	"DIEZ": 10,
+}
+
+func (x Enums_NestedEnum) String() string {
+	return proto.EnumName(Enums_NestedEnum_name, int32(x))
+}
+
+func (Enums_NestedEnum) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{1, 0}
+}
+
+// Scalars contains scalar field types.
+type Scalars struct {
+	SBool                bool     `protobuf:"varint,1,opt,name=s_bool,json=sBool,proto3" json:"s_bool,omitempty"`
+	SInt32               int32    `protobuf:"varint,2,opt,name=s_int32,json=sInt32,proto3" json:"s_int32,omitempty"`
+	SInt64               int64    `protobuf:"varint,3,opt,name=s_int64,json=sInt64,proto3" json:"s_int64,omitempty"`
+	SUint32              uint32   `protobuf:"varint,4,opt,name=s_uint32,json=sUint32,proto3" json:"s_uint32,omitempty"`
+	SUint64              uint64   `protobuf:"varint,5,opt,name=s_uint64,json=sUint64,proto3" json:"s_uint64,omitempty"`
+	SSint32              int32    `protobuf:"zigzag32,6,opt,name=s_sint32,json=sSint32,proto3" json:"s_sint32,omitempty"`
+	SSint64              int64    `protobuf:"zigzag64,7,opt,name=s_sint64,json=sSint64,proto3" json:"s_sint64,omitempty"`
+	SFixed32             uint32   `protobuf:"fixed32,8,opt,name=s_fixed32,json=sFixed32,proto3" json:"s_fixed32,omitempty"`
+	SFixed64             uint64   `protobuf:"fixed64,9,opt,name=s_fixed64,json=sFixed64,proto3" json:"s_fixed64,omitempty"`
+	SSfixed32            int32    `protobuf:"fixed32,10,opt,name=s_sfixed32,json=sSfixed32,proto3" json:"s_sfixed32,omitempty"`
+	SSfixed64            int64    `protobuf:"fixed64,11,opt,name=s_sfixed64,json=sSfixed64,proto3" json:"s_sfixed64,omitempty"`
+	SFloat               float32  `protobuf:"fixed32,20,opt,name=s_float,json=sFloat,proto3" json:"s_float,omitempty"`
+	SDouble              float64  `protobuf:"fixed64,21,opt,name=s_double,json=sDouble,proto3" json:"s_double,omitempty"`
+	SBytes               []byte   `protobuf:"bytes,14,opt,name=s_bytes,json=sBytes,proto3" json:"s_bytes,omitempty"`
+	SString              string   `protobuf:"bytes,13,opt,name=s_string,json=sString,proto3" json:"s_string,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Scalars) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[0].MessageOf(m)
+}
+func (m *Scalars) Reset()         { *m = Scalars{} }
+func (m *Scalars) String() string { return proto.CompactTextString(m) }
+func (*Scalars) ProtoMessage()    {}
+func (*Scalars) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{0}
+}
+
+func (m *Scalars) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Scalars.Unmarshal(m, b)
+}
+func (m *Scalars) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Scalars.Marshal(b, m, deterministic)
+}
+func (m *Scalars) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Scalars.Merge(m, src)
+}
+func (m *Scalars) XXX_Size() int {
+	return xxx_messageInfo_Scalars.Size(m)
+}
+func (m *Scalars) XXX_DiscardUnknown() {
+	xxx_messageInfo_Scalars.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Scalars proto.InternalMessageInfo
+
+func (m *Scalars) GetSBool() bool {
+	if m != nil {
+		return m.SBool
+	}
+	return false
+}
+
+func (m *Scalars) GetSInt32() int32 {
+	if m != nil {
+		return m.SInt32
+	}
+	return 0
+}
+
+func (m *Scalars) GetSInt64() int64 {
+	if m != nil {
+		return m.SInt64
+	}
+	return 0
+}
+
+func (m *Scalars) GetSUint32() uint32 {
+	if m != nil {
+		return m.SUint32
+	}
+	return 0
+}
+
+func (m *Scalars) GetSUint64() uint64 {
+	if m != nil {
+		return m.SUint64
+	}
+	return 0
+}
+
+func (m *Scalars) GetSSint32() int32 {
+	if m != nil {
+		return m.SSint32
+	}
+	return 0
+}
+
+func (m *Scalars) GetSSint64() int64 {
+	if m != nil {
+		return m.SSint64
+	}
+	return 0
+}
+
+func (m *Scalars) GetSFixed32() uint32 {
+	if m != nil {
+		return m.SFixed32
+	}
+	return 0
+}
+
+func (m *Scalars) GetSFixed64() uint64 {
+	if m != nil {
+		return m.SFixed64
+	}
+	return 0
+}
+
+func (m *Scalars) GetSSfixed32() int32 {
+	if m != nil {
+		return m.SSfixed32
+	}
+	return 0
+}
+
+func (m *Scalars) GetSSfixed64() int64 {
+	if m != nil {
+		return m.SSfixed64
+	}
+	return 0
+}
+
+func (m *Scalars) GetSFloat() float32 {
+	if m != nil {
+		return m.SFloat
+	}
+	return 0
+}
+
+func (m *Scalars) GetSDouble() float64 {
+	if m != nil {
+		return m.SDouble
+	}
+	return 0
+}
+
+func (m *Scalars) GetSBytes() []byte {
+	if m != nil {
+		return m.SBytes
+	}
+	return nil
+}
+
+func (m *Scalars) GetSString() string {
+	if m != nil {
+		return m.SString
+	}
+	return ""
+}
+
+// Message contains enum fields.
+type Enums struct {
+	SEnum                Enum             `protobuf:"varint,1,opt,name=s_enum,json=sEnum,proto3,enum=pb3.Enum" json:"s_enum,omitempty"`
+	SNestedEnum          Enums_NestedEnum `protobuf:"varint,3,opt,name=s_nested_enum,json=sNestedEnum,proto3,enum=pb3.Enums_NestedEnum" json:"s_nested_enum,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *Enums) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[1].MessageOf(m)
+}
+func (m *Enums) Reset()         { *m = Enums{} }
+func (m *Enums) String() string { return proto.CompactTextString(m) }
+func (*Enums) ProtoMessage()    {}
+func (*Enums) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{1}
+}
+
+func (m *Enums) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Enums.Unmarshal(m, b)
+}
+func (m *Enums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Enums.Marshal(b, m, deterministic)
+}
+func (m *Enums) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Enums.Merge(m, src)
+}
+func (m *Enums) XXX_Size() int {
+	return xxx_messageInfo_Enums.Size(m)
+}
+func (m *Enums) XXX_DiscardUnknown() {
+	xxx_messageInfo_Enums.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Enums proto.InternalMessageInfo
+
+func (m *Enums) GetSEnum() Enum {
+	if m != nil {
+		return m.SEnum
+	}
+	return Enum_ZERO
+}
+
+func (m *Enums) GetSNestedEnum() Enums_NestedEnum {
+	if m != nil {
+		return m.SNestedEnum
+	}
+	return Enums_CERO
+}
+
+// Message contains nested message field.
+type Nests struct {
+	SNested              *Nested  `protobuf:"bytes,2,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Nests) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[2].MessageOf(m)
+}
+func (m *Nests) Reset()         { *m = Nests{} }
+func (m *Nests) String() string { return proto.CompactTextString(m) }
+func (*Nests) ProtoMessage()    {}
+func (*Nests) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{2}
+}
+
+func (m *Nests) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Nests.Unmarshal(m, b)
+}
+func (m *Nests) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Nests.Marshal(b, m, deterministic)
+}
+func (m *Nests) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Nests.Merge(m, src)
+}
+func (m *Nests) XXX_Size() int {
+	return xxx_messageInfo_Nests.Size(m)
+}
+func (m *Nests) XXX_DiscardUnknown() {
+	xxx_messageInfo_Nests.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Nests proto.InternalMessageInfo
+
+func (m *Nests) GetSNested() *Nested {
+	if m != nil {
+		return m.SNested
+	}
+	return nil
+}
+
+// Message type used as submessage.
+type Nested struct {
+	SString              string   `protobuf:"bytes,1,opt,name=s_string,json=sString,proto3" json:"s_string,omitempty"`
+	SNested              *Nested  `protobuf:"bytes,2,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Nested) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[3].MessageOf(m)
+}
+func (m *Nested) Reset()         { *m = Nested{} }
+func (m *Nested) String() string { return proto.CompactTextString(m) }
+func (*Nested) ProtoMessage()    {}
+func (*Nested) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{3}
+}
+
+func (m *Nested) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Nested.Unmarshal(m, b)
+}
+func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Nested.Marshal(b, m, deterministic)
+}
+func (m *Nested) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Nested.Merge(m, src)
+}
+func (m *Nested) XXX_Size() int {
+	return xxx_messageInfo_Nested.Size(m)
+}
+func (m *Nested) XXX_DiscardUnknown() {
+	xxx_messageInfo_Nested.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Nested proto.InternalMessageInfo
+
+func (m *Nested) GetSString() string {
+	if m != nil {
+		return m.SString
+	}
+	return ""
+}
+
+func (m *Nested) GetSNested() *Nested {
+	if m != nil {
+		return m.SNested
+	}
+	return nil
+}
+
+// Message contains oneof field.
+type Oneofs struct {
+	// Types that are valid to be assigned to Union:
+	//	*Oneofs_OneofEnum
+	//	*Oneofs_OneofString
+	//	*Oneofs_OneofNested
+	Union                isOneofs_Union `protobuf_oneof:"union"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *Oneofs) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[4].MessageOf(m)
+}
+func (m *Oneofs) Reset()         { *m = Oneofs{} }
+func (m *Oneofs) String() string { return proto.CompactTextString(m) }
+func (*Oneofs) ProtoMessage()    {}
+func (*Oneofs) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{4}
+}
+
+func (m *Oneofs) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Oneofs.Unmarshal(m, b)
+}
+func (m *Oneofs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Oneofs.Marshal(b, m, deterministic)
+}
+func (m *Oneofs) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Oneofs.Merge(m, src)
+}
+func (m *Oneofs) XXX_Size() int {
+	return xxx_messageInfo_Oneofs.Size(m)
+}
+func (m *Oneofs) XXX_DiscardUnknown() {
+	xxx_messageInfo_Oneofs.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Oneofs proto.InternalMessageInfo
+
+type isOneofs_Union interface {
+	isOneofs_Union()
+}
+
+type Oneofs_OneofEnum struct {
+	OneofEnum Enum `protobuf:"varint,1,opt,name=oneof_enum,json=oneofEnum,proto3,enum=pb3.Enum,oneof"`
+}
+
+type Oneofs_OneofString struct {
+	OneofString string `protobuf:"bytes,2,opt,name=oneof_string,json=oneofString,proto3,oneof"`
+}
+
+type Oneofs_OneofNested struct {
+	OneofNested *Nested `protobuf:"bytes,3,opt,name=oneof_nested,json=oneofNested,proto3,oneof"`
+}
+
+func (*Oneofs_OneofEnum) isOneofs_Union() {}
+
+func (*Oneofs_OneofString) isOneofs_Union() {}
+
+func (*Oneofs_OneofNested) isOneofs_Union() {}
+
+func (m *Oneofs) GetUnion() isOneofs_Union {
+	if m != nil {
+		return m.Union
+	}
+	return nil
+}
+
+func (m *Oneofs) GetOneofEnum() Enum {
+	if x, ok := m.GetUnion().(*Oneofs_OneofEnum); ok {
+		return x.OneofEnum
+	}
+	return Enum_ZERO
+}
+
+func (m *Oneofs) GetOneofString() string {
+	if x, ok := m.GetUnion().(*Oneofs_OneofString); ok {
+		return x.OneofString
+	}
+	return ""
+}
+
+func (m *Oneofs) GetOneofNested() *Nested {
+	if x, ok := m.GetUnion().(*Oneofs_OneofNested); ok {
+		return x.OneofNested
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Oneofs) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Oneofs_OneofEnum)(nil),
+		(*Oneofs_OneofString)(nil),
+		(*Oneofs_OneofNested)(nil),
+	}
+}
+
+// Message contains map fields.
+type Maps struct {
+	Int32ToStr           map[int32]string   `protobuf:"bytes,1,rep,name=int32_to_str,json=int32ToStr,proto3" json:"int32_to_str,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	BoolToUint32         map[bool]uint32    `protobuf:"bytes,2,rep,name=bool_to_uint32,json=boolToUint32,proto3" json:"bool_to_uint32,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+	Uint64ToEnum         map[uint64]Enum    `protobuf:"bytes,3,rep,name=uint64_to_enum,json=uint64ToEnum,proto3" json:"uint64_to_enum,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=pb3.Enum"`
+	StrToNested          map[string]*Nested `protobuf:"bytes,4,rep,name=str_to_nested,json=strToNested,proto3" json:"str_to_nested,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	StrToOneofs          map[string]*Oneofs `protobuf:"bytes,5,rep,name=str_to_oneofs,json=strToOneofs,proto3" json:"str_to_oneofs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *Maps) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[5].MessageOf(m)
+}
+func (m *Maps) Reset()         { *m = Maps{} }
+func (m *Maps) String() string { return proto.CompactTextString(m) }
+func (*Maps) ProtoMessage()    {}
+func (*Maps) Descriptor() ([]byte, []int) {
+	return fileDescriptor_33e0a17922cde063_gzipped, []int{5}
+}
+
+func (m *Maps) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Maps.Unmarshal(m, b)
+}
+func (m *Maps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Maps.Marshal(b, m, deterministic)
+}
+func (m *Maps) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Maps.Merge(m, src)
+}
+func (m *Maps) XXX_Size() int {
+	return xxx_messageInfo_Maps.Size(m)
+}
+func (m *Maps) XXX_DiscardUnknown() {
+	xxx_messageInfo_Maps.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Maps proto.InternalMessageInfo
+
+func (m *Maps) GetInt32ToStr() map[int32]string {
+	if m != nil {
+		return m.Int32ToStr
+	}
+	return nil
+}
+
+func (m *Maps) GetBoolToUint32() map[bool]uint32 {
+	if m != nil {
+		return m.BoolToUint32
+	}
+	return nil
+}
+
+func (m *Maps) GetUint64ToEnum() map[uint64]Enum {
+	if m != nil {
+		return m.Uint64ToEnum
+	}
+	return nil
+}
+
+func (m *Maps) GetStrToNested() map[string]*Nested {
+	if m != nil {
+		return m.StrToNested
+	}
+	return nil
+}
+
+func (m *Maps) GetStrToOneofs() map[string]*Oneofs {
+	if m != nil {
+		return m.StrToOneofs
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterFile("encoding/testprotos/pb3/test.proto", fileDescriptor_33e0a17922cde063_gzipped)
+	proto.RegisterEnum("pb3.Enum", Enum_name, Enum_value)
+	proto.RegisterEnum("pb3.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
+	proto.RegisterType((*Scalars)(nil), "pb3.Scalars")
+	proto.RegisterType((*Enums)(nil), "pb3.Enums")
+	proto.RegisterType((*Nests)(nil), "pb3.Nests")
+	proto.RegisterType((*Nested)(nil), "pb3.Nested")
+	proto.RegisterType((*Oneofs)(nil), "pb3.Oneofs")
+	proto.RegisterType((*Maps)(nil), "pb3.Maps")
+	proto.RegisterMapType((map[bool]uint32)(nil), "pb3.Maps.BoolToUint32Entry")
+	proto.RegisterMapType((map[int32]string)(nil), "pb3.Maps.Int32ToStrEntry")
+	proto.RegisterMapType((map[string]*Nested)(nil), "pb3.Maps.StrToNestedEntry")
+	proto.RegisterMapType((map[string]*Oneofs)(nil), "pb3.Maps.StrToOneofsEntry")
+	proto.RegisterMapType((map[uint64]Enum)(nil), "pb3.Maps.Uint64ToEnumEntry")
+}
+
+var fileDescriptor_33e0a17922cde063 = []byte{
+	// 1690 bytes of the wire-encoded FileDescriptorProto
+	0x0a, 0x22, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x33, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x70, 0x62, 0x33, 0x22, 0x9e, 0x03, 0x0a, 0x07, 0x53, 0x63,
+	0x61, 0x6c, 0x61, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x17, 0x0a, 0x07,
+	0x73, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73,
+	0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x19,
+	0x0a, 0x08, 0x73, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d,
+	0x52, 0x07, 0x73, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x75,
+	0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x55, 0x69,
+	0x6e, 0x74, 0x36, 0x34, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x11, 0x52, 0x07, 0x73, 0x53, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12,
+	0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x12, 0x52, 0x07, 0x73, 0x53, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x5f,
+	0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x07, 0x52, 0x08, 0x73,
+	0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x5f, 0x66, 0x69, 0x78,
+	0x65, 0x64, 0x36, 0x34, 0x18, 0x09, 0x20, 0x01, 0x28, 0x06, 0x52, 0x08, 0x73, 0x46, 0x69, 0x78,
+	0x65, 0x64, 0x36, 0x34, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64,
+	0x33, 0x32, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x09, 0x73, 0x53, 0x66, 0x69, 0x78, 0x65,
+	0x64, 0x33, 0x32, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,
+	0x34, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x10, 0x52, 0x09, 0x73, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64,
+	0x36, 0x34, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x14, 0x20,
+	0x01, 0x28, 0x02, 0x52, 0x06, 0x73, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73,
+	0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x73,
+	0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65,
+	0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12,
+	0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x98, 0x01, 0x0a, 0x05, 0x45,
+	0x6e, 0x75, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52,
+	0x05, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x39, 0x0a, 0x0d, 0x73, 0x5f, 0x6e, 0x65, 0x73, 0x74,
+	0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e,
+	0x70, 0x62, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0b, 0x73, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75,
+	0x6d, 0x22, 0x32, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12,
+	0x08, 0x0a, 0x04, 0x43, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x4e, 0x4f,
+	0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, 0x53, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44,
+	0x49, 0x45, 0x5a, 0x10, 0x0a, 0x22, 0x2f, 0x0a, 0x05, 0x4e, 0x65, 0x73, 0x74, 0x73, 0x12, 0x26,
+	0x0a, 0x08, 0x73, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x07, 0x73,
+	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x4b, 0x0a, 0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x08, 0x73,
+	0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e,
+	0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x07, 0x73, 0x4e, 0x65, 0x73,
+	0x74, 0x65, 0x64, 0x22, 0x94, 0x01, 0x0a, 0x06, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x73, 0x12, 0x2a,
+	0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x48, 0x00, 0x52,
+	0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0c, 0x6f, 0x6e,
+	0x65, 0x6f, 0x66, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x00, 0x52, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12,
+	0x30, 0x0a, 0x0c, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65, 0x73, 0x74,
+	0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x4e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x42, 0x07, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x05, 0x0a, 0x04, 0x4d,
+	0x61, 0x70, 0x73, 0x12, 0x3b, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x6f, 0x5f,
+	0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x33, 0x2e,
+	0x4d, 0x61, 0x70, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x54, 0x6f, 0x53, 0x74, 0x72, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x54, 0x6f, 0x53, 0x74, 0x72,
+	0x12, 0x41, 0x0a, 0x0e, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x69, 0x6e, 0x74,
+	0x33, 0x32, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4d,
+	0x61, 0x70, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x54, 0x6f, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x54, 0x6f, 0x55, 0x69, 0x6e,
+	0x74, 0x33, 0x32, 0x12, 0x41, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x6f,
+	0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62,
+	0x33, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x54, 0x6f, 0x45,
+	0x6e, 0x75, 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34,
+	0x54, 0x6f, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3e, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f,
+	0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x70, 0x62, 0x33, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65,
+	0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x54, 0x6f,
+	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f,
+	0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x70, 0x62, 0x33, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4f, 0x6e,
+	0x65, 0x6f, 0x66, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x54, 0x6f,
+	0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x54,
+	0x6f, 0x53, 0x74, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x42, 0x6f, 0x6f, 0x6c, 0x54, 0x6f, 0x55,
+	0x69, 0x6e, 0x74, 0x33, 0x32, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x11, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34,
+	0x54, 0x6f, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70,
+	0x62, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x1a, 0x4b, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65,
+	0x73, 0x74, 0x65, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,
+	0x4b, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x73, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66,
+	0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x2b, 0x0a, 0x04,
+	0x45, 0x6e, 0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x07,
+	0x0a, 0x03, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02,
+	0x12, 0x07, 0x0a, 0x03, 0x54, 0x45, 0x4e, 0x10, 0x0a, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74,
+	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+	0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70,
+	0x62, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var fileDescriptor_33e0a17922cde063_gzipped = func() []byte {
+	bb := new(bytes.Buffer)
+	zw, _ := gzip.NewWriterLevel(bb, gzip.NoCompression)
+	zw.Write(fileDescriptor_33e0a17922cde063)
+	zw.Close()
+	return bb.Bytes()
+}()
+
+const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
+
+var Test_protoFile protoreflect.FileDescriptor
+
+var xxx_Test_protoFile_enumTypes [2]protoreflect.EnumType
+var xxx_Test_protoFile_messageTypes [11]protoimpl.MessageType
+var xxx_Test_protoFile_goTypes = []interface{}{
+	(Enum)(0),             // 0: pb3.Enum
+	(Enums_NestedEnum)(0), // 1: pb3.Enums.NestedEnum
+	(*Scalars)(nil),       // 2: pb3.Scalars
+	(*Enums)(nil),         // 3: pb3.Enums
+	(*Nests)(nil),         // 4: pb3.Nests
+	(*Nested)(nil),        // 5: pb3.Nested
+	(*Oneofs)(nil),        // 6: pb3.Oneofs
+	(*Maps)(nil),          // 7: pb3.Maps
+	nil,                   // 8: pb3.Maps.Int32ToStrEntry
+	nil,                   // 9: pb3.Maps.BoolToUint32Entry
+	nil,                   // 10: pb3.Maps.Uint64ToEnumEntry
+	nil,                   // 11: pb3.Maps.StrToNestedEntry
+	nil,                   // 12: pb3.Maps.StrToOneofsEntry
+}
+var xxx_Test_protoFile_depIdxs = []int32{
+	0,  // pb3.Enums.s_enum:type_name -> pb3.Enum
+	1,  // pb3.Enums.s_nested_enum:type_name -> pb3.Enums.NestedEnum
+	5,  // pb3.Nests.s_nested:type_name -> pb3.Nested
+	5,  // pb3.Nested.s_nested:type_name -> pb3.Nested
+	0,  // pb3.Oneofs.oneof_enum:type_name -> pb3.Enum
+	5,  // pb3.Oneofs.oneof_nested:type_name -> pb3.Nested
+	8,  // pb3.Maps.int32_to_str:type_name -> pb3.Maps.Int32ToStrEntry
+	9,  // pb3.Maps.bool_to_uint32:type_name -> pb3.Maps.BoolToUint32Entry
+	10, // pb3.Maps.uint64_to_enum:type_name -> pb3.Maps.Uint64ToEnumEntry
+	11, // pb3.Maps.str_to_nested:type_name -> pb3.Maps.StrToNestedEntry
+	12, // pb3.Maps.str_to_oneofs:type_name -> pb3.Maps.StrToOneofsEntry
+	0,  // pb3.Maps.Uint64ToEnumEntry.value:type_name -> pb3.Enum
+	5,  // pb3.Maps.StrToNestedEntry.value:type_name -> pb3.Nested
+	6,  // pb3.Maps.StrToOneofsEntry.value:type_name -> pb3.Oneofs
+}
+
+func init() {
+	var messageTypes [11]protoreflect.MessageType
+	Test_protoFile = protoimpl.FileBuilder{
+		RawDescriptor:      fileDescriptor_33e0a17922cde063,
+		GoTypes:            xxx_Test_protoFile_goTypes,
+		DependencyIndexes:  xxx_Test_protoFile_depIdxs,
+		EnumOutputTypes:    xxx_Test_protoFile_enumTypes[:],
+		MessageOutputTypes: messageTypes[:],
+	}.Init()
+	messageGoTypes := xxx_Test_protoFile_goTypes[2:][:11]
+	for i, mt := range messageTypes[:] {
+		xxx_Test_protoFile_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+		xxx_Test_protoFile_messageTypes[i].PBType = mt
+	}
+	xxx_Test_protoFile_goTypes = nil
+	xxx_Test_protoFile_depIdxs = nil
+}

+ 20 - 3
encoding/textpb/testprotos/pb3/test.proto → encoding/testprotos/pb3/test.proto

@@ -6,12 +6,11 @@
 syntax = "proto3";
 
 package pb3;
-option go_package = "github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb3";
+option go_package = "github.com/golang/protobuf/v2/encoding/testprotos/pb3";
 
 // Scalars contains scalar field types.
 message Scalars {
   bool s_bool = 1;
-
   int32 s_int32 = 2;
   int64 s_int64 = 3;
   uint32 s_uint32 = 4;
@@ -56,7 +55,7 @@ message Enums {
 
 // Message contains nested message field.
 message Nests {
-  Nested s_nested = 1;
+  Nested s_nested = 2;
 }
 
 // Message type used as submessage.
@@ -64,3 +63,21 @@ message Nested {
   string s_string = 1;
   Nested s_nested = 2;
 }
+
+// Message contains oneof field.
+message Oneofs {
+  oneof union {
+    Enum oneof_enum = 1;
+    string oneof_string = 2;
+    Nested oneof_nested = 3;
+  }
+}
+
+// Message contains map fields.
+message Maps {
+  map<int32, string> int32_to_str = 1;
+  map<bool, uint32> bool_to_uint32 = 2;
+  map<uint64, Enum> uint64_to_enum = 3;
+  map<string, Nested> str_to_nested = 4;
+  map<string, Oneofs> str_to_oneofs = 5;
+}

+ 209 - 150
encoding/textpb/decode_test.go

@@ -21,12 +21,13 @@ import (
 	// TODO: Remove this when protoV1 registers these hooks for you.
 	_ "github.com/golang/protobuf/v2/internal/legacy"
 
-	"github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb2"
-	"github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb3"
+	"github.com/golang/protobuf/v2/encoding/testprotos/pb2"
+	"github.com/golang/protobuf/v2/encoding/testprotos/pb3"
 )
 
 func init() {
-	// TODO: remove this when generated code registers to V2 global registry.
+	// TODO: remove these registerExtension calls when generated code registers
+	// to V2 global registry.
 	registerExtension(pb2.E_OptExtBool)
 	registerExtension(pb2.E_OptExtString)
 	registerExtension(pb2.E_OptExtEnum)
@@ -66,7 +67,7 @@ func TestUnmarshal(t *testing.T) {
 		inputMessage: &pb2.Scalars{},
 		wantMessage:  &pb2.Scalars{},
 	}, {
-		desc:         "proto2 optional scalar fields set to zero values",
+		desc:         "proto2 optional scalars set to zero values",
 		inputMessage: &pb2.Scalars{},
 		inputText: `opt_bool: false
 opt_int32: 0
@@ -102,7 +103,7 @@ opt_string: ""
 			OptString:   scalar.String(""),
 		},
 	}, {
-		desc:         "proto3 scalar fields set to zero values",
+		desc:         "proto3 scalars set to zero values",
 		inputMessage: &pb3.Scalars{},
 		inputText: `s_bool: false
 s_int32: 0
@@ -122,7 +123,7 @@ s_string: ""
 `,
 		wantMessage: &pb3.Scalars{},
 	}, {
-		desc:         "proto2 optional scalar fields",
+		desc:         "proto2 optional scalars",
 		inputMessage: &pb2.Scalars{},
 		inputText: `opt_bool: true
 opt_int32: 255
@@ -154,7 +155,7 @@ opt_string: "谷歌"
 			OptString:   scalar.String("谷歌"),
 		},
 	}, {
-		desc:         "proto3 scalar fields",
+		desc:         "proto3 scalars",
 		inputMessage: &pb3.Scalars{},
 		inputText: `s_bool: true
 s_int32: 255
@@ -261,28 +262,28 @@ s_string: "谷歌"
 		inputText:    "s_sfixed64: bad",
 		wantErr:      true,
 	}, {
-		desc:         "float32 positive infinity",
+		desc:         "float positive infinity",
 		inputMessage: &pb3.Scalars{},
 		inputText:    "s_float: inf",
 		wantMessage: &pb3.Scalars{
 			SFloat: float32(math.Inf(1)),
 		},
 	}, {
-		desc:         "float32 negative infinity",
+		desc:         "float negative infinity",
 		inputMessage: &pb3.Scalars{},
 		inputText:    "s_float: -inf",
 		wantMessage: &pb3.Scalars{
 			SFloat: float32(math.Inf(-1)),
 		},
 	}, {
-		desc:         "float64 positive infinity",
+		desc:         "double positive infinity",
 		inputMessage: &pb3.Scalars{},
 		inputText:    "s_double: inf",
 		wantMessage: &pb3.Scalars{
 			SDouble: math.Inf(1),
 		},
 	}, {
-		desc:         "float64 negative infinity",
+		desc:         "double negative infinity",
 		inputMessage: &pb3.Scalars{},
 		inputText:    "s_double: -inf",
 		wantMessage: &pb3.Scalars{
@@ -314,19 +315,19 @@ opt_bool: false
 `,
 		wantErr: true,
 	}, {
-		desc:         "proto2 invalid singular field",
+		desc:         "proto2 more duplicate singular field",
 		inputMessage: &pb2.Scalars{},
 		inputText: `
-opt_bool: [true, false]
+opt_bool: true
+opt_string: "hello"
+opt_bool: false
 `,
 		wantErr: true,
 	}, {
-		desc:         "proto2 more duplicate singular field",
+		desc:         "proto2 invalid singular field",
 		inputMessage: &pb2.Scalars{},
 		inputText: `
-opt_bool: true
-opt_string: "hello"
-opt_bool: false
+opt_bool: [true, false]
 `,
 		wantErr: true,
 	}, {
@@ -350,22 +351,22 @@ s_bool: true
 		desc:         "proto2 enum",
 		inputMessage: &pb2.Enums{},
 		inputText: `
-opt_enum: FIRST
+opt_enum: ONE
 opt_nested_enum: UNO
 `,
 		wantMessage: &pb2.Enums{
-			OptEnum:       pb2.Enum_FIRST.Enum(),
+			OptEnum:       pb2.Enum_ONE.Enum(),
 			OptNestedEnum: pb2.Enums_UNO.Enum(),
 		},
 	}, {
 		desc:         "proto2 enum set to numeric values",
 		inputMessage: &pb2.Enums{},
 		inputText: `
-opt_enum: 1
+opt_enum: 2
 opt_nested_enum: 2
 `,
 		wantMessage: &pb2.Enums{
-			OptEnum:       pb2.Enum_FIRST.Enum(),
+			OptEnum:       pb2.Enum_TWO.Enum(),
 			OptNestedEnum: pb2.Enums_DOS.Enum(),
 		},
 	}, {
@@ -383,7 +384,7 @@ opt_nested_enum: -101
 		desc:         "proto2 enum set to invalid named",
 		inputMessage: &pb2.Enums{},
 		inputText: `
-opt_enum: UNNAMED 
+opt_enum: UNNAMED
 opt_nested_enum: UNNAMED_TOO
 `,
 		wantErr: true,
@@ -403,11 +404,11 @@ s_nested_enum: DIEZ
 		inputMessage: &pb3.Enums{},
 		inputText: `
 s_enum: 2
-s_nested_enum: 1
+s_nested_enum: 2
 `,
 		wantMessage: &pb3.Enums{
 			SEnum:       pb3.Enum_TWO,
-			SNestedEnum: pb3.Enums_UNO,
+			SNestedEnum: pb3.Enums_DOS,
 		},
 	}, {
 		desc:         "proto3 enum unnamed numeric value",
@@ -477,57 +478,67 @@ s_nested: {
 			},
 		},
 	}, {
-		desc:         "oneof field set to empty string",
-		inputMessage: &pb2.Oneofs{},
-		inputText:    "str: ''",
-		wantMessage: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Str{},
+		desc:         "oneof set to empty string",
+		inputMessage: &pb3.Oneofs{},
+		inputText:    "oneof_string: ''",
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofString{},
 		},
 	}, {
-		desc:         "oneof field set to string",
-		inputMessage: &pb2.Oneofs{},
-		inputText:    "str: 'hello'",
-		wantMessage: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Str{
-				Str: "hello",
+		desc:         "oneof set to string",
+		inputMessage: &pb3.Oneofs{},
+		inputText:    "oneof_string: 'hello'",
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofString{
+				OneofString: "hello",
 			},
 		},
 	}, {
-		desc:         "oneof field set to empty message",
-		inputMessage: &pb2.Oneofs{},
-		inputText:    "msg: {}",
-		wantMessage: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Msg{
-				Msg: &pb2.Nested{},
+		desc:         "oneof set to enum",
+		inputMessage: &pb3.Oneofs{},
+		inputText:    "oneof_enum: TEN",
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofEnum{
+				OneofEnum: pb3.Enum_TEN,
 			},
 		},
 	}, {
-		desc:         "oneof field set to message",
-		inputMessage: &pb2.Oneofs{},
+		desc:         "oneof set to empty message",
+		inputMessage: &pb3.Oneofs{},
+		inputText:    "oneof_nested: {}",
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofNested{
+				OneofNested: &pb3.Nested{},
+			},
+		},
+	}, {
+		desc:         "oneof set to message",
+		inputMessage: &pb3.Oneofs{},
 		inputText: `
-msg: {
-  opt_string: "nested message"
+oneof_nested: {
+  s_string: "nested message"
 }
 `,
-		wantMessage: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Msg{
-				Msg: &pb2.Nested{
-					OptString: scalar.String("nested message"),
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofNested{
+				OneofNested: &pb3.Nested{
+					SString: "nested message",
 				},
 			},
 		},
 	}, {
-		desc:         "oneof field set to last value",
-		inputMessage: &pb2.Oneofs{},
+		desc:         "oneof set to last value",
+		inputMessage: &pb3.Oneofs{},
 		inputText: `
-msg: {
-  opt_string: "nested message"
+oneof_nested: {
+  s_string: "nested message"
 }
-str: "wins"
+oneof_enum: TEN
+oneof_string: "wins"
 `,
-		wantMessage: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Str{
-				Str: "wins",
+		wantMessage: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofString{
+				OneofString: "wins",
 			},
 		},
 	}, {
@@ -564,14 +575,14 @@ rpt_string: "b"
 		desc:         "repeated enums",
 		inputMessage: &pb2.Enums{},
 		inputText: `
-rpt_enum: TENTH
+rpt_enum: TEN
 rpt_enum: 1
 rpt_nested_enum: [DOS, 2]
 rpt_enum: 42
 rpt_nested_enum: -47
 `,
 		wantMessage: &pb2.Enums{
-			RptEnum:       []pb2.Enum{pb2.Enum_TENTH, pb2.Enum_FIRST, 42},
+			RptEnum:       []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
 			RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
 		},
 	}, {
@@ -608,22 +619,22 @@ rpt_nested: {}
 		inputMessage: &pb2.Nests{},
 		inputText: `
 RptGroup: {
-  rpt_bool: true
-  rpt_bool: false
+  rpt_string: "hello"
+  rpt_string: "world"
 }
 RptGroup: {}
 `,
 		wantMessage: &pb2.Nests{
 			Rptgroup: []*pb2.Nests_RptGroup{
 				{
-					RptBool: []bool{true, false},
+					RptString: []string{"hello", "world"},
 				},
 				{},
 			},
 		},
 	}, {
 		desc:         "map fields 1",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: -101
@@ -633,37 +644,25 @@ int32_to_str: {
   key: 0
   value: "zero"
 }
-sfixed64_to_bool: {
-  key: 0
-  value: false
-}
-int32_to_str: {
-  key: 255
-  value: "0xff"
-}
 bool_to_uint32: {
   key: false
   value: 101
 }
-sfixed64_to_bool: {
-  key: 51966
-  value: true
+int32_to_str: {
+  key: 255
+  value: "0xff"
 }
 bool_to_uint32: {
   key: true
   value: 42
 }
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				-101: "-101",
 				0xff: "0xff",
 				0:    "zero",
 			},
-			Sfixed64ToBool: map[int64]bool{
-				0xcafe: true,
-				0:      false,
-			},
 			BoolToUint32: map[bool]uint32{
 				true:  42,
 				false: 101,
@@ -671,76 +670,76 @@ bool_to_uint32: {
 		},
 	}, {
 		desc:         "map fields 2",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 uint64_to_enum: {
   key: 1
-  value: FIRST
+  value: ONE
 }
 uint64_to_enum: {
   key: 2
-  value: SECOND
+  value: 2
 }
 uint64_to_enum: {
   key: 10
-  value: TENTH
+  value: 101
 }
 `,
-		wantMessage: &pb2.Maps{
-			Uint64ToEnum: map[uint64]pb2.Enum{
-				1:  pb2.Enum_FIRST,
-				2:  pb2.Enum_SECOND,
-				10: pb2.Enum_TENTH,
+		wantMessage: &pb3.Maps{
+			Uint64ToEnum: map[uint64]pb3.Enum{
+				1:  pb3.Enum_ONE,
+				2:  pb3.Enum_TWO,
+				10: 101,
 			},
 		},
 	}, {
 		desc:         "map fields 3",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 str_to_nested: {
   key: "nested_one"
   value: {
-    opt_string: "nested in a map"
+    s_string: "nested in a map"
   }
 }
 `,
-		wantMessage: &pb2.Maps{
-			StrToNested: map[string]*pb2.Nested{
-				"nested_one": &pb2.Nested{
-					OptString: scalar.String("nested in a map"),
+		wantMessage: &pb3.Maps{
+			StrToNested: map[string]*pb3.Nested{
+				"nested_one": &pb3.Nested{
+					SString: "nested in a map",
 				},
 			},
 		},
 	}, {
 		desc:         "map fields 4",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 str_to_oneofs: {
   key: "nested"
   value: {
-    msg: {
-      opt_string: "nested oneof in map field value"
+    oneof_nested: {
+      s_string: "nested oneof in map field value"
     }
   }
 }
 str_to_oneofs: {
   key: "string"
   value: {
-    str: "hello"
+    oneof_string: "hello"
   }
 }
 `,
-		wantMessage: &pb2.Maps{
-			StrToOneofs: map[string]*pb2.Oneofs{
-				"string": &pb2.Oneofs{
-					Union: &pb2.Oneofs_Str{
-						Str: "hello",
+		wantMessage: &pb3.Maps{
+			StrToOneofs: map[string]*pb3.Oneofs{
+				"string": &pb3.Oneofs{
+					Union: &pb3.Oneofs_OneofString{
+						OneofString: "hello",
 					},
 				},
-				"nested": &pb2.Oneofs{
-					Union: &pb2.Oneofs_Msg{
-						Msg: &pb2.Nested{
-							OptString: scalar.String("nested oneof in map field value"),
+				"nested": &pb3.Oneofs{
+					Union: &pb3.Oneofs_OneofNested{
+						OneofNested: &pb3.Nested{
+							SString: "nested oneof in map field value",
 						},
 					},
 				},
@@ -748,7 +747,7 @@ str_to_oneofs: {
 		},
 	}, {
 		desc:         "map contains duplicate keys",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 0
@@ -759,14 +758,14 @@ int32_to_str: {
   value: "zero"
 }
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				0: "zero",
 			},
 		},
 	}, {
 		desc:         "map contains duplicate key fields",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 0
@@ -777,7 +776,7 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map contains duplicate value fields",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 1
@@ -788,44 +787,103 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map contains missing key",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   value: "zero"
 }
+bool_to_uint32: {
+  value: 47
+}
+str_to_nested: {
+  value: {}
+}
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				0: "zero",
 			},
+			BoolToUint32: map[bool]uint32{
+				false: 47,
+			},
+			StrToNested: map[string]*pb3.Nested{
+				"": {},
+			},
 		},
 	}, {
 		desc:         "map contains missing value",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 100
 }
+bool_to_uint32: {
+  key: true
+}
+uint64_to_enum: {
+  key: 101
+}
+str_to_nested: {
+  key: "hello"
+}
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				100: "",
 			},
+			BoolToUint32: map[bool]uint32{
+				true: 0,
+			},
+			Uint64ToEnum: map[uint64]pb3.Enum{
+				101: pb3.Enum_ZERO,
+			},
+			StrToNested: map[string]*pb3.Nested{
+				"hello": {},
+			},
 		},
 	}, {
 		desc:         "map contains missing key and value",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
+		inputText: `
+int32_to_str: {}
+bool_to_uint32: {}
+uint64_to_enum: {}
+str_to_nested: {}
+`,
+		wantMessage: &pb3.Maps{
+			Int32ToStr: map[int32]string{
+				0: "",
+			},
+			BoolToUint32: map[bool]uint32{
+				false: 0,
+			},
+			Uint64ToEnum: map[uint64]pb3.Enum{
+				0: pb3.Enum_ZERO,
+			},
+			StrToNested: map[string]*pb3.Nested{
+				"": {},
+			},
+		},
+	}, {
+		desc:         "map contains overriding entries",
+		inputMessage: &pb3.Maps{},
 		inputText: `
+int32_to_str: {
+  key: 0
+}
+int32_to_str: {
+  value: "empty"
+}
 int32_to_str: {}
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				0: "",
 			},
 		},
 	}, {
 		desc:         "map contains unknown field",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 0
@@ -836,7 +894,7 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map contains extension-like key field",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   [key]: 10
@@ -846,7 +904,7 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map contains invalid key",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: "invalid"
@@ -856,7 +914,7 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map contains invalid value",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 100
@@ -866,7 +924,7 @@ int32_to_str: {
 		wantErr: true,
 	}, {
 		desc:         "map using mix of [] and repeated",
-		inputMessage: &pb2.Maps{},
+		inputMessage: &pb3.Maps{},
 		inputText: `
 int32_to_str: {
   key: 1
@@ -889,7 +947,7 @@ int32_to_str: {
   value: "two"
 }
 `,
-		wantMessage: &pb2.Maps{
+		wantMessage: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				0: "",
 				1: "one",
@@ -902,7 +960,7 @@ int32_to_str: {
 		inputMessage: &pb2.Requireds{},
 		wantErr:      true,
 	}, {
-		desc:         "proto2 required field set but not optional",
+		desc:         "proto2 required field set",
 		inputMessage: &pb2.PartialRequired{},
 		inputText:    "req_string: 'this is required'",
 		wantMessage: &pb2.PartialRequired{
@@ -913,17 +971,15 @@ int32_to_str: {
 		inputMessage: &pb2.Requireds{},
 		inputText: `
 req_bool: false
-req_fixed32: 47
 req_sfixed64: 3203386110
 req_string: "hello"
-req_enum: FIRST
+req_enum: ONE
 `,
 		wantMessage: &pb2.Requireds{
 			ReqBool:     scalar.Bool(false),
-			ReqFixed32:  scalar.Uint32(47),
 			ReqSfixed64: scalar.Int64(0xbeefcafe),
 			ReqString:   scalar.String("hello"),
-			ReqEnum:     pb2.Enum_FIRST.Enum(),
+			ReqEnum:     pb2.Enum_ONE.Enum(),
 		},
 		wantErr: true,
 	}, {
@@ -931,28 +987,18 @@ req_enum: FIRST
 		inputMessage: &pb2.Requireds{},
 		inputText: `
 req_bool: false
-req_fixed32: 0
-req_fixed64: 0
-req_sfixed32: 0
 req_sfixed64: 0
-req_float: 0
 req_double: 0
 req_string: ""
-req_bytes: ""
-req_enum: UNKNOWN
+req_enum: ONE
 req_nested: {}
 `,
 		wantMessage: &pb2.Requireds{
 			ReqBool:     scalar.Bool(false),
-			ReqFixed32:  scalar.Uint32(0),
-			ReqFixed64:  scalar.Uint64(0),
-			ReqSfixed32: scalar.Int32(0),
 			ReqSfixed64: scalar.Int64(0),
-			ReqFloat:    scalar.Float32(0),
 			ReqDouble:   scalar.Float64(0),
 			ReqString:   scalar.String(""),
-			ReqEnum:     pb2.Enum_UNKNOWN.Enum(),
-			ReqBytes:    []byte{},
+			ReqEnum:     pb2.Enum_ONE.Enum(),
 			ReqNested:   &pb2.Nested{},
 		},
 	}, {
@@ -1010,6 +1056,17 @@ str_to_nested: {
 			},
 		},
 		wantErr: true,
+	}, {
+		desc:         "indirect required field in oneof",
+		inputMessage: &pb2.IndirectRequired{},
+		inputText: `oneof_nested: {}
+`,
+		wantMessage: &pb2.IndirectRequired{
+			Union: &pb2.IndirectRequired_OneofNested{
+				OneofNested: &pb2.NestedWithRequired{},
+			},
+		},
+		wantErr: true,
 	}, {
 		desc:         "ignore reserved field",
 		inputMessage: &pb2.Nests{},
@@ -1029,7 +1086,7 @@ opt_bool: true
 }
 [pb2.opt_ext_string]: "extension field"
 opt_int32: 42
-[pb2.opt_ext_enum]: TENTH
+[pb2.opt_ext_enum]: TEN
 `,
 		wantMessage: func() proto.Message {
 			m := &pb2.Extensions{
@@ -1039,7 +1096,7 @@ opt_int32: 42
 			}
 			setExtension(m, pb2.E_OptExtBool, true)
 			setExtension(m, pb2.E_OptExtString, "extension field")
-			setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
 			setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
 				OptString: scalar.String("nested in an extension"),
 				OptNested: &pb2.Nested{
@@ -1051,10 +1108,10 @@ opt_int32: 42
 	}, {
 		desc:         "extensions of repeated fields",
 		inputMessage: &pb2.Extensions{},
-		inputText: `[pb2.rpt_ext_enum]: TENTH
+		inputText: `[pb2.rpt_ext_enum]: TEN
 [pb2.rpt_ext_enum]: 101
 [pb2.rpt_ext_fixed32]: 42
-[pb2.rpt_ext_enum]: FIRST
+[pb2.rpt_ext_enum]: ONE
 [pb2.rpt_ext_nested]: {
   opt_string: "one"
 }
@@ -1068,7 +1125,7 @@ opt_int32: 42
 `,
 		wantMessage: func() proto.Message {
 			m := &pb2.Extensions{}
-			setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
 			setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
 			setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
 				&pb2.Nested{OptString: scalar.String("one")},
@@ -1081,7 +1138,7 @@ opt_int32: 42
 		desc:         "extensions of non-repeated fields in another message",
 		inputMessage: &pb2.Extensions{},
 		inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
-[pb2.ExtensionsContainer.opt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.opt_ext_enum]: TEN
 [pb2.ExtensionsContainer.opt_ext_nested]: {
   opt_string: "nested in an extension"
   opt_nested: {
@@ -1094,7 +1151,7 @@ opt_int32: 42
 			m := &pb2.Extensions{}
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
-			setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
 				OptString: scalar.String("nested in an extension"),
 				OptNested: &pb2.Nested{
@@ -1112,13 +1169,13 @@ opt_int32: 42
 [pb2.ExtensionsContainer.rpt_ext_nested]: {
   opt_string: "one"
 }
-[pb2.ExtensionsContainer.rpt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
 [pb2.ExtensionsContainer.rpt_ext_nested]: {
   opt_string: "two"
 }
 [pb2.ExtensionsContainer.rpt_ext_enum]: 101
 [pb2.ExtensionsContainer.rpt_ext_string]: "hello"
-[pb2.ExtensionsContainer.rpt_ext_enum]: FIRST
+[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
 [pb2.ExtensionsContainer.rpt_ext_nested]: {
   opt_string: "three"
 }
@@ -1130,7 +1187,7 @@ opt_int32: 42
 				OptBool:   scalar.Bool(true),
 				OptInt32:  scalar.Int32(42),
 			}
-			setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
 			setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
 			setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
 				&pb2.Nested{OptString: scalar.String("one")},
@@ -1211,6 +1268,8 @@ opt_int32: 42
 			return m
 		}(),
 	}, {
+		// TODO: Change these tests to directly use anypb.Any type instead once
+		// type has been regenerated with V2 compiler.
 		desc:         "Any not expanded",
 		inputMessage: &pb2.KnownTypes{},
 		inputText: `opt_any: {

+ 164 - 171
encoding/textpb/encode_test.go

@@ -29,8 +29,8 @@ import (
 	_ "github.com/golang/protobuf/v2/internal/legacy"
 
 	anypb "github.com/golang/protobuf/ptypes/any"
-	"github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb2"
-	"github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb3"
+	"github.com/golang/protobuf/v2/encoding/testprotos/pb2"
+	"github.com/golang/protobuf/v2/encoding/testprotos/pb3"
 )
 
 func init() {
@@ -67,7 +67,7 @@ func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{})
 	knownFields.Set(wire.Number(xd.Field), pval)
 }
 
-func wrapAnyPB(any *anypb.Any) proto.Message {
+func wrapV1Message(any *anypb.Any) proto.Message {
 	return impl.Export{}.MessageOf(any).Interface()
 }
 
@@ -88,15 +88,15 @@ func TestMarshal(t *testing.T) {
 		want    string
 		wantErr bool
 	}{{
-		desc:  "proto2 optional scalar fields not set",
+		desc:  "proto2 optional scalars not set",
 		input: &pb2.Scalars{},
 		want:  "\n",
 	}, {
-		desc:  "proto3 scalar fields not set",
+		desc:  "proto3 scalars not set",
 		input: &pb3.Scalars{},
 		want:  "\n",
 	}, {
-		desc: "proto2 optional scalar fields set to zero values",
+		desc: "proto2 optional scalars set to zero values",
 		input: &pb2.Scalars{
 			OptBool:     scalar.Bool(false),
 			OptInt32:    scalar.Int32(0),
@@ -131,7 +131,7 @@ opt_bytes: ""
 opt_string: ""
 `,
 	}, {
-		desc: "proto3 scalar fields set to zero values",
+		desc: "proto3 scalars set to zero values",
 		input: &pb3.Scalars{
 			SBool:     false,
 			SInt32:    0,
@@ -151,7 +151,7 @@ opt_string: ""
 		},
 		want: "\n",
 	}, {
-		desc: "proto2 optional scalar fields set to some values",
+		desc: "proto2 optional scalars set to some values",
 		input: &pb2.Scalars{
 			OptBool:     scalar.Bool(true),
 			OptInt32:    scalar.Int32(0xff),
@@ -164,9 +164,8 @@ opt_string: ""
 			OptSfixed32: scalar.Int32(-32),
 			OptFloat:    scalar.Float32(1.02),
 			OptDouble:   scalar.Float64(1.0199999809265137),
-			// TODO: Update encoder to not output UTF8 for bytes.
-			OptBytes:  []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
-			OptString: scalar.String("谷歌"),
+			OptBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
+			OptString:   scalar.String("谷歌"),
 		},
 		want: `opt_bool: true
 opt_int32: 255
@@ -183,53 +182,41 @@ opt_bytes: "谷歌"
 opt_string: "谷歌"
 `,
 	}, {
-		desc: "float32 nan",
+		desc: "float nan",
 		input: &pb3.Scalars{
 			SFloat: float32(math.NaN()),
 		},
 		want: "s_float: nan\n",
 	}, {
-		desc: "float32 positive infinity",
+		desc: "float positive infinity",
 		input: &pb3.Scalars{
 			SFloat: float32(math.Inf(1)),
 		},
 		want: "s_float: inf\n",
 	}, {
-		desc: "float32 negative infinity",
+		desc: "float negative infinity",
 		input: &pb3.Scalars{
 			SFloat: float32(math.Inf(-1)),
 		},
 		want: "s_float: -inf\n",
 	}, {
-		desc: "float64 nan",
+		desc: "double nan",
 		input: &pb3.Scalars{
 			SDouble: math.NaN(),
 		},
 		want: "s_double: nan\n",
 	}, {
-		desc: "float64 positive infinity",
+		desc: "double positive infinity",
 		input: &pb3.Scalars{
 			SDouble: math.Inf(1),
 		},
 		want: "s_double: inf\n",
 	}, {
-		desc: "float64 negative infinity",
+		desc: "double negative infinity",
 		input: &pb3.Scalars{
 			SDouble: math.Inf(-1),
 		},
 		want: "s_double: -inf\n",
-	}, {
-		desc: "proto2 bytes set to empty string",
-		input: &pb2.Scalars{
-			OptBytes: []byte(""),
-		},
-		want: "opt_bytes: \"\"\n",
-	}, {
-		desc: "proto3 bytes set to empty string",
-		input: &pb3.Scalars{
-			SBytes: []byte(""),
-		},
-		want: "\n",
 	}, {
 		desc:  "proto2 enum not set",
 		input: &pb2.Enums{},
@@ -237,28 +224,28 @@ opt_string: "谷歌"
 	}, {
 		desc: "proto2 enum set to zero value",
 		input: &pb2.Enums{
-			OptEnum:       pb2.Enum_UNKNOWN.Enum(),
+			OptEnum:       pb2Enum(0),
 			OptNestedEnum: pb2Enums_NestedEnum(0),
 		},
-		want: `opt_enum: UNKNOWN
+		want: `opt_enum: 0
 opt_nested_enum: 0
 `,
 	}, {
 		desc: "proto2 enum",
 		input: &pb2.Enums{
-			OptEnum:       pb2.Enum_FIRST.Enum(),
+			OptEnum:       pb2.Enum_ONE.Enum(),
 			OptNestedEnum: pb2.Enums_UNO.Enum(),
 		},
-		want: `opt_enum: FIRST
+		want: `opt_enum: ONE
 opt_nested_enum: UNO
 `,
 	}, {
 		desc: "proto2 enum set to numeric values",
 		input: &pb2.Enums{
-			OptEnum:       pb2Enum(1),
+			OptEnum:       pb2Enum(2),
 			OptNestedEnum: pb2Enums_NestedEnum(2),
 		},
-		want: `opt_enum: FIRST
+		want: `opt_enum: TWO
 opt_nested_enum: DOS
 `,
 	}, {
@@ -285,19 +272,19 @@ opt_nested_enum: -101
 		desc: "proto3 enum",
 		input: &pb3.Enums{
 			SEnum:       pb3.Enum_ONE,
-			SNestedEnum: pb3.Enums_DIEZ,
+			SNestedEnum: pb3.Enums_UNO,
 		},
 		want: `s_enum: ONE
-s_nested_enum: DIEZ
+s_nested_enum: UNO
 `,
 	}, {
 		desc: "proto3 enum set to numeric values",
 		input: &pb3.Enums{
 			SEnum:       2,
-			SNestedEnum: 1,
+			SNestedEnum: 2,
 		},
 		want: `s_enum: TWO
-s_nested_enum: UNO
+s_nested_enum: DOS
 `,
 	}, {
 		desc: "proto3 enum set to unnamed numeric values",
@@ -339,27 +326,25 @@ OptGroup: {}
 }
 `,
 	}, {
-		desc: "proto2 group fields",
+		desc: "proto2 groups",
 		input: &pb2.Nests{
 			Optgroup: &pb2.Nests_OptGroup{
-				OptBool:   scalar.Bool(true),
 				OptString: scalar.String("inside a group"),
 				OptNested: &pb2.Nested{
 					OptString: scalar.String("nested message inside a group"),
 				},
 				Optnestedgroup: &pb2.Nests_OptGroup_OptNestedGroup{
-					OptEnum: pb2.Enum_TENTH.Enum(),
+					OptFixed32: scalar.Uint32(47),
 				},
 			},
 		},
 		want: `OptGroup: {
-  opt_bool: true
   opt_string: "inside a group"
   opt_nested: {
     opt_string: "nested message inside a group"
   }
   OptNestedGroup: {
-    opt_enum: TENTH
+    opt_fixed32: 47
   }
 }
 `,
@@ -367,6 +352,12 @@ OptGroup: {}
 		desc:  "proto3 nested message not set",
 		input: &pb3.Nests{},
 		want:  "\n",
+	}, {
+		desc: "proto3 nested message set to empty",
+		input: &pb3.Nests{
+			SNested: &pb3.Nested{},
+		},
+		want: "s_nested: {}\n",
 	}, {
 		desc: "proto3 nested message",
 		input: &pb3.Nests{
@@ -385,50 +376,61 @@ OptGroup: {}
 }
 `,
 	}, {
-		desc:  "oneof fields",
-		input: &pb2.Oneofs{},
+		desc:  "oneof not set",
+		input: &pb3.Oneofs{},
 		want:  "\n",
 	}, {
-		desc: "oneof field set to empty string",
-		input: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Str{},
+		desc: "oneof set to empty string",
+		input: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofString{},
+		},
+		want: `oneof_string: ""
+`,
+	}, {
+		desc: "oneof set to string",
+		input: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofString{
+				OneofString: "hello",
+			},
 		},
-		want: "str: \"\"\n",
+		want: `oneof_string: "hello"
+`,
 	}, {
-		desc: "oneof field set to string",
-		input: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Str{
-				Str: "hello",
+		desc: "oneof set to enum",
+		input: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofEnum{
+				OneofEnum: pb3.Enum_ZERO,
 			},
 		},
-		want: "str: \"hello\"\n",
+		want: `oneof_enum: ZERO
+`,
 	}, {
-		desc: "oneof field set to empty message",
-		input: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Msg{
-				Msg: &pb2.Nested{},
+		desc: "oneof set to empty message",
+		input: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofNested{
+				OneofNested: &pb3.Nested{},
 			},
 		},
-		want: "msg: {}\n",
+		want: "oneof_nested: {}\n",
 	}, {
-		desc: "oneof field set to message",
-		input: &pb2.Oneofs{
-			Union: &pb2.Oneofs_Msg{
-				Msg: &pb2.Nested{
-					OptString: scalar.String("nested message"),
+		desc: "oneof set to message",
+		input: &pb3.Oneofs{
+			Union: &pb3.Oneofs_OneofNested{
+				OneofNested: &pb3.Nested{
+					SString: "nested message",
 				},
 			},
 		},
-		want: `msg: {
-  opt_string: "nested message"
+		want: `oneof_nested: {
+  s_string: "nested message"
 }
 `,
 	}, {
-		desc:  "repeated not set",
+		desc:  "repeated fields not set",
 		input: &pb2.Repeats{},
 		want:  "\n",
 	}, {
-		desc: "repeated set to empty slices",
+		desc: "repeated fields set to empty slices",
 		input: &pb2.Repeats{
 			RptBool:   []bool{},
 			RptInt32:  []int32{},
@@ -441,7 +443,7 @@ OptGroup: {}
 		},
 		want: "\n",
 	}, {
-		desc: "repeated set to some values",
+		desc: "repeated fields set to some values",
 		input: &pb2.Repeats{
 			RptBool:   []bool{true, false, true, true},
 			RptInt32:  []int32{1, 6, 0, 0},
@@ -483,28 +485,28 @@ rpt_bytes: "hello"
 rpt_bytes: "世界"
 `,
 	}, {
-		desc: "repeated enum",
+		desc: "repeated enums",
 		input: &pb2.Enums{
-			RptEnum:       []pb2.Enum{pb2.Enum_FIRST, 2, pb2.Enum_TENTH, 42},
+			RptEnum:       []pb2.Enum{pb2.Enum_ONE, 2, pb2.Enum_TEN, 42},
 			RptNestedEnum: []pb2.Enums_NestedEnum{2, 47, 10},
 		},
-		want: `rpt_enum: FIRST
-rpt_enum: SECOND
-rpt_enum: TENTH
+		want: `rpt_enum: ONE
+rpt_enum: TWO
+rpt_enum: TEN
 rpt_enum: 42
 rpt_nested_enum: DOS
 rpt_nested_enum: 47
 rpt_nested_enum: DIEZ
 `,
 	}, {
-		desc: "repeated nested message set to empty",
+		desc: "repeated messages set to empty",
 		input: &pb2.Nests{
 			RptNested: []*pb2.Nested{},
 			Rptgroup:  []*pb2.Nests_RptGroup{},
 		},
 		want: "\n",
 	}, {
-		desc: "repeated nested messages",
+		desc: "repeated messages",
 		input: &pb2.Nests{
 			RptNested: []*pb2.Nested{
 				{
@@ -531,7 +533,7 @@ rpt_nested: {
 rpt_nested: {}
 `,
 	}, {
-		desc: "repeated nested messages contains nil value",
+		desc: "repeated messages contains nil value",
 		input: &pb2.Nests{
 			RptNested: []*pb2.Nested{nil, {}},
 		},
@@ -539,48 +541,45 @@ rpt_nested: {}
 rpt_nested: {}
 `,
 	}, {
-		desc: "repeated group fields",
+		desc: "repeated groups",
 		input: &pb2.Nests{
 			Rptgroup: []*pb2.Nests_RptGroup{
 				{
-					RptBool: []bool{true, false},
+					RptString: []string{"hello", "world"},
 				},
 				{},
+				nil,
 			},
 		},
 		want: `RptGroup: {
-  rpt_bool: true
-  rpt_bool: false
+  rpt_string: "hello"
+  rpt_string: "world"
 }
 RptGroup: {}
+RptGroup: {}
 `,
 	}, {
-		desc:  "map fields empty",
-		input: &pb2.Maps{},
+		desc:  "map fields not set",
+		input: &pb3.Maps{},
 		want:  "\n",
 	}, {
-		desc: "map fields set to empty maps",
-		input: &pb2.Maps{
-			Int32ToStr:     map[int32]string{},
-			Sfixed64ToBool: map[int64]bool{},
-			BoolToUint32:   map[bool]uint32{},
-			Uint64ToEnum:   map[uint64]pb2.Enum{},
-			StrToNested:    map[string]*pb2.Nested{},
-			StrToOneofs:    map[string]*pb2.Oneofs{},
+		desc: "map fields set to empty",
+		input: &pb3.Maps{
+			Int32ToStr:   map[int32]string{},
+			BoolToUint32: map[bool]uint32{},
+			Uint64ToEnum: map[uint64]pb3.Enum{},
+			StrToNested:  map[string]*pb3.Nested{},
+			StrToOneofs:  map[string]*pb3.Oneofs{},
 		},
 		want: "\n",
 	}, {
 		desc: "map fields 1",
-		input: &pb2.Maps{
+		input: &pb3.Maps{
 			Int32ToStr: map[int32]string{
 				-101: "-101",
 				0xff: "0xff",
 				0:    "zero",
 			},
-			Sfixed64ToBool: map[int64]bool{
-				0xcafe: true,
-				0:      false,
-			},
 			BoolToUint32: map[bool]uint32{
 				true:  42,
 				false: 101,
@@ -598,14 +597,6 @@ int32_to_str: {
   key: 255
   value: "0xff"
 }
-sfixed64_to_bool: {
-  key: 0
-  value: false
-}
-sfixed64_to_bool: {
-  key: 51966
-  value: true
-}
 bool_to_uint32: {
   key: false
   value: 101
@@ -617,55 +608,60 @@ bool_to_uint32: {
 `,
 	}, {
 		desc: "map fields 2",
-		input: &pb2.Maps{
-			Uint64ToEnum: map[uint64]pb2.Enum{
-				1:  pb2.Enum_FIRST,
-				2:  pb2.Enum_SECOND,
-				10: pb2.Enum_TENTH,
+		input: &pb3.Maps{
+			Uint64ToEnum: map[uint64]pb3.Enum{
+				1:  pb3.Enum_ONE,
+				2:  pb3.Enum_TWO,
+				10: pb3.Enum_TEN,
+				47: 47,
 			},
 		},
 		want: `uint64_to_enum: {
   key: 1
-  value: FIRST
+  value: ONE
 }
 uint64_to_enum: {
   key: 2
-  value: SECOND
+  value: TWO
 }
 uint64_to_enum: {
   key: 10
-  value: TENTH
+  value: TEN
+}
+uint64_to_enum: {
+  key: 47
+  value: 47
 }
 `,
 	}, {
 		desc: "map fields 3",
-		input: &pb2.Maps{
-			StrToNested: map[string]*pb2.Nested{
-				"nested_one": &pb2.Nested{
-					OptString: scalar.String("nested in a map"),
+		input: &pb3.Maps{
+			StrToNested: map[string]*pb3.Nested{
+				"nested": &pb3.Nested{
+					SString: "nested in a map",
 				},
 			},
 		},
 		want: `str_to_nested: {
-  key: "nested_one"
+  key: "nested"
   value: {
-    opt_string: "nested in a map"
+    s_string: "nested in a map"
   }
 }
 `,
 	}, {
 		desc: "map fields 4",
-		input: &pb2.Maps{
-			StrToOneofs: map[string]*pb2.Oneofs{
-				"string": &pb2.Oneofs{
-					Union: &pb2.Oneofs_Str{
-						Str: "hello",
+		input: &pb3.Maps{
+			StrToOneofs: map[string]*pb3.Oneofs{
+				"string": &pb3.Oneofs{
+					Union: &pb3.Oneofs_OneofString{
+						OneofString: "hello",
 					},
 				},
-				"nested": &pb2.Oneofs{
-					Union: &pb2.Oneofs_Msg{
-						Msg: &pb2.Nested{
-							OptString: scalar.String("nested oneof in map field value"),
+				"nested": &pb3.Oneofs{
+					Union: &pb3.Oneofs_OneofNested{
+						OneofNested: &pb3.Nested{
+							SString: "nested oneof in map field value",
 						},
 					},
 				},
@@ -674,22 +670,22 @@ uint64_to_enum: {
 		want: `str_to_oneofs: {
   key: "nested"
   value: {
-    msg: {
-      opt_string: "nested oneof in map field value"
+    oneof_nested: {
+      s_string: "nested oneof in map field value"
     }
   }
 }
 str_to_oneofs: {
   key: "string"
   value: {
-    str: "hello"
+    oneof_string: "hello"
   }
 }
 `,
 	}, {
-		desc: "map field nil message value",
-		input: &pb2.Maps{
-			StrToNested: map[string]*pb2.Nested{
+		desc: "map field contains nil value",
+		input: &pb3.Maps{
+			StrToNested: map[string]*pb3.Nested{
 				"nil": nil,
 			},
 		},
@@ -707,45 +703,33 @@ str_to_oneofs: {
 		desc: "proto2 required fields partially set",
 		input: &pb2.Requireds{
 			ReqBool:     scalar.Bool(false),
-			ReqFixed32:  scalar.Uint32(47),
 			ReqSfixed64: scalar.Int64(0xbeefcafe),
 			ReqDouble:   scalar.Float64(math.NaN()),
 			ReqString:   scalar.String("hello"),
-			ReqEnum:     pb2.Enum_FIRST.Enum(),
+			ReqEnum:     pb2.Enum_ONE.Enum(),
 		},
 		want: `req_bool: false
-req_fixed32: 47
 req_sfixed64: 3203386110
 req_double: nan
 req_string: "hello"
-req_enum: FIRST
+req_enum: ONE
 `,
 		wantErr: true,
 	}, {
 		desc: "proto2 required fields all set",
 		input: &pb2.Requireds{
 			ReqBool:     scalar.Bool(false),
-			ReqFixed32:  scalar.Uint32(0),
-			ReqFixed64:  scalar.Uint64(0),
-			ReqSfixed32: scalar.Int32(0),
 			ReqSfixed64: scalar.Int64(0),
-			ReqFloat:    scalar.Float32(0),
-			ReqDouble:   scalar.Float64(0),
+			ReqDouble:   scalar.Float64(1.23),
 			ReqString:   scalar.String(""),
-			ReqEnum:     pb2.Enum_UNKNOWN.Enum(),
-			ReqBytes:    []byte{},
+			ReqEnum:     pb2.Enum_ONE.Enum(),
 			ReqNested:   &pb2.Nested{},
 		},
 		want: `req_bool: false
-req_fixed32: 0
-req_fixed64: 0
-req_sfixed32: 0
 req_sfixed64: 0
-req_float: 0
-req_double: 0
+req_double: 1.23
 req_string: ""
-req_bytes: ""
-req_enum: UNKNOWN
+req_enum: ONE
 req_nested: {}
 `,
 	}, {
@@ -789,6 +773,15 @@ req_nested: {}
 }
 `,
 		wantErr: true,
+	}, {
+		desc: "indirect required field in oneof",
+		input: &pb2.IndirectRequired{
+			Union: &pb2.IndirectRequired_OneofNested{
+				OneofNested: &pb2.NestedWithRequired{},
+			},
+		},
+		want:    "oneof_nested: {}\n",
+		wantErr: true,
 	}, {
 		desc: "unknown varint and fixed types",
 		input: &pb2.Scalars{
@@ -861,7 +854,7 @@ req_nested: {}
 			}
 			setExtension(m, pb2.E_OptExtBool, true)
 			setExtension(m, pb2.E_OptExtString, "extension field")
-			setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
 			setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
 				OptString: scalar.String("nested in an extension"),
 				OptNested: &pb2.Nested{
@@ -874,7 +867,7 @@ req_nested: {}
 opt_bool: true
 opt_int32: 42
 [pb2.opt_ext_bool]: true
-[pb2.opt_ext_enum]: TENTH
+[pb2.opt_ext_enum]: TEN
 [pb2.opt_ext_nested]: {
   opt_string: "nested in an extension"
   opt_nested: {
@@ -884,7 +877,7 @@ opt_int32: 42
 [pb2.opt_ext_string]: "extension field"
 `,
 	}, {
-		desc: "registered extension but not set",
+		desc: "extension message field set to nil",
 		input: func() proto.Message {
 			m := &pb2.Extensions{}
 			setExtension(m, pb2.E_OptExtNested, nil)
@@ -895,7 +888,7 @@ opt_int32: 42
 		desc: "extensions of repeated fields",
 		input: func() proto.Message {
 			m := &pb2.Extensions{}
-			setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
 			setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
 			setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
 				&pb2.Nested{OptString: scalar.String("one")},
@@ -904,9 +897,9 @@ opt_int32: 42
 			})
 			return m
 		}(),
-		want: `[pb2.rpt_ext_enum]: TENTH
+		want: `[pb2.rpt_ext_enum]: TEN
 [pb2.rpt_ext_enum]: 101
-[pb2.rpt_ext_enum]: FIRST
+[pb2.rpt_ext_enum]: ONE
 [pb2.rpt_ext_fixed32]: 42
 [pb2.rpt_ext_fixed32]: 47
 [pb2.rpt_ext_nested]: {
@@ -925,7 +918,7 @@ opt_int32: 42
 			m := &pb2.Extensions{}
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
-			setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
 			setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
 				OptString: scalar.String("nested in an extension"),
 				OptNested: &pb2.Nested{
@@ -935,7 +928,7 @@ opt_int32: 42
 			return m
 		}(),
 		want: `[pb2.ExtensionsContainer.opt_ext_bool]: true
-[pb2.ExtensionsContainer.opt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.opt_ext_enum]: TEN
 [pb2.ExtensionsContainer.opt_ext_nested]: {
   opt_string: "nested in an extension"
   opt_nested: {
@@ -952,7 +945,7 @@ opt_int32: 42
 				OptBool:   scalar.Bool(true),
 				OptInt32:  scalar.Int32(42),
 			}
-			setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
 			setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
 			setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
 				&pb2.Nested{OptString: scalar.String("one")},
@@ -964,9 +957,9 @@ opt_int32: 42
 		want: `opt_string: "non-extension field"
 opt_bool: true
 opt_int32: 42
-[pb2.ExtensionsContainer.rpt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
 [pb2.ExtensionsContainer.rpt_ext_enum]: 101
-[pb2.ExtensionsContainer.rpt_ext_enum]: FIRST
+[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
 [pb2.ExtensionsContainer.rpt_ext_nested]: {
   opt_string: "one"
 }
@@ -1031,7 +1024,7 @@ opt_int32: 42
 }
 `,
 	}, {
-		desc: "Any message not expanded",
+		desc: "Any not expanded",
 		mo: textpb.MarshalOptions{
 			Resolver: preg.NewTypes(),
 		},
@@ -1047,7 +1040,7 @@ opt_int32: 42
 			if err != nil {
 				t.Fatalf("error in binary marshaling message for Any.value: %v", err)
 			}
-			return wrapAnyPB(&anypb.Any{
+			return wrapV1Message(&anypb.Any{
 				TypeUrl: "pb2.Nested",
 				Value:   b,
 			})
@@ -1056,7 +1049,7 @@ opt_int32: 42
 value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
 `,
 	}, {
-		desc: "Any message expanded",
+		desc: "Any expanded",
 		mo: textpb.MarshalOptions{
 			Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
 		},
@@ -1072,7 +1065,7 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
 			if err != nil {
 				t.Fatalf("error in binary marshaling message for Any.value: %v", err)
 			}
-			return wrapAnyPB(&anypb.Any{
+			return wrapV1Message(&anypb.Any{
 				TypeUrl: "foo/pb2.Nested",
 				Value:   b,
 			})
@@ -1085,7 +1078,7 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
 }
 `,
 	}, {
-		desc: "Any message expanded with missing required error",
+		desc: "Any expanded with missing required error",
 		mo: textpb.MarshalOptions{
 			Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
 		},
@@ -1099,7 +1092,7 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
 			if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
 				t.Fatalf("error in binary marshaling message for Any.value: %v", err)
 			}
-			return wrapAnyPB(&anypb.Any{
+			return wrapV1Message(&anypb.Any{
 				TypeUrl: string(m.ProtoReflect().Type().FullName()),
 				Value:   b,
 			})
@@ -1110,11 +1103,11 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
 `,
 		wantErr: true,
 	}, {
-		desc: "Any message with invalid value",
+		desc: "Any with invalid value",
 		mo: textpb.MarshalOptions{
 			Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
 		},
-		input: wrapAnyPB(&anypb.Any{
+		input: wrapV1Message(&anypb.Any{
 			TypeUrl: "foo/pb2.Nested",
 			Value:   dhex("80"),
 		}),

+ 3 - 3
encoding/textpb/other_test.go

@@ -5,15 +5,14 @@ import (
 
 	protoV1 "github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/v2/encoding/textpb"
-	"github.com/golang/protobuf/v2/encoding/textpb/testprotos/pb2"
+	"github.com/golang/protobuf/v2/internal/impl"
+	"github.com/golang/protobuf/v2/internal/scalar"
 	"github.com/golang/protobuf/v2/proto"
 	preg "github.com/golang/protobuf/v2/reflect/protoregistry"
 
 	// The legacy package must be imported prior to use of any legacy messages.
 	// TODO: Remove this when protoV1 registers these hooks for you.
-	"github.com/golang/protobuf/v2/internal/impl"
 	_ "github.com/golang/protobuf/v2/internal/legacy"
-	"github.com/golang/protobuf/v2/internal/scalar"
 
 	anypb "github.com/golang/protobuf/ptypes/any"
 	durpb "github.com/golang/protobuf/ptypes/duration"
@@ -21,6 +20,7 @@ import (
 	stpb "github.com/golang/protobuf/ptypes/struct"
 	tspb "github.com/golang/protobuf/ptypes/timestamp"
 	wpb "github.com/golang/protobuf/ptypes/wrappers"
+	"github.com/golang/protobuf/v2/encoding/testprotos/pb2"
 )
 
 func TestRoundTrip(t *testing.T) {

+ 0 - 510
encoding/textpb/testprotos/pb3/test.pb.go

@@ -1,510 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: encoding/textpb/testprotos/pb3/test.proto
-
-package pb3
-
-import (
-	bytes "bytes"
-	gzip "compress/gzip"
-	proto "github.com/golang/protobuf/proto"
-	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
-	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
-	reflect "reflect"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-type Enum int32
-
-const (
-	Enum_ZERO Enum = 0
-	Enum_ONE  Enum = 1
-	Enum_TWO  Enum = 2
-	Enum_TEN  Enum = 10
-)
-
-func (e Enum) Type() protoreflect.EnumType {
-	return xxx_Test_protoFile_enumTypes[0]
-}
-func (e Enum) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(e)
-}
-
-var Enum_name = map[int32]string{
-	0:  "ZERO",
-	1:  "ONE",
-	2:  "TWO",
-	10: "TEN",
-}
-
-var Enum_value = map[string]int32{
-	"ZERO": 0,
-	"ONE":  1,
-	"TWO":  2,
-	"TEN":  10,
-}
-
-func (x Enum) String() string {
-	return proto.EnumName(Enum_name, int32(x))
-}
-
-func (Enum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{0}
-}
-
-type Enums_NestedEnum int32
-
-const (
-	Enums_CERO Enums_NestedEnum = 0
-	Enums_UNO  Enums_NestedEnum = 1
-	Enums_DOS  Enums_NestedEnum = 2
-	Enums_DIEZ Enums_NestedEnum = 10
-)
-
-func (e Enums_NestedEnum) Type() protoreflect.EnumType {
-	return xxx_Test_protoFile_enumTypes[1]
-}
-func (e Enums_NestedEnum) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(e)
-}
-
-var Enums_NestedEnum_name = map[int32]string{
-	0:  "CERO",
-	1:  "UNO",
-	2:  "DOS",
-	10: "DIEZ",
-}
-
-var Enums_NestedEnum_value = map[string]int32{
-	"CERO": 0,
-	"UNO":  1,
-	"DOS":  2,
-	"DIEZ": 10,
-}
-
-func (x Enums_NestedEnum) String() string {
-	return proto.EnumName(Enums_NestedEnum_name, int32(x))
-}
-
-func (Enums_NestedEnum) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{1, 0}
-}
-
-// Scalars contains scalar field types.
-type Scalars struct {
-	SBool                bool     `protobuf:"varint,1,opt,name=s_bool,json=sBool,proto3" json:"s_bool,omitempty"`
-	SInt32               int32    `protobuf:"varint,2,opt,name=s_int32,json=sInt32,proto3" json:"s_int32,omitempty"`
-	SInt64               int64    `protobuf:"varint,3,opt,name=s_int64,json=sInt64,proto3" json:"s_int64,omitempty"`
-	SUint32              uint32   `protobuf:"varint,4,opt,name=s_uint32,json=sUint32,proto3" json:"s_uint32,omitempty"`
-	SUint64              uint64   `protobuf:"varint,5,opt,name=s_uint64,json=sUint64,proto3" json:"s_uint64,omitempty"`
-	SSint32              int32    `protobuf:"zigzag32,6,opt,name=s_sint32,json=sSint32,proto3" json:"s_sint32,omitempty"`
-	SSint64              int64    `protobuf:"zigzag64,7,opt,name=s_sint64,json=sSint64,proto3" json:"s_sint64,omitempty"`
-	SFixed32             uint32   `protobuf:"fixed32,8,opt,name=s_fixed32,json=sFixed32,proto3" json:"s_fixed32,omitempty"`
-	SFixed64             uint64   `protobuf:"fixed64,9,opt,name=s_fixed64,json=sFixed64,proto3" json:"s_fixed64,omitempty"`
-	SSfixed32            int32    `protobuf:"fixed32,10,opt,name=s_sfixed32,json=sSfixed32,proto3" json:"s_sfixed32,omitempty"`
-	SSfixed64            int64    `protobuf:"fixed64,11,opt,name=s_sfixed64,json=sSfixed64,proto3" json:"s_sfixed64,omitempty"`
-	SFloat               float32  `protobuf:"fixed32,20,opt,name=s_float,json=sFloat,proto3" json:"s_float,omitempty"`
-	SDouble              float64  `protobuf:"fixed64,21,opt,name=s_double,json=sDouble,proto3" json:"s_double,omitempty"`
-	SBytes               []byte   `protobuf:"bytes,14,opt,name=s_bytes,json=sBytes,proto3" json:"s_bytes,omitempty"`
-	SString              string   `protobuf:"bytes,13,opt,name=s_string,json=sString,proto3" json:"s_string,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Scalars) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[0].MessageOf(m)
-}
-func (m *Scalars) Reset()         { *m = Scalars{} }
-func (m *Scalars) String() string { return proto.CompactTextString(m) }
-func (*Scalars) ProtoMessage()    {}
-func (*Scalars) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{0}
-}
-
-func (m *Scalars) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Scalars.Unmarshal(m, b)
-}
-func (m *Scalars) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Scalars.Marshal(b, m, deterministic)
-}
-func (m *Scalars) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Scalars.Merge(m, src)
-}
-func (m *Scalars) XXX_Size() int {
-	return xxx_messageInfo_Scalars.Size(m)
-}
-func (m *Scalars) XXX_DiscardUnknown() {
-	xxx_messageInfo_Scalars.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Scalars proto.InternalMessageInfo
-
-func (m *Scalars) GetSBool() bool {
-	if m != nil {
-		return m.SBool
-	}
-	return false
-}
-
-func (m *Scalars) GetSInt32() int32 {
-	if m != nil {
-		return m.SInt32
-	}
-	return 0
-}
-
-func (m *Scalars) GetSInt64() int64 {
-	if m != nil {
-		return m.SInt64
-	}
-	return 0
-}
-
-func (m *Scalars) GetSUint32() uint32 {
-	if m != nil {
-		return m.SUint32
-	}
-	return 0
-}
-
-func (m *Scalars) GetSUint64() uint64 {
-	if m != nil {
-		return m.SUint64
-	}
-	return 0
-}
-
-func (m *Scalars) GetSSint32() int32 {
-	if m != nil {
-		return m.SSint32
-	}
-	return 0
-}
-
-func (m *Scalars) GetSSint64() int64 {
-	if m != nil {
-		return m.SSint64
-	}
-	return 0
-}
-
-func (m *Scalars) GetSFixed32() uint32 {
-	if m != nil {
-		return m.SFixed32
-	}
-	return 0
-}
-
-func (m *Scalars) GetSFixed64() uint64 {
-	if m != nil {
-		return m.SFixed64
-	}
-	return 0
-}
-
-func (m *Scalars) GetSSfixed32() int32 {
-	if m != nil {
-		return m.SSfixed32
-	}
-	return 0
-}
-
-func (m *Scalars) GetSSfixed64() int64 {
-	if m != nil {
-		return m.SSfixed64
-	}
-	return 0
-}
-
-func (m *Scalars) GetSFloat() float32 {
-	if m != nil {
-		return m.SFloat
-	}
-	return 0
-}
-
-func (m *Scalars) GetSDouble() float64 {
-	if m != nil {
-		return m.SDouble
-	}
-	return 0
-}
-
-func (m *Scalars) GetSBytes() []byte {
-	if m != nil {
-		return m.SBytes
-	}
-	return nil
-}
-
-func (m *Scalars) GetSString() string {
-	if m != nil {
-		return m.SString
-	}
-	return ""
-}
-
-// Message contains enum fields.
-type Enums struct {
-	SEnum                Enum             `protobuf:"varint,1,opt,name=s_enum,json=sEnum,proto3,enum=pb3.Enum" json:"s_enum,omitempty"`
-	SNestedEnum          Enums_NestedEnum `protobuf:"varint,3,opt,name=s_nested_enum,json=sNestedEnum,proto3,enum=pb3.Enums_NestedEnum" json:"s_nested_enum,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
-}
-
-func (m *Enums) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[1].MessageOf(m)
-}
-func (m *Enums) Reset()         { *m = Enums{} }
-func (m *Enums) String() string { return proto.CompactTextString(m) }
-func (*Enums) ProtoMessage()    {}
-func (*Enums) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{1}
-}
-
-func (m *Enums) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Enums.Unmarshal(m, b)
-}
-func (m *Enums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Enums.Marshal(b, m, deterministic)
-}
-func (m *Enums) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Enums.Merge(m, src)
-}
-func (m *Enums) XXX_Size() int {
-	return xxx_messageInfo_Enums.Size(m)
-}
-func (m *Enums) XXX_DiscardUnknown() {
-	xxx_messageInfo_Enums.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Enums proto.InternalMessageInfo
-
-func (m *Enums) GetSEnum() Enum {
-	if m != nil {
-		return m.SEnum
-	}
-	return Enum_ZERO
-}
-
-func (m *Enums) GetSNestedEnum() Enums_NestedEnum {
-	if m != nil {
-		return m.SNestedEnum
-	}
-	return Enums_CERO
-}
-
-// Message contains nested message field.
-type Nests struct {
-	SNested              *Nested  `protobuf:"bytes,1,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Nests) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[2].MessageOf(m)
-}
-func (m *Nests) Reset()         { *m = Nests{} }
-func (m *Nests) String() string { return proto.CompactTextString(m) }
-func (*Nests) ProtoMessage()    {}
-func (*Nests) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{2}
-}
-
-func (m *Nests) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nests.Unmarshal(m, b)
-}
-func (m *Nests) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nests.Marshal(b, m, deterministic)
-}
-func (m *Nests) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nests.Merge(m, src)
-}
-func (m *Nests) XXX_Size() int {
-	return xxx_messageInfo_Nests.Size(m)
-}
-func (m *Nests) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nests.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nests proto.InternalMessageInfo
-
-func (m *Nests) GetSNested() *Nested {
-	if m != nil {
-		return m.SNested
-	}
-	return nil
-}
-
-// Message type used as submessage.
-type Nested struct {
-	SString              string   `protobuf:"bytes,1,opt,name=s_string,json=sString,proto3" json:"s_string,omitempty"`
-	SNested              *Nested  `protobuf:"bytes,2,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Nested) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[3].MessageOf(m)
-}
-func (m *Nested) Reset()         { *m = Nested{} }
-func (m *Nested) String() string { return proto.CompactTextString(m) }
-func (*Nested) ProtoMessage()    {}
-func (*Nested) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0854715c5b41c422_gzipped, []int{3}
-}
-
-func (m *Nested) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Nested.Unmarshal(m, b)
-}
-func (m *Nested) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Nested.Marshal(b, m, deterministic)
-}
-func (m *Nested) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Nested.Merge(m, src)
-}
-func (m *Nested) XXX_Size() int {
-	return xxx_messageInfo_Nested.Size(m)
-}
-func (m *Nested) XXX_DiscardUnknown() {
-	xxx_messageInfo_Nested.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Nested proto.InternalMessageInfo
-
-func (m *Nested) GetSString() string {
-	if m != nil {
-		return m.SString
-	}
-	return ""
-}
-
-func (m *Nested) GetSNested() *Nested {
-	if m != nil {
-		return m.SNested
-	}
-	return nil
-}
-
-func init() {
-	proto.RegisterFile("encoding/textpb/testprotos/pb3/test.proto", fileDescriptor_0854715c5b41c422_gzipped)
-	proto.RegisterEnum("pb3.Enum", Enum_name, Enum_value)
-	proto.RegisterEnum("pb3.Enums_NestedEnum", Enums_NestedEnum_name, Enums_NestedEnum_value)
-	proto.RegisterType((*Scalars)(nil), "pb3.Scalars")
-	proto.RegisterType((*Enums)(nil), "pb3.Enums")
-	proto.RegisterType((*Nests)(nil), "pb3.Nests")
-	proto.RegisterType((*Nested)(nil), "pb3.Nested")
-}
-
-var fileDescriptor_0854715c5b41c422 = []byte{
-	// 863 bytes of the wire-encoded FileDescriptorProto
-	0x0a, 0x29, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x70,
-	0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x33,
-	0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x70, 0x62, 0x33,
-	0x22, 0x9e, 0x03, 0x0a, 0x07, 0x53, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06,
-	0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x42,
-	0x6f, 0x6f, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x17, 0x0a, 0x07,
-	0x73, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73,
-	0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33,
-	0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32,
-	0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01,
-	0x28, 0x04, 0x52, 0x07, 0x73, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x19, 0x0a, 0x08, 0x73,
-	0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x06, 0x20, 0x01, 0x28, 0x11, 0x52, 0x07, 0x73,
-	0x53, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x74,
-	0x36, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x12, 0x52, 0x07, 0x73, 0x53, 0x69, 0x6e, 0x74, 0x36,
-	0x34, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x07, 0x52, 0x08, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x1b,
-	0x0a, 0x09, 0x73, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x09, 0x20, 0x01, 0x28,
-	0x06, 0x52, 0x08, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x1d, 0x0a, 0x0a, 0x73,
-	0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0f, 0x52,
-	0x09, 0x73, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x5f,
-	0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x10, 0x52, 0x09,
-	0x73, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x5f, 0x66,
-	0x6c, 0x6f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x73, 0x46, 0x6c, 0x6f,
-	0x61, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x15,
-	0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x73, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x17, 0x0a,
-	0x07, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06,
-	0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69,
-	0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e,
-	0x67, 0x22, 0x98, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x06, 0x73,
-	0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70, 0x62,
-	0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x39, 0x0a,
-	0x0d, 0x73, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73,
-	0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0b, 0x73, 0x4e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x32, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x45, 0x52, 0x4f, 0x10, 0x00,
-	0x12, 0x07, 0x0a, 0x03, 0x55, 0x4e, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, 0x53,
-	0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x49, 0x45, 0x5a, 0x10, 0x0a, 0x22, 0x2f, 0x0a, 0x05,
-	0x4e, 0x65, 0x73, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x08, 0x73, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x52, 0x07, 0x73, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x4b, 0x0a,
-	0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x74, 0x72,
-	0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x53, 0x74, 0x72, 0x69,
-	0x6e, 0x67, 0x12, 0x26, 0x0a, 0x08, 0x73, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x33, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x52, 0x07, 0x73, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2a, 0x2b, 0x0a, 0x04, 0x45, 0x6e,
-	0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03,
-	0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x07,
-	0x0a, 0x03, 0x54, 0x45, 0x4e, 0x10, 0x0a, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75,
-	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
-	0x67, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x70, 0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var fileDescriptor_0854715c5b41c422_gzipped = func() []byte {
-	bb := new(bytes.Buffer)
-	zw, _ := gzip.NewWriterLevel(bb, gzip.NoCompression)
-	zw.Write(fileDescriptor_0854715c5b41c422)
-	zw.Close()
-	return bb.Bytes()
-}()
-
-const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
-
-var Test_protoFile protoreflect.FileDescriptor
-
-var xxx_Test_protoFile_enumTypes [2]protoreflect.EnumType
-var xxx_Test_protoFile_messageTypes [4]protoimpl.MessageType
-var xxx_Test_protoFile_goTypes = []interface{}{
-	(Enum)(0),             // 0: pb3.Enum
-	(Enums_NestedEnum)(0), // 1: pb3.Enums.NestedEnum
-	(*Scalars)(nil),       // 2: pb3.Scalars
-	(*Enums)(nil),         // 3: pb3.Enums
-	(*Nests)(nil),         // 4: pb3.Nests
-	(*Nested)(nil),        // 5: pb3.Nested
-}
-var xxx_Test_protoFile_depIdxs = []int32{
-	0, // pb3.Enums.s_enum:type_name -> pb3.Enum
-	1, // pb3.Enums.s_nested_enum:type_name -> pb3.Enums.NestedEnum
-	5, // pb3.Nests.s_nested:type_name -> pb3.Nested
-	5, // pb3.Nested.s_nested:type_name -> pb3.Nested
-}
-
-func init() {
-	var messageTypes [4]protoreflect.MessageType
-	Test_protoFile = protoimpl.FileBuilder{
-		RawDescriptor:      fileDescriptor_0854715c5b41c422,
-		GoTypes:            xxx_Test_protoFile_goTypes,
-		DependencyIndexes:  xxx_Test_protoFile_depIdxs,
-		EnumOutputTypes:    xxx_Test_protoFile_enumTypes[:],
-		MessageOutputTypes: messageTypes[:],
-	}.Init()
-	messageGoTypes := xxx_Test_protoFile_goTypes[2:][:4]
-	for i, mt := range messageTypes[:] {
-		xxx_Test_protoFile_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
-		xxx_Test_protoFile_messageTypes[i].PBType = mt
-	}
-	xxx_Test_protoFile_goTypes = nil
-	xxx_Test_protoFile_depIdxs = nil
-}

+ 2 - 2
regenerate.bash

@@ -59,9 +59,9 @@ PROTOC_GEN_GO_ENABLE_REFLECT=1 protoc -I$tmpdir/src \
   $tmpdir/src/google/protobuf/compiler/plugin.proto
 cp $tmpdir/src/google/protobuf/compiler/plugin.pb.go ./types/plugin/plugin.pb.go
 
-echo "# encoding/textpb/testprotos/pb?/test.proto"
+echo "# encoding/testprotos/pb?/test.proto"
 PROTOC_GEN_GO_ENABLE_REFLECT=1 protoc --go_out=paths=source_relative:. \
-  encoding/textpb/testprotos/pb?/test.proto
+  encoding/testprotos/pb?/test.proto
 
 echo "# reflect/protoregistry/testprotos/test.proto"
 PROTOC_GEN_GO_ENABLE_REFLECT=1 protoc --go_out=paths=source_relative:. \

Some files were not shown because too many files changed in this diff