// Copyright 2024 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.

package reflection_test

import (
	"fmt"
	"math"
	"testing"

	testpb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_hybrid"
	"google.golang.org/protobuf/reflect/protoreflect"
	"google.golang.org/protobuf/testing/prototest"
)

func TestOpen3Concrete(t *testing.T) {

	prototest.Message{}.Test(t, newTestMessageOpen3(nil).ProtoReflect().Type())
}

func TestOpen3Reflection(t *testing.T) {
	prototest.Message{}.Test(t, (*testpb.TestAllTypes)(nil).ProtoReflect().Type())
}

func TestOpen3Shadow_GetConcrete_SetReflection(t *testing.T) {
	prototest.Message{}.Test(t, newShadow(func() (get, set protoreflect.ProtoMessage) {
		m := &testpb.TestAllTypes{}
		return newTestMessageOpen3(m), m
	}).ProtoReflect().Type())
}

func TestOpen3Shadow_GetReflection_SetConcrete(t *testing.T) {
	prototest.Message{}.Test(t, newShadow(func() (get, set protoreflect.ProtoMessage) {
		m := &testpb.TestAllTypes{}
		return m, newTestMessageOpen3(m)
	}).ProtoReflect().Type())
}

func newTestMessageOpen3(m *testpb.TestAllTypes) protoreflect.ProtoMessage {
	return &testProtoMessage{
		m:  m,
		md: m.ProtoReflect().Descriptor(),
		new: func() protoreflect.Message {
			return newTestMessageOpen3(&testpb.TestAllTypes{}).ProtoReflect()
		},
		has: func(num protoreflect.FieldNumber) bool {
			switch num {
			case fieldSingularInt32:
				return m.GetSingularInt32() != 0
			case fieldSingularInt64:
				return m.GetSingularInt64() != 0
			case fieldSingularUint32:
				return m.GetSingularUint32() != 0
			case fieldSingularUint64:
				return m.GetSingularUint64() != 0
			case fieldSingularSint32:
				return m.GetSingularSint32() != 0
			case fieldSingularSint64:
				return m.GetSingularSint64() != 0
			case fieldSingularFixed32:
				return m.GetSingularFixed32() != 0
			case fieldSingularFixed64:
				return m.GetSingularFixed64() != 0
			case fieldSingularSfixed32:
				return m.GetSingularSfixed32() != 0
			case fieldSingularSfixed64:
				return m.GetSingularSfixed64() != 0
			case fieldSingularFloat:
				return m.GetSingularFloat() != 0 || math.Signbit(float64(m.GetSingularFloat()))
			case fieldSingularDouble:
				return m.GetSingularDouble() != 0 || math.Signbit(m.GetSingularDouble())
			case fieldSingularBool:
				return m.GetSingularBool() != false
			case fieldSingularString:
				return m.GetSingularString() != ""
			case fieldSingularBytes:
				return len(m.GetSingularBytes()) != 0
			case fieldSingularNestedEnum:
				return m.GetSingularNestedEnum() != testpb.TestAllTypes_FOO
			case fieldSingularForeignEnum:
				return m.GetSingularForeignEnum() != testpb.ForeignEnum_FOREIGN_ZERO
			case fieldSingularImportEnum:
				return m.GetSingularImportEnum() != testpb.ImportEnum_IMPORT_ZERO

			case fieldOptionalInt32:
				return m.HasOptionalInt32()
			case fieldOptionalInt64:
				return m.HasOptionalInt64()
			case fieldOptionalUint32:
				return m.HasOptionalUint32()
			case fieldOptionalUint64:
				return m.HasOptionalUint64()
			case fieldOptionalSint32:
				return m.HasOptionalSint32()
			case fieldOptionalSint64:
				return m.HasOptionalSint64()
			case fieldOptionalFixed32:
				return m.HasOptionalFixed32()
			case fieldOptionalFixed64:
				return m.HasOptionalFixed64()
			case fieldOptionalSfixed32:
				return m.HasOptionalSfixed32()
			case fieldOptionalSfixed64:
				return m.HasOptionalSfixed64()
			case fieldOptionalFloat:
				return m.HasOptionalFloat()
			case fieldOptionalDouble:
				return m.HasOptionalDouble()
			case fieldOptionalBool:
				return m.HasOptionalBool()
			case fieldOptionalString:
				return m.HasOptionalString()
			case fieldOptionalBytes:
				return m.HasOptionalBytes()
			case fieldOptionalGroup:
				return m.HasOptionalgroup()
			case fieldNotGroupLikeDelimited:
				return m.HasNotGroupLikeDelimited()
			case fieldOptionalNestedMessage:
				return m.HasOptionalNestedMessage()
			case fieldOptionalForeignMessage:
				return m.HasOptionalForeignMessage()
			case fieldOptionalImportMessage:
				return m.HasOptionalImportMessage()
			case fieldOptionalNestedEnum:
				return m.HasOptionalNestedEnum()
			case fieldOptionalForeignEnum:
				return m.HasOptionalForeignEnum()
			case fieldOptionalImportEnum:
				return m.HasOptionalImportEnum()
			case fieldOptionalLazyNestedMessage:
				return m.HasOptionalLazyNestedMessage()

			case fieldRepeatedInt32:
				return len(m.GetRepeatedInt32()) > 0
			case fieldRepeatedInt64:
				return len(m.GetRepeatedInt64()) > 0
			case fieldRepeatedUint32:
				return len(m.GetRepeatedUint32()) > 0
			case fieldRepeatedUint64:
				return len(m.GetRepeatedUint64()) > 0
			case fieldRepeatedSint32:
				return len(m.GetRepeatedSint32()) > 0
			case fieldRepeatedSint64:
				return len(m.GetRepeatedSint64()) > 0
			case fieldRepeatedFixed32:
				return len(m.GetRepeatedFixed32()) > 0
			case fieldRepeatedFixed64:
				return len(m.GetRepeatedFixed64()) > 0
			case fieldRepeatedSfixed32:
				return len(m.GetRepeatedSfixed32()) > 0
			case fieldRepeatedSfixed64:
				return len(m.GetRepeatedSfixed64()) > 0
			case fieldRepeatedFloat:
				return len(m.GetRepeatedFloat()) > 0
			case fieldRepeatedDouble:
				return len(m.GetRepeatedDouble()) > 0
			case fieldRepeatedBool:
				return len(m.GetRepeatedBool()) > 0
			case fieldRepeatedString:
				return len(m.GetRepeatedString()) > 0
			case fieldRepeatedBytes:
				return len(m.GetRepeatedBytes()) > 0
			case fieldRepeatedGroup:
				return len(m.GetRepeatedgroup()) > 0
			case fieldRepeatedNestedMessage:
				return len(m.GetRepeatedNestedMessage()) > 0
			case fieldRepeatedForeignMessage:
				return len(m.GetRepeatedForeignMessage()) > 0
			case fieldRepeatedImportMessage:
				return len(m.GetRepeatedImportmessage()) > 0
			case fieldRepeatedNestedEnum:
				return len(m.GetRepeatedNestedEnum()) > 0
			case fieldRepeatedForeignEnum:
				return len(m.GetRepeatedForeignEnum()) > 0
			case fieldRepeatedImportEnum:
				return len(m.GetRepeatedImportenum()) > 0

			case fieldMapInt32Int32:
				return len(m.GetMapInt32Int32()) > 0
			case fieldMapInt64Int64:
				return len(m.GetMapInt64Int64()) > 0
			case fieldMapUint32Uint32:
				return len(m.GetMapUint32Uint32()) > 0
			case fieldMapUint64Uint64:
				return len(m.GetMapUint64Uint64()) > 0
			case fieldMapSint32Sint32:
				return len(m.GetMapSint32Sint32()) > 0
			case fieldMapSint64Sint64:
				return len(m.GetMapSint64Sint64()) > 0
			case fieldMapFixed32Fixed32:
				return len(m.GetMapFixed32Fixed32()) > 0
			case fieldMapFixed64Fixed64:
				return len(m.GetMapFixed64Fixed64()) > 0
			case fieldMapSfixed32Sfixed32:
				return len(m.GetMapSfixed32Sfixed32()) > 0
			case fieldMapSfixed64Sfixed64:
				return len(m.GetMapSfixed64Sfixed64()) > 0
			case fieldMapInt32Float:
				return len(m.GetMapInt32Float()) > 0
			case fieldMapInt32Double:
				return len(m.GetMapInt32Double()) > 0
			case fieldMapBoolBool:
				return len(m.GetMapBoolBool()) > 0
			case fieldMapStringString:
				return len(m.GetMapStringString()) > 0
			case fieldMapStringBytes:
				return len(m.GetMapStringBytes()) > 0
			case fieldMapStringNestedMessage:
				return len(m.GetMapStringNestedMessage()) > 0
			case fieldMapStringNestedEnum:
				return len(m.GetMapStringNestedEnum()) > 0

			case fieldDefaultInt32:
				return m.HasDefaultInt32()
			case fieldDefaultInt64:
				return m.HasDefaultInt64()
			case fieldDefaultUint32:
				return m.HasDefaultUint32()
			case fieldDefaultUint64:
				return m.HasDefaultUint64()
			case fieldDefaultSint32:
				return m.HasDefaultSint32()
			case fieldDefaultSint64:
				return m.HasDefaultSint64()
			case fieldDefaultFixed32:
				return m.HasDefaultFixed32()
			case fieldDefaultFixed64:
				return m.HasDefaultFixed64()
			case fieldDefaultSfixed32:
				return m.HasDefaultSfixed32()
			case fieldDefaultSfixed64:
				return m.HasDefaultSfixed64()
			case fieldDefaultFloat:
				return m.HasDefaultFloat()
			case fieldDefaultDouble:
				return m.HasDefaultDouble()
			case fieldDefaultBool:
				return m.HasDefaultBool()
			case fieldDefaultString:
				return m.HasDefaultString()
			case fieldDefaultBytes:
				return m.HasDefaultBytes()
			case fieldDefaultNestedEnum:
				return m.HasDefaultNestedEnum()
			case fieldDefaultForeignEnum:
				return m.HasDefaultForeignEnum()

			case fieldOneofUint32:
				return m.HasOneofUint32()
			case fieldOneofNestedMessage:
				return m.HasOneofNestedMessage()
			case fieldOneofString:
				return m.HasOneofString()
			case fieldOneofBytes:
				return m.HasOneofBytes()
			case fieldOneofBool:
				return m.HasOneofBool()
			case fieldOneofUint64:
				return m.HasOneofUint64()
			case fieldOneofFloat:
				return m.HasOneofFloat()
			case fieldOneofDouble:
				return m.HasOneofDouble()
			case fieldOneofEnum:
				return m.HasOneofEnum()
			case fieldOneofGroup:
				return m.HasOneofgroup()
			case fieldOneofOptionalUint32:
				return m.HasOneofOptionalUint32()

			default:
				panic(fmt.Sprintf("has: unknown field %d", num))
			}
		},
		get: func(num protoreflect.FieldNumber) any {
			switch num {
			case fieldSingularInt32:
				return m.GetSingularInt32()
			case fieldSingularInt64:
				return m.GetSingularInt64()
			case fieldSingularUint32:
				return m.GetSingularUint32()
			case fieldSingularUint64:
				return m.GetSingularUint64()
			case fieldSingularSint32:
				return m.GetSingularSint32()
			case fieldSingularSint64:
				return m.GetSingularSint64()
			case fieldSingularFixed32:
				return m.GetSingularFixed32()
			case fieldSingularFixed64:
				return m.GetSingularFixed64()
			case fieldSingularSfixed32:
				return m.GetSingularSfixed32()
			case fieldSingularSfixed64:
				return m.GetSingularSfixed64()
			case fieldSingularFloat:
				return m.GetSingularFloat()
			case fieldSingularDouble:
				return m.GetSingularDouble()
			case fieldSingularBool:
				return m.GetSingularBool()
			case fieldSingularString:
				return m.GetSingularString()
			case fieldSingularBytes:
				return m.GetSingularBytes()
			case fieldSingularNestedEnum:
				return m.GetSingularNestedEnum()
			case fieldSingularForeignEnum:
				return m.GetSingularForeignEnum()
			case fieldSingularImportEnum:
				return m.GetSingularImportEnum()

			case fieldOptionalInt32:
				return m.GetOptionalInt32()
			case fieldOptionalInt64:
				return m.GetOptionalInt64()
			case fieldOptionalUint32:
				return m.GetOptionalUint32()
			case fieldOptionalUint64:
				return m.GetOptionalUint64()
			case fieldOptionalSint32:
				return m.GetOptionalSint32()
			case fieldOptionalSint64:
				return m.GetOptionalSint64()
			case fieldOptionalFixed32:
				return m.GetOptionalFixed32()
			case fieldOptionalFixed64:
				return m.GetOptionalFixed64()
			case fieldOptionalSfixed32:
				return m.GetOptionalSfixed32()
			case fieldOptionalSfixed64:
				return m.GetOptionalSfixed64()
			case fieldOptionalFloat:
				return m.GetOptionalFloat()
			case fieldOptionalDouble:
				return m.GetOptionalDouble()
			case fieldOptionalBool:
				return m.GetOptionalBool()
			case fieldOptionalString:
				return m.GetOptionalString()
			case fieldOptionalBytes:
				return m.GetOptionalBytes()
			case fieldOptionalGroup:
				return m.GetOptionalgroup()
			case fieldNotGroupLikeDelimited:
				return m.GetNotGroupLikeDelimited()
			case fieldOptionalNestedMessage:
				return m.GetOptionalNestedMessage()
			case fieldOptionalForeignMessage:
				return m.GetOptionalForeignMessage()
			case fieldOptionalImportMessage:
				return m.GetOptionalImportMessage()
			case fieldOptionalNestedEnum:
				return m.GetOptionalNestedEnum()
			case fieldOptionalForeignEnum:
				return m.GetOptionalForeignEnum()
			case fieldOptionalImportEnum:
				return m.GetOptionalImportEnum()
			case fieldOptionalLazyNestedMessage:
				return m.GetOptionalLazyNestedMessage()

			case fieldRepeatedInt32:
				return m.GetRepeatedInt32()
			case fieldRepeatedInt64:
				return m.GetRepeatedInt64()
			case fieldRepeatedUint32:
				return m.GetRepeatedUint32()
			case fieldRepeatedUint64:
				return m.GetRepeatedUint64()
			case fieldRepeatedSint32:
				return m.GetRepeatedSint32()
			case fieldRepeatedSint64:
				return m.GetRepeatedSint64()
			case fieldRepeatedFixed32:
				return m.GetRepeatedFixed32()
			case fieldRepeatedFixed64:
				return m.GetRepeatedFixed64()
			case fieldRepeatedSfixed32:
				return m.GetRepeatedSfixed32()
			case fieldRepeatedSfixed64:
				return m.GetRepeatedSfixed64()
			case fieldRepeatedFloat:
				return m.GetRepeatedFloat()
			case fieldRepeatedDouble:
				return m.GetRepeatedDouble()
			case fieldRepeatedBool:
				return m.GetRepeatedBool()
			case fieldRepeatedString:
				return m.GetRepeatedString()
			case fieldRepeatedBytes:
				return m.GetRepeatedBytes()
			case fieldRepeatedGroup:
				return m.GetRepeatedgroup()
			case fieldRepeatedNestedMessage:
				return m.GetRepeatedNestedMessage()
			case fieldRepeatedForeignMessage:
				return m.GetRepeatedForeignMessage()
			case fieldRepeatedImportMessage:
				return m.GetRepeatedImportmessage()
			case fieldRepeatedNestedEnum:
				return m.GetRepeatedNestedEnum()
			case fieldRepeatedForeignEnum:
				return m.GetRepeatedForeignEnum()
			case fieldRepeatedImportEnum:
				return m.GetRepeatedImportenum()

			case fieldMapInt32Int32:
				return m.GetMapInt32Int32()
			case fieldMapInt64Int64:
				return m.GetMapInt64Int64()
			case fieldMapUint32Uint32:
				return m.GetMapUint32Uint32()
			case fieldMapUint64Uint64:
				return m.GetMapUint64Uint64()
			case fieldMapSint32Sint32:
				return m.GetMapSint32Sint32()
			case fieldMapSint64Sint64:
				return m.GetMapSint64Sint64()
			case fieldMapFixed32Fixed32:
				return m.GetMapFixed32Fixed32()
			case fieldMapFixed64Fixed64:
				return m.GetMapFixed64Fixed64()
			case fieldMapSfixed32Sfixed32:
				return m.GetMapSfixed32Sfixed32()
			case fieldMapSfixed64Sfixed64:
				return m.GetMapSfixed64Sfixed64()
			case fieldMapInt32Float:
				return m.GetMapInt32Float()
			case fieldMapInt32Double:
				return m.GetMapInt32Double()
			case fieldMapBoolBool:
				return m.GetMapBoolBool()
			case fieldMapStringString:
				return m.GetMapStringString()
			case fieldMapStringBytes:
				return m.GetMapStringBytes()
			case fieldMapStringNestedMessage:
				return m.GetMapStringNestedMessage()
			case fieldMapStringNestedEnum:
				return m.GetMapStringNestedEnum()

			case fieldDefaultInt32:
				return m.GetDefaultInt32()
			case fieldDefaultInt64:
				return m.GetDefaultInt64()
			case fieldDefaultUint32:
				return m.GetDefaultUint32()
			case fieldDefaultUint64:
				return m.GetDefaultUint64()
			case fieldDefaultSint32:
				return m.GetDefaultSint32()
			case fieldDefaultSint64:
				return m.GetDefaultSint64()
			case fieldDefaultFixed32:
				return m.GetDefaultFixed32()
			case fieldDefaultFixed64:
				return m.GetDefaultFixed64()
			case fieldDefaultSfixed32:
				return m.GetDefaultSfixed32()
			case fieldDefaultSfixed64:
				return m.GetDefaultSfixed64()
			case fieldDefaultFloat:
				return m.GetDefaultFloat()
			case fieldDefaultDouble:
				return m.GetDefaultDouble()
			case fieldDefaultBool:
				return m.GetDefaultBool()
			case fieldDefaultString:
				return m.GetDefaultString()
			case fieldDefaultBytes:
				return m.GetDefaultBytes()
			case fieldDefaultNestedEnum:
				return m.GetDefaultNestedEnum()
			case fieldDefaultForeignEnum:
				return m.GetDefaultForeignEnum()

			case fieldOneofUint32:
				return m.GetOneofUint32()
			case fieldOneofNestedMessage:
				return m.GetOneofNestedMessage()
			case fieldOneofString:
				return m.GetOneofString()
			case fieldOneofBytes:
				return m.GetOneofBytes()
			case fieldOneofBool:
				return m.GetOneofBool()
			case fieldOneofUint64:
				return m.GetOneofUint64()
			case fieldOneofFloat:
				return m.GetOneofFloat()
			case fieldOneofDouble:
				return m.GetOneofDouble()
			case fieldOneofEnum:
				return m.GetOneofEnum()
			case fieldOneofGroup:
				return m.GetOneofgroup()
			case fieldOneofOptionalUint32:
				return m.GetOneofOptionalUint32()

			default:
				panic(fmt.Sprintf("get: unknown field %d", num))
			}
		},
		set: func(num protoreflect.FieldNumber, v any) {
			switch num {
			case fieldSingularInt32:
				m.SetSingularInt32(v.(int32))
			case fieldSingularInt64:
				m.SetSingularInt64(v.(int64))
			case fieldSingularUint32:
				m.SetSingularUint32(v.(uint32))
			case fieldSingularUint64:
				m.SetSingularUint64(v.(uint64))
			case fieldSingularSint32:
				m.SetSingularSint32(v.(int32))
			case fieldSingularSint64:
				m.SetSingularSint64(v.(int64))
			case fieldSingularFixed32:
				m.SetSingularFixed32(v.(uint32))
			case fieldSingularFixed64:
				m.SetSingularFixed64(v.(uint64))
			case fieldSingularSfixed32:
				m.SetSingularSfixed32(v.(int32))
			case fieldSingularSfixed64:
				m.SetSingularSfixed64(v.(int64))
			case fieldSingularFloat:
				m.SetSingularFloat(v.(float32))
			case fieldSingularDouble:
				m.SetSingularDouble(v.(float64))
			case fieldSingularBool:
				m.SetSingularBool(v.(bool))
			case fieldSingularString:
				m.SetSingularString(v.(string))
			case fieldSingularBytes:
				m.SetSingularBytes(v.([]byte))
			case fieldSingularNestedEnum:
				m.SetSingularNestedEnum(testpb.TestAllTypes_NestedEnum(v.(protoreflect.EnumNumber)))
			case fieldSingularForeignEnum:
				m.SetSingularForeignEnum(testpb.ForeignEnum(v.(protoreflect.EnumNumber)))
			case fieldSingularImportEnum:
				m.SetSingularImportEnum(testpb.ImportEnum(v.(protoreflect.EnumNumber)))

			case fieldOptionalInt32:
				m.SetOptionalInt32(v.(int32))
			case fieldOptionalInt64:
				m.SetOptionalInt64(v.(int64))
			case fieldOptionalUint32:
				m.SetOptionalUint32(v.(uint32))
			case fieldOptionalUint64:
				m.SetOptionalUint64(v.(uint64))
			case fieldOptionalSint32:
				m.SetOptionalSint32(v.(int32))
			case fieldOptionalSint64:
				m.SetOptionalSint64(v.(int64))
			case fieldOptionalFixed32:
				m.SetOptionalFixed32(v.(uint32))
			case fieldOptionalFixed64:
				m.SetOptionalFixed64(v.(uint64))
			case fieldOptionalSfixed32:
				m.SetOptionalSfixed32(v.(int32))
			case fieldOptionalSfixed64:
				m.SetOptionalSfixed64(v.(int64))
			case fieldOptionalFloat:
				m.SetOptionalFloat(v.(float32))
			case fieldOptionalDouble:
				m.SetOptionalDouble(v.(float64))
			case fieldOptionalBool:
				m.SetOptionalBool(v.(bool))
			case fieldOptionalString:
				m.SetOptionalString(v.(string))
			case fieldOptionalBytes:
				m.SetOptionalBytes(v.([]byte))
			case fieldOptionalGroup:
				m.SetOptionalgroup(v.(*testpb.TestAllTypes_OptionalGroup))
			case fieldNotGroupLikeDelimited:
				m.SetNotGroupLikeDelimited(v.(*testpb.TestAllTypes_OptionalGroup))
			case fieldOptionalNestedMessage:
				m.SetOptionalNestedMessage(v.(*testpb.TestAllTypes_NestedMessage))
			case fieldOptionalForeignMessage:
				m.SetOptionalForeignMessage(v.(*testpb.ForeignMessage))
			case fieldOptionalImportMessage:
				m.SetOptionalImportMessage(v.(*testpb.ImportMessage))
			case fieldOptionalNestedEnum:
				m.SetOptionalNestedEnum(testpb.TestAllTypes_NestedEnum(v.(protoreflect.EnumNumber)))
			case fieldOptionalForeignEnum:
				m.SetOptionalForeignEnum(testpb.ForeignEnum(v.(protoreflect.EnumNumber)))
			case fieldOptionalImportEnum:
				m.SetOptionalImportEnum(testpb.ImportEnum(v.(protoreflect.EnumNumber)))
			case fieldOptionalLazyNestedMessage:
				m.SetOptionalLazyNestedMessage(v.(*testpb.TestAllTypes_NestedMessage))

			case fieldRepeatedInt32:
				m.SetRepeatedInt32(v.([]int32))
			case fieldRepeatedInt64:
				m.SetRepeatedInt64(v.([]int64))
			case fieldRepeatedUint32:
				m.SetRepeatedUint32(v.([]uint32))
			case fieldRepeatedUint64:
				m.SetRepeatedUint64(v.([]uint64))
			case fieldRepeatedSint32:
				m.SetRepeatedSint32(v.([]int32))
			case fieldRepeatedSint64:
				m.SetRepeatedSint64(v.([]int64))
			case fieldRepeatedFixed32:
				m.SetRepeatedFixed32(v.([]uint32))
			case fieldRepeatedFixed64:
				m.SetRepeatedFixed64(v.([]uint64))
			case fieldRepeatedSfixed32:
				m.SetRepeatedSfixed32(v.([]int32))
			case fieldRepeatedSfixed64:
				m.SetRepeatedSfixed64(v.([]int64))
			case fieldRepeatedFloat:
				m.SetRepeatedFloat(v.([]float32))
			case fieldRepeatedDouble:
				m.SetRepeatedDouble(v.([]float64))
			case fieldRepeatedBool:
				m.SetRepeatedBool(v.([]bool))
			case fieldRepeatedString:
				m.SetRepeatedString(v.([]string))
			case fieldRepeatedBytes:
				m.SetRepeatedBytes(v.([][]byte))
			case fieldRepeatedGroup:
				m.SetRepeatedgroup(v.([]*testpb.TestAllTypes_RepeatedGroup))
			case fieldRepeatedNestedMessage:
				m.SetRepeatedNestedMessage(v.([]*testpb.TestAllTypes_NestedMessage))
			case fieldRepeatedForeignMessage:
				m.SetRepeatedForeignMessage(v.([]*testpb.ForeignMessage))
			case fieldRepeatedImportMessage:
				m.SetRepeatedImportmessage(v.([]*testpb.ImportMessage))
			case fieldRepeatedNestedEnum:
				m.SetRepeatedNestedEnum(v.([]testpb.TestAllTypes_NestedEnum))
			case fieldRepeatedForeignEnum:
				m.SetRepeatedForeignEnum(v.([]testpb.ForeignEnum))
			case fieldRepeatedImportEnum:
				m.SetRepeatedImportenum(v.([]testpb.ImportEnum))

			case fieldMapInt32Int32:
				m.SetMapInt32Int32(v.(map[int32]int32))
			case fieldMapInt64Int64:
				m.SetMapInt64Int64(v.(map[int64]int64))
			case fieldMapUint32Uint32:
				m.SetMapUint32Uint32(v.(map[uint32]uint32))
			case fieldMapUint64Uint64:
				m.SetMapUint64Uint64(v.(map[uint64]uint64))
			case fieldMapSint32Sint32:
				m.SetMapSint32Sint32(v.(map[int32]int32))
			case fieldMapSint64Sint64:
				m.SetMapSint64Sint64(v.(map[int64]int64))
			case fieldMapFixed32Fixed32:
				m.SetMapFixed32Fixed32(v.(map[uint32]uint32))
			case fieldMapFixed64Fixed64:
				m.SetMapFixed64Fixed64(v.(map[uint64]uint64))
			case fieldMapSfixed32Sfixed32:
				m.SetMapSfixed32Sfixed32(v.(map[int32]int32))
			case fieldMapSfixed64Sfixed64:
				m.SetMapSfixed64Sfixed64(v.(map[int64]int64))
			case fieldMapInt32Float:
				m.SetMapInt32Float(v.(map[int32]float32))
			case fieldMapInt32Double:
				m.SetMapInt32Double(v.(map[int32]float64))
			case fieldMapBoolBool:
				m.SetMapBoolBool(v.(map[bool]bool))
			case fieldMapStringString:
				m.SetMapStringString(v.(map[string]string))
			case fieldMapStringBytes:
				m.SetMapStringBytes(v.(map[string][]byte))
			case fieldMapStringNestedMessage:
				m.SetMapStringNestedMessage(v.(map[string]*testpb.TestAllTypes_NestedMessage))
			case fieldMapStringNestedEnum:
				m.SetMapStringNestedEnum(v.(map[string]testpb.TestAllTypes_NestedEnum))

			case fieldDefaultInt32:
				m.SetDefaultInt32(v.(int32))
			case fieldDefaultInt64:
				m.SetDefaultInt64(v.(int64))
			case fieldDefaultUint32:
				m.SetDefaultUint32(v.(uint32))
			case fieldDefaultUint64:
				m.SetDefaultUint64(v.(uint64))
			case fieldDefaultSint32:
				m.SetDefaultSint32(v.(int32))
			case fieldDefaultSint64:
				m.SetDefaultSint64(v.(int64))
			case fieldDefaultFixed32:
				m.SetDefaultFixed32(v.(uint32))
			case fieldDefaultFixed64:
				m.SetDefaultFixed64(v.(uint64))
			case fieldDefaultSfixed32:
				m.SetDefaultSfixed32(v.(int32))
			case fieldDefaultSfixed64:
				m.SetDefaultSfixed64(v.(int64))
			case fieldDefaultFloat:
				m.SetDefaultFloat(v.(float32))
			case fieldDefaultDouble:
				m.SetDefaultDouble(v.(float64))
			case fieldDefaultBool:
				m.SetDefaultBool(v.(bool))
			case fieldDefaultString:
				m.SetDefaultString(v.(string))
			case fieldDefaultBytes:
				m.SetDefaultBytes(v.([]byte))
			case fieldDefaultNestedEnum:
				m.SetDefaultNestedEnum(testpb.TestAllTypes_NestedEnum(v.(protoreflect.EnumNumber)))
			case fieldDefaultForeignEnum:
				m.SetDefaultForeignEnum(testpb.ForeignEnum(v.(protoreflect.EnumNumber)))

			case fieldDefaultInt32:
				m.SetDefaultInt32(v.(int32))
			case fieldDefaultInt64:
				m.SetDefaultInt64(v.(int64))
			case fieldDefaultUint32:
				m.SetDefaultUint32(v.(uint32))
			case fieldDefaultUint64:
				m.SetDefaultUint64(v.(uint64))
			case fieldDefaultSint32:
				m.SetDefaultSint32(v.(int32))
			case fieldDefaultSint64:
				m.SetDefaultSint64(v.(int64))
			case fieldDefaultFixed32:
				m.SetDefaultFixed32(v.(uint32))
			case fieldDefaultFixed64:
				m.SetDefaultFixed64(v.(uint64))
			case fieldDefaultSfixed32:
				m.SetDefaultSfixed32(v.(int32))
			case fieldDefaultSfixed64:
				m.SetDefaultSfixed64(v.(int64))
			case fieldDefaultFloat:
				m.SetDefaultFloat(v.(float32))
			case fieldDefaultDouble:
				m.SetDefaultDouble(v.(float64))
			case fieldDefaultBool:
				m.SetDefaultBool(v.(bool))
			case fieldDefaultString:
				m.SetDefaultString(v.(string))
			case fieldDefaultBytes:
				m.SetDefaultBytes(v.([]byte))
			case fieldDefaultNestedEnum:
				m.SetDefaultNestedEnum(testpb.TestAllTypes_NestedEnum(v.(protoreflect.EnumNumber)))
			case fieldDefaultForeignEnum:
				m.SetDefaultForeignEnum(testpb.ForeignEnum(v.(protoreflect.EnumNumber)))

			case fieldOneofUint32:
				m.SetOneofUint32(v.(uint32))
			case fieldOneofNestedMessage:
				m.SetOneofNestedMessage(v.(*testpb.TestAllTypes_NestedMessage))
			case fieldOneofString:
				m.SetOneofString(v.(string))
			case fieldOneofBytes:
				m.SetOneofBytes(v.([]byte))
			case fieldOneofBool:
				m.SetOneofBool(v.(bool))
			case fieldOneofUint64:
				m.SetOneofUint64(v.(uint64))
			case fieldOneofFloat:
				m.SetOneofFloat(v.(float32))
			case fieldOneofDouble:
				m.SetOneofDouble(v.(float64))
			case fieldOneofEnum:
				m.SetOneofEnum(testpb.TestAllTypes_NestedEnum(v.(protoreflect.EnumNumber)))
			case fieldOneofGroup:
				m.SetOneofgroup(v.(*testpb.TestAllTypes_OneofGroup))
			case fieldOneofOptionalUint32:
				m.SetOneofOptionalUint32(v.(uint32))

			default:
				panic(fmt.Sprintf("set: unknown field %d", num))
			}
		},
		clear: func(num protoreflect.FieldNumber) {
			switch num {
			case fieldSingularInt32:
				m.SetSingularInt32(0)
			case fieldSingularInt64:
				m.SetSingularInt64(0)
			case fieldSingularUint32:
				m.SetSingularUint32(0)
			case fieldSingularUint64:
				m.SetSingularUint64(0)
			case fieldSingularSint32:
				m.SetSingularSint32(0)
			case fieldSingularSint64:
				m.SetSingularSint64(0)
			case fieldSingularFixed32:
				m.SetSingularFixed32(0)
			case fieldSingularFixed64:
				m.SetSingularFixed64(0)
			case fieldSingularSfixed32:
				m.SetSingularSfixed32(0)
			case fieldSingularSfixed64:
				m.SetSingularSfixed64(0)
			case fieldSingularFloat:
				m.SetSingularFloat(0)
			case fieldSingularDouble:
				m.SetSingularDouble(0)
			case fieldSingularBool:
				m.SetSingularBool(false)
			case fieldSingularString:
				m.SetSingularString("")
			case fieldSingularBytes:
				m.SetSingularBytes(nil)
			case fieldSingularNestedEnum:
				m.SetSingularNestedEnum(testpb.TestAllTypes_FOO)
			case fieldSingularForeignEnum:
				m.SetSingularForeignEnum(testpb.ForeignEnum_FOREIGN_ZERO)
			case fieldSingularImportEnum:
				m.SetSingularImportEnum(testpb.ImportEnum_IMPORT_ZERO)

			case fieldOptionalInt32:
				m.ClearOptionalInt32()
			case fieldOptionalInt64:
				m.ClearOptionalInt64()
			case fieldOptionalUint32:
				m.ClearOptionalUint32()
			case fieldOptionalUint64:
				m.ClearOptionalUint64()
			case fieldOptionalSint32:
				m.ClearOptionalSint32()
			case fieldOptionalSint64:
				m.ClearOptionalSint64()
			case fieldOptionalFixed32:
				m.ClearOptionalFixed32()
			case fieldOptionalFixed64:
				m.ClearOptionalFixed64()
			case fieldOptionalSfixed32:
				m.ClearOptionalSfixed32()
			case fieldOptionalSfixed64:
				m.ClearOptionalSfixed64()
			case fieldOptionalFloat:
				m.ClearOptionalFloat()
			case fieldOptionalDouble:
				m.ClearOptionalDouble()
			case fieldOptionalBool:
				m.ClearOptionalBool()
			case fieldOptionalString:
				m.ClearOptionalString()
			case fieldOptionalBytes:
				m.ClearOptionalBytes()
			case fieldOptionalGroup:
				m.ClearOptionalgroup()
			case fieldNotGroupLikeDelimited:
				m.ClearNotGroupLikeDelimited()
			case fieldOptionalNestedMessage:
				m.ClearOptionalNestedMessage()
			case fieldOptionalForeignMessage:
				m.ClearOptionalForeignMessage()
			case fieldOptionalImportMessage:
				m.ClearOptionalImportMessage()
			case fieldOptionalNestedEnum:
				m.ClearOptionalNestedEnum()
			case fieldOptionalForeignEnum:
				m.ClearOptionalForeignEnum()
			case fieldOptionalImportEnum:
				m.ClearOptionalImportEnum()
			case fieldOptionalLazyNestedMessage:
				m.ClearOptionalLazyNestedMessage()

			case fieldRepeatedInt32:
				m.SetRepeatedInt32(nil)
			case fieldRepeatedInt64:
				m.SetRepeatedInt64(nil)
			case fieldRepeatedUint32:
				m.SetRepeatedUint32(nil)
			case fieldRepeatedUint64:
				m.SetRepeatedUint64(nil)
			case fieldRepeatedSint32:
				m.SetRepeatedSint32(nil)
			case fieldRepeatedSint64:
				m.SetRepeatedSint64(nil)
			case fieldRepeatedFixed32:
				m.SetRepeatedFixed32(nil)
			case fieldRepeatedFixed64:
				m.SetRepeatedFixed64(nil)
			case fieldRepeatedSfixed32:
				m.SetRepeatedSfixed32(nil)
			case fieldRepeatedSfixed64:
				m.SetRepeatedSfixed64(nil)
			case fieldRepeatedFloat:
				m.SetRepeatedFloat(nil)
			case fieldRepeatedDouble:
				m.SetRepeatedDouble(nil)
			case fieldRepeatedBool:
				m.SetRepeatedBool(nil)
			case fieldRepeatedString:
				m.SetRepeatedString(nil)
			case fieldRepeatedBytes:
				m.SetRepeatedBytes(nil)
			case fieldRepeatedGroup:
				m.SetRepeatedgroup(nil)
			case fieldRepeatedNestedMessage:
				m.SetRepeatedNestedMessage(nil)
			case fieldRepeatedForeignMessage:
				m.SetRepeatedForeignMessage(nil)
			case fieldRepeatedImportMessage:
				m.SetRepeatedImportmessage(nil)
			case fieldRepeatedNestedEnum:
				m.SetRepeatedNestedEnum(nil)
			case fieldRepeatedForeignEnum:
				m.SetRepeatedForeignEnum(nil)
			case fieldRepeatedImportEnum:
				m.SetRepeatedImportenum(nil)

			case fieldMapInt32Int32:
				m.SetMapInt32Int32(nil)
			case fieldMapInt64Int64:
				m.SetMapInt64Int64(nil)
			case fieldMapUint32Uint32:
				m.SetMapUint32Uint32(nil)
			case fieldMapUint64Uint64:
				m.SetMapUint64Uint64(nil)
			case fieldMapSint32Sint32:
				m.SetMapSint32Sint32(nil)
			case fieldMapSint64Sint64:
				m.SetMapSint64Sint64(nil)
			case fieldMapFixed32Fixed32:
				m.SetMapFixed32Fixed32(nil)
			case fieldMapFixed64Fixed64:
				m.SetMapFixed64Fixed64(nil)
			case fieldMapSfixed32Sfixed32:
				m.SetMapSfixed32Sfixed32(nil)
			case fieldMapSfixed64Sfixed64:
				m.SetMapSfixed64Sfixed64(nil)
			case fieldMapInt32Float:
				m.SetMapInt32Float(nil)
			case fieldMapInt32Double:
				m.SetMapInt32Double(nil)
			case fieldMapBoolBool:
				m.SetMapBoolBool(nil)
			case fieldMapStringString:
				m.SetMapStringString(nil)
			case fieldMapStringBytes:
				m.SetMapStringBytes(nil)
			case fieldMapStringNestedMessage:
				m.SetMapStringNestedMessage(nil)
			case fieldMapStringNestedEnum:
				m.SetMapStringNestedEnum(nil)

			case fieldDefaultInt32:
				m.ClearDefaultInt32()
			case fieldDefaultInt64:
				m.ClearDefaultInt64()
			case fieldDefaultUint32:
				m.ClearDefaultUint32()
			case fieldDefaultUint64:
				m.ClearDefaultUint64()
			case fieldDefaultSint32:
				m.ClearDefaultSint32()
			case fieldDefaultSint64:
				m.ClearDefaultSint64()
			case fieldDefaultFixed32:
				m.ClearDefaultFixed32()
			case fieldDefaultFixed64:
				m.ClearDefaultFixed64()
			case fieldDefaultSfixed32:
				m.ClearDefaultSfixed32()
			case fieldDefaultSfixed64:
				m.ClearDefaultSfixed64()
			case fieldDefaultFloat:
				m.ClearDefaultFloat()
			case fieldDefaultDouble:
				m.ClearDefaultDouble()
			case fieldDefaultBool:
				m.ClearDefaultBool()
			case fieldDefaultString:
				m.ClearDefaultString()
			case fieldDefaultBytes:
				m.ClearDefaultBytes()
			case fieldDefaultNestedEnum:
				m.ClearDefaultNestedEnum()
			case fieldDefaultForeignEnum:
				m.ClearDefaultForeignEnum()

			case fieldOneofUint32:
				m.ClearOneofUint32()
			case fieldOneofNestedMessage:
				m.ClearOneofNestedMessage()
			case fieldOneofString:
				m.ClearOneofString()
			case fieldOneofBytes:
				m.ClearOneofBytes()
			case fieldOneofBool:
				m.ClearOneofBool()
			case fieldOneofUint64:
				m.ClearOneofUint64()
			case fieldOneofFloat:
				m.ClearOneofFloat()
			case fieldOneofDouble:
				m.ClearOneofDouble()
			case fieldOneofEnum:
				m.ClearOneofEnum()
			case fieldOneofGroup:
				m.ClearOneofgroup()
			case fieldOneofOptionalUint32:
				m.ClearOneofOptionalUint32()

			default:
				panic(fmt.Sprintf("clear: unknown field %d", num))
			}
		},
	}
}
