示例#1
0
        public void StableCompositeSubscription_AddRange()
        {
            var cs = new StableCompositeSubscription();

            var s1 = new MySub();

            cs.AddRange(new ISubscription[] { s1 });
            Start(cs);
            Assert.AreEqual(1, s1.StartCount);
            Assert.AreEqual(1, cs.Count);

            var s2 = new MySub();

            cs.AddRange(new ISubscription[] { 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.AddRange(new ISubscription[] { s3 });
            Start(cs);
            Assert.AreEqual(2, s1.StartCount);
            Assert.AreEqual(2, s2.StartCount);
            Assert.AreEqual(1, s3.StartCount);
            Assert.AreEqual(1, cs.Count);

            cs.AddRange(Array.Empty <ISubscription>());
            Start(cs);
            Assert.AreEqual(2, s1.StartCount);
            Assert.AreEqual(2, s2.StartCount);
            Assert.AreEqual(2, s3.StartCount);
            Assert.AreEqual(1, cs.Count);
        }
示例#2
0
        public void StableCompositeSubscription_ArgumentChecking()
        {
#pragma warning disable IDE0034 // Simplify 'default' expression (illustrative of method signature)
            AssertEx.ThrowsException <ArgumentNullException>(() => new StableCompositeSubscription(default(IEnumerable <ISubscription>)), ex => Assert.AreEqual("subscriptions", ex.ParamName));
            AssertEx.ThrowsException <ArgumentNullException>(() => new StableCompositeSubscription(default(ISubscription[])), ex => Assert.AreEqual("subscriptions", ex.ParamName));
#pragma warning restore IDE0034 // Simplify 'default' expression

            var cs = new StableCompositeSubscription();

            AssertEx.ThrowsException <ArgumentNullException>(() => cs.Add(null), ex => Assert.AreEqual("subscription", ex.ParamName));
            AssertEx.ThrowsException <ArgumentNullException>(() => cs.AddRange(null), ex => Assert.AreEqual("subscriptions", ex.ParamName));
            AssertEx.ThrowsException <ArgumentNullException>(() => cs.Remove(null), ex => Assert.AreEqual("subscription", ex.ParamName));
        }
示例#3
0
        public void StableCompositeSubscription_AddRemove()
        {
            var cs = new StableCompositeSubscription();

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

            cs.Remove(s3);
            Assert.AreEqual(1, s3.DisposedCount);
            Assert.AreEqual(0, cs.Count);

            cs.AddRange(new[] { s1, s2, s3 });
            Assert.AreEqual(3, cs.Count);
            cs.Remove(s3);
            Assert.AreEqual(2, s3.DisposedCount);
            Assert.AreEqual(2, cs.Count);
            cs.Add(s3);
            Assert.AreEqual(3, cs.Count);
            cs.Remove(s2);
            Assert.AreEqual(2, s2.DisposedCount);
            Assert.AreEqual(2, cs.Count);
            cs.Add(s2);
            Assert.AreEqual(3, cs.Count);
            cs.Remove(s1);
            Assert.AreEqual(2, s2.DisposedCount);
            Assert.AreEqual(2, cs.Count);
        }
示例#4
0
        public void StableCompositeSubscription_ShrinkingBehavior()
        {
            var cs = new StableCompositeSubscription();

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

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

                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);
            }
        }
示例#5
0
        public void StableCompositeSubscription_Dispose()
        {
            var cs = new StableCompositeSubscription();

            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.AddRange(new ISubscription[] { s1, s2, s3, s4 });

            Assert.AreEqual(2, s1.DisposedCount);
            Assert.AreEqual(2, s2.DisposedCount);
            Assert.AreEqual(2, s3.DisposedCount);
            Assert.AreEqual(2, 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(2, s1.DisposedCount);
            Assert.AreEqual(2, s2.DisposedCount);
            Assert.AreEqual(2, s3.DisposedCount);
            Assert.AreEqual(2, s4.DisposedCount);
            Assert.AreEqual(0, cs.Count);

            Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(cs));
            Assert.IsTrue(Enumerable.Empty <ISubscription>().SequenceEqual(((IEnumerable)cs).CastNotSmart <ISubscription>()));
        }