public void WeakCacheDictionary_Simple()
        {
            var cd = new WeakCacheDictionary <string, string>();

            var n = 0;

            Assert.AreEqual("FOO", cd.GetOrAdd("foo", s => { n++; return(s.ToUpper()); }));
            Assert.AreEqual(1, n);

            Assert.AreEqual("FOO", cd.GetOrAdd("foo", s => { n++; return(s.ToUpper()); }));
            Assert.AreEqual(1, n);

            Assert.AreEqual("BAR", cd.GetOrAdd("bar", s => { n++; return(s.ToUpper()); }));
            Assert.AreEqual(2, n);

            Assert.IsTrue(cd.Remove("bar"));
            Assert.AreEqual(2, n);

            Assert.IsFalse(cd.Remove("qux"));
            Assert.AreEqual(2, n);

            Assert.AreEqual("BAR", cd.GetOrAdd("bar", s => { n++; return(s.ToUpper()); }));
            Assert.AreEqual(3, n);

#if DEBUG
            Assert.IsTrue(cd.Keys.OrderBy(x => x).SequenceEqual(new[] { "bar", "foo" }));
#endif
        }
        public void WeakCacheDictionary_Null()
        {
            var cd = new WeakCacheDictionary <string, string>();

            var n = 0;

            Assert.AreEqual("NULL", cd.GetOrAdd(key: null, s => { n++; return((s ?? "null").ToUpper()); }));
            Assert.AreEqual(1, n);

            Assert.AreEqual("NULL", cd.GetOrAdd(key: null, s => { n++; return((s ?? "null").ToUpper()); }));
            Assert.AreEqual(1, n);

            Assert.IsTrue(cd.Remove(key: null));
            Assert.AreEqual(1, n);

            Assert.AreEqual("NULL", cd.GetOrAdd(key: null, s => { n++; return((s ?? "null").ToUpper()); }));
            Assert.AreEqual(2, n);

#if DEBUG
            Assert.IsTrue(cd.Keys.Any(x => x == null));
#endif
        }