1package generator
2
3import (
4	"strings"
5	"text/template"
6)
7
8var interfaceFuncs template.FuncMap = template.FuncMap{
9	"ToLower":  strings.ToLower,
10	"UnExport": unexport,
11	"Replace":  strings.Replace,
12}
13
14const interfaceTemplate string = `// Code generated by counterfeiter. DO NOT EDIT.
15package {{.DestinationPackage}}
16
17import (
18	{{- range .Imports}}
19	{{.Alias}} "{{.Path}}"
20	{{- end}}
21)
22
23type {{.Name}} struct {
24	{{- range .Methods}}
25	{{.Name}}Stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}
26	{{UnExport .Name}}Mutex sync.RWMutex
27	{{UnExport .Name}}ArgsForCall []struct{
28		{{- range .Params}}
29		{{.Name}} {{if .IsVariadic}}{{Replace .Type "..." "[]" -1}}{{else}}{{.Type}}{{end}}
30		{{- end}}
31	}
32	{{- if .Returns.HasLength}}
33	{{UnExport .Name}}Returns struct{
34		{{- range .Returns}}
35		{{UnExport .Name}} {{.Type}}
36		{{- end}}
37	}
38	{{UnExport .Name}}ReturnsOnCall map[int]struct{
39		{{- range .Returns}}
40		{{UnExport .Name}} {{.Type}}
41		{{- end}}
42	}
43	{{- end}}
44	{{- end}}
45	invocations      map[string][][]interface{}
46	invocationsMutex sync.RWMutex
47}
48
49{{range .Methods -}}
50func (fake *{{.FakeName}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
51	{{- range .Params.Slices}}
52	var {{UnExport .Name}}Copy {{.Type}}
53	if {{UnExport .Name}} != nil {
54		{{UnExport .Name}}Copy = make({{.Type}}, len({{UnExport .Name}}))
55		copy({{UnExport .Name}}Copy, {{UnExport .Name}})
56	}
57	{{- end}}
58	fake.{{UnExport .Name}}Mutex.Lock()
59	{{- if .Returns.HasLength}}
60	ret, specificReturn := fake.{{UnExport .Name}}ReturnsOnCall[len(fake.{{UnExport .Name}}ArgsForCall)]
61	{{- end}}
62	fake.{{UnExport .Name}}ArgsForCall = append(fake.{{UnExport .Name}}ArgsForCall, struct{
63		{{- range .Params}}
64		{{.Name}} {{if .IsVariadic}}{{Replace .Type "..." "[]" -1}}{{else}}{{.Type}}{{end}}
65		{{- end}}
66	}{ {{- .Params.AsNamedArgs -}} })
67	fake.recordInvocation("{{.Name}}", []interface{}{ {{- if .Params.HasLength}}{{.Params.AsNamedArgs}}{{end -}} })
68	fake.{{UnExport .Name}}Mutex.Unlock()
69	if fake.{{.Name}}Stub != nil {
70		{{- if .Returns.HasLength}}
71		return fake.{{.Name}}Stub({{.Params.AsNamedArgsForInvocation}}){{else}}fake.{{.Name}}Stub({{.Params.AsNamedArgsForInvocation}})
72		{{- end}}
73	}
74	{{- if .Returns.HasLength}}
75	if specificReturn {
76		return {{.Returns.WithPrefix "ret."}}
77	}
78	fakeReturns := fake.{{UnExport .Name}}Returns
79	return {{.Returns.WithPrefix "fakeReturns."}}
80	{{- end}}
81}
82
83func (fake *{{.FakeName}}) {{.Name}}CallCount() int {
84	fake.{{UnExport .Name}}Mutex.RLock()
85	defer fake.{{UnExport .Name}}Mutex.RUnlock()
86	return len(fake.{{UnExport .Name}}ArgsForCall)
87}
88
89{{if .Params.HasLength -}}
90func (fake *{{.FakeName}}) {{.Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
91	fake.{{UnExport .Name}}Mutex.RLock()
92	defer fake.{{UnExport .Name}}Mutex.RUnlock()
93	argsForCall := fake.{{UnExport .Name}}ArgsForCall[i]
94	return {{.Params.WithPrefix "argsForCall."}}
95}
96{{- end}}
97
98{{if .Returns.HasLength -}}
99func (fake *{{.FakeName}}) {{.Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
100	fake.{{.Name}}Stub = nil
101	fake.{{UnExport .Name}}Returns = struct {
102		{{- range .Returns}}
103		{{UnExport .Name}} {{.Type}}
104		{{- end}}
105	}{ {{- .Returns.AsNamedArgs -}} }
106}
107
108func (fake *{{.FakeName}}) {{.Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
109	fake.{{.Name}}Stub = nil
110	if fake.{{UnExport .Name}}ReturnsOnCall == nil {
111		fake.{{UnExport .Name}}ReturnsOnCall = make(map[int]struct {
112			{{- range .Returns}}
113			{{UnExport .Name}} {{.Type}}
114			{{- end}}
115		})
116	}
117	fake.{{UnExport .Name}}ReturnsOnCall[i] = struct {
118		{{- range .Returns}}
119		{{UnExport .Name}} {{.Type}}
120		{{- end}}
121	}{ {{- .Returns.AsNamedArgs -}} }
122}
123
124{{end -}}
125{{end}}
126
127func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
128	fake.invocationsMutex.RLock()
129	defer fake.invocationsMutex.RUnlock()
130	{{- range .Methods}}
131	fake.{{UnExport .Name}}Mutex.RLock()
132	defer fake.{{UnExport .Name}}Mutex.RUnlock()
133	{{- end}}
134	copiedInvocations := map[string][][]interface{}{}
135	for key, value := range fake.invocations {
136		copiedInvocations[key] = value
137	}
138	return copiedInvocations
139}
140
141func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
142	fake.invocationsMutex.Lock()
143	defer fake.invocationsMutex.Unlock()
144	if fake.invocations == nil {
145		fake.invocations = map[string][][]interface{}{}
146	}
147	if fake.invocations[key] == nil {
148		fake.invocations[key] = [][]interface{}{}
149	}
150	fake.invocations[key] = append(fake.invocations[key], args)
151}
152
153var _ {{.TargetAlias}}.{{.TargetName}} = new({{.Name}})
154`
155