예제 #1
0
        public void Generate_LongRunning_Throw()
        {
            var start = default(ManualResetEvent);
            var end   = default(ManualResetEvent);
            var s     = new TestLongRunningScheduler(x => start = x, x => end = x);

            var ex = new Exception();
            var xs = Observable.Generate(0, x => { if (x < 100)
                                                   {
                                                       return(true);
                                                   }
                                                   throw ex; }, x => x + 1, x => x, s);

            var lst  = new List <int>();
            var e    = default(Exception);
            var done = false;

            xs.Subscribe(x => { lst.Add(x); }, e_ => e = e_, () => done = true);

            end.WaitOne();

            Assert.True(lst.SequenceEqual(Enumerable.Range(0, 100)));
            Assert.AreSame(ex, e);
            Assert.False(done);
        }
예제 #2
0
        public void ObserveOn_LongRunning_Cancel()
        {
            var started = default(ManualResetEvent);
            var stopped = default(ManualResetEvent);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e);

            var s = new Subject <int>();

            var lst = new List <int>();
            var end = new ManualResetEvent(false);

            var running = new ManualResetEvent(false);
            var d       = s.ObserveOn(scheduler).Subscribe(x => { lst.Add(x); running.Set(); });

            s.OnNext(0);
            started.WaitOne();

            s.OnNext(1);
            s.OnNext(2);
            s.OnNext(3);
            running.WaitOne();

            d.Dispose();
            stopped.WaitOne();

            s.OnNext(4);

            Assert.True(lst.Count > 0 && !lst.Contains(4));
        }
예제 #3
0
        public void ObserveOn_LongRunning_OnNextThrows()
        {
            var started   = default(ManualResetEvent);
            var stopped   = default(ManualResetEvent);
            var exception = default(Exception);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e, ex => exception = ex);

            var s = new Subject <int>();

            var lst = new List <int>();
            var end = new ManualResetEvent(false);

            var running = new ManualResetEvent(false);
            var d       = s.ObserveOn(scheduler).Subscribe(x => { lst.Add(x); running.Set(); if (x == 3)
                                                                  {
                                                                      throw new Exception();
                                                                  }
                                                           });

            s.OnNext(0);
            started.WaitOne();

            s.OnNext(1);
            s.OnNext(2);
            s.OnNext(3);
            running.WaitOne();

            s.OnNext(4);

            stopped.WaitOne();

            Assert.NotNull(exception);
        }
예제 #4
0
        public void ObserveOn_LongRunning_HoldUpDuringDispatchAndFail()
        {
            var started = default(ManualResetEvent);
            var stopped = default(ManualResetEvent);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e);

            var s = new Subject <int>();

            var onNext = new ManualResetEvent(false);
            var resume = new ManualResetEvent(false);
            var lst    = new List <int>();
            var err    = default(Exception);
            var end    = new ManualResetEvent(false);

            s.ObserveOn(scheduler).Subscribe(x => { lst.Add(x); onNext.Set(); resume.WaitOne(); }, ex_ => { err = ex_; end.Set(); });

            s.OnNext(1);
            onNext.WaitOne();

            s.OnNext(2);
            s.OnNext(3);

            var ex = new Exception();

            s.OnError(ex);

            resume.Set();

            end.WaitOne();
            Assert.True(lst.SequenceEqual(new[] { 1, 2, 3 }));
            Assert.Same(ex, err);
        }
예제 #5
0
        public void ObserveOn_LongRunning_TimeVariance()
        {
            var started = default(ManualResetEvent);
            var stopped = default(ManualResetEvent);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e);

            var s = new Subject <int>();

            var end = new ManualResetEvent(false);

            s.ObserveOn(scheduler).Subscribe(_ => { }, () => end.Set());

            s.OnNext(1);       // Ensure active
            started.WaitOne();
            Thread.Sleep(100); // Try to enter the dispatcher event wait state

            for (int i = 0; i < 1000; i++)
            {
                if (i % 100 == 0)
                {
                    Thread.Sleep(10);
                }

                s.OnNext(i);
            }

            s.OnCompleted();

            end.WaitOne();
        }
예제 #6
0
        public void ObserveOn_LongRunning_Error()
        {
            var started = default(ManualResetEvent);
            var stopped = default(ManualResetEvent);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e);

            var s = new Subject <int>();

            var end = new ManualResetEvent(false);
            var err = default(Exception);

            s.ObserveOn(scheduler).Subscribe(_ => { }, ex => { err = ex; end.Set(); });

            s.OnNext(1);
            s.OnNext(2);
            s.OnNext(3);

            var ex_ = new Exception();

            s.OnError(ex_);

            end.WaitOne();

            Assert.Same(ex_, err);
        }
예제 #7
0
        public void EnumerableToObservable_LongRunning_Dispose()
        {
            var start     = default(ManualResetEvent);
            var end       = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var e = Enumerable.Range(0, int.MaxValue);

            var results = e.ToObservable(scheduler);

            var lst = new List <int>();
            var d   = results.Subscribe(lst.Add);

            start.WaitOne();

            while (lst.Count < 100)
            {
                ;
            }

            d.Dispose();
            end.WaitOne();

            Assert.True(e.Take(100).SequenceEqual(lst.Take(100)));
        }
예제 #8
0
        public void Range_LongRunning_Boundaries()
        {
            var start     = default(ManualResetEvent);
            var end       = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Range(int.MaxValue, 1, scheduler);

            var lst = new List <int>();

            xs.ForEach(lst.Add);

            Assert.True(lst.SequenceEqual(Enumerable.Range(int.MaxValue, 1)));
        }
