예제 #1
0
        public void ConnectableObservable_Connected()
        {
            var scheduler = new TestScheduler();

            var xs = scheduler.CreateHotObservable<int>(
                OnNext(210, 1),
                OnNext(220, 2),
                OnNext(230, 3),
                OnNext(240, 4),
                OnCompleted<int>(250)
            );

            var subject = new MySubject();

            var conn = new ConnectableObservable<int>(xs, subject);
            var disconnect = conn.Connect();

            var res = scheduler.Start(() => conn);

            res.Messages.AssertEqual(
                OnNext(210, 1),
                OnNext(220, 2),
                OnNext(230, 3),
                OnNext(240, 4),
                OnCompleted<int>(250)
            );
        }
예제 #2
0
        public void ConnectableObservable_Creation()
        {
            var y = 0;

            var s2 = new Subject<int>();
            var co2 = new ConnectableObservable<int>(Observable.Return<int>(1), s2);

            co2.Subscribe(x => y = x);
            Assert.AreNotEqual(1, y);
            
            co2.Connect();
            Assert.AreEqual(1, y);
        }
        public void connecting_multiple_times_does_not_subscribe_to_source_multiple_times()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            connectable.Connect();
            connectable.Connect();

            Assert.AreEqual(1, source.SubscriptionCount);
        }
예제 #4
0
        public void connecting_multiple_times_does_not_subscribe_to_source_multiple_times()
        {
            StatsObserver <int> stats = new StatsObserver <int>();

            StatsSubject <int> source  = new StatsSubject <int>();
            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            var sub = connectable.Subscribe(stats);

            connectable.Connect();
            connectable.Connect();

            Assert.AreEqual(1, source.SubscriptionCount);
        }
        public void connecting_subscribes_to_source()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            Assert.IsFalse(source.HasSubscriptions);

            connectable.Connect();

            Assert.IsTrue(source.HasSubscriptions);
        }
예제 #6
0
        public void disconnecting_subscribes_to_source()
        {
            StatsObserver <int> stats = new StatsObserver <int>();

            StatsSubject <int> source  = new StatsSubject <int>();
            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            var sub = connectable.Subscribe(stats);

            Assert.IsFalse(source.HasSubscriptions);

            connectable.Connect().Dispose();

            Assert.IsFalse(source.HasSubscriptions);
        }
예제 #7
0
        public void values_send_before_completion_are_ignored()
        {
            StatsObserver <int> stats = new StatsObserver <int>();

            StatsSubject <int> source  = new StatsSubject <int>();
            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);
            source.OnCompleted();
            source.OnError(new Exception());

            Assert.IsFalse(stats.NextCalled);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }
예제 #8
0
        public void disconnecting_does_not_remove_subscriptions()
        {
            IObservable <int>   source = Observable.Empty <int>();
            StatsObserver <int> stats  = new StatsObserver <int>();

            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            Assert.IsFalse(subject.HasSubscriptions);

            var sub = connectable.Subscribe(stats);

            Assert.IsTrue(subject.HasSubscriptions);

            connectable.Connect().Dispose();

            Assert.IsTrue(subject.HasSubscriptions);
        }
예제 #9
0
        public void uses_subject_for_subscriptions()
        {
            IObservable <int>   source = Observable.Empty <int>();
            StatsObserver <int> stats  = new StatsObserver <int>();

            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            Assert.IsFalse(subject.HasSubscriptions);

            var sub = connectable.Subscribe(stats);

            Assert.IsTrue(subject.HasSubscriptions);

            sub.Dispose();

            Assert.IsFalse(subject.HasSubscriptions);
        }
        public void disconnecting_does_not_remove_subscriptions()
        {
            IObservable<int> source = Observable.Empty<int>();
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            Assert.IsFalse(subject.HasSubscriptions);

            var sub = connectable.Subscribe(stats);

            Assert.IsTrue(subject.HasSubscriptions);

            connectable.Connect().Dispose();

            Assert.IsTrue(subject.HasSubscriptions);
        }
        public void disconnecting_first_of_multiple_connections_subscribes_to_source()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            Assert.IsFalse(source.HasSubscriptions);

            var connectionA = connectable.Connect();
            var connectionB = connectable.Connect();

            connectionA.Dispose();

            Assert.IsFalse(source.HasSubscriptions);
        }
예제 #12
0
            public void Run(Multicast <TSource, TIntermediate, TResult> parent)
            {
                IObservable <TResult> observable;
                IConnectableObservable <TIntermediate> connectable;

                try
                {
                    var subject = parent._subjectSelector();
                    connectable = new ConnectableObservable <TSource, TIntermediate>(parent._source, subject);
                    observable  = parent._selector(connectable);
                }
                catch (Exception exception)
                {
                    ForwardOnError(exception);
                    return;
                }

                Run(observable);
                _connection.Disposable = connectable.Connect();
            }
예제 #13
0
            public void Run(Multicast <TSource, TIntermediate, TResult> parent)
            {
                var observable  = default(IObservable <TResult>);
                var connectable = default(IConnectableObservable <TIntermediate>);

                try
                {
                    var subject = parent._subjectSelector();
                    connectable = new ConnectableObservable <TSource, TIntermediate>(parent._source, subject);
                    observable  = parent._selector(connectable);
                }
                catch (Exception exception)
                {
                    ForwardOnError(exception);
                    return;
                }

                Run(observable);
                Disposable.SetSingle(ref _connection, connectable.Connect());
            }
