Exemple #1
0
        [Test] public void testSequenceImmediate()
        {
            var counter = new FutureCounter();

            var success1 = Future.Success("Yay 1!");
            var success2 = Future.Success("Yay 2!");

            var failure1 = Future.Failure <string>(new Exception("Boo 1!"));
            var failure2 = Future.Failure <string>(new Exception("Boo 2!"));

            var sucseq = Future.Sequence(List(success1, success2));

            counter.Bind(sucseq);
            sucseq.OnSuccess(results => {
                Assert.AreEqual(List("Yay 1!", "Yay 2!"), results);
            });
            counter.Check("immediate seq success/success", 1, 0, 1);

            counter.Bind(Future.Sequence(List(success1, failure1)));
            counter.Check("immediate seq success/failure", 0, 1, 1);

            counter.Bind(Future.Sequence(List(failure1, success2)));
            counter.Check("immediate seq failure/success", 0, 1, 1);

            counter.Bind(Future.Sequence(List(failure1, failure2)));
            counter.Check("immediate seq failure/failure", 0, 1, 1);
        }
Exemple #2
0
        [Test] public void testSequenceTuple()
        {
            var counter = new FutureCounter();
            var str     = Future.Success("string");
            var integer = Future.Success(42);

            var sucsuc = Future.Sequence(str, integer);

            sucsuc.OnSuccess(tup => {
                Assert.AreEqual("string", tup.Item1);
                Assert.AreEqual(42, tup.Item2);
            });
            counter.Bind(sucsuc);
            counter.Check("tuple2 seq success/success", 1, 0, 1);

            var fail    = Future.Failure <bool>(new Exception("Alas, poor Yorrick."));
            var sucfail = Future.Sequence(str, fail);

            counter.Bind(sucfail);
            counter.Check("tuple2 seq success/fail", 0, 1, 1);

            var failsuc = Future.Sequence(fail, str);

            counter.Bind(failsuc);
            counter.Check("tuple2 seq fail/success", 0, 1, 1);
        }
Exemple #3
0
        [Test] public void testFlatMappedDeferred()
        {
            var scounter = new FutureCounter();
            var fcounter = new FutureCounter();
            Func <string, IFuture <bool> > successMap = value => {
                return(Future.Success(value != null));
            };
            Func <string, IFuture <bool> > failMap = value => {
                return(Future.Failure <bool>(new Exception("Barzle!")));
            };

            var success = new Promise <string>();

            scounter.Bind(success.FlatMap(successMap));
            scounter.Check("before succeed/succeed", 0, 0, 0);
            fcounter.Bind(success.FlatMap(failMap));
            fcounter.Check("before succeed/fail", 0, 0, 0);
            success.Succeed("Yay!");
            scounter.Check("after succeed/succeed", 1, 0, 1);
            fcounter.Check("after succeed/fail", 0, 1, 1);

            var failure = new Promise <string>();

            scounter.Bind(failure.FlatMap(successMap));
            fcounter.Bind(failure.FlatMap(failMap));
            scounter.Check("before fail/success", 0, 0, 0);
            fcounter.Check("before fail/failure", 0, 0, 0);
            failure.Fail(new Exception("Boo!"));
            scounter.Check("after fail/success", 0, 1, 1);
            fcounter.Check("after fail/failure", 0, 1, 1);

            Assert.False(success.HasConnections());
            Assert.False(failure.HasConnections());
        }
Exemple #4
0
        [Test] public void testFlatMappedImmediate()
        {
            var scounter = new FutureCounter();
            var fcounter = new FutureCounter();
            var ccounter = new FutureCounter();
            Func <string, IFuture <bool> > successMap = value => {
                return(Future.Success(value != null));
            };
            Func <string, IFuture <bool> > failMap = value => {
                return(Future.Failure <bool>(new Exception("Barzle!")));
            };
            Func <string, IFuture <bool> > crashMap = value => {
                throw new Exception("Barzle!");
            };

            var success = Future.Success("Yay!");

            scounter.Bind(success.FlatMap(successMap));
            fcounter.Bind(success.FlatMap(failMap));
            ccounter.Bind(success.FlatMap(crashMap));
            scounter.Check("immediate success/success", 1, 0, 1);
            fcounter.Check("immediate success/failure", 0, 1, 1);
            ccounter.Check("immediate success/crash", 0, 1, 1);

            var failure = Future.Failure <string>(new Exception("Boo!"));

            scounter.Bind(failure.FlatMap(successMap));
            fcounter.Bind(failure.FlatMap(failMap));
            ccounter.Bind(failure.FlatMap(crashMap));
            scounter.Check("immediate failure/success", 0, 1, 1);
            fcounter.Check("immediate failure/failure", 0, 1, 1);
            ccounter.Check("immediate failure/crash", 0, 1, 1);
        }
Exemple #5
0
        [Test] public void testCollectEmpty()
        {
            FutureCounter counter = new FutureCounter();
            IFuture <ICollection <string> > seq = Future.Collect(List <IFuture <string> >());

            counter.Bind(seq);
            counter.Check("collect empty list succeeds", 1, 0, 1);
        }
Exemple #6
0
        [Test] public void testSequenceEmpty()
        {
            FutureCounter            counter = new FutureCounter();
            IFuture <List <string> > seq     = Future.Sequence(List <IFuture <string> >());

            counter.Bind(seq);
            counter.Check("sequence empty list succeeds", 1, 0, 1);
        }
