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 "sync" 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 equalDirt(x, y *Dirt) bool { 17*88d15eacSSasha Smundak if !reflect.DeepEqual(x.table, y.table) || 18*88d15eacSSasha Smundak !reflect.DeepEqual(x.ts, y.ts) || 19*88d15eacSSasha Smundak x.Discord != y.Discord || 20*88d15eacSSasha Smundak !pb.Equal(&x.Proto, &y.Proto) || 21*88d15eacSSasha Smundak len(x.wizard) != len(y.wizard) || 22*88d15eacSSasha Smundak len(x.sadistic) != len(y.sadistic) || 23*88d15eacSSasha Smundak x.lastTime != y.lastTime { 24*88d15eacSSasha Smundak return false 25*88d15eacSSasha Smundak } 26*88d15eacSSasha Smundak for k, vx := range x.wizard { 27*88d15eacSSasha Smundak vy, ok := y.wizard[k] 28*88d15eacSSasha Smundak if !ok || !pb.Equal(vx, vy) { 29*88d15eacSSasha Smundak return false 30*88d15eacSSasha Smundak } 31*88d15eacSSasha Smundak } 32*88d15eacSSasha Smundak for k, vx := range x.sadistic { 33*88d15eacSSasha Smundak vy, ok := y.sadistic[k] 34*88d15eacSSasha Smundak if !ok || !pb.Equal(vx, vy) { 35*88d15eacSSasha Smundak return false 36*88d15eacSSasha Smundak } 37*88d15eacSSasha Smundak } 38*88d15eacSSasha Smundak return true 39*88d15eacSSasha Smundak} 40*88d15eacSSasha Smundak*/ 41*88d15eacSSasha Smundak 42*88d15eacSSasha Smundaktype FakeMutex struct { 43*88d15eacSSasha Smundak sync.Locker 44*88d15eacSSasha Smundak x struct{} 45*88d15eacSSasha Smundak} 46*88d15eacSSasha Smundak 47*88d15eacSSasha Smundaktype Dirt struct { 48*88d15eacSSasha Smundak table Table // Always concrete type of MockTable 49*88d15eacSSasha Smundak ts Timestamp 50*88d15eacSSasha Smundak Discord DiscordState 51*88d15eacSSasha Smundak Proto pb.Dirt 52*88d15eacSSasha Smundak wizard map[string]*pb.Wizard 53*88d15eacSSasha Smundak sadistic map[string]*pb.Sadistic 54*88d15eacSSasha Smundak lastTime int64 55*88d15eacSSasha Smundak mu FakeMutex 56*88d15eacSSasha Smundak} 57*88d15eacSSasha Smundak 58*88d15eacSSasha Smundaktype DiscordState int 59*88d15eacSSasha Smundak 60*88d15eacSSasha Smundaktype Timestamp int64 61*88d15eacSSasha Smundak 62*88d15eacSSasha Smundakfunc (d *Dirt) SetTable(t Table) { d.table = t } 63*88d15eacSSasha Smundakfunc (d *Dirt) SetTimestamp(t Timestamp) { d.ts = t } 64*88d15eacSSasha Smundakfunc (d *Dirt) SetWizard(m map[string]*pb.Wizard) { d.wizard = m } 65*88d15eacSSasha Smundakfunc (d *Dirt) SetSadistic(m map[string]*pb.Sadistic) { d.sadistic = m } 66*88d15eacSSasha Smundakfunc (d *Dirt) SetLastTime(t int64) { d.lastTime = t } 67*88d15eacSSasha Smundak 68*88d15eacSSasha Smundaktype Table interface { 69*88d15eacSSasha Smundak Operation1() error 70*88d15eacSSasha Smundak Operation2() error 71*88d15eacSSasha Smundak Operation3() error 72*88d15eacSSasha Smundak} 73*88d15eacSSasha Smundak 74*88d15eacSSasha Smundaktype MockTable struct { 75*88d15eacSSasha Smundak state []string 76*88d15eacSSasha Smundak} 77*88d15eacSSasha Smundak 78*88d15eacSSasha Smundakfunc CreateMockTable(s []string) *MockTable { return &MockTable{s} } 79*88d15eacSSasha Smundakfunc (mt *MockTable) Operation1() error { return nil } 80*88d15eacSSasha Smundakfunc (mt *MockTable) Operation2() error { return nil } 81*88d15eacSSasha Smundakfunc (mt *MockTable) Operation3() error { return nil } 82*88d15eacSSasha Smundakfunc (mt *MockTable) State() []string { return mt.state } 83