public void CompositeSubscription_Dispose() { var cs = new CompositeSubscription(); var s1 = new MySub(); cs.Add(s1); var s2 = new MySub(); cs.Add(s2); var s3 = new MySub(); cs.Add(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(0, cs.Count); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(cs)); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>())); var s4 = new MySub(); cs.Add(s4); Assert.AreEqual(1, s4.DisposedCount); Assert.AreEqual(0, cs.Count); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(cs)); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>())); cs.Dispose(); Assert.AreEqual(1, s1.DisposedCount); Assert.AreEqual(1, s2.DisposedCount); Assert.AreEqual(1, s3.DisposedCount); Assert.AreEqual(1, s4.DisposedCount); Assert.AreEqual(0, cs.Count); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(cs)); Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>())); }
public void OnNext(TSource value) { lock (_lock) { if (_innerSubscriptions.Count >= _maxInnerCount) { Output.OnError(new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "The number of concurrent nested sequences produced by the SelectMany operator exceeded {0} items. Please review the SelectMany operator usage to avoid exceeding this limit.", _maxInnerCount))); Dispose(); return; } } ISubscribable <TCollection> collection; try { collection = Params._collectionSelector(value); #pragma warning disable IDE0079 // Remove unnecessary suppression. #pragma warning disable CA2000 // Dispose objects before losing scope. (Observer will be owned by inner subscription.) var observer = new Observer(this, value); var subscription = SubscribeInner <TCollection>(collection, observer); observer.Subscription = subscription; SubscriptionInitializeVisitor.Subscribe(subscription); SubscriptionInitializeVisitor.SetContext(subscription, _context); lock (_lock) { // No need to set dirty flag here, the SubscribeInner call returns // an operator with the dirty flag set to true. _innerSubscriptions.Add(subscription); } SubscriptionInitializeVisitor.Start(subscription); #pragma warning restore CA2000 #pragma warning restore IDE0079 } catch (Exception ex) { lock (_lock) { Output.OnError(ex); Dispose(); return; } } }
public void CompositeSubscription_AddRemove() { var cs = new CompositeSubscription(); var s1 = new MySub(); cs.Add(s1); Start(cs); Assert.AreEqual(1, s1.StartCount); Assert.AreEqual(1, cs.Count); var s2 = new MySub(); cs.Add(s2); Start(cs); Assert.AreEqual(2, s1.StartCount); Assert.AreEqual(1, s2.StartCount); Assert.AreEqual(2, cs.Count); cs.Remove(s1); Assert.AreEqual(1, s1.DisposedCount); Assert.AreEqual(1, cs.Count); Start(cs); Assert.AreEqual(2, s1.StartCount); Assert.AreEqual(2, s2.StartCount); cs.Remove(s2); Assert.AreEqual(1, s1.DisposedCount); Assert.AreEqual(1, s2.DisposedCount); Assert.AreEqual(0, cs.Count); Start(cs); Assert.AreEqual(2, s1.StartCount); Assert.AreEqual(2, s2.StartCount); var s3 = new MySub(); cs.Add(s3); Start(cs); Assert.AreEqual(2, s1.StartCount); Assert.AreEqual(2, s2.StartCount); Assert.AreEqual(1, s3.StartCount); Assert.AreEqual(1, cs.Count); }
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = SessionsFragmentBinding.Inflate(inflater, container, false); HasOptionsMenu = true; InitViewPager(); InitEmptyView(); CompositeSubscription.Add(LoadData()); CompositeSubscription.Add(FetchAndSave()); return(binding.Root); }
public void CompositeSubscription_ArgumentChecking() { Assert.ThrowsException <ArgumentOutOfRangeException>(() => new CompositeSubscription(0)); Assert.ThrowsException <ArgumentOutOfRangeException>(() => new CompositeSubscription(-1)); Assert.ThrowsException <ArgumentNullException>(() => new CompositeSubscription(default(IEnumerable <ISubscription>))); Assert.ThrowsException <ArgumentNullException>(() => new CompositeSubscription(default(ISubscription[]))); var cs = new CompositeSubscription(); Assert.ThrowsException <ArgumentNullException>(() => cs.Add(null)); Assert.ThrowsException <ArgumentNullException>(() => cs.Remove(null)); }
public void Adapter_subscriptions_can_also_be_disposed() { var b = new MethodScanner("Handle").MakeBuilder(); var disposableSub = new DisposableSubscription(b.BuildSubscriptions(new SomeHandler()).First()); ISubscriptionResolver resolver = new CompositeSubscription(); resolver.Add(disposableSub); var subs = resolver.GetSubscriptionsFor(new MessageA()); subs.ShouldHaveCount(1); disposableSub.GetDisposer().Dispose(); subs = resolver.GetSubscriptionsFor(new MessageA()); subs.ShouldHaveCount(0); }
public void CompositeSubscription_ShrinkingBehavior() { #pragma warning disable IDE0079 // Remove unnecessary suppression #pragma warning disable CA1829 // Use Length/Count property instead of Count() when available (tests IEnumerable<T> implementation) var cs = new CompositeSubscription(16); var N = 100; var ds1 = Enumerable.Range(0, N).Select(i => (i, s: new MySub())).ToList(); foreach (var(i, s) in ds1) { cs.Add(s); } Start(cs); foreach (var(i, s) in ds1) { Assert.AreEqual(1, s.StartCount); } var rand = new Random(1983); ds1 = ds1.OrderBy(_ => rand.Next()).ToList(); var R = 2 * N / 3; var rs = ds1.Take(R); var n = ds1.Count; foreach (var(i, s) in rs) { var d = s; cs.Remove(d); Assert.AreEqual(1, d.DisposedCount); --n; Assert.AreEqual(n, cs.Count); Assert.AreEqual(n, cs.Count()); } var ds2 = Enumerable.Range(0, N).Select(i => (i, s: new MySub())).ToList(); foreach (var(i, s) in ds2) { cs.Add(s); } Start(cs); foreach (var(i, s) in ds1.Skip(R)) { Assert.AreEqual(2, s.StartCount); } foreach (var(i, s) in ds2) { Assert.AreEqual(1, s.StartCount); } var es = ds1.Skip(R).Concat(ds2).OrderBy(_ => rand.Next()).ToList(); var Q = 9 * es.Count / 10; var qs = es.Take(Q); n = cs.Count; foreach (var(i, s) in qs) { var d = s; cs.Remove(d); Assert.AreEqual(1, d.DisposedCount); --n; Assert.AreEqual(n, cs.Count); Assert.AreEqual(n, cs.Count()); } var ts = es.Skip(Q).ToList(); foreach (var(i, s) in ts) { var d = s; Assert.AreEqual(0, d.DisposedCount); } cs.Dispose(); foreach (var(i, s) in ts) { var d = s; Assert.AreEqual(1, d.DisposedCount); } #pragma warning restore CA1829 #pragma warning restore IDE0079 }