public void FinallyAddRemoveThreadSafe()
        {
            var called = 0;
            var value  = new Exception();

            var token = new MutableAsyncToken <MyClass>();

            void FinallyAction(IMutableAsyncToken <MyClass> result)
            {
                called++;

                Assert.AreSame(token, result);

                token.Remove(FinallyAction);
            }

            token.OnFinally(_ =>
            {
                token.Remove(FinallyAction);
            });
            token.OnFinally(FinallyAction);

            token.Fail(value);

            Assert.AreEqual(1, called);
        }
        public void SucceedAddRemoveThreadSafe()
        {
            var called = 0;
            var value  = new MyClass();

            var token = new MutableAsyncToken <MyClass>();

            void SucceedAction(MyClass result)
            {
                called++;

                Assert.AreSame(value, result);

                token.Remove(SucceedAction);
            }

            token.OnSuccess(_ =>
            {
                token.Remove(SucceedAction);
            });
            token.OnSuccess(SucceedAction);

            token.Succeed(value);

            Assert.AreEqual(1, called);
        }
        public void FailAddRemove()
        {
            var called = 0;
            var value  = new Exception();

            var token = new MutableAsyncToken <MyClass>();

            token.Fail(value);

            void FailAction(Exception result)
            {
                called++;

                Assert.AreSame(value, result);
            }

            token.OnFailure(FailAction);
            token.Remove(FailAction);

            token.Fail(value);

            Assert.AreEqual(1, called);
        }