public void MustSucceedRevertingWithoutCallingPerform()
        {
            var sut    = new OperationSequence(loggerMock.Object, new Queue <IOperation>());
            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Success, result);
        }
        public void MustContinueToRevertOperationsInCaseOfError()
        {
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success);

            operationA.Setup(o => o.Revert()).Throws <Exception>();
            operationB.Setup(o => o.Revert()).Throws <Exception>();
            operationC.Setup(o => o.Revert()).Throws <Exception>();

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            operationA.Verify(o => o.Revert(), Times.Once);
            operationB.Verify(o => o.Revert(), Times.Once);
            operationC.Verify(o => o.Revert(), Times.Once);

            Assert.AreEqual(OperationResult.Failed, result);
        }
        public void MustOnlyRevertPerformedOperations()
        {
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationA.Setup(o => o.Revert()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Aborted);
            operationB.Setup(o => o.Revert()).Returns(OperationResult.Success);

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            operationA.Verify(o => o.Revert(), Times.Once);
            operationB.Verify(o => o.Revert(), Times.Once);
            operationC.Verify(o => o.Revert(), Times.Never);

            Assert.AreEqual(OperationResult.Success, result);
        }
        public void MustRevertOperationsInSequence()
        {
            int current = 0, a = 0, b = 0, c = 0;
            var operationA = new Mock <IOperation>();
            var operationB = new Mock <IOperation>();
            var operationC = new Mock <IOperation>();
            var operations = new Queue <IOperation>();

            operationA.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationB.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success);

            operationA.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => a = ++current);
            operationB.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => b = ++current);
            operationC.Setup(o => o.Revert()).Returns(OperationResult.Success).Callback(() => c = ++current);

            operations.Enqueue(operationA.Object);
            operations.Enqueue(operationB.Object);
            operations.Enqueue(operationC.Object);

            var sut = new OperationSequence(loggerMock.Object, operations);

            sut.TryPerform();

            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Success, result);
            Assert.IsTrue(c == 1);
            Assert.IsTrue(b == 2);
            Assert.IsTrue(a == 3);
        }
        public void MustNotFailInCaseOfUnexpectedErrorWhenReverting()
        {
            var sut = new OperationSequence(loggerMock.Object, new Queue <IOperation>());

            sut.ProgressChanged += (args) => throw new Exception();

            var result = sut.TryRevert();

            Assert.AreEqual(OperationResult.Failed, result);
        }