@@ -32,6 +32,9 @@ type event interface {
3232}
3333
3434func (m * Mock )TickerFunc (ctx context.Context ,d time.Duration ,f func ()error ,tags ... string )Waiter {
35+ if d <= 0 {
36+ panic ("TickerFunc called with negative or zero duration" )
37+ }
3538m .mu .Lock ()
3639defer m .mu .Unlock ()
3740c := newCall (clockFunctionTickerFunc ,tags ,withDuration (d ))
@@ -51,6 +54,28 @@ func (m *Mock) TickerFunc(ctx context.Context, d time.Duration, f func() error,
5154return t
5255}
5356
57+ func (m * Mock )NewTicker (d time.Duration ,tags ... string )* Ticker {
58+ if d <= 0 {
59+ panic ("NewTicker called with negative or zero duration" )
60+ }
61+ m .mu .Lock ()
62+ defer m .mu .Unlock ()
63+ c := newCall (clockFunctionNewTicker ,tags ,withDuration (d ))
64+ m .matchCallLocked (c )
65+ defer close (c .complete )
66+ // 1 element buffer follows standard library implementation
67+ ticks := make (chan time.Time ,1 )
68+ t := & Ticker {
69+ C :ticks ,
70+ c :ticks ,
71+ d :d ,
72+ nxt :m .cur .Add (d ),
73+ mock :m ,
74+ }
75+ m .addEventLocked (t )
76+ return t
77+ }
78+
5479func (m * Mock )NewTimer (d time.Duration ,tags ... string )* Timer {
5580m .mu .Lock ()
5681defer m .mu .Unlock ()
@@ -70,7 +95,7 @@ func (m *Mock) NewTimer(d time.Duration, tags ...string) *Timer {
7095go t .fire (t .mock .cur )
7196return t
7297}
73- m .addTimerLocked (t )
98+ m .addEventLocked (t )
7499return t
75100}
76101
@@ -91,7 +116,7 @@ func (m *Mock) AfterFunc(d time.Duration, f func(), tags ...string) *Timer {
91116go t .fire (t .mock .cur )
92117return t
93118}
94- m .addTimerLocked (t )
119+ m .addEventLocked (t )
95120return t
96121}
97122
@@ -122,8 +147,8 @@ func (m *Mock) Until(t time.Time, tags ...string) time.Duration {
122147return t .Sub (m .cur )
123148}
124149
125- func (m * Mock )addTimerLocked ( t * Timer ) {
126- m .all = append (m .all ,t )
150+ func (m * Mock )addEventLocked ( e event ) {
151+ m .all = append (m .all ,e )
127152m .recomputeNextLocked ()
128153}
129154
@@ -152,20 +177,12 @@ func (m *Mock) removeTimer(t *Timer) {
152177}
153178
154179func (m * Mock )removeTimerLocked (t * Timer ) {
155- defer m .recomputeNextLocked ()
156180t .stopped = true
157- var e event = t
158- for i := range m .all {
159- if m .all [i ]== e {
160- m .all = append (m .all [:i ],m .all [i + 1 :]... )
161- return
162- }
163- }
181+ m .removeEventLocked (t )
164182}
165183
166- func (m * Mock )removeTickerFuncLocked ( ct * mockTickerFunc ) {
184+ func (m * Mock )removeEventLocked ( e event ) {
167185defer m .recomputeNextLocked ()
168- var e event = ct
169186for i := range m .all {
170187if m .all [i ]== e {
171188m .all = append (m .all [:i ],m .all [i + 1 :]... )
@@ -371,6 +388,18 @@ func (t Trapper) TickerFuncWait(tags ...string) *Trap {
371388return t .mock .newTrap (clockFunctionTickerFuncWait ,tags )
372389}
373390
391+ func (t Trapper )NewTicker (tags ... string )* Trap {
392+ return t .mock .newTrap (clockFunctionNewTicker ,tags )
393+ }
394+
395+ func (t Trapper )TickerStop (tags ... string )* Trap {
396+ return t .mock .newTrap (clockFunctionTickerStop ,tags )
397+ }
398+
399+ func (t Trapper )TickerReset (tags ... string )* Trap {
400+ return t .mock .newTrap (clockFunctionTickerReset ,tags )
401+ }
402+
374403func (t Trapper )Now (tags ... string )* Trap {
375404return t .mock .newTrap (clockFunctionNow ,tags )
376405}
@@ -459,7 +488,7 @@ func (m *mockTickerFunc) exitLocked(err error) {
459488}
460489m .done = true
461490m .err = err
462- m .mock .removeTickerFuncLocked (m )
491+ m .mock .removeEventLocked (m )
463492m .cond .Broadcast ()
464493}
465494
@@ -493,6 +522,9 @@ const (
493522clockFunctionTimerReset
494523clockFunctionTickerFunc
495524clockFunctionTickerFuncWait
525+ clockFunctionNewTicker
526+ clockFunctionTickerReset
527+ clockFunctionTickerStop
496528clockFunctionNow
497529clockFunctionSince
498530clockFunctionUntil