public void Mapper_Crash() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); var to = ObservableSource.CombineLatest(a => { int v = 0; foreach (var e in a) { v += e; } if (v == 22) { throw new InvalidOperationException(); } return(v); }, us1, us2).Test(); to.AssertEmpty(); us1.OnNext(1); us2.OnNext(10); us1.OnNext(2); us2.OnNext(20); Assert.False(us1.HasObserver()); Assert.False(us2.HasObserver()); to.AssertFailure(typeof(InvalidOperationException), 11, 12); }
public void No_Combinations_Complete_After_All() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); var to = ObservableSource.CombineLatest(a => { int v = 0; foreach (var e in a) { v += e; } return(v); }, us1, us2).Test(); to.AssertEmpty(); us1.OnCompleted(); Assert.True(us2.HasObserver(), "Other source disposed?"); us2.EmitAll(1, 2, 3, 4, 5); to.AssertResult(); }
public void Error_Delayed() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); var to = ObservableSource.CombineLatest(a => { int v = 0; foreach (var e in a) { v += e; } return(v); }, true, us1, us2).Test(); to.AssertEmpty(); us1.OnNext(1); us1.OnError(new InvalidOperationException()); Assert.True(us2.HasObserver()); us2.EmitAll(10, 20, 30, 40, 50); to.AssertFailure(typeof(InvalidOperationException), 11, 21, 31, 41, 51); }
public void Offline_Error_Fused() { var ms = new MonocastSubject <int>(); var ex = new IndexOutOfRangeException(); ms.OnNext(1); ms.OnNext(2); ms.OnNext(3); ms.OnError(ex); Assert.False(ms.HasObservers); Assert.True(ms.HasException()); Assert.False(ms.HasCompleted()); Assert.AreEqual(ex, ms.GetException()); var to = ms.Test(fusionMode: FusionSupport.Any); Assert.False(ms.HasObservers); to.AssertFuseable() .AssertFusionMode(FusionSupport.Async); to.AssertFailure(typeof(IndexOutOfRangeException), 1, 2, 3); ms.Test().AssertFailure(typeof(InvalidOperationException)); }
public void Main_Disposes_Others_On_Error() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); us1.Emit(10); us2.Emit(100); var source = new PublishSubject <int>(); var to = source.WithLatestFrom((a, bs) => { foreach (var i in bs) { a += i; } return(a); }, us1, us2).Test(); Assert.True(us1.HasObserver()); Assert.True(us2.HasObserver()); to.AssertEmpty(); source.EmitError(new InvalidOperationException(), 1, 2, 3, 4, 5); Assert.False(us1.HasObserver()); Assert.False(us2.HasObserver()); to.AssertFailure(typeof(InvalidOperationException), 111, 112, 113, 114, 115); }
public void Race_While() { for (int i = 0; i < TestHelper.RACE_LOOPS; i++) { var us = new MonocastSubject <int>(); var to = new TestObserver <int>(); TestHelper.Race(() => { for (int j = 0; j < 1000; j++) { us.OnNext(j); } us.OnCompleted(); }, () => { us.BlockingSubscribeWhile(v => { to.OnNext(v); return(true); }, to.OnError, to.OnCompleted); }); to.AssertValueCount(1000) .AssertNoError() .AssertCompleted(); } }
public void Switch_Outer_Completes_First() { var source = new PublishSubject <IObservableSource <int> >(); var to = source.Switch().Test(); to.AssertEmpty(); var us1 = new MonocastSubject <int>(); source.OnNext(us1); Assert.True(us1.HasObserver()); var us2 = new MonocastSubject <int>(); source.OnNext(us2); Assert.True(us2.HasObserver()); Assert.False(us1.HasObserver()); source.OnCompleted(); Assert.True(us2.HasObserver()); to.AssertEmpty(); us2.EmitAll(1, 2, 3, 4, 5); to.AssertResult(1, 2, 3, 4, 5); }
public void Basic_While_Dispose() { var to = new TestObserver <int>(); var sad = new SingleAssignmentDisposable(); var cdl = new CountdownEvent(2); var us = new MonocastSubject <int>(); Task.Factory.StartNew(() => { while (to.ItemCount != 5) { ; } sad.Dispose(); cdl.Signal(); }); Task.Factory.StartNew(() => { us.Emit(1, 2, 3, 4, 5); cdl.Signal(); }); us.BlockingSubscribeWhile(v => { to.OnNext(v); return(true); }, to.OnError, to.OnCompleted, d => sad.Disposable = d); to.AssertValuesOnly(1, 2, 3, 4, 5); Assert.True(cdl.Wait(3000)); Assert.False(us.HasObserver()); }
public void Race() { for (int i = 0; i < TestHelper.RACE_LOOPS; i++) { var ups = new MonocastSubject <int>[] { new MonocastSubject <int>(), new MonocastSubject <int>() }; var to = ObservableSource.Range(0, 2) .Map(v => ups[v]) .Merge() .Test(); TestHelper.Race(() => { for (int j = 0; j < 1000; j++) { ups[0].OnNext(j); } ups[0].OnCompleted(); }, () => { for (int j = 1000; j < 2000; j++) { ups[1].OnNext(j); } ups[1].OnCompleted(); }); to.AssertValueCount(2000) .AssertNoError() .AssertCompleted(); } }
public void Offline_Basic_Fused() { var ms = new MonocastSubject <int>(); ms.OnNext(1); ms.OnNext(2); ms.OnNext(3); ms.OnCompleted(); Assert.False(ms.HasObservers); Assert.False(ms.HasException()); Assert.True(ms.HasCompleted()); Assert.Null(ms.GetException()); var to = ms.Test(fusionMode: FusionSupport.Any); to.AssertFuseable() .AssertFusionMode(FusionSupport.Async); Assert.False(ms.HasObservers); to.AssertResult(1, 2, 3); ms.Test().AssertFailure(typeof(InvalidOperationException)); }
public void Async_Regular_Error_Delayed() { for (int i = 0; i < 2; i++) { var ts = new TestScheduler(); var subj = new MonocastSubject <int>(); var to = subj.ObserveOn(ts, true, fair: i == 0) .Test() .WithTag($"fair={i == 0}"); Assert.True(subj.HasObservers); to.AssertEmpty(); subj.OnNext(1); subj.OnNext(2); subj.OnError(new InvalidOperationException()); to.AssertEmpty(); ts.AdvanceTimeBy(1); to.AssertFailure(typeof(InvalidOperationException), 1, 2); } }
public void Mapper_Crashes() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); var to = ObservableSource.Zip(a => { int s = 0; foreach (var v in a) { s += v; } if (s == 33) { throw new InvalidOperationException(); } return(s); }, us1, us2 ).Test(); us1.Emit(1, 2, 3); Assert.True(us1.HasObserver()); Assert.True(us2.HasObserver()); us2.Emit(10, 20, 30, 40); Assert.False(us1.HasObserver()); Assert.False(us2.HasObserver()); to.AssertFailure(typeof(InvalidOperationException), 11, 22); }
public void Error_Delayed() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); var to = ObservableSource.Zip(a => { int s = 0; foreach (var v in a) { s += v; } return(s); }, true, us1, us2 ).Test(); us1.EmitError(new InvalidOperationException(), 1, 2, 3); Assert.True(us2.HasObserver(), "us2: No observers!"); us2.Emit(10, 20, 30, 40); Assert.False(us2.HasObserver(), "us2: Observers present!"); to.AssertFailure(typeof(InvalidOperationException), 11, 22, 33); }
public void Fused_Failure_Message() { var ms = new MonocastSubject <int>(); var to = ms.Test(fusionMode: FusionSupport.Any); to.AssertEmpty() .AssertFuseable() .AssertFusionMode(FusionSupport.Async); ms.OnNext(1); try { to.AssertEmpty(); Assert.Fail("Should have thrown"); } catch (AssertionException) { throw; } catch (Exception ex) { var msg = ex.Message; Assert.True(msg.Contains("fuseable!")); Assert.True(msg.Contains("fusion-requested")); Assert.True(msg.Contains("fusion-established")); } }
public void Race() { for (int i = 0; i < TestHelper.RACE_LOOPS; i++) { var us = new MonocastSubject <int>(); var to = new TestObserver <int>(); TestHelper.Race(() => { for (int j = 0; j < 1000; j++) { us.OnNext(j); } us.OnCompleted(); }, () => { foreach (var v in us.BlockingEnumerable()) { to.OnNext(v); } to.OnCompleted(); }); to.AssertValueCount(1000) .AssertNoError() .AssertCompleted(); } }
public void Main_Disposes_Others_On_Completion() { var us1 = new MonocastSubject <int>(); var us2 = new MonocastSubject <int>(); us1.Emit(10); us2.Emit(100); var source = new PublishSubject <int>(); var to = source.WithLatestFrom((a, bs) => { foreach (var i in bs) { a += i; } return(a); }, us1, us2).Test(); Assert.True(us1.HasObserver()); Assert.True(us2.HasObserver()); to.AssertEmpty(); source.EmitAll(1, 2, 3, 4, 5); Assert.False(us1.HasObserver()); Assert.False(us2.HasObserver()); to.AssertResult(111, 112, 113, 114, 115); }
public void Disposed() { var us = new MonocastSubject <int>(); var to = new TestObserverLocal(); bool[] disposed = { false }; var d = us.ConcatMap(v => new OnDispose <int>(Enumerable.Range(v * 100, 5), disposed)) .SubscribeWith(to); Assert.True(us.HasObserver()); to.AssertEmpty(); us.OnNext(1); to.AssertValuesOnly(100, 101, 102, 103, 104); Assert.True(us.HasObserver()); us.OnNext(2); Assert.False(us.HasObserver()); Assert.True(disposed[0]); to.AssertResult(100, 101, 102, 103, 104, 200, 201); }
public void Basic_Observer_Dispose() { var to = new TestObserver <int>(); var cdl = new CountdownEvent(2); var us = new MonocastSubject <int>(); Task.Factory.StartNew(() => { while (to.ItemCount != 5) { ; } to.Dispose(); cdl.Signal(); }); Task.Factory.StartNew(() => { us.Emit(1, 2, 3, 4, 5); cdl.Signal(); }); us.BlockingSubscribe(to); to.AssertValuesOnly(1, 2, 3, 4, 5); Assert.True(cdl.Wait(3000)); Assert.False(us.HasObserver()); }
public void Basic_Error() { var us = new MonocastSubject <int>(); ObservableSource.Range(1, 5).ConcatError(new InvalidOperationException()) .RepeatWhen(v => us) .Test() .AssertFailure(typeof(InvalidOperationException), 1, 2, 3, 4, 5); }
public void Max_Concurrency_Honored_2_DelayErrors() { var us = new MonocastSubject <int>[] { new MonocastSubject <int>(), new MonocastSubject <int>(), new MonocastSubject <int>(), }; var to = ObservableSource.Range(0, 3) .Map(v => us[v]) .Merge(delayErrors: true, maxConcurrency: 2) .Test(); to.AssertEmpty(); Assert.True(us[0].HasObserver()); Assert.True(us[1].HasObserver()); Assert.False(us[2].HasObserver()); us[0].OnNext(1); Assert.True(us[0].HasObserver()); Assert.True(us[1].HasObserver()); Assert.False(us[2].HasObserver()); to.AssertValuesOnly(1); us[0].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.True(us[1].HasObserver()); Assert.True(us[2].HasObserver()); us[1].OnNext(2); to.AssertValuesOnly(1, 2); us[1].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.True(us[2].HasObserver()); us[2].OnNext(3); to.AssertValuesOnly(1, 2, 3); us[2].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.False(us[2].HasObserver()); to.AssertResult(1, 2, 3); }
public void Main_Disposed_Handler_Errors() { var us = new MonocastSubject <int>(); us.RepeatWhen(v => ObservableSource.Error <int>(new InvalidOperationException())) .Test() .AssertFailure(typeof(InvalidOperationException)); Assert.False(us.HasObserver()); }
public void OnTerminate_Dispose() { var count = 0; var ms = new MonocastSubject <int>(onTerminate: () => count++); ms.Test().Dispose(); Assert.AreEqual(1, count); }
public void Main_Disposed_Handler_Completes() { var us = new MonocastSubject <int>(); us.RepeatWhen(v => ObservableSource.Empty <int>()) .Test() .AssertResult(); Assert.False(us.HasObserver()); }
public void Max_Concurrency_Honored() { var us = new MonocastSubject <int>[] { new MonocastSubject <int>(), new MonocastSubject <int>(), new MonocastSubject <int>(), }; var to = ObservableSource.Range(0, 3) .ConcatMapEager(v => us[v], 1) .Test(); to.AssertEmpty(); Assert.True(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.False(us[2].HasObserver()); us[0].OnNext(1); Assert.True(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.False(us[2].HasObserver()); to.AssertValuesOnly(1); us[0].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.True(us[1].HasObserver()); Assert.False(us[2].HasObserver()); us[1].OnNext(2); to.AssertValuesOnly(1, 2); us[1].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.True(us[2].HasObserver()); us[2].OnNext(3); to.AssertValuesOnly(1, 2, 3); us[2].OnCompleted(); Assert.False(us[0].HasObserver()); Assert.False(us[1].HasObserver()); Assert.False(us[2].HasObserver()); to.AssertResult(1, 2, 3); }
public void Handler_Disposed() { var us = new MonocastSubject <int>(); ObservableSource.Range(1, 5).ConcatError(new InvalidOperationException()) .RepeatWhen(v => us) .Test() .AssertFailure(typeof(InvalidOperationException), 1, 2, 3, 4, 5); Assert.False(us.HasObserver()); }
public void OnTerminate_Completed() { var count = 0; var ms = new MonocastSubject <int>(onTerminate: () => count++); ms.OnCompleted(); ms.OnCompleted(); Assert.AreEqual(1, count); }
public void Handler_Disposed() { var us = new MonocastSubject <int>(); ObservableSource.Range(1, 5) .RetryWhen(v => us) .Test() .AssertResult(1, 2, 3, 4, 5); Assert.False(us.HasObserver()); }
public void Handler_Completes_Immediately() { var us = new MonocastSubject <int>(); us .RetryWhen(v => ObservableSource.Empty <int>()) .Test() .AssertResult(); Assert.False(us.HasObserver()); }
public void OnTerminate_Error() { var count = 0; var ms = new MonocastSubject <int>(onTerminate: () => count++); ms.OnError(new InvalidOperationException()); ms.OnError(new IndexOutOfRangeException()); Assert.AreEqual(1, count); }
public void Basic_With_Error() { var up = new MonocastSubject <int>(); var to = new TestObserver <int>(); up.Subscribe(ObservableSource.ToSerialized(to)); up.EmitError(new InvalidOperationException(), 1, 2, 3, 4, 5); to.AssertFailure(typeof(InvalidOperationException), 1, 2, 3, 4, 5); }