private void TestComplex(bool feedAhead, bool fail) { AsyncEnumerator <int> enumerator = new AsyncEnumerator <int>(); var consumer = enumerator.Consumer; var src = Enumerable.Range(0, 3); List <Task> yieldTasks; if (feedAhead) { yieldTasks = consumer.FeedFast(src); if (fail) { consumer.Fail(new TestUtils.SomeTestException()); } else { consumer.Complete(); } VerifyYieldAfterLast(consumer); var actual = enumerator.Consume(src.Count()); } else { yieldTasks = new List <Task>(); foreach (var item in src) { var moveNextTask = enumerator.MoveNextAsync(); yieldTasks.Add(consumer.YieldAsync(item)); moveNextTask.Wait(); Assert.IsTrue(moveNextTask.IsCompleted); Assert.IsTrue(moveNextTask.AwaitSynchronously()); } if (fail) { consumer.Fail(new TestUtils.SomeTestException()); } else { consumer.Complete(); } VerifyYieldAfterLast(consumer); } foreach (var yieldTask in yieldTasks.Take(yieldTasks.Count - 1)) { yieldTask.Wait(); Assert.IsTrue(yieldTask.IsCompleted); } Assert.IsFalse(yieldTasks.Last().IsCompleted); try { bool res = enumerator.MoveNextAsync().AwaitSynchronously(); if (fail) { Assert.Fail(); } Assert.IsFalse(res); } catch (TestUtils.SomeTestException) { if (!fail) { Assert.Fail(); } } }