public void BadAdd()
        {
            var ld = new RecentDictionary <int, int>();

            ld.Add(42, 42);
            // Can't add when key already exists:
            Assert.Throws <ArgumentException>(() => ld.Add(42, 123));
        }
        public void ZeroHash()
        {
            // Check hashcode of 0, which is a special case.
            var ld = new RecentDictionary <string, string>(100, new BadHasher());

            ld.Add("foo", "bar");
            Assert.Equal("bar", ld["foo"]);
            Assert.True(ld.Remove("foo"));
        }
        public void RemoveMissing()
        {
            var ld = new RecentDictionary <string, int>();

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

            Assert.False(ld.Remove("12345"));
        }
        public void RemoveAndResize()
        {
            var ld = new RecentDictionary <string, int>();

            // Add first 500.
            for (int i = 0; i < 500; i++)
            {
                ld.Add(i.ToString(), i);
            }

            // remove everything divisible by 7
            for (int i = 0; i < 500; i += 7)
            {
                bool removed = ld.Remove(i.ToString());
                Assert.True(removed);
            }

            // Add 2000 more elements to force resizing.
            for (int i = 500; i < 2500; i++)
            {
                ld.Add(i.ToString(), i);
            }

            for (int i = 0; i < 2500; i++)
            {
                bool found = ld.TryGetValue(i.ToString(), out int ret);
                if ((i < 500) && (i % 7 == 0))
                {
                    Assert.False(found);
                }
                else
                {
                    Assert.True(found);
                    Assert.Equal(i, ret);
                }
            }
        }
        public void ContainsValue()
        {
            var ld = new RecentDictionary <string, int>();

            for (int i = 0; i < 100; i++)
            {
                ld.Add(i.ToString(), i);
            }

            ld.Remove("42");

            Assert.True(ld.ContainsValue(66));
            Assert.True(ld.Values.Contains(88));
            Assert.False(ld.ContainsValue(42));
            Assert.False(ld.ContainsValue(543434));
        }
        public void EnumerateEmpty()
        {
            var ld = new RecentDictionary <string, int>();

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

            ld.Clear();
            Assert.Empty(ld);

            foreach (var kvp in ld)
            {
                Assert.True(false, "shouldn't ever get here");
            }
        }
        public void RemoveLru()
        {
            var ld = new RecentDictionary <string, int>();

            for (int i = 0; i < 42; i++)
            {
                ld.Add(i.ToString(), i);
            }

            ld.RemoveLeastRecent();
            Assert.False(ld.ContainsKey("0"));
            Assert.True(ld.ContainsKey("1"));
            Assert.Equal(41, ld.Count);

            // Access the least-recently used element, make
            // sure it doesn't get removed.

            Assert.Equal(1, ld["1"]);
            ld.RemoveLeastRecent();
            Assert.True(ld.ContainsKey("1"));
            Assert.False(ld.ContainsKey("2"));
        }
        public void EnumerateValues()
        {
            var ld = new RecentDictionary <int, int>();

            for (int i = 0; i < 100; i++)
            {
                ld.Add(i, i);
            }

            ld.Remove(99);

            bool[] returnedVals = new bool[99];
            foreach (var val in ld.Values)
            {
                Assert.False(returnedVals[val], "value was returned twice from enumerator");
                returnedVals[val] = true;
            }

            foreach (bool found in returnedVals)
            {
                Assert.True(found, "a value was not returned");
            }
        }
        public void EnumerateKeys()
        {
            var ld = new RecentDictionary <int, int>();

            for (int i = 0; i < 100; i++)
            {
                ld.Add(i, i);
            }

            ld.Remove(99);

            bool[] returnedKeys = new bool[99];
            foreach (var key in ld.Keys)
            {
                Assert.False(returnedKeys[key], "key was returned twice from enumerator");
                returnedKeys[key] = true;
            }

            foreach (bool found in returnedKeys)
            {
                Assert.True(found, "a key was not returned");
            }
        }
        public void CheckEnumerator()
        {
            var ld = new RecentDictionary <string, int>();

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

            bool removed = ld.Remove("9");

            Assert.True(removed);

            int counter = 0;

            foreach (var kvp in ld)
            {
                Assert.True(kvp.Value < 9);
                counter++;
            }

            Assert.Equal(9, counter);
        }