xref: /aosp_15_r20/external/golang-protobuf/proto/equal_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 proto_test
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"math"
9*1c12ee1eSDan Willemsen	"testing"
10*1c12ee1eSDan Willemsen
11*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
12*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/pragma"
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/testing/protopack"
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen	testpb "google.golang.org/protobuf/internal/testprotos/test"
17*1c12ee1eSDan Willemsen	test3pb "google.golang.org/protobuf/internal/testprotos/test3"
18*1c12ee1eSDan Willemsen)
19*1c12ee1eSDan Willemsen
20*1c12ee1eSDan Willemsenfunc TestEqual(t *testing.T) {
21*1c12ee1eSDan Willemsen	identicalPtrPb := &testpb.TestAllTypes{MapStringString: map[string]string{"a": "b", "c": "d"}}
22*1c12ee1eSDan Willemsen
23*1c12ee1eSDan Willemsen	type incomparableMessage struct {
24*1c12ee1eSDan Willemsen		*testpb.TestAllTypes
25*1c12ee1eSDan Willemsen		pragma.DoNotCompare
26*1c12ee1eSDan Willemsen	}
27*1c12ee1eSDan Willemsen
28*1c12ee1eSDan Willemsen	tests := []struct {
29*1c12ee1eSDan Willemsen		x, y proto.Message
30*1c12ee1eSDan Willemsen		eq   bool
31*1c12ee1eSDan Willemsen	}{
32*1c12ee1eSDan Willemsen		{
33*1c12ee1eSDan Willemsen			x:  nil,
34*1c12ee1eSDan Willemsen			y:  nil,
35*1c12ee1eSDan Willemsen			eq: true,
36*1c12ee1eSDan Willemsen		}, {
37*1c12ee1eSDan Willemsen			x:  (*testpb.TestAllTypes)(nil),
38*1c12ee1eSDan Willemsen			y:  nil,
39*1c12ee1eSDan Willemsen			eq: false,
40*1c12ee1eSDan Willemsen		}, {
41*1c12ee1eSDan Willemsen			x:  (*testpb.TestAllTypes)(nil),
42*1c12ee1eSDan Willemsen			y:  (*testpb.TestAllTypes)(nil),
43*1c12ee1eSDan Willemsen			eq: true,
44*1c12ee1eSDan Willemsen		}, {
45*1c12ee1eSDan Willemsen			x:  new(testpb.TestAllTypes),
46*1c12ee1eSDan Willemsen			y:  (*testpb.TestAllTypes)(nil),
47*1c12ee1eSDan Willemsen			eq: false,
48*1c12ee1eSDan Willemsen		}, {
49*1c12ee1eSDan Willemsen			x:  new(testpb.TestAllTypes),
50*1c12ee1eSDan Willemsen			y:  new(testpb.TestAllTypes),
51*1c12ee1eSDan Willemsen			eq: true,
52*1c12ee1eSDan Willemsen		}, {
53*1c12ee1eSDan Willemsen			x:  (*testpb.TestAllTypes)(nil),
54*1c12ee1eSDan Willemsen			y:  (*testpb.TestAllExtensions)(nil),
55*1c12ee1eSDan Willemsen			eq: false,
56*1c12ee1eSDan Willemsen		}, {
57*1c12ee1eSDan Willemsen			x:  (*testpb.TestAllTypes)(nil),
58*1c12ee1eSDan Willemsen			y:  new(testpb.TestAllExtensions),
59*1c12ee1eSDan Willemsen			eq: false,
60*1c12ee1eSDan Willemsen		}, {
61*1c12ee1eSDan Willemsen			x:  new(testpb.TestAllTypes),
62*1c12ee1eSDan Willemsen			y:  new(testpb.TestAllExtensions),
63*1c12ee1eSDan Willemsen			eq: false,
64*1c12ee1eSDan Willemsen		},
65*1c12ee1eSDan Willemsen
66*1c12ee1eSDan Willemsen		// Identical input pointers
67*1c12ee1eSDan Willemsen		{
68*1c12ee1eSDan Willemsen			x:  identicalPtrPb,
69*1c12ee1eSDan Willemsen			y:  identicalPtrPb,
70*1c12ee1eSDan Willemsen			eq: true,
71*1c12ee1eSDan Willemsen		},
72*1c12ee1eSDan Willemsen
73*1c12ee1eSDan Willemsen		// Incomparable types. The top-level types are not actually directly
74*1c12ee1eSDan Willemsen		// compared (which would panic), but rather the comparison happens on the
75*1c12ee1eSDan Willemsen		// objects returned by ProtoReflect(). These tests are here just to ensure
76*1c12ee1eSDan Willemsen		// that any short-circuit checks do not accidentally try to compare
77*1c12ee1eSDan Willemsen		// incomparable top-level types.
78*1c12ee1eSDan Willemsen		{
79*1c12ee1eSDan Willemsen			x:  incomparableMessage{TestAllTypes: identicalPtrPb},
80*1c12ee1eSDan Willemsen			y:  incomparableMessage{TestAllTypes: identicalPtrPb},
81*1c12ee1eSDan Willemsen			eq: true,
82*1c12ee1eSDan Willemsen		},
83*1c12ee1eSDan Willemsen		{
84*1c12ee1eSDan Willemsen			x:  identicalPtrPb,
85*1c12ee1eSDan Willemsen			y:  incomparableMessage{TestAllTypes: identicalPtrPb},
86*1c12ee1eSDan Willemsen			eq: true,
87*1c12ee1eSDan Willemsen		},
88*1c12ee1eSDan Willemsen		{
89*1c12ee1eSDan Willemsen			x:  identicalPtrPb,
90*1c12ee1eSDan Willemsen			y:  &incomparableMessage{TestAllTypes: identicalPtrPb},
91*1c12ee1eSDan Willemsen			eq: true,
92*1c12ee1eSDan Willemsen		},
93*1c12ee1eSDan Willemsen
94*1c12ee1eSDan Willemsen		// Proto2 scalars.
95*1c12ee1eSDan Willemsen		{
96*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalInt32: proto.Int32(1)},
97*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)},
98*1c12ee1eSDan Willemsen		}, {
99*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalInt64: proto.Int64(1)},
100*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalInt64: proto.Int64(2)},
101*1c12ee1eSDan Willemsen		}, {
102*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalUint32: proto.Uint32(1)},
103*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalUint32: proto.Uint32(2)},
104*1c12ee1eSDan Willemsen		}, {
105*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalUint64: proto.Uint64(1)},
106*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalUint64: proto.Uint64(2)},
107*1c12ee1eSDan Willemsen		}, {
108*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalSint32: proto.Int32(1)},
109*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSint32: proto.Int32(2)},
110*1c12ee1eSDan Willemsen		}, {
111*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalSint64: proto.Int64(1)},
112*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSint64: proto.Int64(2)},
113*1c12ee1eSDan Willemsen		}, {
114*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalFixed32: proto.Uint32(1)},
115*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFixed32: proto.Uint32(2)},
116*1c12ee1eSDan Willemsen		}, {
117*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalFixed64: proto.Uint64(1)},
118*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFixed64: proto.Uint64(2)},
119*1c12ee1eSDan Willemsen		}, {
120*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalSfixed32: proto.Int32(1)},
121*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSfixed32: proto.Int32(2)},
122*1c12ee1eSDan Willemsen		}, {
123*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalSfixed64: proto.Int64(1)},
124*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSfixed64: proto.Int64(2)},
125*1c12ee1eSDan Willemsen		}, {
126*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalFloat: proto.Float32(1)},
127*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFloat: proto.Float32(2)},
128*1c12ee1eSDan Willemsen		}, {
129*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalDouble: proto.Float64(1)},
130*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalDouble: proto.Float64(2)},
131*1c12ee1eSDan Willemsen		}, {
132*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalFloat: proto.Float32(float32(math.NaN()))},
133*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFloat: proto.Float32(0)},
134*1c12ee1eSDan Willemsen		}, {
135*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalDouble: proto.Float64(float64(math.NaN()))},
136*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalDouble: proto.Float64(0)},
137*1c12ee1eSDan Willemsen		}, {
138*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalBool: proto.Bool(true)},
139*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalBool: proto.Bool(false)},
140*1c12ee1eSDan Willemsen		}, {
141*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalString: proto.String("a")},
142*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalString: proto.String("b")},
143*1c12ee1eSDan Willemsen		}, {
144*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalBytes: []byte("a")},
145*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalBytes: []byte("b")},
146*1c12ee1eSDan Willemsen		}, {
147*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()},
148*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum()},
149*1c12ee1eSDan Willemsen		}, {
150*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)},
151*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalInt32: proto.Int32(2)},
152*1c12ee1eSDan Willemsen			eq: true,
153*1c12ee1eSDan Willemsen		}, {
154*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalInt64: proto.Int64(2)},
155*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalInt64: proto.Int64(2)},
156*1c12ee1eSDan Willemsen			eq: true,
157*1c12ee1eSDan Willemsen		}, {
158*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalUint32: proto.Uint32(2)},
159*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalUint32: proto.Uint32(2)},
160*1c12ee1eSDan Willemsen			eq: true,
161*1c12ee1eSDan Willemsen		}, {
162*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalUint64: proto.Uint64(2)},
163*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalUint64: proto.Uint64(2)},
164*1c12ee1eSDan Willemsen			eq: true,
165*1c12ee1eSDan Willemsen		}, {
166*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalSint32: proto.Int32(2)},
167*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalSint32: proto.Int32(2)},
168*1c12ee1eSDan Willemsen			eq: true,
169*1c12ee1eSDan Willemsen		}, {
170*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalSint64: proto.Int64(2)},
171*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalSint64: proto.Int64(2)},
172*1c12ee1eSDan Willemsen			eq: true,
173*1c12ee1eSDan Willemsen		}, {
174*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalFixed32: proto.Uint32(2)},
175*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalFixed32: proto.Uint32(2)},
176*1c12ee1eSDan Willemsen			eq: true,
177*1c12ee1eSDan Willemsen		}, {
178*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalFixed64: proto.Uint64(2)},
179*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalFixed64: proto.Uint64(2)},
180*1c12ee1eSDan Willemsen			eq: true,
181*1c12ee1eSDan Willemsen		}, {
182*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalSfixed32: proto.Int32(2)},
183*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalSfixed32: proto.Int32(2)},
184*1c12ee1eSDan Willemsen			eq: true,
185*1c12ee1eSDan Willemsen		}, {
186*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalSfixed64: proto.Int64(2)},
187*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalSfixed64: proto.Int64(2)},
188*1c12ee1eSDan Willemsen			eq: true,
189*1c12ee1eSDan Willemsen		}, {
190*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalFloat: proto.Float32(2)},
191*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalFloat: proto.Float32(2)},
192*1c12ee1eSDan Willemsen			eq: true,
193*1c12ee1eSDan Willemsen		}, {
194*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalDouble: proto.Float64(2)},
195*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalDouble: proto.Float64(2)},
196*1c12ee1eSDan Willemsen			eq: true,
197*1c12ee1eSDan Willemsen		}, {
198*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalFloat: proto.Float32(float32(math.NaN()))},
199*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalFloat: proto.Float32(float32(math.NaN()))},
200*1c12ee1eSDan Willemsen			eq: true,
201*1c12ee1eSDan Willemsen		}, {
202*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalDouble: proto.Float64(float64(math.NaN()))},
203*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalDouble: proto.Float64(float64(math.NaN()))},
204*1c12ee1eSDan Willemsen			eq: true,
205*1c12ee1eSDan Willemsen		}, {
206*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalBool: proto.Bool(true)},
207*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalBool: proto.Bool(true)},
208*1c12ee1eSDan Willemsen			eq: true,
209*1c12ee1eSDan Willemsen		}, {
210*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalString: proto.String("abc")},
211*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalString: proto.String("abc")},
212*1c12ee1eSDan Willemsen			eq: true,
213*1c12ee1eSDan Willemsen		}, {
214*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalBytes: []byte("abc")},
215*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalBytes: []byte("abc")},
216*1c12ee1eSDan Willemsen			eq: true,
217*1c12ee1eSDan Willemsen		}, {
218*1c12ee1eSDan Willemsen			x:  &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()},
219*1c12ee1eSDan Willemsen			y:  &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()},
220*1c12ee1eSDan Willemsen			eq: true,
221*1c12ee1eSDan Willemsen		},
222*1c12ee1eSDan Willemsen
223*1c12ee1eSDan Willemsen		// Proto2 presence.
224*1c12ee1eSDan Willemsen		{
225*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
226*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalInt32: proto.Int32(0)},
227*1c12ee1eSDan Willemsen		}, {
228*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
229*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalInt64: proto.Int64(0)},
230*1c12ee1eSDan Willemsen		}, {
231*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
232*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalUint32: proto.Uint32(0)},
233*1c12ee1eSDan Willemsen		}, {
234*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
235*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalUint64: proto.Uint64(0)},
236*1c12ee1eSDan Willemsen		}, {
237*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
238*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSint32: proto.Int32(0)},
239*1c12ee1eSDan Willemsen		}, {
240*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
241*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSint64: proto.Int64(0)},
242*1c12ee1eSDan Willemsen		}, {
243*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
244*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFixed32: proto.Uint32(0)},
245*1c12ee1eSDan Willemsen		}, {
246*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
247*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFixed64: proto.Uint64(0)},
248*1c12ee1eSDan Willemsen		}, {
249*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
250*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSfixed32: proto.Int32(0)},
251*1c12ee1eSDan Willemsen		}, {
252*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
253*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalSfixed64: proto.Int64(0)},
254*1c12ee1eSDan Willemsen		}, {
255*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
256*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalFloat: proto.Float32(0)},
257*1c12ee1eSDan Willemsen		}, {
258*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
259*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalDouble: proto.Float64(0)},
260*1c12ee1eSDan Willemsen		}, {
261*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
262*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalBool: proto.Bool(false)},
263*1c12ee1eSDan Willemsen		}, {
264*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
265*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalString: proto.String("")},
266*1c12ee1eSDan Willemsen		}, {
267*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
268*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalBytes: []byte{}},
269*1c12ee1eSDan Willemsen		}, {
270*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
271*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalNestedEnum: testpb.TestAllTypes_FOO.Enum()},
272*1c12ee1eSDan Willemsen		},
273*1c12ee1eSDan Willemsen
274*1c12ee1eSDan Willemsen		// Proto3 presence.
275*1c12ee1eSDan Willemsen		{
276*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
277*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalInt32: proto.Int32(0)},
278*1c12ee1eSDan Willemsen		}, {
279*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
280*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalInt64: proto.Int64(0)},
281*1c12ee1eSDan Willemsen		}, {
282*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
283*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalUint32: proto.Uint32(0)},
284*1c12ee1eSDan Willemsen		}, {
285*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
286*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalUint64: proto.Uint64(0)},
287*1c12ee1eSDan Willemsen		}, {
288*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
289*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalSint32: proto.Int32(0)},
290*1c12ee1eSDan Willemsen		}, {
291*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
292*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalSint64: proto.Int64(0)},
293*1c12ee1eSDan Willemsen		}, {
294*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
295*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalFixed32: proto.Uint32(0)},
296*1c12ee1eSDan Willemsen		}, {
297*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
298*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalFixed64: proto.Uint64(0)},
299*1c12ee1eSDan Willemsen		}, {
300*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
301*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalSfixed32: proto.Int32(0)},
302*1c12ee1eSDan Willemsen		}, {
303*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
304*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalSfixed64: proto.Int64(0)},
305*1c12ee1eSDan Willemsen		}, {
306*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
307*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalFloat: proto.Float32(0)},
308*1c12ee1eSDan Willemsen		}, {
309*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
310*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalDouble: proto.Float64(0)},
311*1c12ee1eSDan Willemsen		}, {
312*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
313*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalBool: proto.Bool(false)},
314*1c12ee1eSDan Willemsen		}, {
315*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
316*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalString: proto.String("")},
317*1c12ee1eSDan Willemsen		}, {
318*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
319*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalBytes: []byte{}},
320*1c12ee1eSDan Willemsen		}, {
321*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
322*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalNestedEnum: test3pb.TestAllTypes_FOO.Enum()},
323*1c12ee1eSDan Willemsen		},
324*1c12ee1eSDan Willemsen
325*1c12ee1eSDan Willemsen		// Proto2 default values are not considered by Equal, so the following are still unequal.
326*1c12ee1eSDan Willemsen		{
327*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{DefaultInt32: proto.Int32(81)},
328*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{},
329*1c12ee1eSDan Willemsen		}, {
330*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
331*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultInt32: proto.Int32(81)},
332*1c12ee1eSDan Willemsen		}, {
333*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
334*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultInt64: proto.Int64(82)},
335*1c12ee1eSDan Willemsen		}, {
336*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
337*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultUint32: proto.Uint32(83)},
338*1c12ee1eSDan Willemsen		}, {
339*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
340*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultUint64: proto.Uint64(84)},
341*1c12ee1eSDan Willemsen		}, {
342*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
343*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultSint32: proto.Int32(-85)},
344*1c12ee1eSDan Willemsen		}, {
345*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
346*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultSint64: proto.Int64(86)},
347*1c12ee1eSDan Willemsen		}, {
348*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
349*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultFixed32: proto.Uint32(87)},
350*1c12ee1eSDan Willemsen		}, {
351*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
352*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultFixed64: proto.Uint64(88)},
353*1c12ee1eSDan Willemsen		}, {
354*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
355*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultSfixed32: proto.Int32(89)},
356*1c12ee1eSDan Willemsen		}, {
357*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
358*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultSfixed64: proto.Int64(-90)},
359*1c12ee1eSDan Willemsen		}, {
360*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
361*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultFloat: proto.Float32(91.5)},
362*1c12ee1eSDan Willemsen		}, {
363*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
364*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultDouble: proto.Float64(92e3)},
365*1c12ee1eSDan Willemsen		}, {
366*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
367*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultBool: proto.Bool(true)},
368*1c12ee1eSDan Willemsen		}, {
369*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
370*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultString: proto.String("hello")},
371*1c12ee1eSDan Willemsen		}, {
372*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
373*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultBytes: []byte("world")},
374*1c12ee1eSDan Willemsen		}, {
375*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
376*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{DefaultNestedEnum: testpb.TestAllTypes_BAR.Enum()},
377*1c12ee1eSDan Willemsen		},
378*1c12ee1eSDan Willemsen
379*1c12ee1eSDan Willemsen		// Groups.
380*1c12ee1eSDan Willemsen		{
381*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{Optionalgroup: &testpb.TestAllTypes_OptionalGroup{
382*1c12ee1eSDan Willemsen				A: proto.Int32(1),
383*1c12ee1eSDan Willemsen			}},
384*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{Optionalgroup: &testpb.TestAllTypes_OptionalGroup{
385*1c12ee1eSDan Willemsen				A: proto.Int32(2),
386*1c12ee1eSDan Willemsen			}},
387*1c12ee1eSDan Willemsen		}, {
388*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
389*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{Optionalgroup: &testpb.TestAllTypes_OptionalGroup{}},
390*1c12ee1eSDan Willemsen		},
391*1c12ee1eSDan Willemsen
392*1c12ee1eSDan Willemsen		// Messages.
393*1c12ee1eSDan Willemsen		{
394*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{
395*1c12ee1eSDan Willemsen				A: proto.Int32(1),
396*1c12ee1eSDan Willemsen			}},
397*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{
398*1c12ee1eSDan Willemsen				A: proto.Int32(2),
399*1c12ee1eSDan Willemsen			}},
400*1c12ee1eSDan Willemsen		}, {
401*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{},
402*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{}},
403*1c12ee1eSDan Willemsen		}, {
404*1c12ee1eSDan Willemsen			x: &test3pb.TestAllTypes{},
405*1c12ee1eSDan Willemsen			y: &test3pb.TestAllTypes{OptionalNestedMessage: &test3pb.TestAllTypes_NestedMessage{}},
406*1c12ee1eSDan Willemsen		},
407*1c12ee1eSDan Willemsen
408*1c12ee1eSDan Willemsen		// Lists.
409*1c12ee1eSDan Willemsen		{
410*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedInt32: []int32{1}},
411*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedInt32: []int32{1, 2}},
412*1c12ee1eSDan Willemsen		}, {
413*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedInt32: []int32{1, 2}},
414*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedInt32: []int32{1, 3}},
415*1c12ee1eSDan Willemsen		}, {
416*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedInt64: []int64{1, 2}},
417*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedInt64: []int64{1, 3}},
418*1c12ee1eSDan Willemsen		}, {
419*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedUint32: []uint32{1, 2}},
420*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedUint32: []uint32{1, 3}},
421*1c12ee1eSDan Willemsen		}, {
422*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedUint64: []uint64{1, 2}},
423*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedUint64: []uint64{1, 3}},
424*1c12ee1eSDan Willemsen		}, {
425*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedSint32: []int32{1, 2}},
426*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedSint32: []int32{1, 3}},
427*1c12ee1eSDan Willemsen		}, {
428*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedSint64: []int64{1, 2}},
429*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedSint64: []int64{1, 3}},
430*1c12ee1eSDan Willemsen		}, {
431*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedFixed32: []uint32{1, 2}},
432*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedFixed32: []uint32{1, 3}},
433*1c12ee1eSDan Willemsen		}, {
434*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedFixed64: []uint64{1, 2}},
435*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedFixed64: []uint64{1, 3}},
436*1c12ee1eSDan Willemsen		}, {
437*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedSfixed32: []int32{1, 2}},
438*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedSfixed32: []int32{1, 3}},
439*1c12ee1eSDan Willemsen		}, {
440*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedSfixed64: []int64{1, 2}},
441*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedSfixed64: []int64{1, 3}},
442*1c12ee1eSDan Willemsen		}, {
443*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedFloat: []float32{1, 2}},
444*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedFloat: []float32{1, 3}},
445*1c12ee1eSDan Willemsen		}, {
446*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedDouble: []float64{1, 2}},
447*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedDouble: []float64{1, 3}},
448*1c12ee1eSDan Willemsen		}, {
449*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedBool: []bool{true, false}},
450*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedBool: []bool{true, true}},
451*1c12ee1eSDan Willemsen		}, {
452*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedString: []string{"a", "b"}},
453*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedString: []string{"a", "c"}},
454*1c12ee1eSDan Willemsen		}, {
455*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedBytes: [][]byte{[]byte("a"), []byte("b")}},
456*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedBytes: [][]byte{[]byte("a"), []byte("c")}},
457*1c12ee1eSDan Willemsen		}, {
458*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO}},
459*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_BAR}},
460*1c12ee1eSDan Willemsen		}, {
461*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{Repeatedgroup: []*testpb.TestAllTypes_RepeatedGroup{
462*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
463*1c12ee1eSDan Willemsen				{A: proto.Int32(2)},
464*1c12ee1eSDan Willemsen			}},
465*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{Repeatedgroup: []*testpb.TestAllTypes_RepeatedGroup{
466*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
467*1c12ee1eSDan Willemsen				{A: proto.Int32(3)},
468*1c12ee1eSDan Willemsen			}},
469*1c12ee1eSDan Willemsen		}, {
470*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{
471*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
472*1c12ee1eSDan Willemsen				{A: proto.Int32(2)},
473*1c12ee1eSDan Willemsen			}},
474*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{
475*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
476*1c12ee1eSDan Willemsen				{A: proto.Int32(3)},
477*1c12ee1eSDan Willemsen			}},
478*1c12ee1eSDan Willemsen		},
479*1c12ee1eSDan Willemsen
480*1c12ee1eSDan Willemsen		// Maps: various configurations.
481*1c12ee1eSDan Willemsen		{
482*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2}},
483*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{3: 4}},
484*1c12ee1eSDan Willemsen		}, {
485*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2}},
486*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2, 3: 4}},
487*1c12ee1eSDan Willemsen		}, {
488*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2, 3: 4}},
489*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2}},
490*1c12ee1eSDan Willemsen		},
491*1c12ee1eSDan Willemsen
492*1c12ee1eSDan Willemsen		// Maps: various types.
493*1c12ee1eSDan Willemsen		{
494*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2, 3: 4}},
495*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Int32: map[int32]int32{1: 2, 3: 5}},
496*1c12ee1eSDan Willemsen		}, {
497*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt64Int64: map[int64]int64{1: 2, 3: 4}},
498*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt64Int64: map[int64]int64{1: 2, 3: 5}},
499*1c12ee1eSDan Willemsen		}, {
500*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapUint32Uint32: map[uint32]uint32{1: 2, 3: 4}},
501*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapUint32Uint32: map[uint32]uint32{1: 2, 3: 5}},
502*1c12ee1eSDan Willemsen		}, {
503*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapUint64Uint64: map[uint64]uint64{1: 2, 3: 4}},
504*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapUint64Uint64: map[uint64]uint64{1: 2, 3: 5}},
505*1c12ee1eSDan Willemsen		}, {
506*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapSint32Sint32: map[int32]int32{1: 2, 3: 4}},
507*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapSint32Sint32: map[int32]int32{1: 2, 3: 5}},
508*1c12ee1eSDan Willemsen		}, {
509*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapSint64Sint64: map[int64]int64{1: 2, 3: 4}},
510*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapSint64Sint64: map[int64]int64{1: 2, 3: 5}},
511*1c12ee1eSDan Willemsen		}, {
512*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapFixed32Fixed32: map[uint32]uint32{1: 2, 3: 4}},
513*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapFixed32Fixed32: map[uint32]uint32{1: 2, 3: 5}},
514*1c12ee1eSDan Willemsen		}, {
515*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapFixed64Fixed64: map[uint64]uint64{1: 2, 3: 4}},
516*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapFixed64Fixed64: map[uint64]uint64{1: 2, 3: 5}},
517*1c12ee1eSDan Willemsen		}, {
518*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapSfixed32Sfixed32: map[int32]int32{1: 2, 3: 4}},
519*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapSfixed32Sfixed32: map[int32]int32{1: 2, 3: 5}},
520*1c12ee1eSDan Willemsen		}, {
521*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapSfixed64Sfixed64: map[int64]int64{1: 2, 3: 4}},
522*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapSfixed64Sfixed64: map[int64]int64{1: 2, 3: 5}},
523*1c12ee1eSDan Willemsen		}, {
524*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Float: map[int32]float32{1: 2, 3: 4}},
525*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Float: map[int32]float32{1: 2, 3: 5}},
526*1c12ee1eSDan Willemsen		}, {
527*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapInt32Double: map[int32]float64{1: 2, 3: 4}},
528*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapInt32Double: map[int32]float64{1: 2, 3: 5}},
529*1c12ee1eSDan Willemsen		}, {
530*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapBoolBool: map[bool]bool{true: false, false: true}},
531*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapBoolBool: map[bool]bool{true: false, false: false}},
532*1c12ee1eSDan Willemsen		}, {
533*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapStringString: map[string]string{"a": "b", "c": "d"}},
534*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapStringString: map[string]string{"a": "b", "c": "e"}},
535*1c12ee1eSDan Willemsen		}, {
536*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapStringBytes: map[string][]byte{"a": []byte("b"), "c": []byte("d")}},
537*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapStringBytes: map[string][]byte{"a": []byte("b"), "c": []byte("e")}},
538*1c12ee1eSDan Willemsen		}, {
539*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{
540*1c12ee1eSDan Willemsen				"a": {A: proto.Int32(1)},
541*1c12ee1eSDan Willemsen				"b": {A: proto.Int32(2)},
542*1c12ee1eSDan Willemsen			}},
543*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{
544*1c12ee1eSDan Willemsen				"a": {A: proto.Int32(1)},
545*1c12ee1eSDan Willemsen				"b": {A: proto.Int32(3)},
546*1c12ee1eSDan Willemsen			}},
547*1c12ee1eSDan Willemsen		}, {
548*1c12ee1eSDan Willemsen			x: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{
549*1c12ee1eSDan Willemsen				"a": testpb.TestAllTypes_FOO,
550*1c12ee1eSDan Willemsen				"b": testpb.TestAllTypes_BAR,
551*1c12ee1eSDan Willemsen			}},
552*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{
553*1c12ee1eSDan Willemsen				"a": testpb.TestAllTypes_FOO,
554*1c12ee1eSDan Willemsen				"b": testpb.TestAllTypes_BAZ,
555*1c12ee1eSDan Willemsen			}},
556*1c12ee1eSDan Willemsen		},
557*1c12ee1eSDan Willemsen
558*1c12ee1eSDan Willemsen		// Extensions.
559*1c12ee1eSDan Willemsen		{
560*1c12ee1eSDan Willemsen			x: build(&testpb.TestAllExtensions{},
561*1c12ee1eSDan Willemsen				extend(testpb.E_OptionalInt32, int32(1)),
562*1c12ee1eSDan Willemsen			),
563*1c12ee1eSDan Willemsen			y: build(&testpb.TestAllExtensions{},
564*1c12ee1eSDan Willemsen				extend(testpb.E_OptionalInt32, int32(2)),
565*1c12ee1eSDan Willemsen			),
566*1c12ee1eSDan Willemsen		}, {
567*1c12ee1eSDan Willemsen			x: &testpb.TestAllExtensions{},
568*1c12ee1eSDan Willemsen			y: build(&testpb.TestAllExtensions{},
569*1c12ee1eSDan Willemsen				extend(testpb.E_OptionalInt32, int32(2)),
570*1c12ee1eSDan Willemsen			),
571*1c12ee1eSDan Willemsen		},
572*1c12ee1eSDan Willemsen
573*1c12ee1eSDan Willemsen		// Unknown fields.
574*1c12ee1eSDan Willemsen		{
575*1c12ee1eSDan Willemsen			x: build(&testpb.TestAllTypes{}, unknown(protopack.Message{
576*1c12ee1eSDan Willemsen				protopack.Tag{100000, protopack.VarintType}, protopack.Varint(1),
577*1c12ee1eSDan Willemsen			}.Marshal())),
578*1c12ee1eSDan Willemsen			y: build(&testpb.TestAllTypes{}, unknown(protopack.Message{
579*1c12ee1eSDan Willemsen				protopack.Tag{100000, protopack.VarintType}, protopack.Varint(2),
580*1c12ee1eSDan Willemsen			}.Marshal())),
581*1c12ee1eSDan Willemsen		}, {
582*1c12ee1eSDan Willemsen			x: build(&testpb.TestAllTypes{}, unknown(protopack.Message{
583*1c12ee1eSDan Willemsen				protopack.Tag{100000, protopack.VarintType}, protopack.Varint(1),
584*1c12ee1eSDan Willemsen			}.Marshal())),
585*1c12ee1eSDan Willemsen			y: &testpb.TestAllTypes{},
586*1c12ee1eSDan Willemsen		},
587*1c12ee1eSDan Willemsen	}
588*1c12ee1eSDan Willemsen
589*1c12ee1eSDan Willemsen	for _, tt := range tests {
590*1c12ee1eSDan Willemsen		if !tt.eq && !proto.Equal(tt.x, tt.x) {
591*1c12ee1eSDan Willemsen			t.Errorf("Equal(x, x) = false, want true\n==== x ====\n%v", prototext.Format(tt.x))
592*1c12ee1eSDan Willemsen		}
593*1c12ee1eSDan Willemsen		if !tt.eq && !proto.Equal(tt.y, tt.y) {
594*1c12ee1eSDan Willemsen			t.Errorf("Equal(y, y) = false, want true\n==== y ====\n%v", prototext.Format(tt.y))
595*1c12ee1eSDan Willemsen		}
596*1c12ee1eSDan Willemsen		if eq := proto.Equal(tt.x, tt.y); eq != tt.eq {
597*1c12ee1eSDan Willemsen			t.Errorf("Equal(x, y) = %v, want %v\n==== x ====\n%v==== y ====\n%v", eq, tt.eq, prototext.Format(tt.x), prototext.Format(tt.y))
598*1c12ee1eSDan Willemsen		}
599*1c12ee1eSDan Willemsen	}
600*1c12ee1eSDan Willemsen}
601*1c12ee1eSDan Willemsen
602*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithSmallEmpty(b *testing.B) {
603*1c12ee1eSDan Willemsen	x := &testpb.ForeignMessage{}
604*1c12ee1eSDan Willemsen	y := &testpb.ForeignMessage{}
605*1c12ee1eSDan Willemsen
606*1c12ee1eSDan Willemsen	b.ResetTimer()
607*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
608*1c12ee1eSDan Willemsen		proto.Equal(x, y)
609*1c12ee1eSDan Willemsen	}
610*1c12ee1eSDan Willemsen}
611*1c12ee1eSDan Willemsen
612*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithIdenticalPtrEmpty(b *testing.B) {
613*1c12ee1eSDan Willemsen	x := &testpb.ForeignMessage{}
614*1c12ee1eSDan Willemsen
615*1c12ee1eSDan Willemsen	b.ResetTimer()
616*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
617*1c12ee1eSDan Willemsen		proto.Equal(x, x)
618*1c12ee1eSDan Willemsen	}
619*1c12ee1eSDan Willemsen}
620*1c12ee1eSDan Willemsen
621*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithLargeEmpty(b *testing.B) {
622*1c12ee1eSDan Willemsen	x := &testpb.TestAllTypes{}
623*1c12ee1eSDan Willemsen	y := &testpb.TestAllTypes{}
624*1c12ee1eSDan Willemsen
625*1c12ee1eSDan Willemsen	b.ResetTimer()
626*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
627*1c12ee1eSDan Willemsen		proto.Equal(x, y)
628*1c12ee1eSDan Willemsen	}
629*1c12ee1eSDan Willemsen}
630*1c12ee1eSDan Willemsen
631*1c12ee1eSDan Willemsenfunc makeNested(depth int) *testpb.TestAllTypes {
632*1c12ee1eSDan Willemsen	if depth <= 0 {
633*1c12ee1eSDan Willemsen		return nil
634*1c12ee1eSDan Willemsen	}
635*1c12ee1eSDan Willemsen	return &testpb.TestAllTypes{
636*1c12ee1eSDan Willemsen		OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{
637*1c12ee1eSDan Willemsen			Corecursive: makeNested(depth - 1),
638*1c12ee1eSDan Willemsen		},
639*1c12ee1eSDan Willemsen	}
640*1c12ee1eSDan Willemsen}
641*1c12ee1eSDan Willemsen
642*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithDeeplyNestedEqual(b *testing.B) {
643*1c12ee1eSDan Willemsen	x := makeNested(20)
644*1c12ee1eSDan Willemsen	y := makeNested(20)
645*1c12ee1eSDan Willemsen
646*1c12ee1eSDan Willemsen	b.ResetTimer()
647*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
648*1c12ee1eSDan Willemsen		proto.Equal(x, y)
649*1c12ee1eSDan Willemsen	}
650*1c12ee1eSDan Willemsen}
651*1c12ee1eSDan Willemsen
652*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithDeeplyNestedDifferent(b *testing.B) {
653*1c12ee1eSDan Willemsen	x := makeNested(20)
654*1c12ee1eSDan Willemsen	y := makeNested(21)
655*1c12ee1eSDan Willemsen
656*1c12ee1eSDan Willemsen	b.ResetTimer()
657*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
658*1c12ee1eSDan Willemsen		proto.Equal(x, y)
659*1c12ee1eSDan Willemsen	}
660*1c12ee1eSDan Willemsen}
661*1c12ee1eSDan Willemsen
662*1c12ee1eSDan Willemsenfunc BenchmarkEqualWithDeeplyNestedIdenticalPtr(b *testing.B) {
663*1c12ee1eSDan Willemsen	x := makeNested(20)
664*1c12ee1eSDan Willemsen
665*1c12ee1eSDan Willemsen	b.ResetTimer()
666*1c12ee1eSDan Willemsen	for i := 0; i < b.N; i++ {
667*1c12ee1eSDan Willemsen		proto.Equal(x, x)
668*1c12ee1eSDan Willemsen	}
669*1c12ee1eSDan Willemsen}
670