コード例 #1
0
        /// <summary>
        /// Test the source by exhaustively consuming it, requiring it to support the
        /// <see cref="IAsyncFusedEnumerator{T}"/> interface, and returning
        /// a TestObserver with the results.
        /// </summary>
        /// <typeparam name="T">The element type of the sequence.</typeparam>
        /// <param name="source">The async enumerable sequence to test.</param>
        /// <returns>The task with the TestObserver instance</returns>
        public static async Task <TestObserver <T> > TestAsyncFused <T>(this IAsyncEnumerable <T> source)
        {
            var to = new TestObserver <T>();
            var en = source.GetAsyncEnumerator();
            var f  = en as IAsyncFusedEnumerator <T>;

            if (f == null)
            {
                throw new ArgumentException("The IAsyncEnumerator returned by source is not fuseable");
            }
            try
            {
                for (; ;)
                {
                    var v = f.TryPoll(out var state);

                    if (state == AsyncFusedState.Ready)
                    {
                        to.OnNext(v);
                    }
                    else if (state == AsyncFusedState.Terminated)
                    {
                        to.OnCompleted();
                        break;
                    }
                    else if (!await en.MoveNextAsync())
                    {
                        to.OnCompleted();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                to.OnError(ex);
            }
            finally
            {
                await en.DisposeAsync();
            }
            return(to);
        }
コード例 #2
0
        /// <summary>
        /// Test the source by exhaustively consuming it and returning
        /// a TestObserver with the results.
        /// </summary>
        /// <typeparam name="T">The element type of the sequence.</typeparam>
        /// <param name="source">The async enumerable sequence to test.</param>
        /// <returns>The task with the TestObserver instance</returns>
        public static async Task <TestObserver <T> > TestAsync <T>(this IAsyncEnumerable <T> source)
        {
            var to = new TestObserver <T>();
            var en = source.GetAsyncEnumerator();

            try
            {
                while (await en.MoveNextAsync())
                {
                    to.OnNext(en.Current);
                }
                to.OnCompleted();
            }
            catch (Exception ex)
            {
                to.OnError(ex);
            }
            finally
            {
                await en.DisposeAsync();
            }
            return(to);
        }