예제 #14
0
        public void operation_order_is_honoured_prior_to_connection()
        {
            StatsObserver <int> stats = new StatsObserver <int>();

            StatsSubject <int> source  = new StatsSubject <int>();
            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);
            source.OnCompleted();

            connectable.Connect();

            source.OnNext(1);

            Assert.IsFalse(stats.NextCalled);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }
예제 #15
0
        public void operations_are_passed_on_once_connected()
        {
            StatsObserver <int> stats = new StatsObserver <int>();

            StatsSubject <int> source  = new StatsSubject <int>();
            StatsSubject <int> subject = new StatsSubject <int>();

            ConnectableObservable <int> connectable = new ConnectableObservable <int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);

            connectable.Connect();

            source.OnNext(1);

            Assert.IsTrue(stats.NextCalled);
            Assert.AreEqual(1, stats.NextValues[0]);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }
예제 #16
0
            public IDisposable Run(Multicast <TSource, TIntermediate, TResult> parent)
            {
                var observable  = default(IObservable <TResult>);
                var connectable = default(IConnectableObservable <TIntermediate>);

                try
                {
                    var subject = parent._subjectSelector();
                    connectable = new ConnectableObservable <TSource, TIntermediate>(parent._source, subject);
                    observable  = parent._selector(connectable);
                }
                catch (Exception exception)
                {
                    ForwardOnError(exception);
                    return(Disposable.Empty);
                }

                var subscription = observable.SubscribeSafe(this);
                var connection   = connectable.Connect();

                return(StableCompositeDisposable.Create(subscription, connection));
            }
예제 #17
0
            public IDisposable Run()
            {
                var observable  = default(IObservable <TResult>);
                var connectable = default(IConnectableObservable <TIntermediate>);

                try
                {
                    var subject = _parent._subjectSelector();
                    connectable = new ConnectableObservable <TSource, TIntermediate>(_parent._source, subject);
                    observable  = _parent._selector(connectable);
                }
                catch (Exception exception)
                {
                    base._observer.OnError(exception);
                    base.Dispose();
                    return(Disposable.Empty);
                }

                var subscription = observable.SubscribeSafe(this);
                var connection   = connectable.Connect();

                return(new CompositeDisposable(subscription, connection));
            }
        public void uses_subject_for_subscriptions()
        {
            IObservable<int> source = Observable.Empty<int>();
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            Assert.IsFalse(subject.HasSubscriptions);

            var sub = connectable.Subscribe(stats);

            Assert.IsTrue(subject.HasSubscriptions);

            sub.Dispose();

            Assert.IsFalse(subject.HasSubscriptions);
        }
예제 #19
0
 public Connection(ConnectableObservable <T> parent, IDisposable subscription)
 {
     this.parent       = parent;
     this.subscription = subscription;
 }
예제 #20
0
        public void RefCount_NotConnected()
        {
            var disconnected = false;
            var count = 0;
            var xs = Observable.Defer(() =>
            {
                count++;
                return Observable.Create<int>(obs =>
                {
                    return () => { disconnected = true; };
                });
            });

            var subject = new MySubject();

            var conn = new ConnectableObservable<int>(xs, subject);
            var refd = conn.RefCount();

            var dis1 = refd.Subscribe();
            Assert.AreEqual(1, count);
            Assert.AreEqual(1, subject.SubscribeCount);
            Assert.IsFalse(disconnected);

            var dis2 = refd.Subscribe();
            Assert.AreEqual(1, count);
            Assert.AreEqual(2, subject.SubscribeCount);
            Assert.IsFalse(disconnected);

            dis1.Dispose();
            Assert.IsFalse(disconnected);
            dis2.Dispose();
            Assert.IsTrue(disconnected);
            disconnected = false;

            var dis3 = refd.Subscribe();
            Assert.AreEqual(2, count);
            Assert.AreEqual(3, subject.SubscribeCount);
            Assert.IsFalse(disconnected);

            dis3.Dispose();
            Assert.IsTrue(disconnected);
        }
예제 #21
0
        public void RefCount_ConnectsOnFirst()
        {
            var scheduler = new TestScheduler();

            var xs = scheduler.CreateHotObservable<int>(
                OnNext(210, 1),
                OnNext(220, 2),
                OnNext(230, 3),
                OnNext(240, 4),
                OnCompleted<int>(250)
            );

            var subject = new MySubject();

            var conn = new ConnectableObservable<int>(xs, subject);

            var res = scheduler.Start(() =>
                conn.RefCount()
            );

            res.Messages.AssertEqual(
                OnNext(210, 1),
                OnNext(220, 2),
                OnNext(230, 3),
                OnNext(240, 4),
                OnCompleted<int>(250)
            );

            Assert.IsTrue(subject.Disposed);
        }
        public void operations_are_passed_on_once_connected()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);

            connectable.Connect();

            source.OnNext(1);

            Assert.IsTrue(stats.NextCalled);
            Assert.AreEqual(1, stats.NextValues[0]);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }
        public void operation_order_is_honoured_prior_to_connection()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);
            source.OnCompleted();

            connectable.Connect();

            source.OnNext(1);

            Assert.IsFalse(stats.NextCalled);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }
        public void values_send_before_completion_are_ignored()
        {
            StatsObserver<int> stats = new StatsObserver<int>();

            StatsSubject<int> source = new StatsSubject<int>();
            StatsSubject<int> subject = new StatsSubject<int>();

            ConnectableObservable<int> connectable = new ConnectableObservable<int>(source, subject);

            var sub = connectable.Subscribe(stats);

            source.OnNext(0);
            source.OnCompleted();
            source.OnError(new Exception());

            Assert.IsFalse(stats.NextCalled);
            Assert.IsFalse(stats.CompletedCalled);
            Assert.IsFalse(stats.ErrorCalled);
        }