예제 #9
0
        public void Range_LongRunning1()
        {
            var start = default(ManualResetEvent);
            var end   = default(ManualResetEvent);
            var s     = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Range(0, 100, s);

            var lst  = new List <int>();
            var done = false;

            xs.Subscribe(x => { lst.Add(x); }, () => done = true);

            end.WaitOne();

            Assert.True(lst.SequenceEqual(Enumerable.Range(0, 100)));
            Assert.True(done);
        }
예제 #10
0
        public void EnumerableToObservable_LongRunning_Complete()
        {
            var start     = default(ManualResetEvent);
            var end       = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var e = new[] { 3, 1, 2, 4 };

            var results = e.ToObservable(scheduler);

            var lst = new List <int>();

            results.Subscribe(lst.Add);

            start.WaitOne();
            end.WaitOne();

            Assert.True(e.SequenceEqual(lst));
        }
예제 #11
0
        public void EnumerableToObservable_LongRunning_Error()
        {
            var start     = default(ManualResetEvent);
            var end       = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var ex = new Exception();
            var e  = EnumerableToObservable_Error_Core(ex);

            var results = e.ToObservable(scheduler);

            var lst = new List <int>();
            var err = default(Exception);

            results.Subscribe(lst.Add, ex_ => err = ex_);

            start.WaitOne();
            end.WaitOne();

            Assert.True(new[] { 1, 2 }.SequenceEqual(lst));
            Assert.Same(ex, err);
        }
예제 #12
0
        public void ObserveOn_LongRunning_Simple()
        {
            var started = default(ManualResetEvent);
            var stopped = default(ManualResetEvent);

            var scheduler = new TestLongRunningScheduler(e => started = e, e => stopped = e);

            var s = new Subject <int>();

            var end = new ManualResetEvent(false);
            var lst = new List <int>();

            s.ObserveOn(scheduler).Subscribe(lst.Add, () => end.Set());

            s.OnNext(1);
            s.OnNext(2);
            s.OnNext(3);
            s.OnCompleted();

            end.WaitOne();

            Assert.True(lst.SequenceEqual(new[] { 1, 2, 3 }));
        }
예제 #13
0
        public void Generate_LongRunning2()
        {
            var start = default(ManualResetEvent);
            var end   = default(ManualResetEvent);
            var s     = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Generate(0, _ => true, x => x + 1, x => x, s);

            var lst = new List <int>();
            var d   = xs.Subscribe(x => { lst.Add(x); });

            start.WaitOne();

            while (lst.Count < 100)
            {
                ;
            }

            d.Dispose();
            end.WaitOne();

            Assert.True(lst.Take(100).SequenceEqual(Enumerable.Range(0, 100)));
        }
예제 #14
0
        public void Range_LongRunning2()
        {
            var start = default(ManualResetEvent);
            var end   = default(ManualResetEvent);
            var s     = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Range(0, int.MaxValue, s);

            var lst = new List <int>();
            var d   = xs.Subscribe(x => { lst.Add(x); });

            start.WaitOne();

            while (lst.Count < 100)
            {
                ;
            }

            d.Dispose();
            end.WaitOne();

            Assert.True(true);
        }
        public void Repeat_Inf_LongRunning()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var s = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Repeat(42, s);

            var lst = new List<int>();
            var d = xs.Subscribe(x => { lst.Add(x); });

            start.WaitOne();

            while (lst.Count < 100)
                ;

            d.Dispose();
            end.WaitOne();

            Assert.IsTrue(true);
        }
        public void Repeat_Count_LongRunning1()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var s = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Repeat(42, 100, s);

            var lst = new List<int>();
            var done = false;
            xs.Subscribe(x => { lst.Add(x); }, () => done = true);

            end.WaitOne();

            Assert.IsTrue(lst.SequenceEqual(Enumerable.Repeat(42, 100)));
            Assert.IsTrue(done);
        }
        public void Range_LongRunning_Boundaries()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Range(int.MaxValue, 1, scheduler);

            var lst = new List<int>();
            xs.ForEach(lst.Add);

            Assert.IsTrue(lst.SequenceEqual(Enumerable.Range(int.MaxValue, 1)));
        }
        public void Generate_LongRunning_Throw()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var s = new TestLongRunningScheduler(x => start = x, x => end = x);

            var ex = new Exception();
            var xs = Observable.Generate(0, x => { if (x < 100) return true; throw ex; }, x => x + 1, x => x, s);

            var lst = new List<int>();
            var e = default(Exception);
            var done = false;
            xs.Subscribe(x => { lst.Add(x); }, e_ => e = e_, () => done = true);

            end.WaitOne();

            Assert.IsTrue(lst.SequenceEqual(Enumerable.Range(0, 100)));
            Assert.AreSame(ex, e);
            Assert.IsFalse(done);
        }
        public void Generate_LongRunning2()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var s = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Generate(0, _ => true, x => x + 1, x => x, s);

            var lst = new List<int>();
            var d = xs.Subscribe(x => { lst.Add(x); });

            start.WaitOne();

            while (lst.Count < 100)
                ;

            d.Dispose();
            end.WaitOne();

            Assert.IsTrue(lst.Take(100).SequenceEqual(Enumerable.Range(0, 100)));
        }
        public void Range_LongRunning_Regular()
        {
            var start = default(ManualResetEvent);
            var end = default(ManualResetEvent);
            var scheduler = new TestLongRunningScheduler(x => start = x, x => end = x);

            var xs = Observable.Range(5, 17, scheduler);

            var lst = new List<int>();
            xs.ForEach(lst.Add);

            Assert.True(lst.SequenceEqual(Enumerable.Range(5, 17)));
        }