public void ControllerShouldReportUndoRedoStatus()
        {
            var testCommand = new AdHocCommand(() => { }, () => { });
            var controller  = new Controller();

            var undoAvailable = false;
            var redoAvailable = false;

            controller.UndoAvailabilityChanged += (_, args) => undoAvailable = args.IsAvailable;
            controller.RedoAvailabilityChanged += (_, args) => redoAvailable = args.IsAvailable;

            controller.Execute(testCommand);

            Assert.True(undoAvailable);
            Assert.False(redoAvailable);

            controller.Undo();

            Assert.False(undoAvailable);
            Assert.True(redoAvailable);

            controller.Redo();

            Assert.True(undoAvailable);
            Assert.False(redoAvailable);
        }
        public void ControllerShouldExecuteGivenCommand()
        {
            var executed    = false;
            var testCommand = new AdHocCommand(() => executed = true);
            var controller  = new Controller();

            controller.Execute(testCommand);

            Assert.True(executed);
        }
        public void ControllerShouldAllowToUndoCommand()
        {
            var executed    = false;
            var undone      = false;
            var testCommand = new AdHocCommand(() => executed = true, () => undone = true);
            var controller  = new Controller();

            controller.Execute(testCommand);

            Assert.True(executed);
            Assert.False(undone);

            controller.Undo();

            Assert.True(executed);
            Assert.True(undone);
        }
        public void ControllerShouldAllowToRedoCommand()
        {
            var executed    = 0;
            var undone      = false;
            var testCommand = new AdHocCommand(() => ++ executed, () => undone = true);
            var controller  = new Controller();

            controller.Execute(testCommand);

            Assert.AreEqual(1, executed);
            Assert.False(undone);

            controller.Undo();

            Assert.AreEqual(1, executed);
            Assert.True(undone);

            controller.Redo();

            Assert.AreEqual(2, executed);
        }