예제 #1
0
        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();
                }
            }
        }