Exemplo n.º 1
0
        /// <inheritdoc cref="IAsyncToken{T}"/>
        public IAsyncToken <TR> Map <TR>(Func <T, TR> map)
        {
            var output = new AsyncToken <TR>();

            OnSuccess(value => output.Succeed(map(value)));
            OnFailure(output.Fail);

            return(output);
        }
Exemplo n.º 2
0
        /// <inheritdoc cref="IAsyncToken{T}"/>
        public IAsyncToken <T> Token()
        {
            var token = new AsyncToken <T>();

            OnSuccess(token.Succeed);
            OnFailure(token.Fail);

            return(token);
        }
Exemplo n.º 3
0
        public void OnSuccessCalledAfterResolved()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.Succeed(new TestResult());
            token.OnSuccess(_ => called = true);

            Assert.IsTrue(called);
        }
Exemplo n.º 4
0
        public void OnSuccessNotCalledAfterResolved()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.Fail(new Exception());
            token.OnSuccess(_ => called = true);

            Assert.IsFalse(called);
        }
Exemplo n.º 5
0
        public void OnFinallyCalledFromFail()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.OnFinally(_ => called = true);
            token.Fail(new Exception());

            Assert.IsTrue(called);
        }
Exemplo n.º 6
0
        public void OnFinallyCalledFromSucceed()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.OnFinally(_ => called = true);
            token.Succeed(new TestResult());

            Assert.IsTrue(called);
        }
Exemplo n.º 7
0
        public void OnFinallyNotCalledAfterAbort()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.OnFinally(_ => called = true);
            token.Abort();
            token.Fail(new Exception());

            Assert.IsFalse(called);
        }
Exemplo n.º 8
0
        public void OnSuccessAborted()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.OnSuccess(_ => called = true);
            token.Abort();
            token.Succeed(new TestResult());
            token.OnSuccess(_ => called = true);

            Assert.IsFalse(called);
        }
Exemplo n.º 9
0
        public void OnFailureAborted()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token.OnFailure(_ => called = true);
            token.Abort();
            token.OnFailure(_ => called = true);
            token.Fail(new Exception());

            Assert.IsFalse(called);
        }
Exemplo n.º 10
0
        public void AbortInCallbackNotRespected()
        {
            var token  = new AsyncToken <TestResult>();
            var called = false;

            token
            .OnSuccess(_ => token.Abort())
            .OnSuccess(_ => called = true)
            .OnFinally(_ => called = true);
            token.Succeed(new TestResult());

            Assert.IsTrue(called);
        }
