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 }