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 protocmp 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "math" 9*1c12ee1eSDan Willemsen "math/rand" 10*1c12ee1eSDan Willemsen "sort" 11*1c12ee1eSDan Willemsen "testing" 12*1c12ee1eSDan Willemsen 13*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp" 14*1c12ee1eSDan Willemsen 15*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 16*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 17*1c12ee1eSDan Willemsen "google.golang.org/protobuf/testing/protopack" 18*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/dynamicpb" 19*1c12ee1eSDan Willemsen 20*1c12ee1eSDan Willemsen testpb "google.golang.org/protobuf/internal/testprotos/test" 21*1c12ee1eSDan Willemsen) 22*1c12ee1eSDan Willemsen 23*1c12ee1eSDan Willemsenfunc TestEqual(t *testing.T) { 24*1c12ee1eSDan Willemsen type test struct { 25*1c12ee1eSDan Willemsen x, y interface{} 26*1c12ee1eSDan Willemsen opts cmp.Options 27*1c12ee1eSDan Willemsen want bool 28*1c12ee1eSDan Willemsen } 29*1c12ee1eSDan Willemsen var tests []test 30*1c12ee1eSDan Willemsen 31*1c12ee1eSDan Willemsen allTypesDesc := (*testpb.TestAllTypes)(nil).ProtoReflect().Descriptor() 32*1c12ee1eSDan Willemsen 33*1c12ee1eSDan Willemsen // Test nil and empty messages of differing types. 34*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 35*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 36*1c12ee1eSDan Willemsen y: (*testpb.TestAllTypes)(nil), 37*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 38*1c12ee1eSDan Willemsen want: true, 39*1c12ee1eSDan Willemsen }, { 40*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 41*1c12ee1eSDan Willemsen y: (*testpb.TestAllExtensions)(nil), 42*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 43*1c12ee1eSDan Willemsen want: false, 44*1c12ee1eSDan Willemsen }, { 45*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 46*1c12ee1eSDan Willemsen y: new(testpb.TestAllTypes), 47*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 48*1c12ee1eSDan Willemsen want: false, 49*1c12ee1eSDan Willemsen }, { 50*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 51*1c12ee1eSDan Willemsen y: dynamicpb.NewMessage(allTypesDesc), 52*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 53*1c12ee1eSDan Willemsen want: false, 54*1c12ee1eSDan Willemsen }, { 55*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 56*1c12ee1eSDan Willemsen y: new(testpb.TestAllTypes), 57*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 58*1c12ee1eSDan Willemsen want: true, 59*1c12ee1eSDan Willemsen }, { 60*1c12ee1eSDan Willemsen x: (*testpb.TestAllTypes)(nil), 61*1c12ee1eSDan Willemsen y: dynamicpb.NewMessage(allTypesDesc), 62*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 63*1c12ee1eSDan Willemsen want: true, 64*1c12ee1eSDan Willemsen }, { 65*1c12ee1eSDan Willemsen x: new(testpb.TestAllTypes), 66*1c12ee1eSDan Willemsen y: new(testpb.TestAllTypes), 67*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 68*1c12ee1eSDan Willemsen want: true, 69*1c12ee1eSDan Willemsen }, { 70*1c12ee1eSDan Willemsen x: new(testpb.TestAllTypes), 71*1c12ee1eSDan Willemsen y: dynamicpb.NewMessage(allTypesDesc), 72*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 73*1c12ee1eSDan Willemsen want: true, 74*1c12ee1eSDan Willemsen }, { 75*1c12ee1eSDan Willemsen x: new(testpb.TestAllTypes), 76*1c12ee1eSDan Willemsen y: new(testpb.TestAllExtensions), 77*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 78*1c12ee1eSDan Willemsen want: false, 79*1c12ee1eSDan Willemsen }, { 80*1c12ee1eSDan Willemsen x: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 81*1c12ee1eSDan Willemsen y: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 82*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 83*1c12ee1eSDan Willemsen want: true, 84*1c12ee1eSDan Willemsen }, { 85*1c12ee1eSDan Willemsen x: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 86*1c12ee1eSDan Willemsen y: struct{ I interface{} }{new(testpb.TestAllTypes)}, 87*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 88*1c12ee1eSDan Willemsen want: false, 89*1c12ee1eSDan Willemsen }, { 90*1c12ee1eSDan Willemsen x: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 91*1c12ee1eSDan Willemsen y: struct{ I interface{} }{dynamicpb.NewMessage(allTypesDesc)}, 92*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 93*1c12ee1eSDan Willemsen want: false, 94*1c12ee1eSDan Willemsen }, { 95*1c12ee1eSDan Willemsen x: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 96*1c12ee1eSDan Willemsen y: struct{ I interface{} }{new(testpb.TestAllTypes)}, 97*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 98*1c12ee1eSDan Willemsen want: true, 99*1c12ee1eSDan Willemsen }, { 100*1c12ee1eSDan Willemsen x: struct{ I interface{} }{(*testpb.TestAllTypes)(nil)}, 101*1c12ee1eSDan Willemsen y: struct{ I interface{} }{dynamicpb.NewMessage(allTypesDesc)}, 102*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 103*1c12ee1eSDan Willemsen want: true, 104*1c12ee1eSDan Willemsen }, { 105*1c12ee1eSDan Willemsen x: struct{ I interface{} }{new(testpb.TestAllTypes)}, 106*1c12ee1eSDan Willemsen y: struct{ I interface{} }{new(testpb.TestAllTypes)}, 107*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 108*1c12ee1eSDan Willemsen want: true, 109*1c12ee1eSDan Willemsen }, { 110*1c12ee1eSDan Willemsen x: struct{ I interface{} }{new(testpb.TestAllTypes)}, 111*1c12ee1eSDan Willemsen y: struct{ I interface{} }{dynamicpb.NewMessage(allTypesDesc)}, 112*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 113*1c12ee1eSDan Willemsen want: true, 114*1c12ee1eSDan Willemsen }, { 115*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 116*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 117*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 118*1c12ee1eSDan Willemsen want: true, 119*1c12ee1eSDan Willemsen }, { 120*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 121*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{new(testpb.TestAllTypes)}, 122*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 123*1c12ee1eSDan Willemsen want: false, 124*1c12ee1eSDan Willemsen }, { 125*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 126*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{dynamicpb.NewMessage(allTypesDesc)}, 127*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 128*1c12ee1eSDan Willemsen want: false, 129*1c12ee1eSDan Willemsen }, { 130*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 131*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{new(testpb.TestAllTypes)}, 132*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 133*1c12ee1eSDan Willemsen want: true, 134*1c12ee1eSDan Willemsen }, { 135*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{(*testpb.TestAllTypes)(nil)}, 136*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{dynamicpb.NewMessage(allTypesDesc)}, 137*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 138*1c12ee1eSDan Willemsen want: true, 139*1c12ee1eSDan Willemsen }, { 140*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{new(testpb.TestAllTypes)}, 141*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{new(testpb.TestAllTypes)}, 142*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 143*1c12ee1eSDan Willemsen want: true, 144*1c12ee1eSDan Willemsen }, { 145*1c12ee1eSDan Willemsen x: struct{ M proto.Message }{new(testpb.TestAllTypes)}, 146*1c12ee1eSDan Willemsen y: struct{ M proto.Message }{dynamicpb.NewMessage(allTypesDesc)}, 147*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 148*1c12ee1eSDan Willemsen want: true, 149*1c12ee1eSDan Willemsen }}...) 150*1c12ee1eSDan Willemsen 151*1c12ee1eSDan Willemsen // Test message values. 152*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 153*1c12ee1eSDan Willemsen x: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}, 154*1c12ee1eSDan Willemsen y: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}, 155*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 156*1c12ee1eSDan Willemsen want: true, 157*1c12ee1eSDan Willemsen }, { 158*1c12ee1eSDan Willemsen x: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}, 159*1c12ee1eSDan Willemsen y: testpb.TestAllTypes{OptionalSint64: proto.Int64(2)}, 160*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 161*1c12ee1eSDan Willemsen want: false, 162*1c12ee1eSDan Willemsen }, { 163*1c12ee1eSDan Willemsen x: struct{ M testpb.TestAllTypes }{M: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}}, 164*1c12ee1eSDan Willemsen y: struct{ M testpb.TestAllTypes }{M: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}}, 165*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 166*1c12ee1eSDan Willemsen want: true, 167*1c12ee1eSDan Willemsen }, { 168*1c12ee1eSDan Willemsen x: struct{ M testpb.TestAllTypes }{M: testpb.TestAllTypes{OptionalSint64: proto.Int64(1)}}, 169*1c12ee1eSDan Willemsen y: struct{ M testpb.TestAllTypes }{M: testpb.TestAllTypes{OptionalSint64: proto.Int64(2)}}, 170*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 171*1c12ee1eSDan Willemsen want: false, 172*1c12ee1eSDan Willemsen }, { 173*1c12ee1eSDan Willemsen x: struct{ M []testpb.TestAllTypes }{M: []testpb.TestAllTypes{{OptionalSint64: proto.Int64(1)}}}, 174*1c12ee1eSDan Willemsen y: struct{ M []testpb.TestAllTypes }{M: []testpb.TestAllTypes{{OptionalSint64: proto.Int64(1)}}}, 175*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 176*1c12ee1eSDan Willemsen want: true, 177*1c12ee1eSDan Willemsen }, { 178*1c12ee1eSDan Willemsen x: struct{ M []testpb.TestAllTypes }{M: []testpb.TestAllTypes{{OptionalSint64: proto.Int64(1)}}}, 179*1c12ee1eSDan Willemsen y: struct{ M []testpb.TestAllTypes }{M: []testpb.TestAllTypes{{OptionalSint64: proto.Int64(2)}}}, 180*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 181*1c12ee1eSDan Willemsen want: false, 182*1c12ee1eSDan Willemsen }, { 183*1c12ee1eSDan Willemsen x: struct { 184*1c12ee1eSDan Willemsen M map[string]testpb.TestAllTypes 185*1c12ee1eSDan Willemsen }{ 186*1c12ee1eSDan Willemsen M: map[string]testpb.TestAllTypes{"k": {OptionalSint64: proto.Int64(1)}}, 187*1c12ee1eSDan Willemsen }, 188*1c12ee1eSDan Willemsen y: struct { 189*1c12ee1eSDan Willemsen M map[string]testpb.TestAllTypes 190*1c12ee1eSDan Willemsen }{ 191*1c12ee1eSDan Willemsen M: map[string]testpb.TestAllTypes{"k": {OptionalSint64: proto.Int64(1)}}, 192*1c12ee1eSDan Willemsen }, 193*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 194*1c12ee1eSDan Willemsen want: true, 195*1c12ee1eSDan Willemsen }, { 196*1c12ee1eSDan Willemsen x: struct { 197*1c12ee1eSDan Willemsen M map[string]testpb.TestAllTypes 198*1c12ee1eSDan Willemsen }{ 199*1c12ee1eSDan Willemsen M: map[string]testpb.TestAllTypes{"k": {OptionalSint64: proto.Int64(1)}}, 200*1c12ee1eSDan Willemsen }, 201*1c12ee1eSDan Willemsen y: struct { 202*1c12ee1eSDan Willemsen M map[string]testpb.TestAllTypes 203*1c12ee1eSDan Willemsen }{ 204*1c12ee1eSDan Willemsen M: map[string]testpb.TestAllTypes{"k": {OptionalSint64: proto.Int64(2)}}, 205*1c12ee1eSDan Willemsen }, 206*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 207*1c12ee1eSDan Willemsen want: false, 208*1c12ee1eSDan Willemsen }}...) 209*1c12ee1eSDan Willemsen 210*1c12ee1eSDan Willemsen // Test IgnoreUnknown. 211*1c12ee1eSDan Willemsen raw := protopack.Message{ 212*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.String("Hello, goodbye!"), 213*1c12ee1eSDan Willemsen }.Marshal() 214*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 215*1c12ee1eSDan Willemsen x: apply(&testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, setUnknown{raw}), 216*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, 217*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 218*1c12ee1eSDan Willemsen want: false, 219*1c12ee1eSDan Willemsen }, { 220*1c12ee1eSDan Willemsen x: apply(&testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, setUnknown{raw}), 221*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, 222*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreUnknown()}, 223*1c12ee1eSDan Willemsen want: true, 224*1c12ee1eSDan Willemsen }, { 225*1c12ee1eSDan Willemsen x: apply(&testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, setUnknown{raw}), 226*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalSint64: proto.Int64(6)}, 227*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreUnknown()}, 228*1c12ee1eSDan Willemsen want: false, 229*1c12ee1eSDan Willemsen }, { 230*1c12ee1eSDan Willemsen x: apply(&testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, setUnknown{raw}), 231*1c12ee1eSDan Willemsen y: apply(dynamicpb.NewMessage(allTypesDesc), setField{6, int64(5)}), 232*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 233*1c12ee1eSDan Willemsen want: false, 234*1c12ee1eSDan Willemsen }, { 235*1c12ee1eSDan Willemsen x: apply(&testpb.TestAllTypes{OptionalSint64: proto.Int64(5)}, setUnknown{raw}), 236*1c12ee1eSDan Willemsen y: apply(dynamicpb.NewMessage(allTypesDesc), setField{6, int64(5)}), 237*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreUnknown()}, 238*1c12ee1eSDan Willemsen want: true, 239*1c12ee1eSDan Willemsen }}...) 240*1c12ee1eSDan Willemsen 241*1c12ee1eSDan Willemsen // Test IgnoreDefaultScalars. 242*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 243*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 244*1c12ee1eSDan Willemsen DefaultInt32: proto.Int32(81), 245*1c12ee1eSDan Willemsen DefaultUint32: proto.Uint32(83), 246*1c12ee1eSDan Willemsen DefaultFloat: proto.Float32(91.5), 247*1c12ee1eSDan Willemsen DefaultBool: proto.Bool(true), 248*1c12ee1eSDan Willemsen DefaultBytes: []byte("world"), 249*1c12ee1eSDan Willemsen }, 250*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 251*1c12ee1eSDan Willemsen DefaultInt64: proto.Int64(82), 252*1c12ee1eSDan Willemsen DefaultUint64: proto.Uint64(84), 253*1c12ee1eSDan Willemsen DefaultDouble: proto.Float64(92e3), 254*1c12ee1eSDan Willemsen DefaultString: proto.String("hello"), 255*1c12ee1eSDan Willemsen DefaultForeignEnum: testpb.ForeignEnum_FOREIGN_BAR.Enum(), 256*1c12ee1eSDan Willemsen }, 257*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 258*1c12ee1eSDan Willemsen want: false, 259*1c12ee1eSDan Willemsen }, { 260*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 261*1c12ee1eSDan Willemsen DefaultInt32: proto.Int32(81), 262*1c12ee1eSDan Willemsen DefaultUint32: proto.Uint32(83), 263*1c12ee1eSDan Willemsen DefaultFloat: proto.Float32(91.5), 264*1c12ee1eSDan Willemsen DefaultBool: proto.Bool(true), 265*1c12ee1eSDan Willemsen DefaultBytes: []byte("world"), 266*1c12ee1eSDan Willemsen }, 267*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 268*1c12ee1eSDan Willemsen DefaultInt64: proto.Int64(82), 269*1c12ee1eSDan Willemsen DefaultUint64: proto.Uint64(84), 270*1c12ee1eSDan Willemsen DefaultDouble: proto.Float64(92e3), 271*1c12ee1eSDan Willemsen DefaultString: proto.String("hello"), 272*1c12ee1eSDan Willemsen DefaultForeignEnum: testpb.ForeignEnum_FOREIGN_BAR.Enum(), 273*1c12ee1eSDan Willemsen }, 274*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 275*1c12ee1eSDan Willemsen want: true, 276*1c12ee1eSDan Willemsen }, { 277*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 278*1c12ee1eSDan Willemsen OptionalInt32: proto.Int32(81), 279*1c12ee1eSDan Willemsen OptionalUint32: proto.Uint32(83), 280*1c12ee1eSDan Willemsen OptionalFloat: proto.Float32(91.5), 281*1c12ee1eSDan Willemsen OptionalBool: proto.Bool(true), 282*1c12ee1eSDan Willemsen OptionalBytes: []byte("world"), 283*1c12ee1eSDan Willemsen }, 284*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 285*1c12ee1eSDan Willemsen OptionalInt64: proto.Int64(82), 286*1c12ee1eSDan Willemsen OptionalUint64: proto.Uint64(84), 287*1c12ee1eSDan Willemsen OptionalDouble: proto.Float64(92e3), 288*1c12ee1eSDan Willemsen OptionalString: proto.String("hello"), 289*1c12ee1eSDan Willemsen OptionalForeignEnum: testpb.ForeignEnum_FOREIGN_BAR.Enum(), 290*1c12ee1eSDan Willemsen }, 291*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 292*1c12ee1eSDan Willemsen want: false, 293*1c12ee1eSDan Willemsen }, { 294*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 295*1c12ee1eSDan Willemsen OptionalInt32: proto.Int32(0), 296*1c12ee1eSDan Willemsen OptionalUint32: proto.Uint32(0), 297*1c12ee1eSDan Willemsen OptionalFloat: proto.Float32(0), 298*1c12ee1eSDan Willemsen OptionalBool: proto.Bool(false), 299*1c12ee1eSDan Willemsen OptionalBytes: []byte(""), 300*1c12ee1eSDan Willemsen }, 301*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 302*1c12ee1eSDan Willemsen OptionalInt64: proto.Int64(0), 303*1c12ee1eSDan Willemsen OptionalUint64: proto.Uint64(0), 304*1c12ee1eSDan Willemsen OptionalDouble: proto.Float64(0), 305*1c12ee1eSDan Willemsen OptionalString: proto.String(""), 306*1c12ee1eSDan Willemsen OptionalForeignEnum: testpb.ForeignEnum_FOREIGN_FOO.Enum(), 307*1c12ee1eSDan Willemsen }, 308*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 309*1c12ee1eSDan Willemsen want: true, 310*1c12ee1eSDan Willemsen }, { 311*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 312*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultInt32, int32(81)}, 313*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultUint32, uint32(83)}, 314*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultFloat, float32(91.5)}, 315*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultBool, bool(true)}, 316*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultBytes, []byte("world")}), 317*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 318*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultInt64, int64(82)}, 319*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultUint64, uint64(84)}, 320*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultDouble, float64(92e3)}, 321*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultString, string("hello")}), 322*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 323*1c12ee1eSDan Willemsen want: false, 324*1c12ee1eSDan Willemsen }, { 325*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 326*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultInt32, int32(81)}, 327*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultUint32, uint32(83)}, 328*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultFloat, float32(91.5)}, 329*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultBool, bool(true)}, 330*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultBytes, []byte("world")}), 331*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 332*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultInt64, int64(82)}, 333*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultUint64, uint64(84)}, 334*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultDouble, float64(92e3)}, 335*1c12ee1eSDan Willemsen setExtension{testpb.E_DefaultString, string("hello")}), 336*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 337*1c12ee1eSDan Willemsen want: true, 338*1c12ee1eSDan Willemsen }, { 339*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 340*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalInt32, int32(0)}, 341*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalUint32, uint32(0)}, 342*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalFloat, float32(0)}, 343*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalBool, bool(false)}, 344*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalBytes, []byte("")}), 345*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 346*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalInt64, int64(0)}, 347*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalUint64, uint64(0)}, 348*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalDouble, float64(0)}, 349*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, string("")}), 350*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 351*1c12ee1eSDan Willemsen want: false, 352*1c12ee1eSDan Willemsen }, { 353*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 354*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalInt32, int32(0)}, 355*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalUint32, uint32(0)}, 356*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalFloat, float32(0)}, 357*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalBool, bool(false)}, 358*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalBytes, []byte("")}), 359*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 360*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalInt64, int64(0)}, 361*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalUint64, uint64(0)}, 362*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalDouble, float64(0)}, 363*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, string("")}), 364*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 365*1c12ee1eSDan Willemsen want: true, 366*1c12ee1eSDan Willemsen }, { 367*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 368*1c12ee1eSDan Willemsen DefaultFloat: proto.Float32(91.6), 369*1c12ee1eSDan Willemsen }, 370*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 371*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 372*1c12ee1eSDan Willemsen want: false, 373*1c12ee1eSDan Willemsen }, { 374*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 375*1c12ee1eSDan Willemsen OptionalForeignMessage: &testpb.ForeignMessage{}, 376*1c12ee1eSDan Willemsen }, 377*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 378*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreDefaultScalars()}, 379*1c12ee1eSDan Willemsen want: false, 380*1c12ee1eSDan Willemsen }}...) 381*1c12ee1eSDan Willemsen 382*1c12ee1eSDan Willemsen // Test IgnoreEmptyMessages. 383*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 384*1c12ee1eSDan Willemsen x: []*testpb.TestAllTypes{nil, {}, {OptionalInt32: proto.Int32(5)}}, 385*1c12ee1eSDan Willemsen y: []*testpb.TestAllTypes{nil, {}, {OptionalInt32: proto.Int32(5)}}, 386*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 387*1c12ee1eSDan Willemsen want: true, 388*1c12ee1eSDan Willemsen }, { 389*1c12ee1eSDan Willemsen x: []*testpb.TestAllTypes{nil, {}, {OptionalInt32: proto.Int32(5)}}, 390*1c12ee1eSDan Willemsen y: []*testpb.TestAllTypes{{OptionalInt32: proto.Int32(5)}}, 391*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 392*1c12ee1eSDan Willemsen want: false, 393*1c12ee1eSDan Willemsen }, { 394*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalForeignMessage: &testpb.ForeignMessage{}}, 395*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalForeignMessage: nil}, 396*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 397*1c12ee1eSDan Willemsen want: false, 398*1c12ee1eSDan Willemsen }, { 399*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalForeignMessage: &testpb.ForeignMessage{}}, 400*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalForeignMessage: nil}, 401*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 402*1c12ee1eSDan Willemsen want: true, 403*1c12ee1eSDan Willemsen }, { 404*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalForeignMessage: &testpb.ForeignMessage{C: proto.Int32(5)}}, 405*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalForeignMessage: nil}, 406*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 407*1c12ee1eSDan Willemsen want: false, 408*1c12ee1eSDan Willemsen }, { 409*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{}}, 410*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: nil}, 411*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 412*1c12ee1eSDan Willemsen want: true, 413*1c12ee1eSDan Willemsen }, { 414*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {}}}, 415*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: nil}, 416*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 417*1c12ee1eSDan Willemsen want: false, 418*1c12ee1eSDan Willemsen }, { 419*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {}}}, 420*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: nil}, 421*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 422*1c12ee1eSDan Willemsen want: true, 423*1c12ee1eSDan Willemsen }, { 424*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(5)}, {}}}, 425*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: nil}, 426*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 427*1c12ee1eSDan Willemsen want: false, 428*1c12ee1eSDan Willemsen }, { 429*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(5)}, {}}}, 430*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {}, nil, {}, {C: proto.Int32(5)}, {}}}, 431*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 432*1c12ee1eSDan Willemsen want: false, 433*1c12ee1eSDan Willemsen }, { 434*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(5)}, {}}}, 435*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {}, nil, {}, {C: proto.Int32(5)}, {}}}, 436*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 437*1c12ee1eSDan Willemsen want: true, 438*1c12ee1eSDan Willemsen }, { 439*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{}}, 440*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: nil}, 441*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 442*1c12ee1eSDan Willemsen want: true, 443*1c12ee1eSDan Willemsen }, { 444*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": nil, "2": {}}}, 445*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: nil}, 446*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 447*1c12ee1eSDan Willemsen want: false, 448*1c12ee1eSDan Willemsen }, { 449*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": nil, "2": {}}}, 450*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: nil}, 451*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 452*1c12ee1eSDan Willemsen want: true, 453*1c12ee1eSDan Willemsen }, { 454*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": nil, "2": {A: proto.Int32(5)}, "3": {}}}, 455*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: nil}, 456*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 457*1c12ee1eSDan Willemsen want: false, 458*1c12ee1eSDan Willemsen }, { 459*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": nil, "2": {A: proto.Int32(5)}, "3": {}}}, 460*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": {}, "1a": {}, "1b": nil, "2": {A: proto.Int32(5)}, "4": {}}}, 461*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 462*1c12ee1eSDan Willemsen want: false, 463*1c12ee1eSDan Willemsen }, { 464*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": nil, "2": {A: proto.Int32(5)}, "3": {}}}, 465*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"1": {}, "1a": {}, "1b": nil, "2": {A: proto.Int32(5)}, "4": {}}}, 466*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEmptyMessages()}, 467*1c12ee1eSDan Willemsen want: true, 468*1c12ee1eSDan Willemsen }}...) 469*1c12ee1eSDan Willemsen 470*1c12ee1eSDan Willemsen // Test IgnoreEnums and IgnoreMessages. 471*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 472*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 473*1c12ee1eSDan Willemsen OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}, 474*1c12ee1eSDan Willemsen RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}, 475*1c12ee1eSDan Willemsen MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"3": {A: proto.Int32(3)}}, 476*1c12ee1eSDan Willemsen }, 477*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 478*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 479*1c12ee1eSDan Willemsen want: false, 480*1c12ee1eSDan Willemsen }, { 481*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 482*1c12ee1eSDan Willemsen OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}, 483*1c12ee1eSDan Willemsen RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}, 484*1c12ee1eSDan Willemsen MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"3": {A: proto.Int32(3)}}, 485*1c12ee1eSDan Willemsen }, 486*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 487*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreMessages(&testpb.TestAllTypes{})}, 488*1c12ee1eSDan Willemsen want: true, 489*1c12ee1eSDan Willemsen }, { 490*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 491*1c12ee1eSDan Willemsen OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum(), 492*1c12ee1eSDan Willemsen RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}, 493*1c12ee1eSDan Willemsen MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"baz": testpb.TestAllTypes_BAZ}, 494*1c12ee1eSDan Willemsen }, 495*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 496*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 497*1c12ee1eSDan Willemsen want: false, 498*1c12ee1eSDan Willemsen }, { 499*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 500*1c12ee1eSDan Willemsen OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum(), 501*1c12ee1eSDan Willemsen RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}, 502*1c12ee1eSDan Willemsen MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"baz": testpb.TestAllTypes_BAZ}, 503*1c12ee1eSDan Willemsen }, 504*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 505*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), IgnoreEnums(testpb.TestAllTypes_NestedEnum(0))}, 506*1c12ee1eSDan Willemsen want: true, 507*1c12ee1eSDan Willemsen }, { 508*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 509*1c12ee1eSDan Willemsen OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum(), 510*1c12ee1eSDan Willemsen RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}, 511*1c12ee1eSDan Willemsen MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"baz": testpb.TestAllTypes_BAZ}, 512*1c12ee1eSDan Willemsen 513*1c12ee1eSDan Willemsen OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}, 514*1c12ee1eSDan Willemsen RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}, 515*1c12ee1eSDan Willemsen MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"3": {A: proto.Int32(3)}}, 516*1c12ee1eSDan Willemsen }, 517*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 518*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 519*1c12ee1eSDan Willemsen IgnoreMessages(&testpb.TestAllExtensions{}), 520*1c12ee1eSDan Willemsen IgnoreEnums(testpb.ForeignEnum(0)), 521*1c12ee1eSDan Willemsen }, 522*1c12ee1eSDan Willemsen want: false, 523*1c12ee1eSDan Willemsen }}...) 524*1c12ee1eSDan Willemsen 525*1c12ee1eSDan Willemsen // Test IgnoreFields and IgnoreOneofs. 526*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 527*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(5)}, 528*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(6)}, 529*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 530*1c12ee1eSDan Willemsen want: false, 531*1c12ee1eSDan Willemsen }, { 532*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(5)}, 533*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{}, 534*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 535*1c12ee1eSDan Willemsen IgnoreFields(&testpb.TestAllTypes{}, "optional_int32")}, 536*1c12ee1eSDan Willemsen want: true, 537*1c12ee1eSDan Willemsen }, { 538*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(5)}, 539*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(6)}, 540*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 541*1c12ee1eSDan Willemsen IgnoreFields(&testpb.TestAllTypes{}, "optional_int32")}, 542*1c12ee1eSDan Willemsen want: true, 543*1c12ee1eSDan Willemsen }, { 544*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(5)}, 545*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(6)}, 546*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 547*1c12ee1eSDan Willemsen IgnoreFields(&testpb.TestAllTypes{}, "optional_int64")}, 548*1c12ee1eSDan Willemsen want: false, 549*1c12ee1eSDan Willemsen }, { 550*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{5}}, 551*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofString{"5"}}, 552*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 553*1c12ee1eSDan Willemsen want: false, 554*1c12ee1eSDan Willemsen }, { 555*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{5}}, 556*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofString{"5"}}, 557*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 558*1c12ee1eSDan Willemsen IgnoreFields(&testpb.TestAllTypes{}, "oneof_uint32"), 559*1c12ee1eSDan Willemsen IgnoreFields(&testpb.TestAllTypes{}, "oneof_string")}, 560*1c12ee1eSDan Willemsen want: true, 561*1c12ee1eSDan Willemsen }, { 562*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{5}}, 563*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofString{"5"}}, 564*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 565*1c12ee1eSDan Willemsen IgnoreOneofs(&testpb.TestAllTypes{}, "oneof_field")}, 566*1c12ee1eSDan Willemsen want: true, 567*1c12ee1eSDan Willemsen }, { 568*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 569*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "hello"}), 570*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 571*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "goodbye"}), 572*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 573*1c12ee1eSDan Willemsen want: false, 574*1c12ee1eSDan Willemsen }, { 575*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 576*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "hello"}), 577*1c12ee1eSDan Willemsen y: new(testpb.TestAllExtensions), 578*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 579*1c12ee1eSDan Willemsen IgnoreDescriptors(testpb.E_OptionalString.TypeDescriptor())}, 580*1c12ee1eSDan Willemsen want: true, 581*1c12ee1eSDan Willemsen }, { 582*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 583*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "hello"}), 584*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 585*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "goodbye"}), 586*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 587*1c12ee1eSDan Willemsen IgnoreDescriptors(testpb.E_OptionalString.TypeDescriptor())}, 588*1c12ee1eSDan Willemsen want: true, 589*1c12ee1eSDan Willemsen }, { 590*1c12ee1eSDan Willemsen x: apply(new(testpb.TestAllExtensions), 591*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "hello"}), 592*1c12ee1eSDan Willemsen y: apply(new(testpb.TestAllExtensions), 593*1c12ee1eSDan Willemsen setExtension{testpb.E_OptionalString, "goodbye"}), 594*1c12ee1eSDan Willemsen opts: cmp.Options{Transform(), 595*1c12ee1eSDan Willemsen IgnoreDescriptors(testpb.E_OptionalInt32.TypeDescriptor())}, 596*1c12ee1eSDan Willemsen want: false, 597*1c12ee1eSDan Willemsen }}...) 598*1c12ee1eSDan Willemsen 599*1c12ee1eSDan Willemsen // Test FilterEnum. 600*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 601*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 602*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 603*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 604*1c12ee1eSDan Willemsen want: false, 605*1c12ee1eSDan Willemsen }, { 606*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 607*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 608*1c12ee1eSDan Willemsen opts: cmp.Options{ 609*1c12ee1eSDan Willemsen Transform(), 610*1c12ee1eSDan Willemsen FilterEnum(testpb.ForeignEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 611*1c12ee1eSDan Willemsen }, 612*1c12ee1eSDan Willemsen want: false, // mismatching filter type 613*1c12ee1eSDan Willemsen }, { 614*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 615*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 616*1c12ee1eSDan Willemsen opts: cmp.Options{ 617*1c12ee1eSDan Willemsen Transform(), 618*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y int) bool { return true })), 619*1c12ee1eSDan Willemsen }, 620*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 621*1c12ee1eSDan Willemsen }, { 622*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 623*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 624*1c12ee1eSDan Willemsen opts: cmp.Options{ 625*1c12ee1eSDan Willemsen Transform(), 626*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y testpb.TestAllTypes_NestedEnum) bool { return true })), 627*1c12ee1eSDan Willemsen }, 628*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 629*1c12ee1eSDan Willemsen }, { 630*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 631*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 632*1c12ee1eSDan Willemsen opts: cmp.Options{ 633*1c12ee1eSDan Willemsen Transform(), 634*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 635*1c12ee1eSDan Willemsen }, 636*1c12ee1eSDan Willemsen want: true, 637*1c12ee1eSDan Willemsen }, { 638*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()}, 639*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()}, 640*1c12ee1eSDan Willemsen opts: cmp.Options{ 641*1c12ee1eSDan Willemsen Transform(), 642*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y Enum) bool { return true })), 643*1c12ee1eSDan Willemsen }, 644*1c12ee1eSDan Willemsen want: true, 645*1c12ee1eSDan Willemsen }, { 646*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 647*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 648*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 649*1c12ee1eSDan Willemsen want: false, 650*1c12ee1eSDan Willemsen }, { 651*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 652*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 653*1c12ee1eSDan Willemsen opts: cmp.Options{ 654*1c12ee1eSDan Willemsen Transform(), 655*1c12ee1eSDan Willemsen FilterEnum(testpb.ForeignEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 656*1c12ee1eSDan Willemsen }, 657*1c12ee1eSDan Willemsen want: false, // mismatching filter type 658*1c12ee1eSDan Willemsen }, { 659*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 660*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 661*1c12ee1eSDan Willemsen opts: cmp.Options{ 662*1c12ee1eSDan Willemsen Transform(), 663*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y int) bool { return true })), 664*1c12ee1eSDan Willemsen }, 665*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 666*1c12ee1eSDan Willemsen }, { 667*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 668*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 669*1c12ee1eSDan Willemsen opts: cmp.Options{ 670*1c12ee1eSDan Willemsen Transform(), 671*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y []testpb.TestAllTypes_NestedEnum) bool { return true })), 672*1c12ee1eSDan Willemsen }, 673*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 674*1c12ee1eSDan Willemsen }, { 675*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 676*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 677*1c12ee1eSDan Willemsen opts: cmp.Options{ 678*1c12ee1eSDan Willemsen Transform(), 679*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 680*1c12ee1eSDan Willemsen }, 681*1c12ee1eSDan Willemsen want: true, 682*1c12ee1eSDan Willemsen }, { 683*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}}, 684*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}}, 685*1c12ee1eSDan Willemsen opts: cmp.Options{ 686*1c12ee1eSDan Willemsen Transform(), 687*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y []Enum) bool { return true })), 688*1c12ee1eSDan Willemsen }, 689*1c12ee1eSDan Willemsen want: true, 690*1c12ee1eSDan Willemsen }, { 691*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 692*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 693*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 694*1c12ee1eSDan Willemsen want: false, 695*1c12ee1eSDan Willemsen }, { 696*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 697*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 698*1c12ee1eSDan Willemsen opts: cmp.Options{ 699*1c12ee1eSDan Willemsen Transform(), 700*1c12ee1eSDan Willemsen FilterEnum(testpb.ForeignEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 701*1c12ee1eSDan Willemsen }, 702*1c12ee1eSDan Willemsen want: false, // mismatching filter type 703*1c12ee1eSDan Willemsen }, { 704*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 705*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 706*1c12ee1eSDan Willemsen opts: cmp.Options{ 707*1c12ee1eSDan Willemsen Transform(), 708*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y int) bool { return true })), 709*1c12ee1eSDan Willemsen }, 710*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 711*1c12ee1eSDan Willemsen }, { 712*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 713*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 714*1c12ee1eSDan Willemsen opts: cmp.Options{ 715*1c12ee1eSDan Willemsen Transform(), 716*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y map[string]testpb.TestAllTypes_NestedEnum) bool { return true })), 717*1c12ee1eSDan Willemsen }, 718*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 719*1c12ee1eSDan Willemsen }, { 720*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 721*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 722*1c12ee1eSDan Willemsen opts: cmp.Options{ 723*1c12ee1eSDan Willemsen Transform(), 724*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y interface{}) bool { return true })), 725*1c12ee1eSDan Willemsen }, 726*1c12ee1eSDan Willemsen want: true, 727*1c12ee1eSDan Willemsen }, { 728*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_FOO}}, 729*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{"k": testpb.TestAllTypes_BAR}}, 730*1c12ee1eSDan Willemsen opts: cmp.Options{ 731*1c12ee1eSDan Willemsen Transform(), 732*1c12ee1eSDan Willemsen FilterEnum(testpb.TestAllTypes_NestedEnum(0), cmp.Comparer(func(x, y map[string]Enum) bool { return true })), 733*1c12ee1eSDan Willemsen }, 734*1c12ee1eSDan Willemsen want: true, 735*1c12ee1eSDan Willemsen }}...) 736*1c12ee1eSDan Willemsen 737*1c12ee1eSDan Willemsen // Test FilterMessage. 738*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 739*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 740*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 741*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 742*1c12ee1eSDan Willemsen want: false, 743*1c12ee1eSDan Willemsen }, { 744*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 745*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 746*1c12ee1eSDan Willemsen opts: cmp.Options{ 747*1c12ee1eSDan Willemsen Transform(), 748*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllExtensions), cmp.Comparer(func(x, y interface{}) bool { return true })), 749*1c12ee1eSDan Willemsen }, 750*1c12ee1eSDan Willemsen want: false, // mismatching filter type 751*1c12ee1eSDan Willemsen }, { 752*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 753*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 754*1c12ee1eSDan Willemsen opts: cmp.Options{ 755*1c12ee1eSDan Willemsen Transform(), 756*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y int) bool { return true })), 757*1c12ee1eSDan Willemsen }, 758*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 759*1c12ee1eSDan Willemsen }, { 760*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 761*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 762*1c12ee1eSDan Willemsen opts: cmp.Options{ 763*1c12ee1eSDan Willemsen Transform(), 764*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y *testpb.TestAllTypes_NestedMessage) bool { return true })), 765*1c12ee1eSDan Willemsen }, 766*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 767*1c12ee1eSDan Willemsen }, { 768*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 769*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 770*1c12ee1eSDan Willemsen opts: cmp.Options{ 771*1c12ee1eSDan Willemsen Transform(), 772*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y interface{}) bool { return true })), 773*1c12ee1eSDan Willemsen }, 774*1c12ee1eSDan Willemsen want: true, 775*1c12ee1eSDan Willemsen }, { 776*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(1)}}, 777*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(2)}}, 778*1c12ee1eSDan Willemsen opts: cmp.Options{ 779*1c12ee1eSDan Willemsen Transform(), 780*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y Message) bool { return true })), 781*1c12ee1eSDan Willemsen }, 782*1c12ee1eSDan Willemsen want: true, 783*1c12ee1eSDan Willemsen }, { 784*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 785*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 786*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 787*1c12ee1eSDan Willemsen want: false, 788*1c12ee1eSDan Willemsen }, { 789*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 790*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 791*1c12ee1eSDan Willemsen opts: cmp.Options{ 792*1c12ee1eSDan Willemsen Transform(), 793*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllExtensions), cmp.Comparer(func(x, y interface{}) bool { return true })), 794*1c12ee1eSDan Willemsen }, 795*1c12ee1eSDan Willemsen want: false, // mismatching filter type 796*1c12ee1eSDan Willemsen }, { 797*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 798*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 799*1c12ee1eSDan Willemsen opts: cmp.Options{ 800*1c12ee1eSDan Willemsen Transform(), 801*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y int) bool { return true })), 802*1c12ee1eSDan Willemsen }, 803*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 804*1c12ee1eSDan Willemsen }, { 805*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 806*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 807*1c12ee1eSDan Willemsen opts: cmp.Options{ 808*1c12ee1eSDan Willemsen Transform(), 809*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y []*testpb.TestAllTypes_NestedMessage) bool { return true })), 810*1c12ee1eSDan Willemsen }, 811*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 812*1c12ee1eSDan Willemsen }, { 813*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 814*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 815*1c12ee1eSDan Willemsen opts: cmp.Options{ 816*1c12ee1eSDan Willemsen Transform(), 817*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y interface{}) bool { return true })), 818*1c12ee1eSDan Willemsen }, 819*1c12ee1eSDan Willemsen want: true, 820*1c12ee1eSDan Willemsen }, { 821*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(1)}}}, 822*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{{A: proto.Int32(2)}}}, 823*1c12ee1eSDan Willemsen opts: cmp.Options{ 824*1c12ee1eSDan Willemsen Transform(), 825*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y []Message) bool { return true })), 826*1c12ee1eSDan Willemsen }, 827*1c12ee1eSDan Willemsen want: true, 828*1c12ee1eSDan Willemsen }, { 829*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 830*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 831*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 832*1c12ee1eSDan Willemsen want: false, 833*1c12ee1eSDan Willemsen }, { 834*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 835*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 836*1c12ee1eSDan Willemsen opts: cmp.Options{ 837*1c12ee1eSDan Willemsen Transform(), 838*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllExtensions), cmp.Comparer(func(x, y interface{}) bool { return true })), 839*1c12ee1eSDan Willemsen }, 840*1c12ee1eSDan Willemsen want: false, // mismatching filter type 841*1c12ee1eSDan Willemsen }, { 842*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 843*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 844*1c12ee1eSDan Willemsen opts: cmp.Options{ 845*1c12ee1eSDan Willemsen Transform(), 846*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y int) bool { return true })), 847*1c12ee1eSDan Willemsen }, 848*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 849*1c12ee1eSDan Willemsen }, { 850*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 851*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 852*1c12ee1eSDan Willemsen opts: cmp.Options{ 853*1c12ee1eSDan Willemsen Transform(), 854*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y map[string]*testpb.TestAllTypes_NestedMessage) bool { return true })), 855*1c12ee1eSDan Willemsen }, 856*1c12ee1eSDan Willemsen want: false, // matching filter type, but mismatching comparer type 857*1c12ee1eSDan Willemsen }, { 858*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 859*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 860*1c12ee1eSDan Willemsen opts: cmp.Options{ 861*1c12ee1eSDan Willemsen Transform(), 862*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y interface{}) bool { return true })), 863*1c12ee1eSDan Willemsen }, 864*1c12ee1eSDan Willemsen want: true, 865*1c12ee1eSDan Willemsen }, { 866*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(1)}}}, 867*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{"k": {A: proto.Int32(2)}}}, 868*1c12ee1eSDan Willemsen opts: cmp.Options{ 869*1c12ee1eSDan Willemsen Transform(), 870*1c12ee1eSDan Willemsen FilterMessage(new(testpb.TestAllTypes_NestedMessage), cmp.Comparer(func(x, y map[string]Message) bool { return true })), 871*1c12ee1eSDan Willemsen }, 872*1c12ee1eSDan Willemsen want: true, 873*1c12ee1eSDan Willemsen }}...) 874*1c12ee1eSDan Willemsen 875*1c12ee1eSDan Willemsen // Test FilterField. 876*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 877*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)}, 878*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)}, 879*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 880*1c12ee1eSDan Willemsen want: false, 881*1c12ee1eSDan Willemsen }, { 882*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)}, 883*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)}, 884*1c12ee1eSDan Willemsen opts: cmp.Options{ 885*1c12ee1eSDan Willemsen Transform(), 886*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "optional_int64", cmp.Comparer(func(x, y interface{}) bool { return true })), 887*1c12ee1eSDan Willemsen }, 888*1c12ee1eSDan Willemsen want: false, // mismatching filter name 889*1c12ee1eSDan Willemsen }, { 890*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)}, 891*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)}, 892*1c12ee1eSDan Willemsen opts: cmp.Options{ 893*1c12ee1eSDan Willemsen Transform(), 894*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "optional_int32", cmp.Comparer(func(x, y int64) bool { return true })), 895*1c12ee1eSDan Willemsen }, 896*1c12ee1eSDan Willemsen want: false, // matching filter name, but mismatching comparer type 897*1c12ee1eSDan Willemsen }, { 898*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)}, 899*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)}, 900*1c12ee1eSDan Willemsen opts: cmp.Options{ 901*1c12ee1eSDan Willemsen Transform(), 902*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "optional_int32", cmp.Comparer(func(x, y interface{}) bool { return true })), 903*1c12ee1eSDan Willemsen }, 904*1c12ee1eSDan Willemsen want: true, 905*1c12ee1eSDan Willemsen }, { 906*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)}, 907*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)}, 908*1c12ee1eSDan Willemsen opts: cmp.Options{ 909*1c12ee1eSDan Willemsen Transform(), 910*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "optional_int32", cmp.Comparer(func(x, y int32) bool { return true })), 911*1c12ee1eSDan Willemsen }, 912*1c12ee1eSDan Willemsen want: true, 913*1c12ee1eSDan Willemsen }, { 914*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}}, 915*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2}}, 916*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 917*1c12ee1eSDan Willemsen want: false, 918*1c12ee1eSDan Willemsen }, { 919*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}}, 920*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2}}, 921*1c12ee1eSDan Willemsen opts: cmp.Options{ 922*1c12ee1eSDan Willemsen Transform(), 923*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "repeated_int64", cmp.Comparer(func(x, y interface{}) bool { return true })), 924*1c12ee1eSDan Willemsen }, 925*1c12ee1eSDan Willemsen want: false, // mismatching filter name 926*1c12ee1eSDan Willemsen }, { 927*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}}, 928*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2}}, 929*1c12ee1eSDan Willemsen opts: cmp.Options{ 930*1c12ee1eSDan Willemsen Transform(), 931*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "repeated_int32", cmp.Comparer(func(x, y []int64) bool { return true })), 932*1c12ee1eSDan Willemsen }, 933*1c12ee1eSDan Willemsen want: false, // matching filter name, but mismatching comparer type 934*1c12ee1eSDan Willemsen }, { 935*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}}, 936*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2}}, 937*1c12ee1eSDan Willemsen opts: cmp.Options{ 938*1c12ee1eSDan Willemsen Transform(), 939*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "repeated_int32", cmp.Comparer(func(x, y interface{}) bool { return true })), 940*1c12ee1eSDan Willemsen }, 941*1c12ee1eSDan Willemsen want: true, 942*1c12ee1eSDan Willemsen }, { 943*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}}, 944*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2}}, 945*1c12ee1eSDan Willemsen opts: cmp.Options{ 946*1c12ee1eSDan Willemsen Transform(), 947*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "repeated_int32", cmp.Comparer(func(x, y []int32) bool { return true })), 948*1c12ee1eSDan Willemsen }, 949*1c12ee1eSDan Willemsen want: true, 950*1c12ee1eSDan Willemsen }, { 951*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 1}}, 952*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{2: 2}}, 953*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 954*1c12ee1eSDan Willemsen want: false, 955*1c12ee1eSDan Willemsen }, { 956*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 1}}, 957*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{2: 2}}, 958*1c12ee1eSDan Willemsen opts: cmp.Options{ 959*1c12ee1eSDan Willemsen Transform(), 960*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "map_int64_int64", cmp.Comparer(func(x, y interface{}) bool { return true })), 961*1c12ee1eSDan Willemsen }, 962*1c12ee1eSDan Willemsen want: false, // mismatching filter name 963*1c12ee1eSDan Willemsen }, { 964*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 1}}, 965*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{2: 2}}, 966*1c12ee1eSDan Willemsen opts: cmp.Options{ 967*1c12ee1eSDan Willemsen Transform(), 968*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "map_int32_int32", cmp.Comparer(func(x, y map[int64]int64) bool { return true })), 969*1c12ee1eSDan Willemsen }, 970*1c12ee1eSDan Willemsen want: false, // matching filter name, but mismatching comparer type 971*1c12ee1eSDan Willemsen }, { 972*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 1}}, 973*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{2: 2}}, 974*1c12ee1eSDan Willemsen opts: cmp.Options{ 975*1c12ee1eSDan Willemsen Transform(), 976*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "map_int32_int32", cmp.Comparer(func(x, y interface{}) bool { return true })), 977*1c12ee1eSDan Willemsen }, 978*1c12ee1eSDan Willemsen want: true, 979*1c12ee1eSDan Willemsen }, { 980*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 1}}, 981*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{2: 2}}, 982*1c12ee1eSDan Willemsen opts: cmp.Options{ 983*1c12ee1eSDan Willemsen Transform(), 984*1c12ee1eSDan Willemsen FilterField(new(testpb.TestAllTypes), "map_int32_int32", cmp.Comparer(func(x, y map[int32]int32) bool { return true })), 985*1c12ee1eSDan Willemsen }, 986*1c12ee1eSDan Willemsen want: true, 987*1c12ee1eSDan Willemsen }}...) 988*1c12ee1eSDan Willemsen 989*1c12ee1eSDan Willemsen // Test FilterOneof 990*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 991*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{1}}, 992*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{2}}, 993*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 994*1c12ee1eSDan Willemsen want: false, 995*1c12ee1eSDan Willemsen }, { 996*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{1}}, 997*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{2}}, 998*1c12ee1eSDan Willemsen opts: cmp.Options{ 999*1c12ee1eSDan Willemsen Transform(), 1000*1c12ee1eSDan Willemsen FilterOneof(new(testpb.TestAllTypes), "oneof_optional", cmp.Comparer(func(x, y interface{}) bool { return true })), 1001*1c12ee1eSDan Willemsen }, 1002*1c12ee1eSDan Willemsen want: false, // mismatching filter name 1003*1c12ee1eSDan Willemsen }, { 1004*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{1}}, 1005*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{2}}, 1006*1c12ee1eSDan Willemsen opts: cmp.Options{ 1007*1c12ee1eSDan Willemsen Transform(), 1008*1c12ee1eSDan Willemsen FilterOneof(new(testpb.TestAllTypes), "oneof_field", cmp.Comparer(func(x, y string) bool { return true })), 1009*1c12ee1eSDan Willemsen }, 1010*1c12ee1eSDan Willemsen want: false, // matching filter name, but mismatching comparer type 1011*1c12ee1eSDan Willemsen }, { 1012*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{1}}, 1013*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{2}}, 1014*1c12ee1eSDan Willemsen opts: cmp.Options{ 1015*1c12ee1eSDan Willemsen Transform(), 1016*1c12ee1eSDan Willemsen FilterOneof(new(testpb.TestAllTypes), "oneof_field", cmp.Comparer(func(x, y uint32) bool { return true })), 1017*1c12ee1eSDan Willemsen }, 1018*1c12ee1eSDan Willemsen want: true, 1019*1c12ee1eSDan Willemsen }, { 1020*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{1}}, 1021*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{OneofField: &testpb.TestAllTypes_OneofUint32{2}}, 1022*1c12ee1eSDan Willemsen opts: cmp.Options{ 1023*1c12ee1eSDan Willemsen Transform(), 1024*1c12ee1eSDan Willemsen FilterOneof(new(testpb.TestAllTypes), "oneof_field", cmp.Comparer(func(x, y interface{}) bool { return true })), 1025*1c12ee1eSDan Willemsen }, 1026*1c12ee1eSDan Willemsen want: true, 1027*1c12ee1eSDan Willemsen }}...) 1028*1c12ee1eSDan Willemsen 1029*1c12ee1eSDan Willemsen // Test SortRepeated. 1030*1c12ee1eSDan Willemsen type higherOrderType struct { 1031*1c12ee1eSDan Willemsen M *testpb.TestAllTypes 1032*1c12ee1eSDan Willemsen I32s []int32 1033*1c12ee1eSDan Willemsen Es []testpb.TestAllTypes_NestedEnum 1034*1c12ee1eSDan Willemsen Ms []*testpb.ForeignMessage 1035*1c12ee1eSDan Willemsen } 1036*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 1037*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1038*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1039*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1040*1c12ee1eSDan Willemsen want: false, 1041*1c12ee1eSDan Willemsen }, { 1042*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1043*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1044*1c12ee1eSDan Willemsen opts: cmp.Options{ 1045*1c12ee1eSDan Willemsen Transform(), 1046*1c12ee1eSDan Willemsen SortRepeated(func(x, y int32) bool { return x < y }), 1047*1c12ee1eSDan Willemsen }, 1048*1c12ee1eSDan Willemsen want: true, 1049*1c12ee1eSDan Willemsen }, { 1050*1c12ee1eSDan Willemsen x: higherOrderType{ 1051*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1052*1c12ee1eSDan Willemsen I32s: []int32{3, 2, 1, 2, 3, 3}, 1053*1c12ee1eSDan Willemsen }, 1054*1c12ee1eSDan Willemsen y: higherOrderType{ 1055*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1056*1c12ee1eSDan Willemsen I32s: []int32{2, 3, 3, 2, 1, 3}, 1057*1c12ee1eSDan Willemsen }, 1058*1c12ee1eSDan Willemsen opts: cmp.Options{ 1059*1c12ee1eSDan Willemsen Transform(), 1060*1c12ee1eSDan Willemsen SortRepeated(func(x, y int32) bool { return x < y }), 1061*1c12ee1eSDan Willemsen }, 1062*1c12ee1eSDan Willemsen want: false, // sort does not apply to []int32 outside of a message 1063*1c12ee1eSDan Willemsen }, { 1064*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1065*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1066*1c12ee1eSDan Willemsen opts: cmp.Options{ 1067*1c12ee1eSDan Willemsen Transform(), 1068*1c12ee1eSDan Willemsen SortRepeated(func(x, y int64) bool { return x < y }), 1069*1c12ee1eSDan Willemsen }, 1070*1c12ee1eSDan Willemsen want: false, // wrong sort type: int32 != int64 1071*1c12ee1eSDan Willemsen }, { 1072*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1073*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1074*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1075*1c12ee1eSDan Willemsen want: false, 1076*1c12ee1eSDan Willemsen }, { 1077*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1078*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1079*1c12ee1eSDan Willemsen opts: cmp.Options{ 1080*1c12ee1eSDan Willemsen Transform(), 1081*1c12ee1eSDan Willemsen SortRepeated(func(x, y testpb.TestAllTypes_NestedEnum) bool { return x < y }), 1082*1c12ee1eSDan Willemsen }, 1083*1c12ee1eSDan Willemsen want: true, 1084*1c12ee1eSDan Willemsen }, { 1085*1c12ee1eSDan Willemsen x: higherOrderType{ 1086*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1087*1c12ee1eSDan Willemsen Es: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}, 1088*1c12ee1eSDan Willemsen }, 1089*1c12ee1eSDan Willemsen y: higherOrderType{ 1090*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1091*1c12ee1eSDan Willemsen Es: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}, 1092*1c12ee1eSDan Willemsen }, 1093*1c12ee1eSDan Willemsen opts: cmp.Options{ 1094*1c12ee1eSDan Willemsen Transform(), 1095*1c12ee1eSDan Willemsen SortRepeated(func(x, y testpb.TestAllTypes_NestedEnum) bool { return x < y }), 1096*1c12ee1eSDan Willemsen }, 1097*1c12ee1eSDan Willemsen want: false, // sort does not apply to []testpb.TestAllTypes_NestedEnum outside of a message 1098*1c12ee1eSDan Willemsen }, { 1099*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1100*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1101*1c12ee1eSDan Willemsen opts: cmp.Options{ 1102*1c12ee1eSDan Willemsen Transform(), 1103*1c12ee1eSDan Willemsen SortRepeated(func(x, y testpb.ForeignEnum) bool { return x < y }), 1104*1c12ee1eSDan Willemsen }, 1105*1c12ee1eSDan Willemsen want: false, // wrong sort type: testpb.TestAllTypes_NestedEnum != testpb.ForeignEnum 1106*1c12ee1eSDan Willemsen }, { 1107*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1108*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1109*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1110*1c12ee1eSDan Willemsen want: false, 1111*1c12ee1eSDan Willemsen }, { 1112*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1113*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1114*1c12ee1eSDan Willemsen opts: cmp.Options{ 1115*1c12ee1eSDan Willemsen Transform(), 1116*1c12ee1eSDan Willemsen SortRepeated(func(x, y *testpb.ForeignMessage) bool { return x.GetC() < y.GetC() }), 1117*1c12ee1eSDan Willemsen }, 1118*1c12ee1eSDan Willemsen want: true, 1119*1c12ee1eSDan Willemsen }, { 1120*1c12ee1eSDan Willemsen x: higherOrderType{ 1121*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1122*1c12ee1eSDan Willemsen Ms: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}, 1123*1c12ee1eSDan Willemsen }, 1124*1c12ee1eSDan Willemsen y: higherOrderType{ 1125*1c12ee1eSDan Willemsen M: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1126*1c12ee1eSDan Willemsen Ms: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}, 1127*1c12ee1eSDan Willemsen }, 1128*1c12ee1eSDan Willemsen opts: cmp.Options{ 1129*1c12ee1eSDan Willemsen Transform(), 1130*1c12ee1eSDan Willemsen SortRepeated(func(x, y *testpb.ForeignMessage) bool { return x.GetC() < y.GetC() }), 1131*1c12ee1eSDan Willemsen }, 1132*1c12ee1eSDan Willemsen want: false, // sort does not apply to []*testpb.ForeignMessage outside of a message 1133*1c12ee1eSDan Willemsen }, { 1134*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1135*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1136*1c12ee1eSDan Willemsen opts: cmp.Options{ 1137*1c12ee1eSDan Willemsen Transform(), 1138*1c12ee1eSDan Willemsen SortRepeated(func(x, y *testpb.TestAllTypes_NestedMessage) bool { return x.GetA() < y.GetA() }), 1139*1c12ee1eSDan Willemsen }, 1140*1c12ee1eSDan Willemsen want: false, // wrong sort type: *testpb.ForeignMessage != *testpb.TestAllTypes_NestedMessage 1141*1c12ee1eSDan Willemsen }, { 1142*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 1143*1c12ee1eSDan Willemsen RepeatedInt32: []int32{-32, +32}, 1144*1c12ee1eSDan Willemsen RepeatedSint32: []int32{-32, +32}, 1145*1c12ee1eSDan Willemsen RepeatedSfixed32: []int32{-32, +32}, 1146*1c12ee1eSDan Willemsen RepeatedInt64: []int64{-64, +64}, 1147*1c12ee1eSDan Willemsen RepeatedSint64: []int64{-64, +64}, 1148*1c12ee1eSDan Willemsen RepeatedSfixed64: []int64{-64, +64}, 1149*1c12ee1eSDan Willemsen RepeatedUint32: []uint32{0, 32}, 1150*1c12ee1eSDan Willemsen RepeatedFixed32: []uint32{0, 32}, 1151*1c12ee1eSDan Willemsen RepeatedUint64: []uint64{0, 64}, 1152*1c12ee1eSDan Willemsen RepeatedFixed64: []uint64{0, 64}, 1153*1c12ee1eSDan Willemsen }, 1154*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 1155*1c12ee1eSDan Willemsen RepeatedInt32: []int32{+32, -32}, 1156*1c12ee1eSDan Willemsen RepeatedSint32: []int32{+32, -32}, 1157*1c12ee1eSDan Willemsen RepeatedSfixed32: []int32{+32, -32}, 1158*1c12ee1eSDan Willemsen RepeatedInt64: []int64{+64, -64}, 1159*1c12ee1eSDan Willemsen RepeatedSint64: []int64{+64, -64}, 1160*1c12ee1eSDan Willemsen RepeatedSfixed64: []int64{+64, -64}, 1161*1c12ee1eSDan Willemsen RepeatedUint32: []uint32{32, 0}, 1162*1c12ee1eSDan Willemsen RepeatedFixed32: []uint32{32, 0}, 1163*1c12ee1eSDan Willemsen RepeatedUint64: []uint64{64, 0}, 1164*1c12ee1eSDan Willemsen RepeatedFixed64: []uint64{64, 0}, 1165*1c12ee1eSDan Willemsen }, 1166*1c12ee1eSDan Willemsen opts: cmp.Options{ 1167*1c12ee1eSDan Willemsen Transform(), 1168*1c12ee1eSDan Willemsen SortRepeated(func(x, y int32) bool { return x < y }), 1169*1c12ee1eSDan Willemsen SortRepeated(func(x, y int64) bool { return x < y }), 1170*1c12ee1eSDan Willemsen SortRepeated(func(x, y uint32) bool { return x < y }), 1171*1c12ee1eSDan Willemsen SortRepeated(func(x, y uint64) bool { return x < y }), 1172*1c12ee1eSDan Willemsen }, 1173*1c12ee1eSDan Willemsen want: true, 1174*1c12ee1eSDan Willemsen }}...) 1175*1c12ee1eSDan Willemsen 1176*1c12ee1eSDan Willemsen // Test SortRepeatedFields. 1177*1c12ee1eSDan Willemsen tests = append(tests, []test{{ 1178*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1179*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1180*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1181*1c12ee1eSDan Willemsen want: false, 1182*1c12ee1eSDan Willemsen }, { 1183*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1184*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1185*1c12ee1eSDan Willemsen opts: cmp.Options{ 1186*1c12ee1eSDan Willemsen Transform(), 1187*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_int32"), 1188*1c12ee1eSDan Willemsen }, 1189*1c12ee1eSDan Willemsen want: true, 1190*1c12ee1eSDan Willemsen }, { 1191*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedInt32: []int32{3, 2, 1, 2, 3, 3}}, 1192*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedInt32: []int32{2, 3, 3, 2, 1, 3}}, 1193*1c12ee1eSDan Willemsen opts: cmp.Options{ 1194*1c12ee1eSDan Willemsen Transform(), 1195*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_int64"), 1196*1c12ee1eSDan Willemsen }, 1197*1c12ee1eSDan Willemsen want: false, // wrong field: repeated_int32 != repeated_int64 1198*1c12ee1eSDan Willemsen }, { 1199*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1200*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1201*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1202*1c12ee1eSDan Willemsen want: false, 1203*1c12ee1eSDan Willemsen }, { 1204*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1205*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1206*1c12ee1eSDan Willemsen opts: cmp.Options{ 1207*1c12ee1eSDan Willemsen Transform(), 1208*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_nested_enum"), 1209*1c12ee1eSDan Willemsen }, 1210*1c12ee1eSDan Willemsen want: true, 1211*1c12ee1eSDan Willemsen }, { 1212*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAR, testpb.TestAllTypes_BAZ}}, 1213*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR, testpb.TestAllTypes_FOO, testpb.TestAllTypes_BAZ}}, 1214*1c12ee1eSDan Willemsen opts: cmp.Options{ 1215*1c12ee1eSDan Willemsen Transform(), 1216*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_foreign_enum"), 1217*1c12ee1eSDan Willemsen }, 1218*1c12ee1eSDan Willemsen want: false, // wrong field: repeated_nested_enum != repeated_foreign_enum 1219*1c12ee1eSDan Willemsen }, { 1220*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1221*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1222*1c12ee1eSDan Willemsen opts: cmp.Options{Transform()}, 1223*1c12ee1eSDan Willemsen want: false, 1224*1c12ee1eSDan Willemsen }, { 1225*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1226*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1227*1c12ee1eSDan Willemsen opts: cmp.Options{ 1228*1c12ee1eSDan Willemsen Transform(), 1229*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_foreign_message"), 1230*1c12ee1eSDan Willemsen }, 1231*1c12ee1eSDan Willemsen want: true, 1232*1c12ee1eSDan Willemsen }, { 1233*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{{}, {C: proto.Int32(3)}, nil, {C: proto.Int32(3)}, {C: proto.Int32(5)}, {C: proto.Int32(4)}}}, 1234*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{RepeatedForeignMessage: []*testpb.ForeignMessage{nil, {C: proto.Int32(3)}, {}, {C: proto.Int32(4)}, {C: proto.Int32(3)}, {C: proto.Int32(5)}}}, 1235*1c12ee1eSDan Willemsen opts: cmp.Options{ 1236*1c12ee1eSDan Willemsen Transform(), 1237*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), "repeated_nested_message"), 1238*1c12ee1eSDan Willemsen }, 1239*1c12ee1eSDan Willemsen want: false, // wrong field: repeated_foreign_message != repeated_nested_message 1240*1c12ee1eSDan Willemsen }, { 1241*1c12ee1eSDan Willemsen x: &testpb.TestAllTypes{ 1242*1c12ee1eSDan Willemsen RepeatedBool: []bool{false, true}, 1243*1c12ee1eSDan Willemsen RepeatedInt32: []int32{-32, +32}, 1244*1c12ee1eSDan Willemsen RepeatedInt64: []int64{-64, +64}, 1245*1c12ee1eSDan Willemsen RepeatedUint32: []uint32{0, 32}, 1246*1c12ee1eSDan Willemsen RepeatedUint64: []uint64{0, 64}, 1247*1c12ee1eSDan Willemsen RepeatedFloat: []float32{-32.32, +32.32}, 1248*1c12ee1eSDan Willemsen RepeatedDouble: []float64{-64.64, +64.64}, 1249*1c12ee1eSDan Willemsen RepeatedString: []string{"hello", "world"}, 1250*1c12ee1eSDan Willemsen RepeatedBytes: [][]byte{[]byte("hello"), []byte("world")}, 1251*1c12ee1eSDan Willemsen RepeatedForeignEnum: []testpb.ForeignEnum{testpb.ForeignEnum_FOREIGN_FOO, testpb.ForeignEnum_FOREIGN_BAR}, 1252*1c12ee1eSDan Willemsen RepeatedForeignMessage: []*testpb.ForeignMessage{{C: proto.Int32(-1)}, {C: proto.Int32(+1)}}, 1253*1c12ee1eSDan Willemsen }, 1254*1c12ee1eSDan Willemsen y: &testpb.TestAllTypes{ 1255*1c12ee1eSDan Willemsen RepeatedBool: []bool{true, false}, 1256*1c12ee1eSDan Willemsen RepeatedInt32: []int32{+32, -32}, 1257*1c12ee1eSDan Willemsen RepeatedInt64: []int64{+64, -64}, 1258*1c12ee1eSDan Willemsen RepeatedUint32: []uint32{32, 0}, 1259*1c12ee1eSDan Willemsen RepeatedUint64: []uint64{64, 0}, 1260*1c12ee1eSDan Willemsen RepeatedFloat: []float32{+32.32, -32.32}, 1261*1c12ee1eSDan Willemsen RepeatedDouble: []float64{+64.64, -64.64}, 1262*1c12ee1eSDan Willemsen RepeatedString: []string{"world", "hello"}, 1263*1c12ee1eSDan Willemsen RepeatedBytes: [][]byte{[]byte("world"), []byte("hello")}, 1264*1c12ee1eSDan Willemsen RepeatedForeignEnum: []testpb.ForeignEnum{testpb.ForeignEnum_FOREIGN_BAR, testpb.ForeignEnum_FOREIGN_FOO}, 1265*1c12ee1eSDan Willemsen RepeatedForeignMessage: []*testpb.ForeignMessage{{C: proto.Int32(+1)}, {C: proto.Int32(-1)}}, 1266*1c12ee1eSDan Willemsen }, 1267*1c12ee1eSDan Willemsen opts: cmp.Options{ 1268*1c12ee1eSDan Willemsen Transform(), 1269*1c12ee1eSDan Willemsen SortRepeatedFields(new(testpb.TestAllTypes), 1270*1c12ee1eSDan Willemsen "repeated_bool", 1271*1c12ee1eSDan Willemsen "repeated_int32", 1272*1c12ee1eSDan Willemsen "repeated_int64", 1273*1c12ee1eSDan Willemsen "repeated_uint32", 1274*1c12ee1eSDan Willemsen "repeated_uint64", 1275*1c12ee1eSDan Willemsen "repeated_float", 1276*1c12ee1eSDan Willemsen "repeated_double", 1277*1c12ee1eSDan Willemsen "repeated_string", 1278*1c12ee1eSDan Willemsen "repeated_bytes", 1279*1c12ee1eSDan Willemsen "repeated_foreign_enum", 1280*1c12ee1eSDan Willemsen "repeated_foreign_message", 1281*1c12ee1eSDan Willemsen ), 1282*1c12ee1eSDan Willemsen }, 1283*1c12ee1eSDan Willemsen want: true, 1284*1c12ee1eSDan Willemsen }}...) 1285*1c12ee1eSDan Willemsen 1286*1c12ee1eSDan Willemsen for _, tt := range tests { 1287*1c12ee1eSDan Willemsen t.Run("", func(t *testing.T) { 1288*1c12ee1eSDan Willemsen got := cmp.Equal(tt.x, tt.y, tt.opts) 1289*1c12ee1eSDan Willemsen if got != tt.want { 1290*1c12ee1eSDan Willemsen if !got { 1291*1c12ee1eSDan Willemsen t.Errorf("cmp.Equal = false, want true; diff:\n%v", cmp.Diff(tt.x, tt.y, tt.opts)) 1292*1c12ee1eSDan Willemsen } else { 1293*1c12ee1eSDan Willemsen t.Errorf("cmp.Equal = true, want false") 1294*1c12ee1eSDan Willemsen } 1295*1c12ee1eSDan Willemsen } 1296*1c12ee1eSDan Willemsen }) 1297*1c12ee1eSDan Willemsen } 1298*1c12ee1eSDan Willemsen} 1299*1c12ee1eSDan Willemsen 1300*1c12ee1eSDan Willemsentype setField struct { 1301*1c12ee1eSDan Willemsen num protoreflect.FieldNumber 1302*1c12ee1eSDan Willemsen val interface{} 1303*1c12ee1eSDan Willemsen} 1304*1c12ee1eSDan Willemsentype setUnknown struct { 1305*1c12ee1eSDan Willemsen raw protoreflect.RawFields 1306*1c12ee1eSDan Willemsen} 1307*1c12ee1eSDan Willemsentype setExtension struct { 1308*1c12ee1eSDan Willemsen typ protoreflect.ExtensionType 1309*1c12ee1eSDan Willemsen val interface{} 1310*1c12ee1eSDan Willemsen} 1311*1c12ee1eSDan Willemsen 1312*1c12ee1eSDan Willemsen// apply applies a sequence of mutating operations to m. 1313*1c12ee1eSDan Willemsenfunc apply(m proto.Message, ops ...interface{}) proto.Message { 1314*1c12ee1eSDan Willemsen mr := m.ProtoReflect() 1315*1c12ee1eSDan Willemsen md := mr.Descriptor() 1316*1c12ee1eSDan Willemsen for _, op := range ops { 1317*1c12ee1eSDan Willemsen switch op := op.(type) { 1318*1c12ee1eSDan Willemsen case setField: 1319*1c12ee1eSDan Willemsen fd := md.Fields().ByNumber(op.num) 1320*1c12ee1eSDan Willemsen mr.Set(fd, protoreflect.ValueOf(op.val)) 1321*1c12ee1eSDan Willemsen case setUnknown: 1322*1c12ee1eSDan Willemsen mr.SetUnknown(op.raw) 1323*1c12ee1eSDan Willemsen case setExtension: 1324*1c12ee1eSDan Willemsen mr.Set(op.typ.TypeDescriptor(), protoreflect.ValueOf(op.val)) 1325*1c12ee1eSDan Willemsen } 1326*1c12ee1eSDan Willemsen } 1327*1c12ee1eSDan Willemsen return m 1328*1c12ee1eSDan Willemsen} 1329*1c12ee1eSDan Willemsen 1330*1c12ee1eSDan Willemsenfunc TestSort(t *testing.T) { 1331*1c12ee1eSDan Willemsen t.Run("F32", func(t *testing.T) { 1332*1c12ee1eSDan Willemsen want := []float32{ 1333*1c12ee1eSDan Willemsen float32(math.Float32frombits(0xffc00000)), // -NaN 1334*1c12ee1eSDan Willemsen float32(math.Inf(-1)), 1335*1c12ee1eSDan Willemsen float32(-math.MaxFloat32), 1336*1c12ee1eSDan Willemsen float32(-123.456), 1337*1c12ee1eSDan Willemsen float32(-math.SmallestNonzeroFloat32), 1338*1c12ee1eSDan Willemsen float32(math.Copysign(0, -1)), 1339*1c12ee1eSDan Willemsen float32(math.Copysign(0, +1)), 1340*1c12ee1eSDan Willemsen float32(+math.SmallestNonzeroFloat32), 1341*1c12ee1eSDan Willemsen float32(+123.456), 1342*1c12ee1eSDan Willemsen float32(+math.MaxFloat32), 1343*1c12ee1eSDan Willemsen float32(math.Inf(+1)), 1344*1c12ee1eSDan Willemsen float32(math.Float32frombits(0x7fc00000)), // +NaN 1345*1c12ee1eSDan Willemsen } 1346*1c12ee1eSDan Willemsen for i := 0; i < 10; i++ { 1347*1c12ee1eSDan Willemsen t.Run("", func(t *testing.T) { 1348*1c12ee1eSDan Willemsen got := append([]float32(nil), want...) 1349*1c12ee1eSDan Willemsen rn := rand.New(rand.NewSource(int64(i))) 1350*1c12ee1eSDan Willemsen for i, j := range rn.Perm(len(got)) { 1351*1c12ee1eSDan Willemsen got[i], got[j] = got[j], got[i] 1352*1c12ee1eSDan Willemsen } 1353*1c12ee1eSDan Willemsen sort.Slice(got, func(i, j int) bool { 1354*1c12ee1eSDan Willemsen return lessF32(got[i], got[j]) 1355*1c12ee1eSDan Willemsen }) 1356*1c12ee1eSDan Willemsen cmpF32s := cmp.Comparer(func(x, y float32) bool { 1357*1c12ee1eSDan Willemsen return math.Float32bits(x) == math.Float32bits(y) 1358*1c12ee1eSDan Willemsen }) 1359*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpF32s); diff != "" { 1360*1c12ee1eSDan Willemsen t.Errorf("Sort mismatch (-want +got):\n%s", diff) 1361*1c12ee1eSDan Willemsen } 1362*1c12ee1eSDan Willemsen }) 1363*1c12ee1eSDan Willemsen } 1364*1c12ee1eSDan Willemsen }) 1365*1c12ee1eSDan Willemsen t.Run("F64", func(t *testing.T) { 1366*1c12ee1eSDan Willemsen want := []float64{ 1367*1c12ee1eSDan Willemsen float64(math.Float64frombits(0xfff8000000000001)), // -NaN 1368*1c12ee1eSDan Willemsen float64(math.Inf(-1)), 1369*1c12ee1eSDan Willemsen float64(-math.MaxFloat64), 1370*1c12ee1eSDan Willemsen float64(-123.456), 1371*1c12ee1eSDan Willemsen float64(-math.SmallestNonzeroFloat64), 1372*1c12ee1eSDan Willemsen float64(math.Copysign(0, -1)), 1373*1c12ee1eSDan Willemsen float64(math.Copysign(0, +1)), 1374*1c12ee1eSDan Willemsen float64(+math.SmallestNonzeroFloat64), 1375*1c12ee1eSDan Willemsen float64(+123.456), 1376*1c12ee1eSDan Willemsen float64(+math.MaxFloat64), 1377*1c12ee1eSDan Willemsen float64(math.Inf(+1)), 1378*1c12ee1eSDan Willemsen float64(math.Float64frombits(0x7ff8000000000001)), // +NaN 1379*1c12ee1eSDan Willemsen } 1380*1c12ee1eSDan Willemsen for i := 0; i < 10; i++ { 1381*1c12ee1eSDan Willemsen t.Run("", func(t *testing.T) { 1382*1c12ee1eSDan Willemsen got := append([]float64(nil), want...) 1383*1c12ee1eSDan Willemsen rn := rand.New(rand.NewSource(int64(i))) 1384*1c12ee1eSDan Willemsen for i, j := range rn.Perm(len(got)) { 1385*1c12ee1eSDan Willemsen got[i], got[j] = got[j], got[i] 1386*1c12ee1eSDan Willemsen } 1387*1c12ee1eSDan Willemsen sort.Slice(got, func(i, j int) bool { 1388*1c12ee1eSDan Willemsen return lessF64(got[i], got[j]) 1389*1c12ee1eSDan Willemsen }) 1390*1c12ee1eSDan Willemsen cmpF64s := cmp.Comparer(func(x, y float64) bool { 1391*1c12ee1eSDan Willemsen return math.Float64bits(x) == math.Float64bits(y) 1392*1c12ee1eSDan Willemsen }) 1393*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpF64s); diff != "" { 1394*1c12ee1eSDan Willemsen t.Errorf("Sort mismatch (-want +got):\n%s", diff) 1395*1c12ee1eSDan Willemsen } 1396*1c12ee1eSDan Willemsen }) 1397*1c12ee1eSDan Willemsen } 1398*1c12ee1eSDan Willemsen }) 1399*1c12ee1eSDan Willemsen} 1400