Inheritance: FailState
        public void Should_complete_the_rescue_vane()
        {
            var fail = new TestFail();
            var middle = new Test();

            var success = new TestSuccess();

            Vane<TestSubject> vane = VaneFactory.New(() => fail, x =>
                {
                    x.Rescue(() => success, r => { });
                    x.Feather(() => middle);
                });

            vane.Execute(_testSubject);

            Assert.IsTrue(middle.AssignCalled);
            Assert.IsTrue(middle.ExecuteCalled);
            Assert.IsTrue(middle.CompensateCalled);

            Assert.IsTrue(success.AssignCalled);

            Assert.IsTrue(fail.AssignCalled);
            Assert.IsTrue(fail.ExecuteCalled);
            Assert.IsTrue(fail.CompensateCalled);
        }
        public void Should_create_the_plan_for_fail()
        {
            var fail = new TestFail();
            Vane<TestSubject> vane = VaneFactory.Connect(fail);

            var exception = Assert.Throws<AggregateException>(() => vane.Execute(_testSubject));

            Assert.AreEqual(1, exception.InnerExceptions.Count);
        }
        public void Should_execute_and_compensate_on_fail()
        {
            var fail = new TestFail();
            var log = new Test();
            Vane<TestSubject> vane = VaneFactory.Connect(fail, log);

            var exception = Assert.Throws<AggregateException>(() => vane.Execute(_testSubject));

            Assert.AreEqual(1, exception.InnerExceptions.Count);

            Assert.IsTrue(fail.AssignCalled);
            Assert.IsTrue(fail.ExecuteCalled);
            Assert.IsTrue(fail.CompensateCalled);

            Assert.IsTrue(log.AssignCalled);
            Assert.IsTrue(log.ExecuteCalled);
            Assert.IsTrue(log.CompensateCalled);
        }
        public void Should_complete_the_rescue_vane()
        {
            var success = new TestSuccess();

            var fail = new TestFail();
            var middle = new TestVane();
            var rescue = new Rescue<TestSubject>(success);
            Vane<TestSubject> vane = Vane.Connect(fail, rescue, middle);

            Assert.IsTrue(vane.Execute(_testSubject));

            Assert.IsTrue(fail.AssignCalled);
            Assert.IsTrue(fail.ExecuteCalled);
            Assert.IsFalse(fail.CompensateCalled);

            Assert.IsTrue(middle.AssignCalled);
            Assert.IsTrue(middle.ExecuteCalled);
            Assert.IsTrue(middle.CompensateCalled);

            Assert.IsTrue(success.AssignCalled);
        }
        public void Should_execute_two_and_compensate_on_fail()
        {
            var fail = new TestFail();
            var log = new TestVane();
            var log2 = new TestVane();
            Vane<TestSubject> vane = Vane.Connect(fail, log, log2);

            var exception = Assert.Throws<AgendaExecutionException>(() => vane.Execute(_testSubject));

            Assert.AreEqual(0, exception.InnerExceptionCount);

            Assert.IsTrue(fail.AssignCalled);
            Assert.IsTrue(fail.ExecuteCalled);
            Assert.IsFalse(fail.CompensateCalled);

            Assert.IsTrue(log.AssignCalled);
            Assert.IsTrue(log.ExecuteCalled);
            Assert.IsTrue(log.CompensateCalled);

            Assert.IsTrue(log2.AssignCalled);
            Assert.IsTrue(log2.ExecuteCalled);
            Assert.IsTrue(log2.CompensateCalled);
        }