@@ -5,6 +5,7 @@ package deadline
55
66import (
77 "context"
8+ "sync/atomic"
89 "testing"
910 "time"
1011
@@ -93,6 +94,87 @@ func TestDeadline(t *testing.T) {
9394 expectedCalls := []byte {0 }
9495 assert .Equal (t , expectedCalls , calls , "Wrong order of deadline signal" )
9596 })
97+
98+ t .Run ("DeadlineAfterTimeoutExceedFuture" , func (t * testing.T ) {
99+ now := time .Now ()
100+
101+ d := New ()
102+ var trigger atomic.Int32
103+ d .AfterTimeout (func () {
104+ trigger .Add (1 )
105+ })
106+ d .Set (now .Add (10 * time .Millisecond ))
107+ <- time .After (20 * time .Millisecond )
108+ d .Set (now .Add (10 * time .Millisecond ))
109+ <- time .After (20 * time .Millisecond )
110+
111+ assert .Equal (t , int32 (1 ), trigger .Load (), "Function triggered wrong number of time" )
112+ })
113+
114+ t .Run ("DeadlineAfterTimeoutExceedPast" , func (t * testing.T ) {
115+ now := time .Now ()
116+
117+ d := New ()
118+ var trigger atomic.Int32
119+ d .AfterTimeout (func () {
120+ trigger .Add (1 )
121+ })
122+ d .Set (now .Add (10 * time .Millisecond ))
123+ d .Set (now .Add (- 10 * time .Millisecond ))
124+ <- time .After (20 * time .Millisecond )
125+
126+ assert .Equal (t , int32 (1 ), trigger .Load (), "Function triggered wrong number of time" )
127+ })
128+
129+ t .Run ("DeadlineAfterTimeoutAlreadyExceeded" , func (t * testing.T ) {
130+ now := time .Now ()
131+
132+ d := New ()
133+ var trigger atomic.Int32
134+ d .Set (now .Add (10 * time .Millisecond ))
135+ d .Set (now .Add (- 10 * time .Millisecond ))
136+ <- time .After (20 * time .Millisecond )
137+ d .AfterTimeout (func () {
138+ trigger .Add (1 )
139+ })
140+
141+ assert .Equal (t , int32 (1 ), trigger .Load (), "Function triggered wrong number of time" )
142+ })
143+
144+ t .Run ("DeadlineAfterTimeoutDetach" , func (t * testing.T ) {
145+ now := time .Now ()
146+
147+ d := New ()
148+ var trigger atomic.Int32
149+ detach := d .AfterTimeout (func () {
150+ trigger .Add (1 )
151+ })
152+ ret := detach ()
153+ d .Set (now .Add (10 * time .Millisecond ))
154+ <- time .After (20 * time .Millisecond )
155+
156+ assert .Equal (t , int32 (0 ), trigger .Load (), "Function triggered wrong number of time" )
157+ assert .Equal (t , true , ret , "The detach function returned wrong value" )
158+ })
159+
160+ t .Run ("DeadlineAfterTimeoutMultiCallbacks" , func (t * testing.T ) {
161+ now := time .Now ()
162+
163+ d := New ()
164+ var trigger atomic.Int32
165+ d .AfterTimeout (func () {
166+ trigger .Add (1 )
167+ })
168+ d .AfterTimeout (func () {
169+ trigger .Add (1 )
170+ })
171+ assert .Equal (t , int32 (0 ), trigger .Load (), "Function triggered wrong number of time" )
172+
173+ d .Set (now .Add (10 * time .Millisecond ))
174+ <- time .After (20 * time .Millisecond )
175+
176+ assert .Equal (t , int32 (2 ), trigger .Load (), "Function triggered wrong number of time" )
177+ })
96178}
97179
98180func sendOnDone (ctx context.Context , done <- chan struct {}, dest chan byte , val byte ) {
0 commit comments