public void RollForwardToTheEnd() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); var creationTime = timeline.Mark(); var objectChangeMarkers = new List <TimeMarker>(); int maximumValue = 10; for (int i = 0; i < maximumValue; i++) { obj.SomeValue = i; obj.LotsOfValues.Add(i); var marker = timeline.Mark(); objectChangeMarkers.Add(marker); } timeline.RollBackTo(creationTime); timeline.RollForwardTo(new TimeMarker(100)); Assert.AreEqual(maximumValue - 1, obj.SomeValue); var expected = Enumerable.Range(0, maximumValue); Assert.That( obj.LotsOfValues, Is.EquivalentTo(expected)); }
public void MarkClearsForwardHistory() { var timeline = new Timeline(BuildStorageOfType); var firstMark = timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); timeline.RemoveFromTimeline(obj.HistoryId); var thirdMark = timeline.Mark(); timeline.RollBackTo(firstMark); Assert.IsTrue(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); timeline.AddToTimeline(BuildObject); timeline.Mark(); Assert.IsFalse(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); timeline.RollForwardTo(thirdMark); Assert.IsFalse(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); }
public void RollForwardWithLocalChange() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); obj.SomeValue = 1; obj.LotsOfValues.Add(2); var firstChange = timeline.Mark(); obj.SomeValue = 2; obj.LotsOfValues.Add(4); var secondChange = timeline.Mark(); timeline.RollBackTo(firstChange); obj.SomeValue = 3; obj.LotsOfValues.Add(8); var otherObj = timeline.AddToTimeline(BuildObject); timeline.RollForwardTo(secondChange); Assert.AreEqual(2, obj.SomeValue); Assert.That( obj.LotsOfValues, Is.EquivalentTo(new[] { 2, 4 })); Assert.IsFalse(timeline.DoesObjectExistCurrently(otherObj.HistoryId)); Assert.IsFalse(timeline.HasObjectEverExisted(otherObj.HistoryId)); }
public void RollBackToBeforeBeginning() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); var objectChangeMarkers = new List <TimeMarker>(); int maximumValue = 10; for (int i = 0; i < maximumValue; i++) { obj.SomeValue = i; obj.LotsOfValues.Add(i); var marker = timeline.Mark(); objectChangeMarkers.Add(marker); } timeline.RollBackTo(TimeMarker.TheBeginOfTime); Assert.IsTrue(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); // Remember that the obj has been cut from the timeline but because // we have a reference to it, it's not dead yet. However the storage // should have been rolled back Assert.AreEqual(0, obj.SomeValue); Assert.AreEqual(0, obj.LotsOfValues.Count); }
public void RollBackFromDeath() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); int maximumValue = 10; obj.SomeValue = maximumValue; for (int i = 0; i < maximumValue; i++) { obj.LotsOfValues.Add(i); } var changeMarker = timeline.Mark(); timeline.RemoveFromTimeline(obj.HistoryId); timeline.Mark(); Assert.IsTrue(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); timeline.RollBackTo(changeMarker); var restoredObj = timeline.IdToObject <MockHistoryObject>(obj.HistoryId); Assert.IsNotNull(restoredObj); Assert.AreNotSame(obj, restoredObj); Assert.AreEqual(obj.HistoryId, restoredObj.HistoryId); Assert.AreEqual(maximumValue, restoredObj.SomeValue); Assert.AreEqual(maximumValue, restoredObj.LotsOfValues.Count); }
public void RollBackToPreviousStep() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); var objectChangeMarkers = new List <TimeMarker>(); int maximumValue = 10; for (int i = 0; i < maximumValue; i++) { obj.SomeValue = i; obj.LotsOfValues.Add(i); var marker = timeline.Mark(); objectChangeMarkers.Add(marker); } for (int i = maximumValue - 1; i >= 0; i--) { timeline.RollBackTo(objectChangeMarkers[i]); Assert.AreEqual(i, obj.SomeValue); Assert.AreEqual(i + 1, obj.LotsOfValues.Count); var expected = Enumerable.Range(0, i + 1); Assert.That( obj.LotsOfValues, Is.EquivalentTo(expected)); } }
public void RemoveFromTimelineWhileDeletedBeforeMark() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); timeline.RemoveFromTimeline(obj.HistoryId); Assert.DoesNotThrow(() => timeline.RemoveFromTimeline(obj.HistoryId)); }
public void AddToTimelineWithMark() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); Assert.IsTrue(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsTrue(timeline.DoesObjectExistCurrently(obj.HistoryId)); }
public void RemoveFromTimelineBeforeMark() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline(BuildObject); timeline.Mark(); timeline.RemoveFromTimeline(obj.HistoryId); Assert.IsTrue(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); }
public void MarkWithNoObjects() { var timeline = new Timeline(BuildStorageOfType); var firstMark = timeline.Mark(); Assert.Greater(firstMark, TimeMarker.TheBeginOfTime); Assert.AreEqual(TimeMarker.TheBeginOfTime.Next(), firstMark); }
public void RemoveFromTimelineWithUnknownId() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); Assert.DoesNotThrow(() => timeline.RemoveFromTimeline(new HistoryId())); }
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or /// resetting unmanaged resources. /// </summary> public void Dispose() { if (m_ShouldStore) { if (m_Name == null) { m_Owner.Mark(m_Dependencies); } else { m_Owner.Mark(m_Name, m_Dependencies); } } else { m_Owner.RollBackTo(m_Owner.Current); } }
public void DeleteFromTimelineAtSameTimeAsCreation() { var timeline = new Timeline(BuildStorageOfType); timeline.Mark(); var obj = timeline.AddToTimeline <MockHistoryObject>(BuildObject); timeline.RemoveFromTimeline(obj.HistoryId); Assert.IsFalse(timeline.HasObjectEverExisted(obj.HistoryId)); Assert.IsFalse(timeline.DoesObjectExistCurrently(obj.HistoryId)); }