xref: /aosp_15_r20/external/golang-protobuf/testing/protocmp/util_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
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