public void WaitAsync_Cancelled_DoesNotTakeSlot() { Test.Async(async () => { var semaphore = new AsyncSemaphore(0); Assert.AreEqual(0, semaphore.CurrentCount); var cts = new CancellationTokenSource(); var task = semaphore.WaitAsync(cts.Token); Assert.AreEqual(0, semaphore.CurrentCount); Assert.IsFalse(task.IsCompleted); cts.Cancel(); try { await task; } catch (OperationCanceledException) { } semaphore.Release(); Assert.AreEqual(1, semaphore.CurrentCount); Assert.IsTrue(task.IsCanceled); }); }
public void Release_ZeroSlots_HasNoEffect() { var semaphore = new AsyncSemaphore(1); Assert.AreEqual(1, semaphore.CurrentCount); semaphore.Release(0); Assert.AreEqual(1, semaphore.CurrentCount); }
public void Release_WithWaiters_ReleasesWaiters() { Test.Async(async () => { var semaphore = new AsyncSemaphore(0); Assert.AreEqual(0, semaphore.CurrentCount); var task = semaphore.WaitAsync(); Assert.AreEqual(0, semaphore.CurrentCount); Assert.IsFalse(task.IsCompleted); semaphore.Release(); Assert.AreEqual(0, semaphore.CurrentCount); await task; }); }
public void Release_Overflow_ThrowsException() { var semaphore = new AsyncSemaphore(int.MaxValue); Assert.AreEqual(int.MaxValue, semaphore.CurrentCount); AssertEx.ThrowsException<InvalidOperationException>(() => semaphore.Release()); }
public void Release_WithoutWaiters_IncrementsCount() { var semaphore = new AsyncSemaphore(0); Assert.AreEqual(0, semaphore.CurrentCount); semaphore.Release(); Assert.AreEqual(1, semaphore.CurrentCount); var task = semaphore.WaitAsync(); Assert.AreEqual(0, semaphore.CurrentCount); Assert.IsTrue(task.IsCompleted); }