...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package gomock
16
17 import (
18 "bytes"
19 "errors"
20 "fmt"
21 )
22
23
24
25 type callSet struct {
26
27 expected map[callSetKey][]*Call
28
29 exhausted map[callSetKey][]*Call
30 }
31
32
33 type callSetKey struct {
34 receiver interface{}
35 fname string
36 }
37
38 func newCallSet() *callSet {
39 return &callSet{make(map[callSetKey][]*Call), make(map[callSetKey][]*Call)}
40 }
41
42
43 func (cs callSet) Add(call *Call) {
44 key := callSetKey{call.receiver, call.method}
45 m := cs.expected
46 if call.exhausted() {
47 m = cs.exhausted
48 }
49 m[key] = append(m[key], call)
50 }
51
52
53 func (cs callSet) Remove(call *Call) {
54 key := callSetKey{call.receiver, call.method}
55 calls := cs.expected[key]
56 for i, c := range calls {
57 if c == call {
58
59 cs.expected[key] = append(calls[:i], calls[i+1:]...)
60 cs.exhausted[key] = append(cs.exhausted[key], call)
61 break
62 }
63 }
64 }
65
66
67 func (cs callSet) FindMatch(receiver interface{}, method string, args []interface{}) (*Call, error) {
68 key := callSetKey{receiver, method}
69
70
71 expected := cs.expected[key]
72 var callsErrors bytes.Buffer
73 for _, call := range expected {
74 err := call.matches(args)
75 if err != nil {
76 _, _ = fmt.Fprintf(&callsErrors, "\n%v", err)
77 } else {
78 return call, nil
79 }
80 }
81
82
83
84 exhausted := cs.exhausted[key]
85 for _, call := range exhausted {
86 if err := call.matches(args); err != nil {
87 _, _ = fmt.Fprintf(&callsErrors, "\n%v", err)
88 continue
89 }
90 _, _ = fmt.Fprintf(
91 &callsErrors, "all expected calls for method %q have been exhausted", method,
92 )
93 }
94
95 if len(expected)+len(exhausted) == 0 {
96 _, _ = fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method)
97 }
98
99 return nil, errors.New(callsErrors.String())
100 }
101
102
103 func (cs callSet) Failures() []*Call {
104 failures := make([]*Call, 0, len(cs.expected))
105 for _, calls := range cs.expected {
106 for _, call := range calls {
107 if !call.satisfied() {
108 failures = append(failures, call)
109 }
110 }
111 }
112 return failures
113 }
114
View as plain text