public void CancelAllPop()
 {
     var stack = new AsyncStack<string>();
     var tasks = Enumerable.Range(0, 3).Select(_ => stack.PopAsync()).ToList();
     stack.CancelAllPop().Dispose();
     foreach (var task in tasks)
     {
         task.AssertCanceled();
     }
 }
 public void Count_nonempty()
 {
     var stack = new AsyncStack<string>();
     stack.Push("A");
     stack.Push("B");
     stack.Push("C");
     stack.Push("D");
     Assert.IsTrue(stack.TryPop());
     Assert.AreEqual(3, stack.Count);
 }
 public void CompleteAllPop()
 {
     var stack = new AsyncStack<string>();
     var tasks = Enumerable.Range(0, 3).Select(_ => stack.PopAsync()).ToList();
     stack.CompleteAllPop("X").Dispose();
     foreach (var task in tasks)
     {
         task.AssertResult("X");
     }
 }
 public void Last_in_first_out()
 {
     var stack = new AsyncStack<string>();
     var values = new List<string> { "A", "B", "C" };
     for (int i = 0; i < values.Count; i++)
     {
         stack.Push(values[i]);
     }
     for (int i = values.Count - 1; i >= 0; i--)
     {
         stack.PopAsync().AssertResult(values[i]);
     }
 }
 public void PopAsync_canceled_after_completion()
 {
     var stack = new AsyncStack<string>();
     stack.Push("A");
     using (var cts = new CancellationTokenSource())
     {
         var task = stack.PopAsync(cts.Token);
         cts.Cancel();
         task.AssertResult("A");
     }
 }
 public void PopAsync_before_Push()
 {
     var stack = new AsyncStack<string>();
     var task = stack.PopAsync();
     stack.Push("A");
     task.AssertResult("A");
 }
 public void PopAsync_already_canceled()
 {
     var stack = new AsyncStack<string>();
     stack.Push("A");
     stack.PopAsync(new CancellationToken(true)).AssertCanceled();
 }
 public void Count_empty()
 {
     var stack = new AsyncStack<string>();
     Assert.AreEqual(0, stack.Count);
 }
 public void TryPop_nonempty()
 {
     var stack = new AsyncStack<string>();
     stack.Push("A");
     string value;
     Assert.IsTrue(stack.TryPop(out value));
     Assert.AreEqual("A", value);
     Assert.AreEqual(0, stack.Count);
 }
 public void TryPop_empty()
 {
     var stack = new AsyncStack<string>();
     Assert.IsFalse(stack.TryPop());
 }
 public void TryPeek_empty()
 {
     var stack = new AsyncStack<string>();
     string value;
     Assert.IsFalse(stack.TryPeek(out value));
 }
 public void PopAsync_handled_in_order_of_caller()
 {
     var stack = new AsyncStack<string>();
     var values = new List<string> { "A", "B", "C" };
     var tasks = values.Select(_ => stack.PopAsync()).ToList();
     for (int i = 0; i < values.Count; i++)
     {
         tasks[i].AssertNotCompleted();
         stack.Push(values[i]);
         tasks[i].AssertResult(values[i]);
     }
 }
 public void PopAsync_empty_canceled()
 {
     var stack = new AsyncStack<string>();
     using (var cts = new CancellationTokenSource())
     {
         var task = stack.PopAsync(cts.Token);
         cts.Cancel();
         stack.Push("A");
         task.AssertCanceled();
     }
 }