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

            var token = new MutableAsyncToken <MyClass>();

            void FailAction(Exception result)
            {
                called++;

                Assert.AreSame(value, result);

                token.Remove(FailAction);
            }

            token.OnFailure(_ =>
            {
                token.Remove(FailAction);
            });
            token.OnFailure(FailAction);

            token.Fail(value);

            Assert.AreEqual(1, called);
        }
        public void FailPost()
        {
            var isCalled = false;
            var value    = new Exception();

            var token = new MutableAsyncToken <MyClass>();

            token.Fail(value);

            token
            .OnFailure(result =>
            {
                isCalled = true;

                Assert.AreSame(value, result);
            })
            .OnSuccess(result => throw new Exception());

            Assert.IsTrue(isCalled);
        }
        public void FailMulti()
        {
            var called = 0;
            var value  = new Exception();

            var token = new MutableAsyncToken <MyClass>();

            token
            .OnFailure(result =>
            {
                called++;

                Assert.AreSame(value, result);
            })
            .OnSuccess(exception => throw new Exception());

            token.Fail(value);
            token.Fail(value);

            Assert.AreEqual(2, called);
        }