xref: /aosp_15_r20/external/go-cmp/cmp/internal/teststructs/project1.go (revision 88d15eac089d7f20c739ff1001d56b91872b21a1)
1*88d15eacSSasha Smundak// Copyright 2017, The Go Authors. All rights reserved.
2*88d15eacSSasha Smundak// Use of this source code is governed by a BSD-style
3*88d15eacSSasha Smundak// license that can be found in the LICENSE file.
4*88d15eacSSasha Smundak
5*88d15eacSSasha Smundakpackage teststructs
6*88d15eacSSasha Smundak
7*88d15eacSSasha Smundakimport (
8*88d15eacSSasha Smundak	"time"
9*88d15eacSSasha Smundak
10*88d15eacSSasha Smundak	pb "github.com/google/go-cmp/cmp/internal/testprotos"
11*88d15eacSSasha Smundak)
12*88d15eacSSasha Smundak
13*88d15eacSSasha Smundak// This is an sanitized example of equality from a real use-case.
14*88d15eacSSasha Smundak// The original equality function was as follows:
15*88d15eacSSasha Smundak/*
16*88d15eacSSasha Smundakfunc equalEagle(x, y Eagle) bool {
17*88d15eacSSasha Smundak	if x.Name != y.Name &&
18*88d15eacSSasha Smundak		!reflect.DeepEqual(x.Hounds, y.Hounds) &&
19*88d15eacSSasha Smundak		x.Desc != y.Desc &&
20*88d15eacSSasha Smundak		x.DescLong != y.DescLong &&
21*88d15eacSSasha Smundak		x.Prong != y.Prong &&
22*88d15eacSSasha Smundak		x.StateGoverner != y.StateGoverner &&
23*88d15eacSSasha Smundak		x.PrankRating != y.PrankRating &&
24*88d15eacSSasha Smundak		x.FunnyPrank != y.FunnyPrank &&
25*88d15eacSSasha Smundak		!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
26*88d15eacSSasha Smundak		return false
27*88d15eacSSasha Smundak	}
28*88d15eacSSasha Smundak
29*88d15eacSSasha Smundak	if len(x.Dreamers) != len(y.Dreamers) {
30*88d15eacSSasha Smundak		return false
31*88d15eacSSasha Smundak	}
32*88d15eacSSasha Smundak	for i := range x.Dreamers {
33*88d15eacSSasha Smundak		if !equalDreamer(x.Dreamers[i], y.Dreamers[i]) {
34*88d15eacSSasha Smundak			return false
35*88d15eacSSasha Smundak		}
36*88d15eacSSasha Smundak	}
37*88d15eacSSasha Smundak	if len(x.Slaps) != len(y.Slaps) {
38*88d15eacSSasha Smundak		return false
39*88d15eacSSasha Smundak	}
40*88d15eacSSasha Smundak	for i := range x.Slaps {
41*88d15eacSSasha Smundak		if !equalSlap(x.Slaps[i], y.Slaps[i]) {
42*88d15eacSSasha Smundak			return false
43*88d15eacSSasha Smundak		}
44*88d15eacSSasha Smundak	}
45*88d15eacSSasha Smundak	return true
46*88d15eacSSasha Smundak}
47*88d15eacSSasha Smundakfunc equalDreamer(x, y Dreamer) bool {
48*88d15eacSSasha Smundak	if x.Name != y.Name ||
49*88d15eacSSasha Smundak		x.Desc != y.Desc ||
50*88d15eacSSasha Smundak		x.DescLong != y.DescLong ||
51*88d15eacSSasha Smundak		x.ContSlapsInterval != y.ContSlapsInterval ||
52*88d15eacSSasha Smundak		x.Ornamental != y.Ornamental ||
53*88d15eacSSasha Smundak		x.Amoeba != y.Amoeba ||
54*88d15eacSSasha Smundak		x.Heroes != y.Heroes ||
55*88d15eacSSasha Smundak		x.FloppyDisk != y.FloppyDisk ||
56*88d15eacSSasha Smundak		x.MightiestDuck != y.MightiestDuck ||
57*88d15eacSSasha Smundak		x.FunnyPrank != y.FunnyPrank ||
58*88d15eacSSasha Smundak		!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
59*88d15eacSSasha Smundak
60*88d15eacSSasha Smundak		return false
61*88d15eacSSasha Smundak	}
62*88d15eacSSasha Smundak	if len(x.Animal) != len(y.Animal) {
63*88d15eacSSasha Smundak		return false
64*88d15eacSSasha Smundak	}
65*88d15eacSSasha Smundak	for i := range x.Animal {
66*88d15eacSSasha Smundak		vx := x.Animal[i]
67*88d15eacSSasha Smundak		vy := y.Animal[i]
68*88d15eacSSasha Smundak		if reflect.TypeOf(x.Animal) != reflect.TypeOf(y.Animal) {
69*88d15eacSSasha Smundak			return false
70*88d15eacSSasha Smundak		}
71*88d15eacSSasha Smundak		switch vx.(type) {
72*88d15eacSSasha Smundak		case Goat:
73*88d15eacSSasha Smundak			if !equalGoat(vx.(Goat), vy.(Goat)) {
74*88d15eacSSasha Smundak				return false
75*88d15eacSSasha Smundak			}
76*88d15eacSSasha Smundak		case Donkey:
77*88d15eacSSasha Smundak			if !equalDonkey(vx.(Donkey), vy.(Donkey)) {
78*88d15eacSSasha Smundak				return false
79*88d15eacSSasha Smundak			}
80*88d15eacSSasha Smundak		default:
81*88d15eacSSasha Smundak			panic(fmt.Sprintf("unknown type: %T", vx))
82*88d15eacSSasha Smundak		}
83*88d15eacSSasha Smundak	}
84*88d15eacSSasha Smundak	if len(x.PreSlaps) != len(y.PreSlaps) {
85*88d15eacSSasha Smundak		return false
86*88d15eacSSasha Smundak	}
87*88d15eacSSasha Smundak	for i := range x.PreSlaps {
88*88d15eacSSasha Smundak		if !equalSlap(x.PreSlaps[i], y.PreSlaps[i]) {
89*88d15eacSSasha Smundak			return false
90*88d15eacSSasha Smundak		}
91*88d15eacSSasha Smundak	}
92*88d15eacSSasha Smundak	if len(x.ContSlaps) != len(y.ContSlaps) {
93*88d15eacSSasha Smundak		return false
94*88d15eacSSasha Smundak	}
95*88d15eacSSasha Smundak	for i := range x.ContSlaps {
96*88d15eacSSasha Smundak		if !equalSlap(x.ContSlaps[i], y.ContSlaps[i]) {
97*88d15eacSSasha Smundak			return false
98*88d15eacSSasha Smundak		}
99*88d15eacSSasha Smundak	}
100*88d15eacSSasha Smundak	return true
101*88d15eacSSasha Smundak}
102*88d15eacSSasha Smundakfunc equalSlap(x, y Slap) bool {
103*88d15eacSSasha Smundak	return x.Name == y.Name &&
104*88d15eacSSasha Smundak		x.Desc == y.Desc &&
105*88d15eacSSasha Smundak		x.DescLong == y.DescLong &&
106*88d15eacSSasha Smundak		pb.Equal(x.Args, y.Args) &&
107*88d15eacSSasha Smundak		x.Tense == y.Tense &&
108*88d15eacSSasha Smundak		x.Interval == y.Interval &&
109*88d15eacSSasha Smundak		x.Homeland == y.Homeland &&
110*88d15eacSSasha Smundak		x.FunnyPrank == y.FunnyPrank &&
111*88d15eacSSasha Smundak		pb.Equal(x.Immutable.Proto(), y.Immutable.Proto())
112*88d15eacSSasha Smundak}
113*88d15eacSSasha Smundakfunc equalGoat(x, y Goat) bool {
114*88d15eacSSasha Smundak	if x.Target != y.Target ||
115*88d15eacSSasha Smundak		x.FunnyPrank != y.FunnyPrank ||
116*88d15eacSSasha Smundak		!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
117*88d15eacSSasha Smundak		return false
118*88d15eacSSasha Smundak	}
119*88d15eacSSasha Smundak	if len(x.Slaps) != len(y.Slaps) {
120*88d15eacSSasha Smundak		return false
121*88d15eacSSasha Smundak	}
122*88d15eacSSasha Smundak	for i := range x.Slaps {
123*88d15eacSSasha Smundak		if !equalSlap(x.Slaps[i], y.Slaps[i]) {
124*88d15eacSSasha Smundak			return false
125*88d15eacSSasha Smundak		}
126*88d15eacSSasha Smundak	}
127*88d15eacSSasha Smundak	return true
128*88d15eacSSasha Smundak}
129*88d15eacSSasha Smundakfunc equalDonkey(x, y Donkey) bool {
130*88d15eacSSasha Smundak	return x.Pause == y.Pause &&
131*88d15eacSSasha Smundak		x.Sleep == y.Sleep &&
132*88d15eacSSasha Smundak		x.FunnyPrank == y.FunnyPrank &&
133*88d15eacSSasha Smundak		pb.Equal(x.Immutable.Proto(), y.Immutable.Proto())
134*88d15eacSSasha Smundak}
135*88d15eacSSasha Smundak*/
136*88d15eacSSasha Smundak
137*88d15eacSSasha Smundaktype Eagle struct {
138*88d15eacSSasha Smundak	Name          string
139*88d15eacSSasha Smundak	Hounds        []string
140*88d15eacSSasha Smundak	Desc          string
141*88d15eacSSasha Smundak	DescLong      string
142*88d15eacSSasha Smundak	Dreamers      []Dreamer
143*88d15eacSSasha Smundak	Prong         int64
144*88d15eacSSasha Smundak	Slaps         []Slap
145*88d15eacSSasha Smundak	StateGoverner string
146*88d15eacSSasha Smundak	PrankRating   string
147*88d15eacSSasha Smundak	FunnyPrank    string
148*88d15eacSSasha Smundak	Immutable     *EagleImmutable
149*88d15eacSSasha Smundak}
150*88d15eacSSasha Smundak
151*88d15eacSSasha Smundaktype EagleImmutable struct {
152*88d15eacSSasha Smundak	ID          string
153*88d15eacSSasha Smundak	State       *pb.Eagle_States
154*88d15eacSSasha Smundak	MissingCall *pb.Eagle_MissingCalls
155*88d15eacSSasha Smundak	Birthday    time.Time
156*88d15eacSSasha Smundak	Death       time.Time
157*88d15eacSSasha Smundak	Started     time.Time
158*88d15eacSSasha Smundak	LastUpdate  time.Time
159*88d15eacSSasha Smundak	Creator     string
160*88d15eacSSasha Smundak	empty       bool
161*88d15eacSSasha Smundak}
162*88d15eacSSasha Smundak
163*88d15eacSSasha Smundaktype Dreamer struct {
164*88d15eacSSasha Smundak	Name              string
165*88d15eacSSasha Smundak	Desc              string
166*88d15eacSSasha Smundak	DescLong          string
167*88d15eacSSasha Smundak	PreSlaps          []Slap
168*88d15eacSSasha Smundak	ContSlaps         []Slap
169*88d15eacSSasha Smundak	ContSlapsInterval int32
170*88d15eacSSasha Smundak	Animal            []interface{} // Could be either Goat or Donkey
171*88d15eacSSasha Smundak	Ornamental        bool
172*88d15eacSSasha Smundak	Amoeba            int64
173*88d15eacSSasha Smundak	Heroes            int32
174*88d15eacSSasha Smundak	FloppyDisk        int32
175*88d15eacSSasha Smundak	MightiestDuck     bool
176*88d15eacSSasha Smundak	FunnyPrank        string
177*88d15eacSSasha Smundak	Immutable         *DreamerImmutable
178*88d15eacSSasha Smundak}
179*88d15eacSSasha Smundak
180*88d15eacSSasha Smundaktype DreamerImmutable struct {
181*88d15eacSSasha Smundak	ID          string
182*88d15eacSSasha Smundak	State       *pb.Dreamer_States
183*88d15eacSSasha Smundak	MissingCall *pb.Dreamer_MissingCalls
184*88d15eacSSasha Smundak	Calls       int32
185*88d15eacSSasha Smundak	Started     time.Time
186*88d15eacSSasha Smundak	Stopped     time.Time
187*88d15eacSSasha Smundak	LastUpdate  time.Time
188*88d15eacSSasha Smundak	empty       bool
189*88d15eacSSasha Smundak}
190*88d15eacSSasha Smundak
191*88d15eacSSasha Smundaktype Slap struct {
192*88d15eacSSasha Smundak	Name       string
193*88d15eacSSasha Smundak	Desc       string
194*88d15eacSSasha Smundak	DescLong   string
195*88d15eacSSasha Smundak	Args       pb.Message
196*88d15eacSSasha Smundak	Tense      int32
197*88d15eacSSasha Smundak	Interval   int32
198*88d15eacSSasha Smundak	Homeland   uint32
199*88d15eacSSasha Smundak	FunnyPrank string
200*88d15eacSSasha Smundak	Immutable  *SlapImmutable
201*88d15eacSSasha Smundak}
202*88d15eacSSasha Smundak
203*88d15eacSSasha Smundaktype SlapImmutable struct {
204*88d15eacSSasha Smundak	ID          string
205*88d15eacSSasha Smundak	Out         pb.Message
206*88d15eacSSasha Smundak	MildSlap    bool
207*88d15eacSSasha Smundak	PrettyPrint string
208*88d15eacSSasha Smundak	State       *pb.Slap_States
209*88d15eacSSasha Smundak	Started     time.Time
210*88d15eacSSasha Smundak	Stopped     time.Time
211*88d15eacSSasha Smundak	LastUpdate  time.Time
212*88d15eacSSasha Smundak	LoveRadius  *LoveRadius
213*88d15eacSSasha Smundak	empty       bool
214*88d15eacSSasha Smundak}
215*88d15eacSSasha Smundak
216*88d15eacSSasha Smundaktype Goat struct {
217*88d15eacSSasha Smundak	Target     string
218*88d15eacSSasha Smundak	Slaps      []Slap
219*88d15eacSSasha Smundak	FunnyPrank string
220*88d15eacSSasha Smundak	Immutable  *GoatImmutable
221*88d15eacSSasha Smundak}
222*88d15eacSSasha Smundak
223*88d15eacSSasha Smundaktype GoatImmutable struct {
224*88d15eacSSasha Smundak	ID         string
225*88d15eacSSasha Smundak	State      *pb.Goat_States
226*88d15eacSSasha Smundak	Started    time.Time
227*88d15eacSSasha Smundak	Stopped    time.Time
228*88d15eacSSasha Smundak	LastUpdate time.Time
229*88d15eacSSasha Smundak	empty      bool
230*88d15eacSSasha Smundak}
231*88d15eacSSasha Smundaktype Donkey struct {
232*88d15eacSSasha Smundak	Pause      bool
233*88d15eacSSasha Smundak	Sleep      int32
234*88d15eacSSasha Smundak	FunnyPrank string
235*88d15eacSSasha Smundak	Immutable  *DonkeyImmutable
236*88d15eacSSasha Smundak}
237*88d15eacSSasha Smundak
238*88d15eacSSasha Smundaktype DonkeyImmutable struct {
239*88d15eacSSasha Smundak	ID         string
240*88d15eacSSasha Smundak	State      *pb.Donkey_States
241*88d15eacSSasha Smundak	Started    time.Time
242*88d15eacSSasha Smundak	Stopped    time.Time
243*88d15eacSSasha Smundak	LastUpdate time.Time
244*88d15eacSSasha Smundak	empty      bool
245*88d15eacSSasha Smundak}
246*88d15eacSSasha Smundak
247*88d15eacSSasha Smundaktype LoveRadius struct {
248*88d15eacSSasha Smundak	Summer *SummerLove
249*88d15eacSSasha Smundak	empty  bool
250*88d15eacSSasha Smundak}
251*88d15eacSSasha Smundak
252*88d15eacSSasha Smundaktype SummerLove struct {
253*88d15eacSSasha Smundak	Summary *SummerLoveSummary
254*88d15eacSSasha Smundak	empty   bool
255*88d15eacSSasha Smundak}
256*88d15eacSSasha Smundak
257*88d15eacSSasha Smundaktype SummerLoveSummary struct {
258*88d15eacSSasha Smundak	Devices    []string
259*88d15eacSSasha Smundak	ChangeType []pb.SummerType
260*88d15eacSSasha Smundak	empty      bool
261*88d15eacSSasha Smundak}
262*88d15eacSSasha Smundak
263*88d15eacSSasha Smundakfunc (EagleImmutable) Proto() *pb.Eagle     { return nil }
264*88d15eacSSasha Smundakfunc (DreamerImmutable) Proto() *pb.Dreamer { return nil }
265*88d15eacSSasha Smundakfunc (SlapImmutable) Proto() *pb.Slap       { return nil }
266*88d15eacSSasha Smundakfunc (GoatImmutable) Proto() *pb.Goat       { return nil }
267*88d15eacSSasha Smundakfunc (DonkeyImmutable) Proto() *pb.Donkey   { return nil }
268