public void FromEventPattern() { var tester = new EventTester(); { var list = new List<int>(); var d = Observable.FromEventPattern<EventHandler<MyEventArgs>, MyEventArgs>((h) => h.Invoke, h => tester.genericEventHandler += h, h => tester.genericEventHandler -= h) .Subscribe(xx => { list.Add(xx.EventArgs.MyProperty); Observable.Return(xx.EventArgs.MyProperty) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(x)); }); try { tester.Fire(5); } catch { } try { tester.Fire(1); } catch { } try { tester.Fire(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); tester.Fire(1000); list.Count.Is(5); } }
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.IsCollection(1, 2, 3); }
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.IsCollection("one", "after 1", "after 3"); }
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.IsCollection("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.IsCollection("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 ForEachAsync() { { var list = new List<int>(); var xs = Observable.Range(1, 10).ForEachAsync(x => list.Add(x)).ToArray().Wait(); list.IsCollection(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); xs.Length.Is(1); xs[0].Is(Unit.Default); } { var list = new List<int>(); var listI = new List<int>(); var xs = Observable.Range(1, 10).ForEachAsync((x, i) => { list.Add(x); listI.Add(i); }).ToArray().Wait(); list.IsCollection(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); listI.IsCollection(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); xs.Length.Is(1); xs[0].Is(Unit.Default); } }
public void ResultSelectorEnumerableWithIndex() { SetScehdulerForImport(); { // 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), (x, i1, y, i2) => Tuple.Create(x, i1, y, i2)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnCompleted(); // check list.IsCollection("OnNext((10, 0, 0, 0))", "OnNext((10, 0, 1, 1))", "OnNext((10, 0, 2, 2))", "OnNext((100, 1, 1, 0))", "OnNext((100, 1, 1, 1))", "OnNext((100, 1, 1, 2))", "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), (x, i1, y, i2) => Tuple.Create(x, i1, y, i2)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnError(new Exception()); // check list.IsCollection("OnNext((10, 0, 0, 0))", "OnNext((10, 0, 1, 1))", "OnNext((10, 0, 2, 2))", "OnNext((100, 1, 1, 0))", "OnNext((100, 1, 1, 1))", "OnNext((100, 1, 1, 2))", "OnError(System.Exception)"); } UniRx.Scheduler.SetDefaultForUnity(); }
public void DoOnTerminate() { var list = new List<int>(); Observable.Empty<int>().DoOnTerminate(() => list.Add(1000)).DefaultIfEmpty().Wait(); list.IsCollection(1000); list.Clear(); Observable.Range(1, 5).DoOnTerminate(() => list.Add(1000)).Wait(); list.IsCollection(1000); list.Clear(); Observable.Range(1, 5).Concat(Observable.Throw<int>(new Exception())).DoOnTerminate(() => list.Add(1000)).Subscribe(_ => { }, _ => { }, () => { }); list.IsCollection(1000); }
public void Subject() { // OnCompletedPattern { var subject = new Subject<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.IsCollection(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.Count.Is(0); exception.Count.Is(0); onCompletedCallCount.Is(1); } // OnErrorPattern { var subject = new Subject<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.IsCollection(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.Count.Is(0); exception.Count.Is(1); onCompletedCallCount.Is(0); } }
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.IsCollection("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.IsCollection("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.IsCollection("OnNext((200, 0))", "OnNext((300, 1))", "OnError(System.Exception)"); } }
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.IsCollection("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.IsCollection("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.IsCollection("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.IsCollection("OnNext(200)", "OnNext(300)"); a.OnCompleted(); list.IsCollection("OnNext(200)", "OnNext(300)", "OnCompleted()"); } }
public void Enq() { var q = new UniRx.InternalUtil.ThreadSafeQueueWorker(); var l = new List<int>(); q.Enqueue(x => l.Add((int)x), 1); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -1); q.Enqueue(x => l.Add((int)x), 2); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -2); q.Enqueue(x => l.Add((int)x), 3); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -3); q.Enqueue(x => l.Add((int)x), 4); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -4); q.Enqueue(x => l.Add((int)x), 5); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -5); q.Enqueue(x => l.Add((int)x), 6); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -6); q.Enqueue(x => l.Add((int)x), 7); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -7); q.Enqueue(x => l.Add((int)x), 8); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -8); q.Enqueue(x => l.Add((int)x), 9); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -9); q.Enqueue(x => l.Add((int)x), 10); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -10); q.Enqueue(x => l.Add((int)x), 11); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -11); q.Enqueue(x => l.Add((int)x), 12); q.ExecuteAll(ex => { }); l.IsCollection(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); l.Clear(); q.ExecuteAll(ex => { }); l.IsCollection(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11); l.Clear(); q.ExecuteAll(ex => { }); l.Count.Is(0); q.Enqueue(x => l.Add((int)x), 1); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -1); q.Enqueue(x => l.Add((int)x), 2); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -2); q.Enqueue(x => l.Add((int)x), 3); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -3); q.Enqueue(x => l.Add((int)x), 4); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -4); q.Enqueue(x => l.Add((int)x), 5); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -5); q.Enqueue(x => l.Add((int)x), 6); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -6); q.Enqueue(x => l.Add((int)x), 7); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -7); q.Enqueue(x => l.Add((int)x), 8); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -8); q.Enqueue(x => l.Add((int)x), 9); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -9); q.Enqueue(x => l.Add((int)x), 10); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -10); q.Enqueue(x => l.Add((int)x), 11); q.Enqueue(x => q.Enqueue(_ => l.Add((int)x), null), -11); q.Enqueue(x => l.Add((int)x), 12); q.ExecuteAll(ex => { }); l.IsCollection(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); l.Clear(); q.ExecuteAll(ex => { }); l.IsCollection(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11); l.Clear(); q.ExecuteAll(ex => { }); l.Count.Is(0); }
public void FromEventUnity() { SetScehdulerForImport(); var tester = new EventTester(); { var list = new List<int>(); var d = Observable.FromEvent<int>(h => tester.intAction += h, h => tester.intAction -= h) .Subscribe(xx => { list.Add(xx); Observable.Return(xx) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(x)); }); try { tester.Fire(5); } catch { } try { tester.Fire(1); } catch { } try { tester.Fire(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); tester.Fire(1000); list.Count.Is(5); } { var i = 0; var list = new List<int>(); var d = Observable.FromEvent(h => tester.unitAction += h, h => tester.unitAction -= h) .Subscribe(xx => { list.Add(i); Observable.Return(i) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(i)); }); try { i = 5; tester.Fire(5); } catch { } try { i = 1; tester.Fire(1); } catch { } try { i = 10; tester.Fire(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); tester.Fire(1000); list.Count.Is(5); } UniRx.Scheduler.SetDefaultForUnity(); }
public void DoOnTerminate() { SetScehdulerForImport(); var list = new List<int>(); Observable.Empty<int>().DoOnTerminate(() => list.Add(1000)).DefaultIfEmpty().Wait(); list.IsCollection(1000); list.Clear(); Observable.Range(1, 5).DoOnTerminate(() => list.Add(1000)).Wait(); list.IsCollection(1000); list.Clear(); Observable.Range(1, 5).Concat(Observable.Throw<int>(new Exception())).DoOnTerminate(() => list.Add(1000)).Subscribe(_ => { }, _ => { }, () => { }); list.IsCollection(1000); UniRx.Scheduler.SetDefaultForUnity(); }
public void ReplaySubject() { SetScehdulerForImport(); // 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.IsCollection(1, 10, 100, 1000); // replay subscription onNext.Clear(); _.Dispose(); subject.Subscribe(x => onNext.Add(x), x => exception.Add(x), () => onCompletedCallCount++); onNext.IsCollection(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.IsCollection(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.IsCollection(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.IsCollection(1, 10, 100, 1000); exception.Count.Is(1); onCompletedCallCount.Is(0); } UniRx.Scheduler.SetDefaultForUnity(); }
public void AsyncSubjectTest() { SetScehdulerForImport(); // 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.OnCompleted(); onNext.IsCollection(1000); onCompletedCallCount.Is(1); 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.IsCollection(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.OnError(new Exception()); 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); } UniRx.Scheduler.SetDefaultForUnity(); }
public void SelectorEnumerable() { SetScehdulerForImport(); { // 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)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnCompleted(); // check list.IsCollection("OnNext(1)", "OnNext(2)", "OnNext(3)", "OnNext(10)", "OnNext(10)", "OnNext(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)) .Materialize().Select(x => x.ToString()).Subscribe(x => list.Add(x)); a.OnNext(10); a.OnNext(100); // do a.OnError(new Exception()); // check list.IsCollection("OnNext(1)", "OnNext(2)", "OnNext(3)", "OnNext(10)", "OnNext(10)", "OnNext(10)", "OnError(System.Exception)"); } UniRx.Scheduler.SetDefaultForUnity(); }
public void ResultSelectorWithIndex() { SetScehdulerForImport(); { // 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)), (x, i1, y, i2) => Tuple.Create(x, i1, y.Item1, y.Item2, i2)) .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.IsCollection("OnNext((10, 0, 200, 0, 0))", "OnNext((100, 1, 300, 1, 0))", "OnNext((100, 1, 400, 1, 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)), (x, i1, y, i2) => Tuple.Create(x, i1, y.Item1, y.Item2, i2)) .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.IsCollection("OnNext((10, 0, 200, 0, 0))", "OnNext((100, 1, 300, 1, 0))", "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)), (x, i1, y, i2) => Tuple.Create(x, i1, y.Item1, y.Item2, i2)) .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.IsCollection("OnNext((10, 0, 200, 0, 0))", "OnNext((100, 1, 300, 1, 0))", "OnError(System.Exception)"); } UniRx.Scheduler.SetDefaultForUnity(); }
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.IsCollection(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.IsCollection(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.IsCollection(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.IsCollection(0, 2000, 6000); } }
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.IsCollection(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.IsCollection(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.IsCollection(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.IsCollection(5); } }
public void Durability() { { var s1 = new Subject<int>(); var list = new List<int>(); var d = s1.Subscribe(xx => { list.Add(xx); Observable.Return(xx) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(x)); }); try { s1.OnNext(5); } catch { } try { s1.OnNext(1); } catch { } try { s1.OnNext(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); s1.OnNext(1000); list.Count.Is(5); } { var s1 = new Subject<int>(); var list = new List<int>(); var d = s1.Select(x => x).Take(1000).Subscribe(xx => { list.Add(xx); Observable.Return(xx) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(x)); }); try { s1.OnNext(5); } catch { } try { s1.OnNext(1); } catch { } try { s1.OnNext(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); s1.OnNext(1000); list.Count.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.IsCollection("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.IsCollection("OnNext((10, 1))", "OnNext((10, 2))", "OnNext((10, 3))", "OnNext((100, 10))", "OnNext((100, 10))", "OnNext((100, 10))", "OnError(System.Exception)"); } }
public void FromEventUnityLike() { var tester = new EventTester(); { var list = new List<int>(); var d = Observable.FromEvent<LikeUnityAction<int>, int>(h => new LikeUnityAction<int>(h), h => tester.intUnityAction += h, h => tester.intUnityAction -= h) .Subscribe(xx => { list.Add(xx); Observable.Return(xx) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(x)); }); try { tester.Fire(5); } catch { } try { tester.Fire(1); } catch { } try { tester.Fire(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); tester.Fire(1000); list.Count.Is(5); } { var i = 0; var list = new List<int>(); var d = Observable.FromEvent<LikeUnityAction>(h => new LikeUnityAction(h), h => tester.unityAction += h, h => tester.unityAction -= h) .Subscribe(xx => { list.Add(i); Observable.Return(i) .Do(x => { if (x == 1) throw new Exception(); }) .Subscribe(x => list.Add(i)); }); try { i = 5; tester.Fire(5); } catch { } try { i = 1; tester.Fire(1); } catch { } try { i = 10; tester.Fire(10); } catch { } list.IsCollection(5, 5, 1, 10, 10); d.Dispose(); tester.Fire(1000); list.Count.Is(5); } }
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.IsCollection("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.IsCollection("OnNext(0)", "OnNext(1)", "OnNext(2)", "OnNext(1)", "OnNext(1)", "OnNext(1)", "OnError(System.Exception)"); } }
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.IsCollection(10, 20, 100, 50); list.Clear(); s2.OnCompleted(); s3.OnNext(500); complete.IsFalse(); s1.OnCompleted(); s3.OnCompleted(); complete.IsTrue(); }
public void ReplaySubjectWindowReplay() { 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.IsCollection(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.IsCollection(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.IsCollection(10000, 2, 20); }
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.IsCollection(10, 20, 50); list.Clear(); s2.OnCompleted(); s3.OnNext(500); // dequeued list.IsCollection(500); complete.IsFalse(); s1.OnCompleted(); s3.OnCompleted(); complete.IsTrue(); }
public void DoOnCancel() { var list = new List<int>(); Observable.Empty<int>() .Do(x => list.Add(x), ex => list.Add(100), () => list.Add(1000)) .DoOnCancel(() => list.Add(5000)) .DoOnCancel(() => list.Add(10000)) .DefaultIfEmpty() .Subscribe(_ => { }, _ => { }, () => { }); list.IsCollection(1000); list.Clear(); Observable.Throw<int>(new Exception()) .Do(x => list.Add(x), ex => list.Add(100), () => list.Add(1000)) .DoOnCancel(() => list.Add(5000)) .DoOnCancel(() => list.Add(10000)) .DefaultIfEmpty() .Subscribe(_ => { }, _ => { }, () => { }); list.IsCollection(100); list.Clear(); var subscription = Observable.Timer(TimeSpan.FromMilliseconds(1000)).Select(x => (int)x) .Do(x => list.Add(x), ex => list.Add(100), () => list.Add(1000)) .DoOnCancel(() => list.Add(5000)) .DoOnCancel(() => list.Add(10000)) .Subscribe(); subscription.Dispose(); list.IsCollection(5000, 10000); }
public void Dematerialize() { var m = Observable.Empty<int>().Materialize().Dematerialize().ToArrayWait(); m.IsCollection(); m = Observable.Range(1, 3).Materialize().Dematerialize().ToArrayWait(); m.IsCollection(1, 2, 3); var l = new List<int>(); Observable.Range(1, 3).Concat(Observable.Throw<int>(new Exception())).Materialize() .Dematerialize() .Subscribe(x => l.Add(x), ex => l.Add(1000), () => l.Add(10000)); l.IsCollection(1, 2, 3, 1000); }
public void Switch() { var source = new Subject<IObservable<int>>(); var list = new List<int>(); source.Switch().Subscribe(list.Add); var s1 = new Subject<int>(); source.OnNext(s1); s1.OnNext(100); s1.OnNext(2000); var s2 = new Subject<int>(); s1.HasObservers.IsTrue(); source.OnNext(s2); s1.OnNext(3000); // do nothing s1.HasObservers.IsFalse(); s2.OnNext(5000); source.OnCompleted(); s2.OnNext(900000); list.IsCollection(100, 2000, 5000, 900000); s2.OnCompleted(); }
public void CurrentThread3() { SetScehdulerForImport(); var scheduler = Scheduler.CurrentThread; var list = new List<string>(); scheduler.Schedule(() => { list.Add("one"); var cancel = scheduler.Schedule(TimeSpan.FromSeconds(3), () => { list.Add("after 3"); }); scheduler.Schedule(TimeSpan.FromSeconds(1), () => { list.Add("after 1"); cancel.Dispose(); }); }); list.IsCollection("one", "after 1"); UniRx.Scheduler.SetDefaultForUnity(); }