public void MustUseSameInstanceForAllOperations()
        {
            var first     = true;
            var operation = operationMock.Object;

            IOperation initialize()
            {
                if (first)
                {
                    first = false;

                    return(operation);
                }

                return(new Mock <IOperation>().Object);
            };

            var sut = new LazyInitializationOperation(initialize);

            sut.Perform();
            sut.Revert();

            operationMock.Verify(o => o.Perform(), Times.Once);
            operationMock.Verify(o => o.Revert(), Times.Once);
        }
        public void MustNotInstantiateOperationOnRevert()
        {
            IOperation initialize()
            {
                return(operationMock.Object);
            };

            var sut = new LazyInitializationOperation(initialize);

            sut.Revert();
        }
        public void MustReturnCorrectOperationResult()
        {
            IOperation initialize()
            {
                return(operationMock.Object);
            };

            operationMock.Setup(o => o.Perform()).Returns(OperationResult.Success);
            operationMock.Setup(o => o.Revert()).Returns(OperationResult.Failed);

            var sut     = new LazyInitializationOperation(initialize);
            var perform = sut.Perform();
            var revert  = sut.Revert();

            Assert.AreEqual(OperationResult.Success, perform);
            Assert.AreEqual(OperationResult.Failed, revert);
        }
        public void MustInstantiateOperationOnPerform()
        {
            var initialized = false;

            IOperation initialize()
            {
                initialized = true;

                return(operationMock.Object);
            };

            var sut = new LazyInitializationOperation(initialize);

            sut.Perform();

            Assert.IsTrue(initialized);
        }
        public void MustCorrectlyHandleEventSubscription()
        {
            IOperation initialize()
            {
                return(operationMock.Object);
            };

            var actionRequired        = 0;
            var actionRequiredHandler = new ActionRequiredEventHandler(args => actionRequired++);
            var statusChanged         = 0;
            var statusChangedHandler  = new StatusChangedEventHandler(t => statusChanged++);
            var sut = new LazyInitializationOperation(initialize);

            sut.ActionRequired += actionRequiredHandler;
            sut.StatusChanged  += statusChangedHandler;

            sut.Perform();

            operationMock.Raise(o => o.ActionRequired += null, new Mock <ActionRequiredEventArgs>().Object);
            operationMock.Raise(o => o.StatusChanged  += null, default(TextKey));

            Assert.AreEqual(1, actionRequired);
            Assert.AreEqual(1, statusChanged);

            sut.ActionRequired -= actionRequiredHandler;
            sut.StatusChanged  -= statusChangedHandler;

            operationMock.Raise(o => o.ActionRequired += null, new Mock <ActionRequiredEventArgs>().Object);
            operationMock.Raise(o => o.StatusChanged  += null, default(TextKey));

            Assert.AreEqual(1, actionRequired);
            Assert.AreEqual(1, statusChanged);

            sut.ActionRequired += actionRequiredHandler;
            sut.StatusChanged  += statusChangedHandler;

            operationMock.Raise(o => o.ActionRequired += null, new Mock <ActionRequiredEventArgs>().Object);
            operationMock.Raise(o => o.StatusChanged  += null, default(TextKey));

            Assert.AreEqual(2, actionRequired);
            Assert.AreEqual(2, statusChanged);
        }