blob: e1868a5f056642aa3590feca117e7066a15861c5 [file] [log] [blame]
// 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.
package impl_test
import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
testpb "google.golang.org/protobuf/internal/testprotos/test"
)
func TestExtensionType(t *testing.T) {
cmpOpts := cmp.Options{
cmp.Comparer(func(x, y proto.Message) bool {
return proto.Equal(x, y)
}),
}
for _, test := range []struct {
xt protoreflect.ExtensionType
value interface{}
}{
{
xt: testpb.E_OptionalInt32,
value: int32(0),
},
{
xt: testpb.E_OptionalInt64,
value: int64(0),
},
{
xt: testpb.E_OptionalUint32,
value: uint32(0),
},
{
xt: testpb.E_OptionalUint64,
value: uint64(0),
},
{
xt: testpb.E_OptionalFloat,
value: float32(0),
},
{
xt: testpb.E_OptionalDouble,
value: float64(0),
},
{
xt: testpb.E_OptionalBool,
value: true,
},
{
xt: testpb.E_OptionalString,
value: "",
},
{
xt: testpb.E_OptionalBytes,
value: []byte{},
},
{
xt: testpb.E_OptionalNestedMessage,
value: &testpb.TestAllExtensions_NestedMessage{},
},
{
xt: testpb.E_OptionalNestedEnum,
value: testpb.TestAllTypes_FOO,
},
{
xt: testpb.E_RepeatedInt32,
value: []int32{0},
},
{
xt: testpb.E_RepeatedInt64,
value: []int64{0},
},
{
xt: testpb.E_RepeatedUint32,
value: []uint32{0},
},
{
xt: testpb.E_RepeatedUint64,
value: []uint64{0},
},
{
xt: testpb.E_RepeatedFloat,
value: []float32{0},
},
{
xt: testpb.E_RepeatedDouble,
value: []float64{0},
},
{
xt: testpb.E_RepeatedBool,
value: []bool{true},
},
{
xt: testpb.E_RepeatedString,
value: []string{""},
},
{
xt: testpb.E_RepeatedBytes,
value: [][]byte{nil},
},
{
xt: testpb.E_RepeatedNestedMessage,
value: []*testpb.TestAllExtensions_NestedMessage{{}},
},
{
xt: testpb.E_RepeatedNestedEnum,
value: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO},
},
} {
name := test.xt.TypeDescriptor().FullName()
t.Run(fmt.Sprint(name), func(t *testing.T) {
if !test.xt.IsValidInterface(test.value) {
t.Fatalf("IsValidInterface(%[1]T(%[1]v)) = false, want true", test.value)
}
v := test.xt.ValueOf(test.value)
if !test.xt.IsValidValue(v) {
t.Fatalf("IsValidValue(%[1]T(%[1]v)) = false, want true", v)
}
if got, want := test.xt.InterfaceOf(v), test.value; !cmp.Equal(got, want, cmpOpts) {
t.Fatalf("round trip InterfaceOf(ValueOf(x)) = %v, want %v", got, want)
}
})
}
}