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_Finalizers()
        {
            var cd = new WeakCacheDictionary <Obj, string>();

            var initial = Obj.FinalizeCount;

            for (var i = 1; i <= 10; i++)
            {
                Assert.IsTrue(GetOrAdd(cd).Contains("Obj"));

                // NB: This has shown to be flaky on Mono.
                if (Type.GetType("Mono.Runtime") == null)
                {
                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                    Assert.AreEqual(i, Obj.FinalizeCount - initial);
                }
            }
        }
        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
        }