public void Undo_TransactionNotCommited_CommitsTransactionAndInvokesUndoOperation()
        {
            UndoManager target = new UndoManager();

            Mock <IInvokable> invokableMock = new Mock <IInvokable>(MockBehavior.Loose);

            ITransaction transaction = target.CreateTransaction();

            target.RegisterInvokation(invokableMock.Object);

            target.Undo();

            invokableMock.Verify(i => i.Invoke(), Times.Once());
            Assert.False(target.CanUndo);
            Assert.False(target.CanRedo);
        }
        public void Undo_InvocationRegisteredWithTransaction_InvokesUndoOperation()
        {
            UndoManager target = new UndoManager();

            Mock <IInvokable> invokableMock = new Mock <IInvokable>(MockBehavior.Loose);

            using (ITransaction transaction = target.CreateTransaction())
            {
                target.RegisterInvokation(invokableMock.Object);
            }

            target.Undo();

            invokableMock.Verify(i => i.Invoke(), Times.Once());
            Assert.False(target.CanUndo);
            Assert.False(target.CanRedo);
        }
        public void RegisterInvocation_WithTransaction_RegistersInvocationWithPublicTransaction()
        {
            TransactionFactoryStub factory = new TransactionFactoryStub();
            UndoManager            target  = new UndoManager(factory);

            factory.Transaction = new TransactionStub(target);

            Mock <IInvokable> invokableMock = new Mock <IInvokable>(MockBehavior.Strict);

            using (ITransaction transaction = target.CreateTransaction())
            {
                target.RegisterInvokation(invokableMock.Object);
            }

            Assert.True(factory.TransactionCreated);
            Assert.True(((TransactionStub)factory.Transaction).InvokationRegistered);
            Assert.True(((TransactionStub)factory.Transaction).Commited);

            Assert.True(target.CanUndo);
            Assert.False(target.CanRedo);
        }