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 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 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 Online_Error()
        {
            var ms = new MonocastSubject <int>();

            Assert.False(ms.HasObservers);
            Assert.False(ms.HasException());
            Assert.False(ms.HasCompleted());
            Assert.Null(ms.GetException());

            var to = ms.Test();

            ms.Test().AssertFailure(typeof(InvalidOperationException));

            Assert.True(ms.HasObservers);
            Assert.False(ms.HasException());
            Assert.False(ms.HasCompleted());
            Assert.Null(ms.GetException());

            to.AssertEmpty();

            ms.OnNext(1);

            to.AssertValuesOnly(1);

            ms.OnNext(2);

            to.AssertValuesOnly(1, 2);

            ms.OnNext(3);

            to.AssertValuesOnly(1, 2, 3);

            var ex = new IndexOutOfRangeException();

            ms.OnError(ex);

            to.AssertFailure(typeof(IndexOutOfRangeException), 1, 2, 3);

            Assert.False(ms.HasObservers);
            Assert.True(ms.HasException());
            Assert.False(ms.HasCompleted());
            Assert.AreEqual(ex, ms.GetException());

            ms.Test().AssertFailure(typeof(InvalidOperationException));
        }
        public void OnTerminate_Dispose()
        {
            var count = 0;

            var ms = new MonocastSubject <int>(onTerminate: () => count++);

            ms.Test().Dispose();

            Assert.AreEqual(1, count);
        }
        public void Online_Basic()
        {
            var ms = new MonocastSubject <int>();

            Assert.False(ms.HasObservers);
            Assert.False(ms.HasException());
            Assert.False(ms.HasCompleted());
            Assert.Null(ms.GetException());

            var to = ms.Test();

            ms.Test().AssertFailure(typeof(InvalidOperationException));

            Assert.True(ms.HasObservers);
            Assert.False(ms.HasException());
            Assert.False(ms.HasCompleted());
            Assert.Null(ms.GetException());

            to.AssertEmpty();

            ms.OnNext(1);

            to.AssertValuesOnly(1);

            ms.OnNext(2);

            to.AssertValuesOnly(1, 2);

            ms.OnNext(3);

            to.AssertValuesOnly(1, 2, 3);

            ms.OnCompleted();

            to.AssertResult(1, 2, 3);

            Assert.False(ms.HasObservers);
            Assert.False(ms.HasException());
            Assert.True(ms.HasCompleted());
            Assert.Null(ms.GetException());

            ms.Test().AssertFailure(typeof(InvalidOperationException));
        }