@@ -26,6 +26,7 @@ public void Ctor_InitialCountGreatherThanZero()
2626 var countdownEvent = CreateCountdownEvent ( initialCount ) ;
2727 Assert . AreEqual ( initialCount , countdownEvent . CurrentCount ) ;
2828 Assert . IsFalse ( countdownEvent . IsSet ) ;
29+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
2930 countdownEvent . Dispose ( ) ;
3031 }
3132
@@ -37,6 +38,7 @@ public void Ctor_InitialCountZero()
3738 var countdownEvent = CreateCountdownEvent ( 0 ) ;
3839 Assert . AreEqual ( initialCount , countdownEvent . CurrentCount ) ;
3940 Assert . IsTrue ( countdownEvent . IsSet ) ;
41+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
4042 countdownEvent . Dispose ( ) ;
4143 }
4244
@@ -49,6 +51,7 @@ public void Signal_CurrentCountGreatherThanOne()
4951 Assert . IsFalse ( countdownEvent . Signal ( ) ) ;
5052 Assert . AreEqual ( -- initialCount , countdownEvent . CurrentCount ) ;
5153 Assert . IsFalse ( countdownEvent . IsSet ) ;
54+ Assert . IsFalse ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
5255 countdownEvent . Dispose ( ) ;
5356 }
5457
@@ -59,6 +62,7 @@ public void Signal_CurrentCountOne()
5962 Assert . IsTrue ( countdownEvent . Signal ( ) ) ;
6063 Assert . AreEqual ( 0 , countdownEvent . CurrentCount ) ;
6164 Assert . IsTrue ( countdownEvent . IsSet ) ;
65+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
6266 countdownEvent . Dispose ( ) ;
6367 }
6468
@@ -82,10 +86,6 @@ public void Signal_CurrentCountZero()
8286 }
8387 }
8488
85- public void CurrentCountShouldReturnZeroAfterAttemptToDecrementCountBelowZero ( )
86- {
87- }
88-
8989 [ TestMethod ]
9090 public void Wait_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet ( )
9191 {
@@ -118,6 +118,7 @@ public void Wait_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet()
118118 Assert . IsTrue ( actual ) ;
119119 Assert . AreEqual ( expectedSignalCount , signalCount ) ;
120120 Assert . IsTrue ( countdownEvent . IsSet ) ;
121+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
121122 Assert . IsTrue ( elapsedTime >= sleep ) ;
122123 Assert . IsTrue ( elapsedTime <= sleep . Add ( TimeSpan . FromMilliseconds ( 100 ) ) ) ;
123124
@@ -156,14 +157,15 @@ public void Wait_ShouldReturnTrueWhenCountdownEventIsSetBeforeTimeoutExpires()
156157 Assert . IsTrue ( actual ) ;
157158 Assert . AreEqual ( expectedSignalCount , signalCount ) ;
158159 Assert . IsTrue ( countdownEvent . IsSet ) ;
160+ Assert . IsTrue ( countdownEvent . WaitHandle . WaitOne ( 0 ) ) ;
159161 Assert . IsTrue ( elapsedTime >= sleep ) ;
160162 Assert . IsTrue ( elapsedTime <= timeout ) ;
161163
162164 countdownEvent . Dispose ( ) ;
163165 }
164166
165167 [ TestMethod ]
166- public void Wait_ShouldReturnFalseTimeoutExpiresBeforeCountdownEventIsSet ( )
168+ public void Wait_ShouldReturnFalseWhenTimeoutExpiresBeforeCountdownEventIsSet ( )
167169 {
168170 var sleep = TimeSpan . FromMilliseconds ( 100 ) ;
169171 var timeout = TimeSpan . FromMilliseconds ( 30 ) ;
@@ -193,6 +195,135 @@ public void Wait_ShouldReturnFalseTimeoutExpiresBeforeCountdownEventIsSet()
193195
194196 Assert . IsFalse ( actual ) ;
195197 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 ) ) ;
196327 Assert . IsTrue ( elapsedTime >= timeout ) ;
197328
198329 countdownEvent . Wait ( Session . InfiniteTimeSpan ) ;
0 commit comments