@@ -152,14 +152,98 @@ public void Timer_callback_GetUtcNow_AutoAdvance()
152
152
var oneSecond = TimeSpan . FromSeconds ( 1 ) ;
153
153
var timeProvider = new ManualTimeProvider ( ) { AutoAdvanceAmount = oneSecond } ;
154
154
155
- var t1 = timeProvider . CreateTimer ( _ =>
155
+ using var t1 = timeProvider . CreateTimer ( _ =>
156
156
{
157
157
timeProvider . GetUtcNow ( ) ;
158
158
} , null , TimeSpan . Zero , oneSecond ) ;
159
159
160
160
timeProvider . GetUtcNow ( ) . Should ( ) . Be ( timeProvider . Start + oneSecond ) ;
161
161
}
162
162
163
+ [ Fact ]
164
+ public void Advance_zero ( )
165
+ {
166
+ var sut = new ManualTimeProvider ( ) ;
167
+
168
+ sut . Advance ( TimeSpan . Zero ) ;
169
+
170
+ sut . GetUtcNow ( ) . Should ( ) . Be ( sut . Start ) ;
171
+ }
172
+
173
+ [ Fact ]
174
+ public void Jump_zero ( )
175
+ {
176
+ var sut = new ManualTimeProvider ( ) ;
177
+
178
+ sut . Jump ( TimeSpan . Zero ) ;
179
+
180
+ sut . GetUtcNow ( ) . Should ( ) . Be ( sut . Start ) ;
181
+ }
182
+
183
+ [ Fact ]
184
+ public void AutoAdvanceAmount_throws_when_lt_zero ( )
185
+ {
186
+ var sut = new ManualTimeProvider ( ) ;
187
+
188
+ var throws = ( ) => sut . AutoAdvanceAmount = TimeSpan . FromTicks ( - 1 ) ;
189
+
190
+ throws . Should ( ) . Throw < ArgumentOutOfRangeException > ( ) ;
191
+ }
192
+
193
+ [ Fact ]
194
+ public void Jump_throws_when_lt_zero ( )
195
+ {
196
+ var sut = new ManualTimeProvider ( ) ;
197
+
198
+ var throws = ( ) => sut . Jump ( TimeSpan . FromTicks ( - 1 ) ) ;
199
+
200
+ throws . Should ( ) . Throw < ArgumentOutOfRangeException > ( ) ;
201
+ }
202
+
203
+ [ Fact ]
204
+ public void Jump_throws_going_back_in_time ( )
205
+ {
206
+ var sut = new ManualTimeProvider ( ) ;
207
+
208
+ var throws = ( ) => sut . Jump ( sut . GetUtcNow ( ) - TimeSpan . FromTicks ( 1 ) ) ;
209
+
210
+ throws . Should ( ) . Throw < ArgumentOutOfRangeException > ( ) ;
211
+ }
212
+
213
+ [ Fact ]
214
+ public async Task Multi_threaded_SetUtcNow ( )
215
+ {
216
+ var callbackCount = 0 ;
217
+ var sut = new ManualTimeProvider ( ) ;
218
+ using var timer = sut . CreateTimer ( _ =>
219
+ {
220
+ Thread . Sleep ( 20 ) ;
221
+ callbackCount ++ ;
222
+ } , null , 1 . Seconds ( ) , 1 . Seconds ( ) ) ;
223
+
224
+ var tasks = Enumerable . Range ( 1 , 100 ) . Select ( _ => Task . Run ( ( ) => sut . SetUtcNow ( sut . Start + 1 . Seconds ( ) ) ) ) ;
225
+
226
+ await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
227
+ callbackCount . Should ( ) . Be ( 1 ) ;
228
+ }
229
+
230
+ [ Fact ]
231
+ public async Task Multi_threaded_Jump ( )
232
+ {
233
+ var callbackCount = 0 ;
234
+ var sut = new ManualTimeProvider ( ) ;
235
+ using var timer = sut . CreateTimer ( _ =>
236
+ {
237
+ Thread . Sleep ( 20 ) ;
238
+ callbackCount ++ ;
239
+ } , null , 1 . Seconds ( ) , 1 . Seconds ( ) ) ;
240
+
241
+ var tasks = Enumerable . Range ( 1 , 100 ) . Select ( _ => Task . Run ( ( ) => sut . Jump ( sut . Start + 1 . Seconds ( ) ) ) ) ;
242
+
243
+ await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
244
+ callbackCount . Should ( ) . Be ( 1 ) ;
245
+ }
246
+
163
247
[ Fact ]
164
248
public void ActiveTimers_with_no_timers ( )
165
249
{
@@ -197,5 +281,5 @@ public void ActiveTimers_with_after_timer_state_change()
197
281
sut . Advance ( 1 . Seconds ( ) ) ;
198
282
199
283
sut . ActiveTimers . Should ( ) . Be ( 0 ) ;
200
- }
284
+ }
201
285
}
0 commit comments