| // 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/golang/protobuf/proto" |
| cmp "github.com/google/go-cmp/cmp" |
| testpb "google.golang.org/protobuf/internal/testprotos/test" |
| pref "google.golang.org/protobuf/reflect/protoreflect" |
| ) |
| |
| 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 pref.ExtensionType |
| value interface{} |
| }{ |
| { |
| xt: testpb.E_OptionalInt32Extension, |
| value: int32(0), |
| }, |
| { |
| xt: testpb.E_OptionalInt64Extension, |
| value: int64(0), |
| }, |
| { |
| xt: testpb.E_OptionalUint32Extension, |
| value: uint32(0), |
| }, |
| { |
| xt: testpb.E_OptionalUint64Extension, |
| value: uint64(0), |
| }, |
| { |
| xt: testpb.E_OptionalFloatExtension, |
| value: float32(0), |
| }, |
| { |
| xt: testpb.E_OptionalDoubleExtension, |
| value: float64(0), |
| }, |
| { |
| xt: testpb.E_OptionalBoolExtension, |
| value: true, |
| }, |
| { |
| xt: testpb.E_OptionalStringExtension, |
| value: "", |
| }, |
| { |
| xt: testpb.E_OptionalBytesExtension, |
| value: []byte{}, |
| }, |
| { |
| xt: testpb.E_OptionalNestedMessageExtension, |
| value: &testpb.TestAllTypes_NestedMessage{}, |
| }, |
| { |
| xt: testpb.E_OptionalNestedEnumExtension, |
| value: testpb.TestAllTypes_FOO, |
| }, |
| { |
| xt: testpb.E_RepeatedInt32Extension, |
| value: []int32{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedInt64Extension, |
| value: []int64{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedUint32Extension, |
| value: []uint32{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedUint64Extension, |
| value: []uint64{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedFloatExtension, |
| value: []float32{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedDoubleExtension, |
| value: []float64{0}, |
| }, |
| { |
| xt: testpb.E_RepeatedBoolExtension, |
| value: []bool{true}, |
| }, |
| { |
| xt: testpb.E_RepeatedStringExtension, |
| value: []string{""}, |
| }, |
| { |
| xt: testpb.E_RepeatedBytesExtension, |
| value: [][]byte{nil}, |
| }, |
| { |
| xt: testpb.E_RepeatedNestedMessageExtension, |
| value: []*testpb.TestAllTypes_NestedMessage{{}}, |
| }, |
| { |
| xt: testpb.E_RepeatedNestedEnumExtension, |
| 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) |
| } |
| }) |
| } |
| } |