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