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)
                );
        }
        public void RefCount_ConnectsOnFirst()
        {
            var scheduler = new TestScheduler();

            var xs = scheduler.CreateHotObservable(
                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.True(subject.Disposed);
        }
        public void LazyRefCount_NotConnected()
        {
            var scheduler    = new TestScheduler();
            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(TimeSpan.FromTicks(20), scheduler);

            var dis1 = refd.Subscribe();

            Assert.Equal(1, count);
            Assert.Equal(1, subject.SubscribeCount);
            Assert.False(disconnected);

            var dis2 = refd.Subscribe();

            Assert.Equal(1, count);
            Assert.Equal(2, subject.SubscribeCount);
            Assert.False(disconnected);

            dis1.Dispose();
            Assert.False(disconnected);
            dis2.Dispose();
            Assert.False(disconnected);

            scheduler.AdvanceBy(19);
            Assert.False(disconnected);

            scheduler.AdvanceBy(1);
            Assert.True(disconnected);
            disconnected = false;

            var dis3 = refd.Subscribe();

            Assert.Equal(2, count);
            Assert.Equal(3, subject.SubscribeCount);
            Assert.False(disconnected);

            dis3.Dispose();
            scheduler.AdvanceBy(20);
            Assert.True(disconnected);
        }
        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 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.Equal(1, count);
            Assert.Equal(1, subject.SubscribeCount);
            Assert.False(disconnected);

            var dis2 = refd.Subscribe();

            Assert.Equal(1, count);
            Assert.Equal(2, subject.SubscribeCount);
            Assert.False(disconnected);

            dis1.Dispose();
            Assert.False(disconnected);
            dis2.Dispose();
            Assert.True(disconnected);
            disconnected = false;

            var dis3 = refd.Subscribe();

            Assert.Equal(2, count);
            Assert.Equal(3, subject.SubscribeCount);
            Assert.False(disconnected);

            dis3.Dispose();
            Assert.True(disconnected);
        }