1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package dynamicpb_test
6
7import (
8	"testing"
9
10	"google.golang.org/protobuf/proto"
11	pref "google.golang.org/protobuf/reflect/protoreflect"
12	preg "google.golang.org/protobuf/reflect/protoregistry"
13	"google.golang.org/protobuf/testing/prototest"
14	"google.golang.org/protobuf/types/dynamicpb"
15
16	testpb "google.golang.org/protobuf/internal/testprotos/test"
17	test3pb "google.golang.org/protobuf/internal/testprotos/test3"
18)
19
20func TestConformance(t *testing.T) {
21	for _, message := range []proto.Message{
22		(*testpb.TestAllTypes)(nil),
23		(*test3pb.TestAllTypes)(nil),
24		(*testpb.TestAllExtensions)(nil),
25	} {
26		mt := dynamicpb.NewMessageType(message.ProtoReflect().Descriptor())
27		prototest.Message{}.Test(t, mt)
28	}
29}
30
31func TestDynamicExtensions(t *testing.T) {
32	for _, message := range []proto.Message{
33		(*testpb.TestAllExtensions)(nil),
34	} {
35		mt := dynamicpb.NewMessageType(message.ProtoReflect().Descriptor())
36		prototest.Message{
37			Resolver: extResolver{},
38		}.Test(t, mt)
39	}
40}
41
42func TestDynamicEnums(t *testing.T) {
43	for _, enum := range []pref.Enum{
44		testpb.TestAllTypes_FOO,
45		test3pb.TestAllTypes_FOO,
46	} {
47		et := dynamicpb.NewEnumType(enum.Descriptor())
48		prototest.Enum{}.Test(t, et)
49	}
50}
51
52type extResolver struct{}
53
54func (extResolver) FindExtensionByName(field pref.FullName) (pref.ExtensionType, error) {
55	xt, err := preg.GlobalTypes.FindExtensionByName(field)
56	if err != nil {
57		return nil, err
58	}
59	return dynamicpb.NewExtensionType(xt.TypeDescriptor().Descriptor()), nil
60}
61
62func (extResolver) FindExtensionByNumber(message pref.FullName, field pref.FieldNumber) (pref.ExtensionType, error) {
63	xt, err := preg.GlobalTypes.FindExtensionByNumber(message, field)
64	if err != nil {
65		return nil, err
66	}
67	return dynamicpb.NewExtensionType(xt.TypeDescriptor().Descriptor()), nil
68}
69
70func (extResolver) RangeExtensionsByMessage(message pref.FullName, f func(pref.ExtensionType) bool) {
71	preg.GlobalTypes.RangeExtensionsByMessage(message, func(xt pref.ExtensionType) bool {
72		return f(dynamicpb.NewExtensionType(xt.TypeDescriptor().Descriptor()))
73	})
74}
75