1// Package user is an example package with an interface.
2package user
3
4//go:generate mockgen -destination mock_user_test.go -package user_test github.com/golang/mock/sample Index,Embed,Embedded
5
6// Random bunch of imports to test mockgen.
7import (
8	"io"
9
10	btz "bytes"
11	"hash"
12	"log"
13	"net"
14	"net/http"
15
16	// Two imports with the same base name.
17	t1 "html/template"
18
19	t2 "text/template"
20
21	"github.com/golang/mock/sample/imp1"
22
23	// Dependencies outside the standard library.
24
25	renamed2 "github.com/golang/mock/sample/imp2"
26
27	. "github.com/golang/mock/sample/imp3"
28
29	imp_four "github.com/golang/mock/sample/imp4"
30)
31
32// calls itself "imp_four"
33
34// A bizarre interface to test corner cases in mockgen.
35// This would normally be in its own file or package,
36// separate from the user of it (e.g. io.Reader).
37type Index interface {
38	Get(key string) interface{}
39	GetTwo(key1, key2 string) (v1, v2 interface{})
40	Put(key string, value interface{})
41
42	// Check that imports are handled correctly.
43	Summary(buf *btz.Buffer, w io.Writer)
44	Other() hash.Hash
45	Templates(a t1.CSS, b t2.FuncMap)
46
47	// A method with an anonymous argument.
48	Anon(string)
49
50	// Methods using foreign types outside the standard library.
51	ForeignOne(imp1.Imp1)
52	ForeignTwo(renamed2.Imp2)
53	ForeignThree(Imp3)
54	ForeignFour(imp_four.Imp4)
55
56	// A method that returns a nillable type.
57	NillableRet() error
58	// A method that returns a non-interface type.
59	ConcreteRet() chan<- bool
60
61	// Methods with an ellipsis argument.
62	Ellip(fmt string, args ...interface{})
63	EllipOnly(...string)
64
65	// A method with a pointer argument that we will set.
66	Ptr(arg *int)
67
68	// A method with a slice argument and an array return.
69	Slice(a []int, b []byte) [3]int
70
71	// A method with channel arguments.
72	Chan(a chan int, b chan<- hash.Hash)
73
74	// A method with a function argument.
75	Func(f func(http.Request) (int, bool))
76
77	// A method with a map argument.
78	Map(a map[int]hash.Hash)
79
80	// Methods with an unnamed empty struct argument.
81	Struct(a struct{})          // not so likely
82	StructChan(a chan struct{}) // a bit more common
83}
84
85// An interface with an embedded interface.
86type Embed interface {
87	RegularMethod()
88	Embedded
89	imp1.ForeignEmbedded
90}
91
92type Embedded interface {
93	EmbeddedMethod()
94}
95
96// some random use of another package that isn't needed by the interface.
97var _ net.Addr
98
99// A function that we will test that uses the above interface.
100// It takes a list of keys and values, and puts them in the index.
101func Remember(index Index, keys []string, values []interface{}) {
102	for i, k := range keys {
103		index.Put(k, values[i])
104	}
105	err := index.NillableRet()
106	if err != nil {
107		log.Fatalf("Woah! %v", err)
108	}
109	if len(keys) > 0 && keys[0] == "a" {
110		index.Ellip("%d", 0, 1, 1, 2, 3)
111		index.Ellip("%d", 1, 3, 6, 10, 15)
112		index.EllipOnly("arg")
113	}
114}
115
116func GrabPointer(index Index) int {
117	var a int
118	index.Ptr(&a)
119	return a
120}
121