예제 #1
0
        public void CompareToOperatorWithEqualObjects()
        {
            var    first  = new HistoryId(10);
            object second = new HistoryId(10);

            Assert.AreEqual(0, first.CompareTo(second));
        }
예제 #2
0
        public void Clone()
        {
            var first  = new HistoryId(10);
            var second = first.Clone();

            Assert.AreEqual(first, second);
        }
예제 #3
0
        public void CompareToWithNullObject()
        {
            var    first  = new HistoryId(10);
            object second = null;

            Assert.AreEqual(1, first.CompareTo(second));
        }
예제 #4
0
        public void SmallerThanOperatorWithFirstObjectLarger()
        {
            var first  = new HistoryId(11);
            var second = new HistoryId(10);

            Assert.IsFalse(first < second);
        }
예제 #5
0
        public void SmallerThanOperatorWithFirstObjectSmaller()
        {
            var first  = new HistoryId(9);
            var second = new HistoryId(10);

            Assert.IsTrue(first < second);
        }
예제 #6
0
        public void SmallerThanOperatorWithBothObjectsNull()
        {
            HistoryId first  = null;
            HistoryId second = null;

            Assert.IsFalse(first < second);
        }
예제 #7
0
        public void SmallerThanOperatorWithEqualObjects()
        {
            var first  = new HistoryId(10);
            var second = new HistoryId(10);

            Assert.IsFalse(first < second);
        }
예제 #8
0
        public void SmallerThanOperatorWithFirstObjectNull()
        {
            HistoryId first  = null;
            var       second = new HistoryId(10);

            Assert.IsTrue(first < second);
        }
예제 #9
0
        public void SmallerThanOperatorWithSecondObjectNull()
        {
            var       first  = new HistoryId(10);
            HistoryId second = null;

            Assert.IsFalse(first < second);
        }
예제 #10
0
        public void LargerThanOperatorWithFirstObjectLarger()
        {
            var first  = new HistoryId(11);
            var second = new HistoryId(10);

            Assert.IsTrue(first > second);
        }
예제 #11
0
        public void LargerThanOperatorWithSecondObjectNull()
        {
            var       first  = new HistoryId(10);
            HistoryId second = null;

            Assert.IsTrue(first > second);
        }
예제 #12
0
        public void LargerThanOperatorWithFirstObjectNull()
        {
            HistoryId first  = null;
            var       second = new HistoryId(10);

            Assert.IsFalse(first > second);
        }
예제 #13
0
        public void CompareToWithSmallerFirstObject()
        {
            var    first  = new HistoryId(10);
            object second = new HistoryId(11);

            Assert.IsTrue(first.CompareTo(second) < 0);
        }
예제 #14
0
        public void CompareToWithUnequalObjectTypes()
        {
            var    first  = new HistoryId(10);
            object second = new object();

            Assert.Throws <ArgumentException>(() => first.CompareTo(second));
        }
예제 #15
0
        public void MarkClearsForwardHistory()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            timeline.AddToTimeline();
            timeline.Mark(new TimeMarker(2));

            timeline.Object.SomeValue = 1;
            timeline.Object.LotsOfValues.Add(2);
            timeline.Mark(new TimeMarker(3));

            timeline.DeleteFromTimeline();
            timeline.Mark(new TimeMarker(4));

            timeline.RollBackTo(new TimeMarker(2));

            timeline.Object.SomeValue = 2;
            timeline.Object.LotsOfValues.Add(3);
            timeline.Mark(new TimeMarker(3));

            timeline.RollForwardTo(new TimeMarker(10));
            Assert.AreEqual(2, timeline.Object.SomeValue);
            Assert.That(
                timeline.Object.LotsOfValues,
                Is.EquivalentTo(new int[] { 3 }));
        }
예제 #16
0
        public void DeleteClearsForwardHistory()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            timeline.AddToTimeline();
            timeline.Mark(new TimeMarker(2));

            timeline.Object.SomeValue = 1;
            timeline.Object.LotsOfValues.Add(2);
            timeline.Mark(new TimeMarker(3));

            timeline.DeleteFromTimeline();
            timeline.Mark(new TimeMarker(4));

            timeline.RollBackTo(new TimeMarker(2));
            timeline.DeleteFromTimeline();
            timeline.Mark(new TimeMarker(3));

            timeline.RollBackTo(new TimeMarker(2));
            Assert.IsTrue(timeline.IsAlive());
            Assert.AreEqual(new TimeMarker(2), timeline.CreationTime);
            Assert.AreEqual(new TimeMarker(3), timeline.DeletionTime);

            Assert.AreEqual(0, timeline.Object.SomeValue);
            Assert.AreEqual(0, timeline.Object.LotsOfValues.Count);
        }
