protected static void Unbounded_Trim1(IMemoizationCacheFactory mcf) { var res = mcf.Create <int, int>(x => x * 2, MemoizationOptions.None, EqualityComparer <int> .Default); Assert.AreEqual(42, res.GetOrAdd(21)); Assert.AreEqual(1, res.Count); var trim = res.AsTrimmableByArgumentAndResult(); Assert.IsNotNull(trim); trim.Trim(kv => kv.Key % 2 == 0); Assert.AreEqual(1, res.Count); trim.Trim(kv => kv.Key % 3 == 0); Assert.AreEqual(0, res.Count); Assert.AreEqual(42, res.GetOrAdd(21)); Assert.AreEqual(1, res.Count); trim.Trim(kv => kv.Value % 2 != 0); Assert.AreEqual(1, res.Count); trim.Trim(kv => kv.Value % 3 == 0); Assert.AreEqual(0, res.Count); }
protected static void Unbounded_Trim2(IMemoizationCacheFactory mcf) { var res = mcf.Create <int, int>(x => 100 / x, MemoizationOptions.CacheException, EqualityComparer <int> .Default); Assert.ThrowsException <DivideByZeroException>(() => res.GetOrAdd(0)); Assert.AreEqual(1, res.Count); Assert.AreEqual(50, res.GetOrAdd(2)); Assert.AreEqual(2, res.Count); var trim = res.AsTrimmableByArgumentAndResult(); Assert.IsNotNull(trim); trim.Trim(kv => kv.Key % 2 == 0); Assert.AreEqual(1, res.Count); var trimErr = res.AsTrimmableByArgumentAndResultOrError(); Assert.IsNotNull(trimErr); trimErr.Trim(kv => kv.Value.Kind == ValueOrErrorKind.Error && kv.Key == 0); Assert.AreEqual(0, res.Count); trimErr.Trim(kv => kv.Key % 3 == 0); Assert.AreEqual(0, res.Count); Assert.ThrowsException <DivideByZeroException>(() => res.GetOrAdd(0)); Assert.AreEqual(1, res.Count); Assert.AreEqual(50, res.GetOrAdd(2)); Assert.AreEqual(2, res.Count); }
protected static void Unbounded_ErrorCaching(IMemoizationCacheFactory mcf) { var n = 0; var cache = mcf.Create <string, int>(s => { n++; return(s.Length); }, MemoizationOptions.CacheException, comparer: null); Assert.AreEqual(0, cache.Count); Assert.AreEqual(0, n); for (var i = 1; i <= 3; i++) { Assert.ThrowsException <NullReferenceException>(() => cache.GetOrAdd(argument: null)); Assert.AreEqual(1, cache.Count); Assert.AreEqual(1, n); } }
protected static void Unbounded_Simple(IMemoizationCacheFactory mcf) { foreach (var options in new[] { MemoizationOptions.None, MemoizationOptions.CacheException }) { var n = 0; var cache = mcf.Create <string, int>(s => { n++; return(s.Length); }, options, comparer: null); Assert.AreEqual(0, cache.Count); Assert.AreEqual(0, n); Assert.AreEqual(3, cache.GetOrAdd("foo")); Assert.AreEqual(1, cache.Count); Assert.AreEqual(1, n); Assert.AreEqual(3, cache.GetOrAdd("foo")); Assert.AreEqual(1, cache.Count); Assert.AreEqual(1, n); Assert.AreEqual(4, cache.GetOrAdd("test")); Assert.AreEqual(2, cache.Count); Assert.AreEqual(2, n); cache.Clear(); Assert.AreEqual(0, cache.Count); Assert.AreEqual(2, n); Assert.AreEqual(3, cache.GetOrAdd("foo")); Assert.AreEqual(1, cache.Count); Assert.AreEqual(3, n); Assert.AreEqual(3, cache.GetOrAdd("foo")); Assert.AreEqual(1, cache.Count); Assert.AreEqual(3, n); Assert.AreEqual(4, cache.GetOrAdd("test")); Assert.AreEqual(2, cache.Count); Assert.AreEqual(4, n); Assert.IsTrue(!string.IsNullOrEmpty(cache.DebugView)); } }
protected static void Unbounded_ArgumentChecking(IMemoizationCacheFactory mcf) { Assert.ThrowsException <ArgumentNullException>(() => mcf.Create(default(Func <int, int>), MemoizationOptions.None, EqualityComparer <int> .Default)); }