Exemplo n.º 11
0
        public void Token()
        {
            var token         = new AsyncToken <TestResult>();
            var successCalled = true;

            token
            .Token()
            .OnSuccess(_ => successCalled = true);

            token.Succeed(new TestResult());

            Assert.IsTrue(successCalled);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Creates a single token from a collection of tokens.
        ///
        /// A failure from any one of the tokens will result in a failure of
        /// the returned token. If only a single token fails, only that exception
        /// is returned. If multiple tokens fail, an <c>AggregateException</c>
        /// is returned.
        ///
        /// If no tokens are passed in, the returned token is a Success.
        ///
        /// TODO: TESTS.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tokens"></param>
        /// <returns></returns>
        public static IAsyncToken <T[]> All <T>(params IAsyncToken <T>[] tokens)
        {
            var len = tokens.Length;

            if (0 == len)
            {
                return(new AsyncToken <T[]>(new T[0]));
            }

            var returnToken = new AsyncToken <T[]>();
            var values      = new T[len];
            var exceptions  = new List <Exception>();
            var numReturned = 0;

            for (var i = 0; i < len; i++)
            {
                var token = tokens[i];
                var index = i;
                token
                .OnSuccess(value => values[index] = value)
                .OnFailure(exception => exceptions.Add(exception))
                .OnFinally(_ =>
                {
                    if (++numReturned == len)
                    {
                        if (exceptions.Count > 1)
                        {
                            var aggregate = new AggregateException();
                            aggregate.Exceptions.AddRange(exceptions);

                            returnToken.Fail(aggregate);
                        }
                        else if (exceptions.Count == 1)
                        {
                            returnToken.Fail(exceptions[0]);
                        }
                        else
                        {
                            returnToken.Succeed(values);
                        }
                    }
                });
            }

            return(returnToken);
        }
Exemplo n.º 13
0
        public void OnFinallyCalledInOrderOnFailure()
        {
            var token         = new AsyncToken <TestResult>();
            var failCalled    = false;
            var finallyCalled = false;

            token
            .OnFailure(_ => failCalled = true)
            .OnFinally(_ =>
            {
                Assert.IsTrue(failCalled);

                finallyCalled = true;
            });
            token.Fail(new Exception());

            Assert.IsTrue(finallyCalled);
        }
Exemplo n.º 14
0
        public void OnFinallyCalledInOrderOnSuccess()
        {
            var token         = new AsyncToken <TestResult>();
            var successCalled = false;
            var finallyCalled = false;

            token
            .OnSuccess(_ => successCalled = true)
            .OnFinally(_ =>
            {
                Assert.IsTrue(successCalled);

                finallyCalled = true;
            });
            token.Succeed(new TestResult());

            Assert.IsTrue(finallyCalled);
        }
Exemplo n.º 15
0
        public void ExceptionIsCaughtOnFinally()
        {
            var token     = new AsyncToken <TestResult>();
            var exception = new Exception();
            var called    = false;

            try
            {
                token
                .OnSuccess(_ => throw exception)
                .OnFinally(_ => called = true);
                token.Succeed(new TestResult());
            }
            catch (Exception thrown)
            {
                Assert.AreSame(exception, thrown);
            }

            Assert.IsTrue(called);
        }
Exemplo n.º 16
0
        public void AggregateExceptionCreated()
        {
            var token      = new AsyncToken <TestResult>();
            var exception1 = new Exception();
            var exception2 = new Exception();
            var called     = false;

            try
            {
                token
                .OnSuccess(_ => throw exception1)
                .OnSuccess(_ => throw exception2)
                .OnSuccess(_ => called = true);
                token.Succeed(new TestResult());
            }
            catch (AggregateException exception)
            {
                Assert.AreEqual(2, exception.Exceptions.Count);
            }

            Assert.IsTrue(called);
        }
Exemplo n.º 17
0
        public void OnSuccessCalledExclusively()
        {
            var token         = new AsyncToken <TestResult>();
            var value         = new TestResult();
            var successCalled = false;
            var failureCalled = false;

            token
            .OnSuccess(returnedValue =>
            {
                successCalled = true;

                Assert.AreSame(value, returnedValue);
            })
            .OnFailure(exception =>
            {
                failureCalled = true;
            });
            token.Succeed(value);

            Assert.IsTrue(successCalled);
            Assert.IsFalse(failureCalled);
        }
Exemplo n.º 18
0
        public async Task TaskSuccess()
        {
            var token = new AsyncToken <float>();

            var callbackResult = 0f;

            token.OnSuccess(val => callbackResult = val);

            var taskResult = 0f;
            var task       = token
                             .AsTask()
                             .ContinueWith(cTask =>
            {
                taskResult = cTask.Result;
            });

            var expectedValue = 2.26f;

            token.Succeed(expectedValue);
            await task;

            Assert.AreEqual(expectedValue, callbackResult);
            Assert.AreEqual(expectedValue, taskResult);
        }
Exemplo n.º 19
0
        public async Task TaskAborted()
        {
            var token = new AsyncToken <float>();

            Exception callbackException = null;

            token.OnFailure(exception => callbackException = exception);

            var task        = token.AsTask();
            var taskSuccess = false;

            token.Abort();

            try
            {
                await task;
                taskSuccess = true;
            }
            catch (Exception exception)
            {
                Assert.IsTrue(exception is OperationCanceledException);
            }
            Assert.IsFalse(taskSuccess);
        }
Exemplo n.º 20
0
        public async Task TaskFail()
        {
            var token = new AsyncToken <float>();

            Exception callbackException = null;

            token.OnFailure(exception => callbackException = exception);

            var task = token.AsTask();

            var expectedException = new InvalidOperationException("Test exception");

            token.Fail(expectedException);

            try
            {
                await task;
            }
            catch (Exception exception)
            {
                Assert.AreEqual(expectedException, exception);
            }
            Assert.AreEqual(expectedException, callbackException);
        }