Exemplo n.º 1
0
        private static void Qbserver_ReentrancyDuringInitialization_Impl(Func <IAsyncReactiveQbserver <int>, Task> action, Func <MyObserver <int>, TaskCompletionSource <object> > complete, Action <MyObserver <int> > assert)
        {
            var provider = new MyProvider();
            var observer = provider.CreateQbserver <int>(Expression.Default(typeof(IAsyncReactiveQbserver <int>)));

            var opAsync = action(observer);

            provider.Acquire.WaitOne();

            AssertEx.ThrowsException <AggregateException>(
                () =>
            {
                observer.OnNextAsync(43, CancellationToken.None).Wait();
            },
                ex =>
            {
                var ioe = ex.InnerException as InvalidOperationException;
                Assert.IsNotNull(ioe);
                Assert.IsTrue(ioe.Message.Contains("Concurrent calls"));
            });

            AssertEx.ThrowsException <AggregateException>(
                () =>
            {
                observer.OnErrorAsync(new Exception(), CancellationToken.None).Wait();
            },
                ex =>
            {
                var ioe = ex.InnerException as InvalidOperationException;
                Assert.IsNotNull(ioe);
                Assert.IsTrue(ioe.Message.Contains("Concurrent calls"));
            });

            AssertEx.ThrowsException <AggregateException>(
                () =>
            {
                observer.OnCompletedAsync(CancellationToken.None).Wait();
            },
                ex =>
            {
                var ioe = ex.InnerException as InvalidOperationException;
                Assert.IsNotNull(ioe);
                Assert.IsTrue(ioe.Message.Contains("Concurrent calls"));
            });

            var iv = new MyObserver <int>();

            var tcs = provider.GetObserverAsyncCoreTask;

            tcs.SetResult(iv);

            complete(iv).SetResult(null);
            opAsync.Wait();

            assert(iv);
        }
Exemplo n.º 2
0
        public void Qbserver_RegularFlow()
        {
            var provider = new MyProvider();
            var observer = provider.CreateQbserver <int>(Expression.Default(typeof(IAsyncReactiveQbserver <int>)));

            var iv = new MyObserver <int>();

            provider.GetObserverAsyncCoreTask.SetResult(iv);

            iv.OnNextTask.SetResult(null);
            observer.OnNextAsync(42, CancellationToken.None).Wait();
            observer.OnNextAsync(43, CancellationToken.None).Wait();
            observer.OnNextAsync(44, CancellationToken.None).Wait();

            iv.OnCompletedTask.SetResult(null);
            observer.OnCompletedAsync(CancellationToken.None).Wait();

            Assert.IsTrue(iv.OnNextLog.SequenceEqual(new[] { 42, 43, 44 }));
            Assert.IsTrue(iv.OnCompletedLog);
        }