예제 #17
0
        public void RollForwardPastDeath()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            var creationTime = new TimeMarker(1);

            timeline.AddToTimeline();
            timeline.Mark(creationTime);

            timeline.Object.SomeValue = 1;
            timeline.Object.LotsOfValues.Add(2);
            timeline.Mark(new TimeMarker(2));

            var deletionTime = new TimeMarker(3);

            timeline.DeleteFromTimeline();
            timeline.Mark(deletionTime);

            timeline.RollBackTo(new TimeMarker(1));
            Assert.IsTrue(timeline.IsAlive());

            timeline.RollForwardTo(new TimeMarker(4));
            Assert.IsFalse(timeline.IsAlive());
            Assert.IsNull(timeline.Object);
        }
예제 #18
0
        public void RollForwardWithLocalChange()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            var creationTime = new TimeMarker(1);

            timeline.AddToTimeline();
            timeline.Mark(creationTime);

            timeline.Object.SomeValue = 1;
            timeline.Object.LotsOfValues.Add(2);
            timeline.Mark(new TimeMarker(2));

            timeline.Object.SomeValue = 2;
            timeline.Object.LotsOfValues.Add(4);
            timeline.Mark(new TimeMarker(3));

            timeline.RollBackTo(new TimeMarker(2));
            timeline.Object.SomeValue = 3;
            timeline.Object.LotsOfValues.Add(8);

            timeline.RollForwardTo(new TimeMarker(3));
            Assert.AreEqual(2, timeline.Object.SomeValue);
            Assert.That(
                timeline.Object.LotsOfValues,
                Is.EquivalentTo(new int[] { 2, 4 }));
        }
예제 #19
0
        public void RollBackWhileNotExisting()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            Assert.DoesNotThrow(() => timeline.RollBackTo(new TimeMarker(0)));
        }
예제 #20
0
        public void RollBackFromDeathToLife()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            var creationTime = new TimeMarker(1);

            timeline.AddToTimeline();
            timeline.Mark(creationTime);

            timeline.Object.SomeValue = 1;
            timeline.Object.LotsOfValues.Add(2);
            timeline.Mark(new TimeMarker(2));

            var deletionTime = new TimeMarker(3);

            timeline.DeleteFromTimeline();
            timeline.Mark(deletionTime);

            Assert.DoesNotThrow(() => timeline.RollBackTo(new TimeMarker(2)));
            Assert.IsTrue(timeline.IsAlive());
            Assert.IsNotNull(timeline.Object);
            Assert.AreEqual(1, timeline.Object.SomeValue);
            Assert.That(
                timeline.Object.LotsOfValues,
                Is.EquivalentTo(new int[] { 2 }));
        }
예제 #21
0
        public void RollBackToPreviousValue()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            var creationTime = new TimeMarker(1);

            timeline.AddToTimeline();
            timeline.Mark(creationTime);

            int maximumValue = 10;

            for (int i = 1; i < maximumValue; i++)
            {
                timeline.Object.SomeValue = i;
                timeline.Object.LotsOfValues.Add(i);
                timeline.Mark(new TimeMarker((ulong)(i + 1)));
            }

            for (int i = maximumValue - 1; i > 0; i--)
            {
                timeline.RollBackTo(new TimeMarker((ulong)(i + 1)));
                Assert.AreEqual(i, timeline.Object.SomeValue);

                Assert.AreEqual(i, timeline.Object.LotsOfValues.Count);
                for (int j = 1; j <= i; j++)
                {
                    Assert.IsTrue(timeline.Object.LotsOfValues.Contains(j));
                }
            }
        }
예제 #22
0
        public void RollBackToBeginning()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            var creationTime = new TimeMarker(1);

            timeline.AddToTimeline();
            timeline.Mark(creationTime);

            int maximumValue = 10;

            for (int i = 0; i < maximumValue; i++)
            {
                timeline.Object.SomeValue = i;
                timeline.Object.LotsOfValues.Add(i);
                timeline.Mark(new TimeMarker((ulong)(i + 2)));
            }

            timeline.RollBackTo(new TimeMarker(1));
            Assert.IsTrue(timeline.IsAlive());
            Assert.IsNotNull(timeline.Object);
            Assert.AreEqual(0, timeline.Object.SomeValue);
            Assert.AreEqual(0, timeline.Object.LotsOfValues.Count);
        }
