public void RemoveParticipantsAsync_Underflow_ThrowsException()
        {
            var barrier = new AsyncBarrier(2);

            barrier.SignalAndWaitAsync();
            AssertEx.ThrowsException <InvalidOperationException>(() => barrier.RemoveParticipantsAndWaitAsync(2));
        }
 public void RemoveParticipantsAsync_LastParticipant_CompletesPhase()
 {
     Test.Async(async() =>
     {
         var barrier = new AsyncBarrier(1);
         Assert.AreEqual(0, barrier.CurrentPhaseNumber);
         Assert.AreEqual(1, barrier.ParticipantCount);
         Assert.AreEqual(1, barrier.ParticipantsRemaining);
         await barrier.RemoveParticipantsAndWaitAsync(1);
         Assert.AreEqual(1, barrier.CurrentPhaseNumber);
         Assert.AreEqual(0, barrier.ParticipantCount);
         Assert.AreEqual(0, barrier.ParticipantsRemaining);
     });
 }
 public void AddParticipants_FromZero_IncreasesParticipantsForCurrentPhase()
 {
     Test.Async(async() =>
     {
         var barrier = new AsyncBarrier(1);
         Assert.AreEqual(0, barrier.CurrentPhaseNumber);
         Assert.AreEqual(1, barrier.ParticipantCount);
         Assert.AreEqual(1, barrier.ParticipantsRemaining);
         await barrier.RemoveParticipantsAndWaitAsync();
         Assert.AreEqual(1, barrier.CurrentPhaseNumber);
         Assert.AreEqual(0, barrier.ParticipantCount);
         Assert.AreEqual(0, barrier.ParticipantsRemaining);
         barrier.AddParticipants();
         Assert.AreEqual(1, barrier.CurrentPhaseNumber);
         Assert.AreEqual(1, barrier.ParticipantCount);
         Assert.AreEqual(1, barrier.ParticipantsRemaining);
     });
 }