| // 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) | |
| } | |
| }) | |
| } | |
| } |