예제 #23
0
        public void DeleteFromTimeline()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            timeline.AddToTimeline();
            var creationTime = new TimeMarker(1);

            timeline.Mark(creationTime);

            Assert.IsTrue(timeline.IsAlive());
            Assert.AreEqual(creationTime, timeline.CreationTime);
            Assert.IsNull(timeline.DeletionTime);
            Assert.IsNotNull(timeline.Object);

            timeline.DeleteFromTimeline();
            var deletionTime = new TimeMarker(2);

            timeline.Mark(deletionTime);

            Assert.IsFalse(timeline.IsAlive());
            Assert.AreEqual(creationTime, timeline.CreationTime);
            Assert.AreEqual(deletionTime, timeline.DeletionTime);
            Assert.IsNull(timeline.Object);
        }
예제 #24
0
        public void DeleteFromTimelineWhileNotCreated()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            Assert.DoesNotThrow(() => timeline.DeleteFromTimeline());
        }
예제 #25
0
        private static MockHistoryObject BuildObject(
            HistoryId id,
            IEnumerable <Tuple <byte, IStoreTimelineValues> > members,
            params object[] constructorArguments)
        {
            IVariableTimeline <int>    someValue    = null;
            IListTimelineStorage <int> lotsOfValues = null;

            foreach (var pair in members)
            {
                if (pair.Item1 == MockHistoryObject.SomeValueIndex)
                {
                    someValue = pair.Item2 as IVariableTimeline <int>;
                    continue;
                }

                if (pair.Item1 == MockHistoryObject.LotsOfValuesIndex)
                {
                    lotsOfValues = pair.Item2 as IListTimelineStorage <int>;
                    continue;
                }
            }

            return(new MockHistoryObject(id, someValue, lotsOfValues));
        }
예제 #26
0
        /// <summary>
        /// Removes the object with the given <see cref="HistoryId"/> from the timeline.
        /// </summary>
        /// <param name="id">The ID of the object that should be removed.</param>
        public void RemoveFromTimeline(HistoryId id)
        {
            if ((id == null) || (!m_ObjectTimelines.ContainsKey(id) && !m_NonMarkedObjectTimelines.ContainsKey(id)))
            {
                return;
            }

            if (m_ObjectTimelines.ContainsKey(id))
            {
                // Only delete living objects. Don't delete objects that are already dead
                // and don't delete objects that don't exist yet.
                var timeline = m_ObjectTimelines[id];
                if (timeline.IsAlive())
                {
                    timeline.DeleteFromTimeline();
                }
            }
            else
            {
                // The timeline exists but the object doesn't have a creation time. Thus the creation time
                // must be the next marker. Hence we delete the object and then nuke the timeline.
                var timeline = m_NonMarkedObjectTimelines[id];
                timeline.DeleteFromTimeline();

                m_NonMarkedObjectTimelines.Remove(id);
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="ObjectUnknownToTimelineException"/> class.
 /// </summary>
 /// <param name="id">The history ID of the unknown object.</param>
 public ObjectUnknownToTimelineException(HistoryId id)
     : this(
         string.Format(
             CultureInfo.InvariantCulture,
             Resources.Exceptions_Messages_ObjectUnknownToTimeline_WithId,
             id))
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="TimelineIdDoesNotMatchException"/> class.
 /// </summary>
 /// <param name="provided">The ID number that was provided.</param>
 /// <param name="expected">The ID number that was expected.</param>
 public TimelineIdDoesNotMatchException(HistoryId provided, HistoryId expected)
     : this(
         string.Format(
             CultureInfo.InvariantCulture,
             Resources.Exceptions_Messages_HistoryIdDoesNotMatch_WithIds,
             provided,
             expected))
 {
 }
예제 #29
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TimelineTraveller"/> class.
        /// </summary>
        /// <param name="owner">The ID number of the owner who created the time traveling information.</param>
        /// <param name="information">
        /// The information that should be provided to the owner after the roll-back or roll-forward.
        /// </param>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="owner"/> is <see langword="null" />.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        ///     Thrown if <paramref name="information"/> is <see langword="null" />.
        /// </exception>
        public TimelineTraveller(HistoryId owner, Stream information)
        {
            {
                Lokad.Enforce.Argument(() => owner);
                Lokad.Enforce.Argument(() => information);
            }

            m_OwnerId     = owner;
            m_Information = information;
        }
예제 #30
0
        public void AddToTimelineWithExistingObject()
        {
            var id       = new HistoryId();
            var timeline = new ObjectTimeline <MockHistoryObject>(id, BuildStorageOfType, BuildObject);

            timeline.AddToTimeline();
            var marker = new TimeMarker(1);

            timeline.Mark(marker);

            Assert.Throws <ObjectHasAlreadyBeenAddedToTheTimelineException>(() => timeline.AddToTimeline());
        }