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);
        }
        public void MustCorrectlyPropagateEventSubscription()
        {
            var actionRequiredCalled  = false;
            var actionRequiredHandler = new ActionRequiredEventHandler(args => actionRequiredCalled = true);
            var statusChangedCalled   = false;
            var statusChangedHandler  = new StatusChangedEventHandler(t => statusChangedCalled = true);
            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).Raises(o => o.ActionRequired += null, new Mock <ActionRequiredEventArgs>().Object);
            operationC.Setup(o => o.Perform()).Returns(OperationResult.Success).Raises(o => o.StatusChanged  += null, default(TextKey));

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

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

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

            sut.TryPerform();

            Assert.IsTrue(actionRequiredCalled);
            Assert.IsTrue(statusChangedCalled);

            actionRequiredCalled = false;
            statusChangedCalled  = false;
            sut.ActionRequired  -= actionRequiredHandler;
            sut.StatusChanged   -= statusChangedHandler;

            sut.TryPerform();

            Assert.IsFalse(actionRequiredCalled);
            Assert.IsFalse(statusChangedCalled);
        }