public void AggregateUndoServiceUndoRedoTest() { // UndoServiceAggregate is created using an IUndoService array: var undoServiceForInt = new UndoService <int>(GetIntState, SetIntState, null); var undoServiceForString = new UndoService <string>(GetStringState, SetStringState, null); IUndoService[] subservices = { undoServiceForInt, undoServiceForString }; var serviceAggregate = new UndoServiceAggregate(subservices); // Changes are recorded by the individual UndoServices _statefulInt = 1; undoServiceForInt.RecordState(); _statefulString = "One"; undoServiceForString.RecordState(); _statefulInt = 2; undoServiceForInt.RecordState(); _statefulInt = 3; undoServiceForInt.RecordState(); _statefulString = "Two"; undoServiceForString.RecordState(); /* * The UndoServiceAggregate provides a unified interface for performing undo/redo on the different tracked objects. * (You can also perform Undo/Redo on the individual services, which will undo the last change on the corresponding object.) */ serviceAggregate.Undo(); Assert.IsTrue(_statefulString.Equals("One")); Assert.IsTrue(_statefulInt == 3); serviceAggregate.Undo(); Assert.IsTrue(_statefulString.Equals("One")); Assert.IsTrue(_statefulInt == 2); serviceAggregate.Undo(); Assert.IsTrue(_statefulString.Equals("One")); Assert.IsTrue(_statefulInt == 1); serviceAggregate.Redo(); Assert.IsTrue(_statefulString.Equals("One")); Assert.IsTrue(_statefulInt == 2); serviceAggregate.Redo(); Assert.IsTrue(_statefulString.Equals("One")); Assert.IsTrue(_statefulInt == 3); serviceAggregate.Redo(); Assert.IsTrue(_statefulString.Equals("Two")); Assert.IsTrue(_statefulInt == 3); }
public void CanUndoCanRedoChangedAggregateTest() { _aggregateService.CanUndoChanged += _aggregateService_CanUndoChanged; _aggregateService.CanRedoChanged += _aggregateService_CanRedoChanged; _statefulInt = 1; _subUndoServiceForInt.RecordState(); Assert.IsTrue(_canRedoChangedFiredCount == 0); Assert.IsTrue(_canUndoChangedFiredCount == 1); //Item added to empty undo stack _statefulString = "One"; _subUndoServiceForString.RecordState(); Assert.IsTrue(_canUndoChangedFiredCount == 1); //Adding an item to an empty sub stack does not fire the event in the aggregate per se _aggregateService.Undo(); Assert.IsTrue(_canUndoChangedFiredCount == 1); //Doesn't necessarily fire the event if the last item is removed from a subservice Assert.IsTrue(_canRedoChangedFiredCount == 1); //Item added to empty redo stack _aggregateService.Undo(); Assert.IsTrue(_canUndoChangedFiredCount == 2); //Last item removed from undo stack (event fires) Assert.IsTrue(_canRedoChangedFiredCount == 1); //Item added to already filled redo stack (no event) _aggregateService.Reset(); Assert.IsTrue(_canRedoChangedFiredCount == 2); //Redo stack cleared Assert.IsTrue(_canUndoChangedFiredCount == 2); //Undo Stack was already empty so there was no change _statefulInt = 2; _subUndoServiceForInt.RecordState(); //Item added to undo stack (event count = 3) _aggregateService.Undo(); //Item added to redo stack (event count = 3), item removed from undo stack (event count = 4) _aggregateService.Redo(); Assert.IsTrue(_canRedoChangedFiredCount == 4); //Last item removed from redo stack (event fired). Assert.IsTrue(_canUndoChangedFiredCount == 5); //Item added to empty undo stack (via undo operation). }