1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage impl_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "fmt" 9*1c12ee1eSDan Willemsen "testing" 10*1c12ee1eSDan Willemsen 11*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp" 12*1c12ee1eSDan Willemsen 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 14*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsen testpb "google.golang.org/protobuf/internal/testprotos/test" 17*1c12ee1eSDan Willemsen) 18*1c12ee1eSDan Willemsen 19*1c12ee1eSDan Willemsenfunc TestExtensionType(t *testing.T) { 20*1c12ee1eSDan Willemsen cmpOpts := cmp.Options{ 21*1c12ee1eSDan Willemsen cmp.Comparer(func(x, y proto.Message) bool { 22*1c12ee1eSDan Willemsen return proto.Equal(x, y) 23*1c12ee1eSDan Willemsen }), 24*1c12ee1eSDan Willemsen } 25*1c12ee1eSDan Willemsen for _, test := range []struct { 26*1c12ee1eSDan Willemsen xt protoreflect.ExtensionType 27*1c12ee1eSDan Willemsen value interface{} 28*1c12ee1eSDan Willemsen }{ 29*1c12ee1eSDan Willemsen { 30*1c12ee1eSDan Willemsen xt: testpb.E_OptionalInt32, 31*1c12ee1eSDan Willemsen value: int32(0), 32*1c12ee1eSDan Willemsen }, 33*1c12ee1eSDan Willemsen { 34*1c12ee1eSDan Willemsen xt: testpb.E_OptionalInt64, 35*1c12ee1eSDan Willemsen value: int64(0), 36*1c12ee1eSDan Willemsen }, 37*1c12ee1eSDan Willemsen { 38*1c12ee1eSDan Willemsen xt: testpb.E_OptionalUint32, 39*1c12ee1eSDan Willemsen value: uint32(0), 40*1c12ee1eSDan Willemsen }, 41*1c12ee1eSDan Willemsen { 42*1c12ee1eSDan Willemsen xt: testpb.E_OptionalUint64, 43*1c12ee1eSDan Willemsen value: uint64(0), 44*1c12ee1eSDan Willemsen }, 45*1c12ee1eSDan Willemsen { 46*1c12ee1eSDan Willemsen xt: testpb.E_OptionalFloat, 47*1c12ee1eSDan Willemsen value: float32(0), 48*1c12ee1eSDan Willemsen }, 49*1c12ee1eSDan Willemsen { 50*1c12ee1eSDan Willemsen xt: testpb.E_OptionalDouble, 51*1c12ee1eSDan Willemsen value: float64(0), 52*1c12ee1eSDan Willemsen }, 53*1c12ee1eSDan Willemsen { 54*1c12ee1eSDan Willemsen xt: testpb.E_OptionalBool, 55*1c12ee1eSDan Willemsen value: true, 56*1c12ee1eSDan Willemsen }, 57*1c12ee1eSDan Willemsen { 58*1c12ee1eSDan Willemsen xt: testpb.E_OptionalString, 59*1c12ee1eSDan Willemsen value: "", 60*1c12ee1eSDan Willemsen }, 61*1c12ee1eSDan Willemsen { 62*1c12ee1eSDan Willemsen xt: testpb.E_OptionalBytes, 63*1c12ee1eSDan Willemsen value: []byte{}, 64*1c12ee1eSDan Willemsen }, 65*1c12ee1eSDan Willemsen { 66*1c12ee1eSDan Willemsen xt: testpb.E_OptionalNestedMessage, 67*1c12ee1eSDan Willemsen value: &testpb.TestAllExtensions_NestedMessage{}, 68*1c12ee1eSDan Willemsen }, 69*1c12ee1eSDan Willemsen { 70*1c12ee1eSDan Willemsen xt: testpb.E_OptionalNestedEnum, 71*1c12ee1eSDan Willemsen value: testpb.TestAllTypes_FOO, 72*1c12ee1eSDan Willemsen }, 73*1c12ee1eSDan Willemsen { 74*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedInt32, 75*1c12ee1eSDan Willemsen value: []int32{0}, 76*1c12ee1eSDan Willemsen }, 77*1c12ee1eSDan Willemsen { 78*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedInt64, 79*1c12ee1eSDan Willemsen value: []int64{0}, 80*1c12ee1eSDan Willemsen }, 81*1c12ee1eSDan Willemsen { 82*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedUint32, 83*1c12ee1eSDan Willemsen value: []uint32{0}, 84*1c12ee1eSDan Willemsen }, 85*1c12ee1eSDan Willemsen { 86*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedUint64, 87*1c12ee1eSDan Willemsen value: []uint64{0}, 88*1c12ee1eSDan Willemsen }, 89*1c12ee1eSDan Willemsen { 90*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedFloat, 91*1c12ee1eSDan Willemsen value: []float32{0}, 92*1c12ee1eSDan Willemsen }, 93*1c12ee1eSDan Willemsen { 94*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedDouble, 95*1c12ee1eSDan Willemsen value: []float64{0}, 96*1c12ee1eSDan Willemsen }, 97*1c12ee1eSDan Willemsen { 98*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedBool, 99*1c12ee1eSDan Willemsen value: []bool{true}, 100*1c12ee1eSDan Willemsen }, 101*1c12ee1eSDan Willemsen { 102*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedString, 103*1c12ee1eSDan Willemsen value: []string{""}, 104*1c12ee1eSDan Willemsen }, 105*1c12ee1eSDan Willemsen { 106*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedBytes, 107*1c12ee1eSDan Willemsen value: [][]byte{nil}, 108*1c12ee1eSDan Willemsen }, 109*1c12ee1eSDan Willemsen { 110*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedNestedMessage, 111*1c12ee1eSDan Willemsen value: []*testpb.TestAllExtensions_NestedMessage{{}}, 112*1c12ee1eSDan Willemsen }, 113*1c12ee1eSDan Willemsen { 114*1c12ee1eSDan Willemsen xt: testpb.E_RepeatedNestedEnum, 115*1c12ee1eSDan Willemsen value: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}, 116*1c12ee1eSDan Willemsen }, 117*1c12ee1eSDan Willemsen } { 118*1c12ee1eSDan Willemsen name := test.xt.TypeDescriptor().FullName() 119*1c12ee1eSDan Willemsen t.Run(fmt.Sprint(name), func(t *testing.T) { 120*1c12ee1eSDan Willemsen if !test.xt.IsValidInterface(test.value) { 121*1c12ee1eSDan Willemsen t.Fatalf("IsValidInterface(%[1]T(%[1]v)) = false, want true", test.value) 122*1c12ee1eSDan Willemsen } 123*1c12ee1eSDan Willemsen v := test.xt.ValueOf(test.value) 124*1c12ee1eSDan Willemsen if !test.xt.IsValidValue(v) { 125*1c12ee1eSDan Willemsen t.Fatalf("IsValidValue(%[1]T(%[1]v)) = false, want true", v) 126*1c12ee1eSDan Willemsen } 127*1c12ee1eSDan Willemsen if got, want := test.xt.InterfaceOf(v), test.value; !cmp.Equal(got, want, cmpOpts) { 128*1c12ee1eSDan Willemsen t.Fatalf("round trip InterfaceOf(ValueOf(x)) = %v, want %v", got, want) 129*1c12ee1eSDan Willemsen } 130*1c12ee1eSDan Willemsen }) 131*1c12ee1eSDan Willemsen } 132*1c12ee1eSDan Willemsen} 133