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