blob: 1999e38fd7a2ec8bf4e5d2264f2e5193f6479445 [file] [log] [blame]
// Copyright 2017, The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE.md file.
package teststructs
import (
"time"
pb "github.com/google/go-cmp/cmp/internal/testprotos"
)
// This is an sanitized example of equality from a real use-case.
// The original equality function was as follows:
/*
func equalEagle(x, y Eagle) bool {
if x.Name != y.Name &&
!reflect.DeepEqual(x.Hounds, y.Hounds) &&
x.Desc != y.Desc &&
x.DescLong != y.DescLong &&
x.Prong != y.Prong &&
x.StateGoverner != y.StateGoverner &&
x.PrankRating != y.PrankRating &&
x.FunnyPrank != y.FunnyPrank &&
!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
return false
}
if len(x.Dreamers) != len(y.Dreamers) {
return false
}
for i := range x.Dreamers {
if !equalDreamer(x.Dreamers[i], y.Dreamers[i]) {
return false
}
}
if len(x.Slaps) != len(y.Slaps) {
return false
}
for i := range x.Slaps {
if !equalSlap(x.Slaps[i], y.Slaps[i]) {
return false
}
}
return true
}
func equalDreamer(x, y Dreamer) bool {
if x.Name != y.Name ||
x.Desc != y.Desc ||
x.DescLong != y.DescLong ||
x.ContSlapsInterval != y.ContSlapsInterval ||
x.Ornamental != y.Ornamental ||
x.Amoeba != y.Amoeba ||
x.Heroes != y.Heroes ||
x.FloppyDisk != y.FloppyDisk ||
x.MightiestDuck != y.MightiestDuck ||
x.FunnyPrank != y.FunnyPrank ||
!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
return false
}
if len(x.Animal) != len(y.Animal) {
return false
}
for i := range x.Animal {
vx := x.Animal[i]
vy := y.Animal[i]
if reflect.TypeOf(x.Animal) != reflect.TypeOf(y.Animal) {
return false
}
switch vx.(type) {
case Goat:
if !equalGoat(vx.(Goat), vy.(Goat)) {
return false
}
case Donkey:
if !equalDonkey(vx.(Donkey), vy.(Donkey)) {
return false
}
default:
panic(fmt.Sprintf("unknown type: %T", vx))
}
}
if len(x.PreSlaps) != len(y.PreSlaps) {
return false
}
for i := range x.PreSlaps {
if !equalSlap(x.PreSlaps[i], y.PreSlaps[i]) {
return false
}
}
if len(x.ContSlaps) != len(y.ContSlaps) {
return false
}
for i := range x.ContSlaps {
if !equalSlap(x.ContSlaps[i], y.ContSlaps[i]) {
return false
}
}
return true
}
func equalSlap(x, y Slap) bool {
return x.Name == y.Name &&
x.Desc == y.Desc &&
x.DescLong == y.DescLong &&
pb.Equal(x.Args, y.Args) &&
x.Tense == y.Tense &&
x.Interval == y.Interval &&
x.Homeland == y.Homeland &&
x.FunnyPrank == y.FunnyPrank &&
pb.Equal(x.Immutable.Proto(), y.Immutable.Proto())
}
func equalGoat(x, y Goat) bool {
if x.Target != y.Target ||
x.FunnyPrank != y.FunnyPrank ||
!pb.Equal(x.Immutable.Proto(), y.Immutable.Proto()) {
return false
}
if len(x.Slaps) != len(y.Slaps) {
return false
}
for i := range x.Slaps {
if !equalSlap(x.Slaps[i], y.Slaps[i]) {
return false
}
}
return true
}
func equalDonkey(x, y Donkey) bool {
return x.Pause == y.Pause &&
x.Sleep == y.Sleep &&
x.FunnyPrank == y.FunnyPrank &&
pb.Equal(x.Immutable.Proto(), y.Immutable.Proto())
}
*/
type Eagle struct {
Name string
Hounds []string
Desc string
DescLong string
Dreamers []Dreamer
Prong int64
Slaps []Slap
StateGoverner string
PrankRating string
FunnyPrank string
Immutable *EagleImmutable
}
type EagleImmutable struct {
ID string
State *pb.Eagle_States
MissingCall *pb.Eagle_MissingCalls
Birthday time.Time
Death time.Time
Started time.Time
LastUpdate time.Time
Creator string
empty bool
}
type Dreamer struct {
Name string
Desc string
DescLong string
PreSlaps []Slap
ContSlaps []Slap
ContSlapsInterval int32
Animal []interface{} // Could be either Goat or Donkey
Ornamental bool
Amoeba int64
Heroes int32
FloppyDisk int32
MightiestDuck bool
FunnyPrank string
Immutable *DreamerImmutable
}
type DreamerImmutable struct {
ID string
State *pb.Dreamer_States
MissingCall *pb.Dreamer_MissingCalls
Calls int32
Started time.Time
Stopped time.Time
LastUpdate time.Time
empty bool
}
type Slap struct {
Name string
Desc string
DescLong string
Args pb.Message
Tense int32
Interval int32
Homeland uint32
FunnyPrank string
Immutable *SlapImmutable
}
type SlapImmutable struct {
ID string
Out pb.Message
MildSlap bool
PrettyPrint string
State *pb.Slap_States
Started time.Time
Stopped time.Time
LastUpdate time.Time
LoveRadius *LoveRadius
empty bool
}
type Goat struct {
Target string
Slaps []Slap
FunnyPrank string
Immutable *GoatImmutable
}
type GoatImmutable struct {
ID string
State *pb.Goat_States
Started time.Time
Stopped time.Time
LastUpdate time.Time
empty bool
}
type Donkey struct {
Pause bool
Sleep int32
FunnyPrank string
Immutable *DonkeyImmutable
}
type DonkeyImmutable struct {
ID string
State *pb.Donkey_States
Started time.Time
Stopped time.Time
LastUpdate time.Time
empty bool
}
type LoveRadius struct {
Summer *SummerLove
empty bool
}
type SummerLove struct {
Summary *SummerLoveSummary
empty bool
}
type SummerLoveSummary struct {
Devices []string
ChangeType []pb.SummerType
empty bool
}
func (EagleImmutable) Proto() *pb.Eagle { return nil }
func (DreamerImmutable) Proto() *pb.Dreamer { return nil }
func (SlapImmutable) Proto() *pb.Slap { return nil }
func (GoatImmutable) Proto() *pb.Goat { return nil }
func (DonkeyImmutable) Proto() *pb.Donkey { return nil }