Exemple #7
0
        [Test] public void testSequenceDeferred()
        {
            var counter = new FutureCounter();

            var success1 = new Promise <string>();
            var success2 = new Promise <string>();
            var failure1 = new Promise <string>();
            var failure2 = new Promise <string>();

            var suc2seq = Future.Sequence(List <IFuture <string> >(success1, success2));

            counter.Bind(suc2seq);
            suc2seq.OnSuccess(results => {
                Assert.AreEqual(List("Yay 1!", "Yay 2!"), results);
            });
            counter.Check("before seq succeed/succeed", 0, 0, 0);
            success1.Succeed("Yay 1!");
            success2.Succeed("Yay 2!");
            counter.Check("after seq succeed/succeed", 1, 0, 1);

            IFuture <List <string> > sucfailseq = Future.Sequence(List <IFuture <string> >(success1, failure1));

            sucfailseq.OnFailure(cause => {
                var agg = cause as AggregateException;
                Assert.NotNull(agg);
                Assert.AreEqual(1, agg.InnerExceptions.Count);
            });
            counter.Bind(sucfailseq);
            counter.Check("before seq succeed/fail", 0, 0, 0);
            failure1.Fail(new Exception("Boo 1!"));
            counter.Check("after seq succeed/fail", 0, 1, 1);

            IFuture <List <string> > failsucseq = Future.Sequence(List <IFuture <string> >(failure1, success2));

            failsucseq.OnFailure(cause => {
                var agg = cause as AggregateException;
                Assert.NotNull(agg);
                Assert.AreEqual(1, agg.InnerExceptions.Count);
            });
            counter.Bind(failsucseq);
            counter.Check("after seq fail/succeed", 0, 1, 1);

            IFuture <List <string> > fail2seq = Future.Sequence(List <IFuture <string> >(failure1, failure2));

            fail2seq.OnFailure(cause => {
                var agg = cause as AggregateException;
                Assert.NotNull(agg);
                Assert.AreEqual(2, agg.InnerExceptions.Count);
            });
            counter.Bind(fail2seq);
            counter.Check("before seq fail/fail", 0, 0, 0);
            failure2.Fail(new Exception("Boo 2!"));
            counter.Check("after seq fail/fail", 0, 1, 1);
        }
Exemple #8
0
        [Test] public void testMappedImmediate()
        {
            var counter = new FutureCounter();

            var success = Future.Success("Yay!");

            counter.Bind(success.Map(NotNull));
            counter.Check("immediate succeed", 1, 0, 1);

            var failure = Future.Failure <string>(new Exception("Boo!"));

            counter.Bind(failure.Map(NotNull));
            counter.Check("immediate failure", 0, 1, 1);
        }
Exemple #9
0
        [Test] public void testFlatMappedDoubleDeferred()
        {
            var scounter = new FutureCounter();
            var fcounter = new FutureCounter();

            {
                var success             = new Promise <string>();
                var innerSuccessSuccess = new Promise <bool>();
                scounter.Bind(success.FlatMap(value => innerSuccessSuccess));
                scounter.Check("before succeed/succeed", 0, 0, 0);
                var innerSuccessFailure = new Promise <string>();
                fcounter.Bind(success.FlatMap(value => innerSuccessFailure));
                fcounter.Check("before succeed/fail", 0, 0, 0);

                success.Succeed("Yay!");
                scounter.Check("after first succeed/succeed", 0, 0, 0);
                fcounter.Check("after first succeed/fail", 0, 0, 0);
                innerSuccessSuccess.Succeed(true);
                scounter.Check("after second succeed/succeed", 1, 0, 1);
                innerSuccessFailure.Fail(new Exception("Boo hoo!"));
                fcounter.Check("after second succeed/fail", 0, 1, 1);

                Assert.False(success.HasConnections());
                Assert.False(innerSuccessSuccess.HasConnections());
                Assert.False(innerSuccessFailure.HasConnections());
            }

            {
                var failure             = new Promise <string>();
                var innerFailureSuccess = new Promise <bool>();
                scounter.Bind(failure.FlatMap(value => innerFailureSuccess));
                scounter.Check("before fail/succeed", 0, 0, 0);
                var innerFailureFailure = new Promise <bool>();
                fcounter.Bind(failure.FlatMap(value => innerFailureFailure));
                fcounter.Check("before fail/fail", 0, 0, 0);

                failure.Fail(new Exception("Boo!"));
                scounter.Check("after first fail/succeed", 0, 1, 1);
                fcounter.Check("after first fail/fail", 0, 1, 1);
                innerFailureSuccess.Succeed(true);
                scounter.Check("after second fail/succeed", 0, 1, 1);
                innerFailureFailure.Fail(new Exception("Is this thing on?"));
                fcounter.Check("after second fail/fail", 0, 1, 1);

                Assert.False(failure.HasConnections());
                Assert.False(innerFailureSuccess.HasConnections());
                Assert.False(innerFailureFailure.HasConnections());
            }
        }
Exemple #10
0
        [Test] public void testMappedDeferred()
        {
            var counter = new FutureCounter();

            var success = new Promise <string>();

            counter.Bind(success.Map(NotNull));
            counter.Check("before succeed", 0, 0, 0);
            success.Succeed("Yay!");
            counter.Check("after succeed", 1, 0, 1);

            var failure = new Promise <string>();

            counter.Bind(failure.Map(NotNull));
            counter.Check("before fail", 0, 0, 0);
            failure.Fail(new Exception("Boo!"));
            counter.Check("after fail", 0, 1, 1);

            Assert.False(success.HasConnections());
            Assert.False(failure.HasConnections());
        }