public void StaticCompositeSubscription_Dispose()
        {
            var s1 = new MySub();
            var s2 = new MySub();
            var s3 = new MySub();
            var cs = new StaticCompositeSubscription(s1, s2, s3);

            Assert.AreEqual(0, s1.DisposedCount);
            Assert.AreEqual(0, s2.DisposedCount);
            Assert.AreEqual(0, s3.DisposedCount);
            Assert.AreEqual(3, cs.Count);

            Assert.IsTrue(new[] { s1, s2, s3 }.SequenceEqual(cs));
            Assert.IsTrue(new[] { s1, s2, s3 }.SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>()));

            cs.Dispose();

            Assert.AreEqual(1, s1.DisposedCount);
            Assert.AreEqual(1, s2.DisposedCount);
            Assert.AreEqual(1, s3.DisposedCount);
            Assert.AreEqual(3, cs.Count);

            Assert.IsTrue(new[] { s1, s2, s3 }.SequenceEqual(cs));
            Assert.IsTrue(new[] { s1, s2, s3 }.SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>()));

            // Dispose is idempotent
            cs.Dispose();
            Assert.AreEqual(1, s1.DisposedCount);
            Assert.AreEqual(1, s2.DisposedCount);
            Assert.AreEqual(1, s3.DisposedCount);
            Assert.AreEqual(3, cs.Count);
        }
        public void StaticCompositeSubscription_AddRemove_Throws()
        {
            var cs = new StaticCompositeSubscription();

            var s1 = new MySub();

            Assert.ThrowsException <InvalidOperationException>(() => cs.Add(s1));

            var cs2 = new StaticCompositeSubscription(s1);

            Assert.ThrowsException <InvalidOperationException>(() => cs.Remove(s1));
        }
Пример #3
0
            protected override ISubscription OnSubscribe()
            {
                var src = Params._source.Subscribe(this);

                if (Params._observer is ISubscription o)
                {
                    return(StaticCompositeSubscription.Create(src, o));
                }
                else
                {
                    return(src);
                }
            }
        public void StaticCompositeSubscription_Start()
        {
            var s1 = new MySub();
            var s2 = new MySub();
            var s3 = new MySub();
            var cs = new StaticCompositeSubscription(s1, s2, s3);

            Assert.AreEqual(0, s1.StartCount);
            Assert.AreEqual(0, s2.StartCount);
            Assert.AreEqual(0, s3.StartCount);
            Start(cs);
            Assert.AreEqual(1, s1.StartCount);
            Assert.AreEqual(1, s2.StartCount);
            Assert.AreEqual(1, s3.StartCount);
        }
        /// <summary>
        /// Target for binding rx://builtin/subscribe. Supports visiting the subscription as well as the observer (e.g. for purposes
        /// of state persistence).
        /// </summary>
        /// <typeparam name="T">The type of the elements.</typeparam>
        /// <param name="subscribable">The observable to subscribe to.</param>
        /// <param name="observer">The observer to use for the subscription.</param>
        /// <returns>The subscription object which supports traversal using subscription visitors.</returns>
        public static ISubscription SubscribeRoot <T>(this ISubscribable <T> subscribable, IObserver <T> observer)
        {
            var subscription = subscribable.Subscribe(observer);

            //
            // NB: Subscription is a bit of a misnomer; it's merely a mechanism to visit nodes in a query tree. As such, an observer
            //     can implement `ISubscription` and be reachable by visitors (e.g. to save/load state, to support IUnloadable, etc.).
            //

            if (observer is ISubscription o)
            {
                subscription = StaticCompositeSubscription.Create(subscription, o);
            }

            return(subscription);
        }