public void UseObserverTest1() { var subject = new Subject<string>(); var result = new List<Tuple<int, string>>(); subject .Select(x => new Tuple<int, string>(0, x)) .UseObserver((observer, value, i) => { observer.OnNext(new Tuple<int, string>(i, value.Item2)); }, null, observer => { observer.OnNext(new Tuple<int, string>(-1, "end")); }) .Subscribe(result.Add); subject.OnNext("a"); subject.OnNext("b"); subject.OnNext("c"); subject.OnCompleted(); result.Is( new Tuple<int, string>(0, "a"), new Tuple<int, string>(1, "b"), new Tuple<int, string>(2, "c"), new Tuple<int, string>(-1, "end")); }
public void NoDistinctUntilChanged() { var rp = new ReactiveProperty<string>(mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe); var list = new List<string>(); rp.Subscribe(list.Add); rp.Value = "Hello world"; rp.Value = "Hello world"; rp.Value = "Hello japan"; list.Is(null, "Hello world", "Hello world", "Hello japan"); }
public async Task ForEachAsyncTest2() { var result = new List<int>(); await new[] { 3, 1, 2, 0 }.ForEachAsync(async (i, index) => { result.Add(index); result.Add(await PseudoSlowWork(i)); }); result.Is(0, 3, 1, 1, 2, 2, 3, 0); }
public async Task Async() { var mb = new AsyncMessageBroker(); var l = new List<string>(); var d1 = mb.Subscribe<int>(async x => l.Add("a:" + x)); var d2 = mb.Subscribe<int>(async x => l.Add("b:" + x)); await mb.PublishAsync(100); l.Is("a:100", "b:100"); l.Clear(); d2.Dispose(); await mb.PublishAsync(200); l.Is("a:200"); l.Clear(); d1.Dispose(); await mb.PublishAsync(300); l.Count.Is(0); }
public void OfType() { var subject = new Subject<object>(); var list = new List<int>(); subject.OfType(default(int)).Subscribe(x => list.Add(x)); subject.OnNext(1); subject.OnNext(2); subject.OnNext("hogehoge"); subject.OnNext(3); list.Is(1, 2, 3); }
public void MultiSubscribeTest() { var s = new Subject<string>(); var rp = s.ToReadOnlyReactiveProperty(); var buffer1 = new List<string>(); rp.Subscribe(buffer1.Add); buffer1.Count.Is(1); s.OnNext("Hello world"); buffer1.Count.Is(2); buffer1.Is(default(string), "Hello world"); var buffer2 = new List<string>(); rp.Subscribe(buffer2.Add); buffer1.Is(default(string), "Hello world"); buffer2.Is("Hello world"); s.OnNext("ReactiveProperty"); buffer1.Is(default(string), "Hello world", "ReactiveProperty"); buffer2.Is("Hello world", "ReactiveProperty"); }
public void Sync() { var mb = new MessageBroker(); var l = new List<string>(); var d1 = mb.Subscribe<int>(x => l.Add("a:" + x)); var d2 = mb.Subscribe<int>(x => l.Add("b:" + x)); var d3 = mb.ToObservable<int>().Subscribe(x => l.Add("c:" + x)); mb.Publish(100); l.Is("a:100", "b:100", "c:100"); l.Clear(); d2.Dispose(); mb.Publish(200); l.Is("a:200", "c:200"); l.Clear(); d3.Dispose(); mb.Publish(300); l.Is("a:300"); l.Clear(); d1.Dispose(); mb.Publish(400); l.Count.Is(0); }
public void NormalPattern() { var s = new Subject<string>(); var rp = s.ToReadOnlyReactiveProperty(eventScheduler: Scheduler.CurrentThread); var buffer = new List<string>(); rp.Subscribe(buffer.Add); rp.Value.IsNull(); buffer.Count.Is(1); buffer[0].IsNull(); s.OnNext("Hello"); rp.Value.Is("Hello"); buffer.Count.Is(2); buffer.Is(default(string), "Hello"); s.OnNext("Hello"); rp.Value.Is("Hello"); buffer.Count.Is(2); // distinct until changed. }
public void CurrentThread2() { var scheduler = Scheduler.CurrentThread; var list = new List<string>(); scheduler.Schedule(() => { list.Add("one"); scheduler.Schedule(TimeSpan.FromSeconds(3), () => { list.Add("after 3"); }); scheduler.Schedule(TimeSpan.FromSeconds(1), () => { list.Add("after 1"); }); }); list.Is("one", "after 1", "after 3"); }
public void NormalPatternNoDistinctUntilChanged() { var s = new Subject<string>(); var rp = s.ToReadOnlyReactiveProperty( mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe, eventScheduler: Scheduler.CurrentThread); var buffer = new List<string>(); rp.Subscribe(buffer.Add); rp.Value.IsNull(); buffer.Count.Is(1); buffer[0].IsNull(); s.OnNext("Hello"); rp.Value.Is("Hello"); buffer.Count.Is(2); buffer.Is(default(string), "Hello"); s.OnNext("Hello"); rp.Value.Is("Hello"); buffer.Count.Is(3); // not distinct until changed. }
public void UseObserverTest2() { var subject = new Subject<string>(); var result = new List<string>(); subject .UseObserver((observer, value, i) => { observer.OnNext(value); }, (error, observer) => { observer.OnNext(error.Message); }, observer => { observer.OnNext("end"); }) .Subscribe(result.Add); subject.OnNext("a"); subject.OnError(new Exception("error!")); subject.OnCompleted(); result.Is("a", "error!"); }
public void ToObservable() { { var msgs = new List<string>(); new[] { 1, 10, 100, 1000, 10000, 20000 }.ToObservable(Scheduler.CurrentThread) .Do(i => msgs.Add("DO:" + i)) .Scan((x, y) => { if (y == 100) throw new Exception("exception"); msgs.Add("x:" + x + " y:" + y); return x + y; }) .Subscribe(x => msgs.Add(x.ToString()), e => msgs.Add(e.Message), () => msgs.Add("comp")); msgs.Is("DO:1", "1", "DO:10", "x:1 y:10", "11", "DO:100", "exception"); } { var msgs = new List<string>(); new[] { 1, 10, 100, 1000, 10000, 20000 }.ToObservable(Scheduler.Immediate) .Do(i => msgs.Add("DO:" + i)) .Scan((x, y) => { if (y == 100) throw new Exception("exception"); msgs.Add("x:" + x + " y:" + y); return x + y; }) .Subscribe(x => msgs.Add(x.ToString()), e => msgs.Add(e.Message), () => msgs.Add("comp")); msgs.Is("DO:1", "1", "DO:10", "x:1 y:10", "11", "DO:100", "exception", "DO:1000", "x:11 y:1000", "DO:10000", "x:1011 y:10000", "DO:20000", "x:11011 y:20000" ); } }
public void Select() { { var a = new Subject<int>(); var list = new List<int>(); a.Select(x => x * x).Subscribe(x => list.Add(x)); a.OnNext(100); a.OnNext(200); a.OnNext(300); a.OnCompleted(); list.Count.Is(3); list.Is(10000, 40000, 90000); } { var a = new Subject<int>(); var list = new List<int>(); a.Select((x, i) => x * i).Subscribe(x => list.Add(x)); a.OnNext(100); a.OnNext(200); a.OnNext(300); a.OnCompleted(); list.Count.Is(3); list.Is(0, 200, 600); } { var a = new Subject<int>(); var list = new List<int>(); a.Select(x => x * x).Select(x => x * x).Subscribe(x => list.Add(x)); a.OnNext(2); a.OnNext(4); a.OnNext(8); a.OnCompleted(); list.Count.Is(3); list.Is(16, 256, 4096); } { var a = new Subject<int>(); var list = new List<int>(); a.Select((x, i) => x * i).Select(x => x * 10).Subscribe(x => list.Add(x)); a.OnNext(100); a.OnNext(200); a.OnNext(300); a.OnCompleted(); list.Count.Is(3); list.Is(0, 2000, 6000); } }
public void ForceNotify() { var rp = new ReactiveProperty<int>(0); var collecter = new List<int>(); rp.Subscribe(collecter.Add); collecter.Is(0); rp.ForceNotify(); collecter.Is(0, 0); }
public void Selector() { { // OnCompleted Case var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? b : c) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnCompleted(); b.OnCompleted(); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext(200)", "OnNext(300)", "OnNext(400)", "OnCompleted()"); } { // OnError A var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? b : c) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnError(new Exception()); b.OnCompleted(); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext(200)", "OnNext(300)", "OnError(System.Exception)"); } { // OnError B var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? b : c) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnCompleted(); b.OnError(new Exception()); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext(200)", "OnNext(300)", "OnError(System.Exception)"); } { // OnCompleted Case2 var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? b : c) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); b.OnCompleted(); c.OnCompleted(); // check list.Is("OnNext(200)", "OnNext(300)"); a.OnCompleted(); list.Is("OnNext(200)", "OnNext(300)", "OnCompleted()"); } }
public void ReplaySubjectWindowReplayRxOfficial() { var subject = new ReplaySubject<int>(window: TimeSpan.FromMilliseconds(700)); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; var _ = subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); // 0 Thread.Sleep(TimeSpan.FromMilliseconds(300)); subject.OnNext(10); // 300 Thread.Sleep(TimeSpan.FromMilliseconds(300)); subject.OnNext(100); // 600 Thread.Sleep(TimeSpan.FromMilliseconds(300)); _.Dispose(); onNext.Clear(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(10, 100); subject.OnNext(1000); // 900 Thread.Sleep(TimeSpan.FromMilliseconds(300)); _.Dispose(); onNext.Clear(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(100, 1000); subject.OnNext(10000); // 1200 Thread.Sleep(TimeSpan.FromMilliseconds(500)); subject.OnNext(2); // 1500 Thread.Sleep(TimeSpan.FromMilliseconds(10)); subject.OnNext(20); // 1800 Thread.Sleep(TimeSpan.FromMilliseconds(10)); _.Dispose(); onNext.Clear(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(10000, 2, 20); }
public void EnumCase() { var rp = new ReactiveProperty<TestEnum>(); var results = new List<TestEnum>(); rp.Subscribe(results.Add); results.Is(TestEnum.None); rp.Value = TestEnum.Enum1; results.Is(TestEnum.None, TestEnum.Enum1); rp.Value = TestEnum.Enum2; results.Is(TestEnum.None, TestEnum.Enum1, TestEnum.Enum2); }
public void AsyncSubjectOfficialRx() { // OnCompletedPattern { var subject = new AsyncSubject<int>(); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); subject.OnNext(1000); onNext.Count.Is(0); subject.IsCompleted.IsFalse(); subject.OnCompleted(); onNext.Is(1000); onCompletedCallCount.Is(1); subject.IsCompleted.IsTrue(); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); onNext.Count.Is(1); subject.OnCompleted(); subject.OnError(new Exception()); exception.Count.Is(0); onCompletedCallCount.Is(1); // ++subscription subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(1000, 1000); exception.Count.Is(0); onCompletedCallCount.Is(2); } // OnErrorPattern { var subject = new AsyncSubject<int>(); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); subject.OnNext(1000); onNext.Count.Is(0); subject.IsCompleted.IsFalse(); subject.OnError(new Exception()); subject.IsCompleted.IsTrue(); exception.Count.Is(1); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); onNext.Count.Is(0); subject.OnCompleted(); subject.OnError(new Exception()); exception.Count.Is(1); onCompletedCallCount.Is(0); // ++subscription subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Count.Is(0); exception.Count.Is(2); onCompletedCallCount.Is(0); } }
public void Enq() { var q = new ThreadSafeQueueWorker(); var l = new List<int>(); q.Enqueue(() => l.Add(1)); q.Enqueue(() => q.Enqueue(() => l.Add(-1))); q.Enqueue(() => l.Add(2)); q.Enqueue(() => q.Enqueue(() => l.Add(-2))); q.Enqueue(() => l.Add(3)); q.Enqueue(() => q.Enqueue(() => l.Add(-3))); q.Enqueue(() => l.Add(4)); q.Enqueue(() => q.Enqueue(() => l.Add(-4))); q.Enqueue(() => l.Add(5)); q.Enqueue(() => q.Enqueue(() => l.Add(-5))); q.Enqueue(() => l.Add(6)); q.Enqueue(() => q.Enqueue(() => l.Add(-6))); q.Enqueue(() => l.Add(7)); q.Enqueue(() => q.Enqueue(() => l.Add(-7))); q.Enqueue(() => l.Add(8)); q.Enqueue(() => q.Enqueue(() => l.Add(-8))); q.Enqueue(() => l.Add(9)); q.Enqueue(() => q.Enqueue(() => l.Add(-9))); q.Enqueue(() => l.Add(10)); q.Enqueue(() => q.Enqueue(() => l.Add(-10))); q.Enqueue(() => l.Add(11)); q.Enqueue(() => q.Enqueue(() => l.Add(-11))); q.Enqueue(() => l.Add(12)); q.ExecuteAll(ex => { }); l.Is(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); l.Clear(); q.ExecuteAll(ex => { }); l.Is(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11); l.Clear(); q.ExecuteAll(ex => { }); l.Count.Is(0); q.Enqueue(() => l.Add(1)); q.Enqueue(() => q.Enqueue(() => l.Add(-1))); q.Enqueue(() => l.Add(2)); q.Enqueue(() => q.Enqueue(() => l.Add(-2))); q.Enqueue(() => l.Add(3)); q.Enqueue(() => q.Enqueue(() => l.Add(-3))); q.Enqueue(() => l.Add(4)); q.Enqueue(() => q.Enqueue(() => l.Add(-4))); q.Enqueue(() => l.Add(5)); q.Enqueue(() => q.Enqueue(() => l.Add(-5))); q.Enqueue(() => l.Add(6)); q.Enqueue(() => q.Enqueue(() => l.Add(-6))); q.Enqueue(() => l.Add(7)); q.Enqueue(() => q.Enqueue(() => l.Add(-7))); q.Enqueue(() => l.Add(8)); q.Enqueue(() => q.Enqueue(() => l.Add(-8))); q.Enqueue(() => l.Add(9)); q.Enqueue(() => q.Enqueue(() => l.Add(-9))); q.Enqueue(() => l.Add(10)); q.Enqueue(() => q.Enqueue(() => l.Add(-10))); q.Enqueue(() => l.Add(11)); q.Enqueue(() => q.Enqueue(() => l.Add(-11))); q.Enqueue(() => l.Add(12)); q.ExecuteAll(ex => { }); l.Is(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); l.Clear(); q.ExecuteAll(ex => { }); l.Is(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11); l.Clear(); q.ExecuteAll(ex => { }); l.Count.Is(0); }
public void Merge() { var s1 = new Subject<int>(); var s2 = new Subject<int>(); var s3 = new Subject<int>(); var list = new List<int>(); var complete = false; Observable.Merge(s1, s2, s3).Subscribe(list.Add, () => complete = true); s1.OnNext(10); s1.OnNext(20); s3.OnNext(100); s2.OnNext(50); list.Is(10, 20, 100, 50); list.Clear(); s2.OnCompleted(); s3.OnNext(500); complete.IsFalse(); s1.OnCompleted(); s3.OnCompleted(); complete.IsTrue(); }
public void MergeConcurrent() { var s1 = new Subject<int>(); var s2 = new Subject<int>(); var s3 = new Subject<int>(); var list = new List<int>(); var complete = false; Observable.Merge(new[] { s1, s2, s3 }, maxConcurrent: 2).Subscribe(list.Add, () => complete = true); s1.OnNext(10); s1.OnNext(20); s3.OnNext(100); // in queue s2.OnNext(50); list.Is(10, 20, 50); list.Clear(); s2.OnCompleted(); s3.OnNext(500); // dequeued list.Is(500); complete.IsFalse(); s1.OnCompleted(); s3.OnCompleted(); complete.IsTrue(); }
public void ReplaySubjectBufferReplay() { var subject = new ReplaySubject<int>(bufferSize: 3); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; var _ = subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); subject.OnNext(1000); subject.OnNext(10000); onNext.Is(100, 1000, 10000); // cut 1, 10 // replay subscription onNext.Clear(); _.Dispose(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(100, 1000, 10000); subject.OnNext(20000); onNext.Is(1000, 10000, 20000); subject.OnCompleted(); onCompletedCallCount.Is(1); }
public void SelectorEnumerableWithIndex() { { // OnCompleted Case var a = new Subject<int>(); var list = new List<string>(); a.SelectMany((x, i) => (x == 10) ? Enumerable.Range(i, 3) : Enumerable.Repeat(i, 3)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnCompleted(); // check list.Is("OnNext(0)", "OnNext(1)", "OnNext(2)", "OnNext(1)", "OnNext(1)", "OnNext(1)", "OnCompleted()"); } { // OnError Case var a = new Subject<int>(); var list = new List<string>(); a.SelectMany((x, i) => (x == 10) ? Enumerable.Range(i, 3) : Enumerable.Repeat(i, 3)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnError(new Exception()); // check list.Is("OnNext(0)", "OnNext(1)", "OnNext(2)", "OnNext(1)", "OnNext(1)", "OnNext(1)", "OnError(System.Exception)"); } }
public void SelectorWithIndex() { { // OnCompleted Case var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany((x, i) => (x == 10) ? b.Select(y => Tuple.Create(y, i)) : c.Select(y => Tuple.Create(y, i))) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnCompleted(); b.OnCompleted(); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext((200, 0))", "OnNext((300, 1))", "OnNext((400, 1))", "OnCompleted()"); } { // OnError A var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany((x, i) => (x == 10) ? b.Select(y => Tuple.Create(y, i)) : c.Select(y => Tuple.Create(y, i))) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnError(new Exception()); b.OnCompleted(); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext((200, 0))", "OnNext((300, 1))", "OnError(System.Exception)"); } { // OnError B var a = new Subject<int>(); var b = new Subject<int>(); var c = new Subject<int>(); var list = new List<string>(); a.SelectMany((x, i) => (x == 10) ? b.Select(y => Tuple.Create(y, i)) : c.Select(y => Tuple.Create(y, i))) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do b.OnNext(200); c.OnNext(300); a.OnCompleted(); b.OnError(new Exception()); c.OnNext(400); c.OnCompleted(); // check list.Is("OnNext((200, 0))", "OnNext((300, 1))", "OnError(System.Exception)"); } }
public async Task ForEachAsyncTest1() { var result = new List<int>(); await new[] { 3, 1, 2, 0 }.ForEachAsync(async i => result.Add(await PseudoSlowWork(i))); result.Is(3, 1, 2, 0); }
public void ReplaySubjectRxOfficial() { // OnCompletedPattern { var subject = new ReplaySubject<int>(); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; var _ = subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); subject.OnNext(1000); onNext.Is(1, 10, 100, 1000); // replay subscription onNext.Clear(); _.Dispose(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(1, 10, 100, 1000); subject.OnCompleted(); onCompletedCallCount.Is(1); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); onNext.Count.Is(4); subject.OnCompleted(); subject.OnError(new Exception()); exception.Count.Is(0); onCompletedCallCount.Is(1); // ++subscription onNext.Clear(); onCompletedCallCount = 0; subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(1, 10, 100, 1000); exception.Count.Is(0); onCompletedCallCount.Is(1); } // OnErrorPattern { var subject = new ReplaySubject<int>(); var onNext = new List<int>(); var exception = new List<Exception>(); int onCompletedCallCount = 0; subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); subject.OnNext(1000); onNext.Is(1, 10, 100, 1000); subject.OnError(new Exception()); exception.Count.Is(1); subject.OnNext(1); subject.OnNext(10); subject.OnNext(100); onNext.Count.Is(4); subject.OnCompleted(); subject.OnError(new Exception()); exception.Count.Is(1); onCompletedCallCount.Is(0); // ++subscription onNext.Clear(); exception.Clear(); onCompletedCallCount = 0; subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.Is(1, 10, 100, 1000); exception.Count.Is(1); onCompletedCallCount.Is(0); } }
public void Where() { { var a = new Subject<int>(); var list = new List<int>(); a.Where(x => x % 3 == 0).Subscribe(x => list.Add(x)); a.OnNext(3); a.OnNext(5); a.OnNext(7); a.OnNext(9); a.OnNext(300); a.OnCompleted(); list.Is(3, 9, 300); } { var a = new Subject<int>(); var list = new List<int>(); a.Where((x, i) => (x + i) % 3 == 0).Subscribe(x => list.Add(x)); a.OnNext(3); // 3 + 0 a.OnNext(5); // 5 + 1 a.OnNext(7); // 7 + 2 a.OnNext(9); // 9 + 3 a.OnNext(300); // 300 + 4 a.OnCompleted(); list.Is(3, 5, 7, 9); } { var a = new Subject<int>(); var list = new List<int>(); a.Where(x => x % 3 == 0).Where(x => x % 5 == 0).Subscribe(x => list.Add(x)); a.OnNext(3); a.OnNext(5); a.OnNext(7); a.OnNext(9); a.OnNext(300); a.OnCompleted(); list.Is(300); } { var a = new Subject<int>(); var list = new List<int>(); a.Where((x, i) => (x + i) % 3 == 0).Where(x => x % 5 == 0).Subscribe(x => list.Add(x)); a.OnNext(3); // 3 + 0 a.OnNext(5); // 5 + 1 a.OnNext(7); // 7 + 2 a.OnNext(9); // 9 + 3 a.OnNext(300); // 300 + 4 a.OnCompleted(); list.Is(5); } }
public void ResultSelectorEnumerable() { { // OnCompleted Case var a = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? Enumerable.Range(1, 3) : Enumerable.Repeat(10, 3), (x, y) => Tuple.Create(x, y)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnCompleted(); // check list.Is("OnNext((10, 1))", "OnNext((10, 2))", "OnNext((10, 3))", "OnNext((100, 10))", "OnNext((100, 10))", "OnNext((100, 10))", "OnCompleted()"); } { // OnError Case var a = new Subject<int>(); var list = new List<string>(); a.SelectMany(x => (x == 10) ? Enumerable.Range(1, 3) : Enumerable.Repeat(10, 3), (x, y) => Tuple.Create(x, y)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnError(new Exception()); // check list.Is("OnNext((10, 1))", "OnNext((10, 2))", "OnNext((10, 3))", "OnNext((100, 10))", "OnNext((100, 10))", "OnNext((100, 10))", "OnError(System.Exception)"); } }