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 equalCartel(x, y Cartel) bool { 17*88d15eacSSasha Smundak if !(equalHeadquarter(x.Headquarter, y.Headquarter) && 18*88d15eacSSasha Smundak x.Source() == y.Source() && 19*88d15eacSSasha Smundak x.CreationDate().Equal(y.CreationDate()) && 20*88d15eacSSasha Smundak x.Boss() == y.Boss() && 21*88d15eacSSasha Smundak x.LastCrimeDate().Equal(y.LastCrimeDate())) { 22*88d15eacSSasha Smundak return false 23*88d15eacSSasha Smundak } 24*88d15eacSSasha Smundak if len(x.Poisons()) != len(y.Poisons()) { 25*88d15eacSSasha Smundak return false 26*88d15eacSSasha Smundak } 27*88d15eacSSasha Smundak for i := range x.Poisons() { 28*88d15eacSSasha Smundak if !equalPoison(*x.Poisons()[i], *y.Poisons()[i]) { 29*88d15eacSSasha Smundak return false 30*88d15eacSSasha Smundak } 31*88d15eacSSasha Smundak } 32*88d15eacSSasha Smundak return true 33*88d15eacSSasha Smundak} 34*88d15eacSSasha Smundakfunc equalHeadquarter(x, y Headquarter) bool { 35*88d15eacSSasha Smundak xr, yr := x.Restrictions(), y.Restrictions() 36*88d15eacSSasha Smundak return x.ID() == y.ID() && 37*88d15eacSSasha Smundak x.Location() == y.Location() && 38*88d15eacSSasha Smundak reflect.DeepEqual(x.SubDivisions(), y.SubDivisions()) && 39*88d15eacSSasha Smundak x.IncorporatedDate().Equal(y.IncorporatedDate()) && 40*88d15eacSSasha Smundak pb.Equal(x.MetaData(), y.MetaData()) && 41*88d15eacSSasha Smundak bytes.Equal(x.PrivateMessage(), y.PrivateMessage()) && 42*88d15eacSSasha Smundak bytes.Equal(x.PublicMessage(), y.PublicMessage()) && 43*88d15eacSSasha Smundak x.HorseBack() == y.HorseBack() && 44*88d15eacSSasha Smundak x.Rattle() == y.Rattle() && 45*88d15eacSSasha Smundak x.Convulsion() == y.Convulsion() && 46*88d15eacSSasha Smundak x.Expansion() == y.Expansion() && 47*88d15eacSSasha Smundak x.Status() == y.Status() && 48*88d15eacSSasha Smundak pb.Equal(&xr, &yr) && 49*88d15eacSSasha Smundak x.CreationTime().Equal(y.CreationTime()) 50*88d15eacSSasha Smundak} 51*88d15eacSSasha Smundakfunc equalPoison(x, y Poison) bool { 52*88d15eacSSasha Smundak return x.PoisonType() == y.PoisonType() && 53*88d15eacSSasha Smundak x.Expiration().Equal(y.Expiration()) && 54*88d15eacSSasha Smundak x.Manufacturer() == y.Manufacturer() && 55*88d15eacSSasha Smundak x.Potency() == y.Potency() 56*88d15eacSSasha Smundak} 57*88d15eacSSasha Smundak*/ 58*88d15eacSSasha Smundak 59*88d15eacSSasha Smundaktype Cartel struct { 60*88d15eacSSasha Smundak Headquarter 61*88d15eacSSasha Smundak source string 62*88d15eacSSasha Smundak creationDate time.Time 63*88d15eacSSasha Smundak boss string 64*88d15eacSSasha Smundak lastCrimeDate time.Time 65*88d15eacSSasha Smundak poisons []*Poison 66*88d15eacSSasha Smundak} 67*88d15eacSSasha Smundak 68*88d15eacSSasha Smundakfunc (p Cartel) Source() string { return p.source } 69*88d15eacSSasha Smundakfunc (p Cartel) CreationDate() time.Time { return p.creationDate } 70*88d15eacSSasha Smundakfunc (p Cartel) Boss() string { return p.boss } 71*88d15eacSSasha Smundakfunc (p Cartel) LastCrimeDate() time.Time { return p.lastCrimeDate } 72*88d15eacSSasha Smundakfunc (p Cartel) Poisons() []*Poison { return p.poisons } 73*88d15eacSSasha Smundak 74*88d15eacSSasha Smundakfunc (p *Cartel) SetSource(x string) { p.source = x } 75*88d15eacSSasha Smundakfunc (p *Cartel) SetCreationDate(x time.Time) { p.creationDate = x } 76*88d15eacSSasha Smundakfunc (p *Cartel) SetBoss(x string) { p.boss = x } 77*88d15eacSSasha Smundakfunc (p *Cartel) SetLastCrimeDate(x time.Time) { p.lastCrimeDate = x } 78*88d15eacSSasha Smundakfunc (p *Cartel) SetPoisons(x []*Poison) { p.poisons = x } 79*88d15eacSSasha Smundak 80*88d15eacSSasha Smundaktype Headquarter struct { 81*88d15eacSSasha Smundak id uint64 82*88d15eacSSasha Smundak location string 83*88d15eacSSasha Smundak subDivisions []string 84*88d15eacSSasha Smundak incorporatedDate time.Time 85*88d15eacSSasha Smundak metaData *pb.MetaData 86*88d15eacSSasha Smundak privateMessage []byte 87*88d15eacSSasha Smundak publicMessage []byte 88*88d15eacSSasha Smundak horseBack string 89*88d15eacSSasha Smundak rattle string 90*88d15eacSSasha Smundak convulsion bool 91*88d15eacSSasha Smundak expansion uint64 92*88d15eacSSasha Smundak status pb.HoneyStatus 93*88d15eacSSasha Smundak restrictions pb.Restrictions 94*88d15eacSSasha Smundak creationTime time.Time 95*88d15eacSSasha Smundak} 96*88d15eacSSasha Smundak 97*88d15eacSSasha Smundakfunc (hq Headquarter) ID() uint64 { return hq.id } 98*88d15eacSSasha Smundakfunc (hq Headquarter) Location() string { return hq.location } 99*88d15eacSSasha Smundakfunc (hq Headquarter) SubDivisions() []string { return hq.subDivisions } 100*88d15eacSSasha Smundakfunc (hq Headquarter) IncorporatedDate() time.Time { return hq.incorporatedDate } 101*88d15eacSSasha Smundakfunc (hq Headquarter) MetaData() *pb.MetaData { return hq.metaData } 102*88d15eacSSasha Smundakfunc (hq Headquarter) PrivateMessage() []byte { return hq.privateMessage } 103*88d15eacSSasha Smundakfunc (hq Headquarter) PublicMessage() []byte { return hq.publicMessage } 104*88d15eacSSasha Smundakfunc (hq Headquarter) HorseBack() string { return hq.horseBack } 105*88d15eacSSasha Smundakfunc (hq Headquarter) Rattle() string { return hq.rattle } 106*88d15eacSSasha Smundakfunc (hq Headquarter) Convulsion() bool { return hq.convulsion } 107*88d15eacSSasha Smundakfunc (hq Headquarter) Expansion() uint64 { return hq.expansion } 108*88d15eacSSasha Smundakfunc (hq Headquarter) Status() pb.HoneyStatus { return hq.status } 109*88d15eacSSasha Smundakfunc (hq Headquarter) Restrictions() pb.Restrictions { return hq.restrictions } 110*88d15eacSSasha Smundakfunc (hq Headquarter) CreationTime() time.Time { return hq.creationTime } 111*88d15eacSSasha Smundak 112*88d15eacSSasha Smundakfunc (hq *Headquarter) SetID(x uint64) { hq.id = x } 113*88d15eacSSasha Smundakfunc (hq *Headquarter) SetLocation(x string) { hq.location = x } 114*88d15eacSSasha Smundakfunc (hq *Headquarter) SetSubDivisions(x []string) { hq.subDivisions = x } 115*88d15eacSSasha Smundakfunc (hq *Headquarter) SetIncorporatedDate(x time.Time) { hq.incorporatedDate = x } 116*88d15eacSSasha Smundakfunc (hq *Headquarter) SetMetaData(x *pb.MetaData) { hq.metaData = x } 117*88d15eacSSasha Smundakfunc (hq *Headquarter) SetPrivateMessage(x []byte) { hq.privateMessage = x } 118*88d15eacSSasha Smundakfunc (hq *Headquarter) SetPublicMessage(x []byte) { hq.publicMessage = x } 119*88d15eacSSasha Smundakfunc (hq *Headquarter) SetHorseBack(x string) { hq.horseBack = x } 120*88d15eacSSasha Smundakfunc (hq *Headquarter) SetRattle(x string) { hq.rattle = x } 121*88d15eacSSasha Smundakfunc (hq *Headquarter) SetConvulsion(x bool) { hq.convulsion = x } 122*88d15eacSSasha Smundakfunc (hq *Headquarter) SetExpansion(x uint64) { hq.expansion = x } 123*88d15eacSSasha Smundakfunc (hq *Headquarter) SetStatus(x pb.HoneyStatus) { hq.status = x } 124*88d15eacSSasha Smundakfunc (hq *Headquarter) SetRestrictions(x pb.Restrictions) { hq.restrictions = x } 125*88d15eacSSasha Smundakfunc (hq *Headquarter) SetCreationTime(x time.Time) { hq.creationTime = x } 126*88d15eacSSasha Smundak 127*88d15eacSSasha Smundaktype Poison struct { 128*88d15eacSSasha Smundak poisonType pb.PoisonType 129*88d15eacSSasha Smundak expiration time.Time 130*88d15eacSSasha Smundak manufacturer string 131*88d15eacSSasha Smundak potency int 132*88d15eacSSasha Smundak} 133*88d15eacSSasha Smundak 134*88d15eacSSasha Smundakfunc (p Poison) PoisonType() pb.PoisonType { return p.poisonType } 135*88d15eacSSasha Smundakfunc (p Poison) Expiration() time.Time { return p.expiration } 136*88d15eacSSasha Smundakfunc (p Poison) Manufacturer() string { return p.manufacturer } 137*88d15eacSSasha Smundakfunc (p Poison) Potency() int { return p.potency } 138*88d15eacSSasha Smundak 139*88d15eacSSasha Smundakfunc (p *Poison) SetPoisonType(x pb.PoisonType) { p.poisonType = x } 140*88d15eacSSasha Smundakfunc (p *Poison) SetExpiration(x time.Time) { p.expiration = x } 141*88d15eacSSasha Smundakfunc (p *Poison) SetManufacturer(x string) { p.manufacturer = x } 142*88d15eacSSasha Smundakfunc (p *Poison) SetPotency(x int) { p.potency = x } 143