@@ -26,6 +26,7 @@ public void Ctor_InitialCountGreatherThanZero()
26
26
var countdownEvent = CreateCountdownEvent ( initialCount ) ;
27
27
Assert . AreEqual ( initialCount , countdownEvent . CurrentCount ) ;
28
28
Assert . IsFalse ( countdownEvent . IsSet ) ;
29
+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
29
30
countdownEvent . Dispose ( ) ;
30
31
}
31
32
@@ -37,6 +38,7 @@ public void Ctor_InitialCountZero()
37
38
var countdownEvent = CreateCountdownEvent ( 0 ) ;
38
39
Assert . AreEqual ( initialCount , countdownEvent . CurrentCount ) ;
39
40
Assert . IsTrue ( countdownEvent . IsSet ) ;
41
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
40
42
countdownEvent . Dispose ( ) ;
41
43
}
42
44
@@ -49,6 +51,7 @@ public void Signal_CurrentCountGreatherThanOne()
49
51
Assert . IsFalse ( countdownEvent . Signal ( ) ) ;
50
52
Assert . AreEqual ( -- initialCount , countdownEvent . CurrentCount ) ;
51
53
Assert . IsFalse ( countdownEvent . IsSet ) ;
54
+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
52
55
countdownEvent . Dispose ( ) ;
53
56
}
54
57
@@ -59,6 +62,7 @@ public void Signal_CurrentCountOne()
59
62
Assert . IsTrue ( countdownEvent . Signal ( ) ) ;
60
63
Assert . AreEqual ( 0 , countdownEvent . CurrentCount ) ;
61
64
Assert . IsTrue ( countdownEvent . IsSet ) ;
65
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
62
66
countdownEvent . Dispose ( ) ;
63
67
}
64
68
@@ -82,10 +86,6 @@ public void Signal_CurrentCountZero()
82
86
}
83
87
}
84
88
85
- public void CurrentCountShouldReturnZeroAfterAttemptToDecrementCountBelowZero ( )
86
- {
87
- }
88
-
89
89
[ TestMethod ]
90
90
public void Wait_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet ( )
91
91
{
@@ -118,6 +118,7 @@ public void Wait_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet()
118
118
Assert . IsTrue ( actual ) ;
119
119
Assert . AreEqual ( expectedSignalCount , signalCount ) ;
120
120
Assert . IsTrue ( countdownEvent . IsSet ) ;
121
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
121
122
Assert . IsTrue ( elapsedTime >= sleep ) ;
122
123
Assert . IsTrue ( elapsedTime <= sleep . Add ( TimeSpan . FromMilliseconds ( 100 ) ) ) ;
123
124
@@ -156,14 +157,15 @@ public void Wait_ShouldReturnTrueWhenCountdownEventIsSetBeforeTimeoutExpires()
156
157
Assert . IsTrue ( actual ) ;
157
158
Assert . AreEqual ( expectedSignalCount , signalCount ) ;
158
159
Assert . IsTrue ( countdownEvent . IsSet ) ;
160
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
159
161
Assert . IsTrue ( elapsedTime >= sleep ) ;
160
162
Assert . IsTrue ( elapsedTime <= timeout ) ;
161
163
162
164
countdownEvent . Dispose ( ) ;
163
165
}
164
166
165
167
[ TestMethod ]
166
- public void Wait_ShouldReturnFalseTimeoutExpiresBeforeCountdownEventIsSet ( )
168
+ public void Wait_ShouldReturnFalseWhenTimeoutExpiresBeforeCountdownEventIsSet ( )
167
169
{
168
170
var sleep = TimeSpan . FromMilliseconds ( 100 ) ;
169
171
var timeout = TimeSpan . FromMilliseconds ( 30 ) ;
@@ -193,6 +195,135 @@ public void Wait_ShouldReturnFalseTimeoutExpiresBeforeCountdownEventIsSet()
193
195
194
196
Assert . IsFalse ( actual ) ;
195
197
Assert . IsFalse ( countdownEvent . IsSet ) ;
198
+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
199
+ Assert . IsTrue ( elapsedTime >= timeout ) ;
200
+
201
+ countdownEvent . Wait ( Session . InfiniteTimeSpan ) ;
202
+ countdownEvent . Dispose ( ) ;
203
+ }
204
+
205
+ [ TestMethod ]
206
+ public void WaitHandle_ShouldAlwaysReturnSameInstance ( )
207
+ {
208
+ var countdownEvent = CreateCountdownEvent ( 1 ) ;
209
+
210
+ var waitHandleA = countdownEvent . WaitHandle ;
211
+ Assert . IsNotNull ( waitHandleA ) ;
212
+
213
+ var waitHandleB = countdownEvent . WaitHandle ;
214
+ Assert . AreSame ( waitHandleA , waitHandleB ) ;
215
+ }
216
+
217
+ [ TestMethod ]
218
+ public void WaitHandle_WaitOne_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet ( )
219
+ {
220
+ var sleep = TimeSpan . FromMilliseconds ( 100 ) ;
221
+ var timeout = Session . InfiniteTimeSpan ;
222
+
223
+ var countdownEvent = CreateCountdownEvent ( 1 ) ;
224
+ var signalCount = 0 ;
225
+ var expectedSignalCount = _random . Next ( 5 , 20 ) ;
226
+
227
+ for ( var i = 0 ; i < ( expectedSignalCount - 1 ) ; i ++ )
228
+ countdownEvent . AddCount ( ) ;
229
+
230
+ var threads = new Thread [ expectedSignalCount ] ;
231
+ for ( var i = 0 ; i < expectedSignalCount ; i ++ )
232
+ {
233
+ threads [ i ] = new Thread ( ( ) =>
234
+ {
235
+ Thread . Sleep ( sleep ) ;
236
+ Interlocked . Increment ( ref signalCount ) ;
237
+ countdownEvent . Signal ( ) ;
238
+ } ) ;
239
+ threads [ i ] . Start ( ) ;
240
+ }
241
+
242
+ var start = DateTime . Now ;
243
+ var actual = countdownEvent . WaitHandle . WaitOne ( timeout ) ;
244
+ var elapsedTime = DateTime . Now - start ;
245
+
246
+ Assert . IsTrue ( actual ) ;
247
+ Assert . AreEqual ( expectedSignalCount , signalCount ) ;
248
+ Assert . IsTrue ( countdownEvent . IsSet ) ;
249
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
250
+ Assert . IsTrue ( elapsedTime >= sleep ) ;
251
+ Assert . IsTrue ( elapsedTime <= sleep . Add ( TimeSpan . FromMilliseconds ( 100 ) ) ) ;
252
+
253
+ countdownEvent . Dispose ( ) ;
254
+ }
255
+
256
+ [ TestMethod ]
257
+ public void WaitHandle_WaitOne_ShouldReturnTrueWhenCountdownEventIsSetBeforeTimeoutExpires ( )
258
+ {
259
+ var sleep = TimeSpan . FromMilliseconds ( 100 ) ;
260
+ var timeout = sleep . Add ( TimeSpan . FromSeconds ( 2 ) ) ;
261
+
262
+ var countdownEvent = CreateCountdownEvent ( 1 ) ;
263
+ var signalCount = 0 ;
264
+ var expectedSignalCount = _random . Next ( 5 , 20 ) ;
265
+
266
+ for ( var i = 0 ; i < ( expectedSignalCount - 1 ) ; i ++ )
267
+ countdownEvent . AddCount ( ) ;
268
+
269
+ var threads = new Thread [ expectedSignalCount ] ;
270
+ for ( var i = 0 ; i < expectedSignalCount ; i ++ )
271
+ {
272
+ threads [ i ] = new Thread ( ( ) =>
273
+ {
274
+ Thread . Sleep ( sleep ) ;
275
+ Interlocked . Increment ( ref signalCount ) ;
276
+ countdownEvent . Signal ( ) ;
277
+ } ) ;
278
+ threads [ i ] . Start ( ) ;
279
+ }
280
+
281
+ var start = DateTime . Now ;
282
+ var actual = countdownEvent . Wait ( timeout ) ;
283
+ var elapsedTime = DateTime . Now - start ;
284
+
285
+ Assert . IsTrue ( actual ) ;
286
+ Assert . AreEqual ( expectedSignalCount , signalCount ) ;
287
+ Assert . IsTrue ( countdownEvent . IsSet ) ;
288
+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
289
+ Assert . IsTrue ( elapsedTime >= sleep ) ;
290
+ Assert . IsTrue ( elapsedTime <= timeout ) ;
291
+
292
+ countdownEvent . Dispose ( ) ;
293
+ }
294
+
295
+ [ TestMethod ]
296
+ public void WaitHandle_WaitOne_ShouldReturnFalseWhenTimeoutExpiresBeforeCountdownEventIsSet ( )
297
+ {
298
+ var sleep = TimeSpan . FromMilliseconds ( 100 ) ;
299
+ var timeout = TimeSpan . FromMilliseconds ( 30 ) ;
300
+
301
+ var countdownEvent = CreateCountdownEvent ( 1 ) ;
302
+ var signalCount = 0 ;
303
+ var expectedSignalCount = _random . Next ( 5 , 20 ) ;
304
+
305
+ for ( var i = 0 ; i < ( expectedSignalCount - 1 ) ; i ++ )
306
+ countdownEvent . AddCount ( ) ;
307
+
308
+ var threads = new Thread [ expectedSignalCount ] ;
309
+ for ( var i = 0 ; i < expectedSignalCount ; i ++ )
310
+ {
311
+ threads [ i ] = new Thread ( ( ) =>
312
+ {
313
+ Thread . Sleep ( sleep ) ;
314
+ countdownEvent . Signal ( ) ;
315
+ Interlocked . Increment ( ref signalCount ) ;
316
+ } ) ;
317
+ threads [ i ] . Start ( ) ;
318
+ }
319
+
320
+ var start = DateTime . Now ;
321
+ var actual = countdownEvent . WaitHandle . WaitOne ( timeout ) ;
322
+ var elapsedTime = DateTime . Now - start ;
323
+
324
+ Assert . IsFalse ( actual ) ;
325
+ Assert . IsFalse ( countdownEvent . IsSet ) ;
326
+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
196
327
Assert . IsTrue ( elapsedTime >= timeout ) ;
197
328
198
329
countdownEvent . Wait ( Session . InfiniteTimeSpan ) ;
0 commit comments