public void AddWithDuplicateKey()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);
            Assert.Throws<ArgumentException>(() => storage.Add(key, value));
        }
        public void Add()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);

            Assert.IsTrue(storage.ContainsKey(key));
            Assert.AreEqual(1, storage.Count);
            Assert.AreEqual(value, storage[key]);
        }
        public void AddVoidsForwardStack()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
            }

            storage.StoreCurrent(new TimeMarker(1));
            storage[5] = maximumValue;
            storage.StoreCurrent(new TimeMarker(2));

            storage.RollBackTo(new TimeMarker(1));

            storage.Add(11, 11);
            storage.StoreCurrent(new TimeMarker(3));

            storage.RollForwardTo(new TimeMarker(2));

            Assert.AreEqual(maximumValue + 1, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                if (index < maximumValue)
                {
                    Assert.AreEqual(index, pair.Key);
                    Assert.AreEqual(index, pair.Value);
                }
                else
                {
                    Assert.AreEqual(index + 1, pair.Key);
                    Assert.AreEqual(index + 1, pair.Value);
                }

                index++;
            }
        }
        public void RollForwardToLastValue()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            storage.RollBackTo(new TimeMarker(5));
            storage.RollForwardTo(new TimeMarker((ulong)maximumValue));

            Assert.AreEqual(maximumValue, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                Assert.AreEqual(index, pair.Key);
                Assert.AreEqual(index, pair.Value);

                index++;
            }
        }
        public void RollForwardThroughUpdate()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
            }

            storage.StoreCurrent(new TimeMarker(1));

            storage[5] = maximumValue;
            storage.StoreCurrent(new TimeMarker(2));

            storage.RollBackToStart();
            storage.RollForwardTo(new TimeMarker(2));

            Assert.AreEqual(maximumValue, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                Assert.AreEqual(index, pair.Key);
                if (index != 5)
                {
                    Assert.AreEqual(index, pair.Value);
                }
                else
                {
                    Assert.AreEqual(maximumValue, pair.Value);
                }

                index++;
            }
        }
        public void RollForwardThroughClear()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
            }

            storage.StoreCurrent(new TimeMarker(1));

            storage.Clear();
            storage.Add(maximumValue + 1, maximumValue + 1);

            storage.StoreCurrent(new TimeMarker(2));

            storage.RollBackToStart();
            storage.RollForwardTo(new TimeMarker(2));

            Assert.AreEqual(1, storage.Count);
            Assert.IsTrue(storage.ContainsKey(maximumValue + 1));
        }
        public void RemoveWithNullKey()
        {
            var storage = new DictionaryHistory<string, string>();

            bool result = true;
            Assert.DoesNotThrow(
                () =>
                {
                    result = storage.Remove(null);
                });
            Assert.IsFalse(result);
        }
 public void AddWithNullKey()
 {
     var storage = new DictionaryHistory<string, string>();
     Assert.Throws<ArgumentNullException>(() => storage.Add(null, "a"));
 }
        public void TryGetValueWithNullKey()
        {
            var storage = new DictionaryHistory<string, string>();

            string result;
            var success = storage.TryGetValue(null, out result);

            Assert.IsFalse(success);
            Assert.AreEqual(null, result);
        }
        public void RollBackToFirstValue()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            storage.RollBackTo(new TimeMarker(1));
            Assert.AreEqual(1, storage.Count);
            Assert.IsTrue(storage.ContainsKey(0));
        }
        public void RollBackThroughRemove()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
            }

            storage.StoreCurrent(new TimeMarker(1));

            storage.Remove(5);
            storage.StoreCurrent(new TimeMarker(2));

            storage.RollBackTo(new TimeMarker(1));
            Assert.AreEqual(maximumValue, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                Assert.AreEqual(index, pair.Key);
                Assert.AreEqual(index, pair.Value);

                index++;
            }
        }
        public void RollBackMultipleTimes()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            for (int i = maximumValue; i > 0; i--)
            {
                storage.RollBackTo(new TimeMarker((ulong)i));
                Assert.AreEqual(i, storage.Count);
                for (int j = 1; j <= i; j++)
                {
                    Assert.IsTrue(storage.ContainsKey(j - 1));
                }
            }
        }
        public void RemoveWithUnknownKey()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);

            Assert.IsFalse(storage.Remove(value));
        }
        public void RollForwardToPriorToNextSnapshot()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 30;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            // The snapshot is at 21
            storage.RollBackTo(new TimeMarker(16));
            storage.RollForwardTo(new TimeMarker(20));

            Assert.AreEqual(20, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                Assert.AreEqual(index, pair.Key);
                Assert.AreEqual(index, pair.Value);

                index++;
            }
        }
        public void RollBackToLastSnapshot()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 30;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            // The first snapshot is at 1, the next one is 20 further so it is at 21
            storage.RollBackTo(new TimeMarker(21));
            Assert.AreEqual(21, storage.Count);

            int index = 0;
            foreach (var pair in storage)
            {
                Assert.AreEqual(index, pair.Key);
                Assert.AreEqual(index, pair.Value);

                index++;
            }
        }
        public void RollForwardWithLocalChange()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, i);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            storage.RollBackToStart();
            storage.Add(maximumValue + 1, maximumValue + 1);

            for (int i = 1; i < maximumValue; i++)
            {
                storage.RollForwardTo(new TimeMarker((ulong)i));
                Assert.AreEqual(i, storage.Count);
                for (int j = 1; j <= i; j++)
                {
                    Assert.IsTrue(storage.ContainsKey(j - 1));
                }
            }
        }
        public void RollBackToStart()
        {
            var storage = new DictionaryHistory<int, int>();

            int maximumValue = 10;
            for (int i = 0; i < maximumValue; i++)
            {
                storage.Add(i, 1);
                storage.StoreCurrent(new TimeMarker((ulong)(i + 1)));
            }

            storage.RollBackToStart();
            Assert.AreEqual(0, storage.Count);
        }
        public void TryGetValueWithExistingValue()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);

            int result;
            var success = storage.TryGetValue(key, out result);

            Assert.IsTrue(success);
            Assert.AreEqual(value, result);
        }
 public void RollBackToStartWithNoValues()
 {
     var storage = new DictionaryHistory<int, int>();
     Assert.DoesNotThrow(() => storage.RollBackToStart());
 }
        public void TryGetValueWithUnknownValue()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);

            int result;
            var success = storage.TryGetValue(value, out result);

            Assert.IsFalse(success);
            Assert.AreEqual(0, result);
        }
 public void RollBackWithNoValues()
 {
     var storage = new DictionaryHistory<int, int>();
     Assert.DoesNotThrow(() => storage.RollBackTo(new TimeMarker(1)));
 }
        public void Clear()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);
            storage.Clear();

            Assert.AreEqual(0, storage.Count);
            Assert.IsFalse(storage.ContainsKey(key));
        }
        public void Remove()
        {
            var storage = new DictionaryHistory<int, int>();

            int key = 5;
            int value = 10;
            storage.Add(key, value);

            var result = storage.Remove(key);
            Assert.IsTrue(result);
            Assert.AreEqual(0, storage.Count);
            Assert.IsFalse(storage.ContainsKey(key));
        }