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)); }
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); }