public void LeastRecentlyUsedCompiledDelegateCache_Basics() { var lru = new LeastRecentlyUsedCompiledDelegateCache(4); Assert.AreEqual(0, lru.Count); var f1 = (Func <int>)lru.GetOrAdd(Expression.Lambda(Expression.Constant(42))); Assert.AreEqual(42, f1()); Assert.AreEqual(1, lru.Count); var f2 = (Func <int>)lru.GetOrAdd(Expression.Lambda(Expression.Constant(42))); Assert.AreEqual(42, f2()); Assert.AreSame(f1, f2); Assert.AreEqual(1, lru.Count); var f3 = (Func <int>)lru.GetOrAdd(Expression.Lambda(Expression.Constant(43))); Assert.AreEqual(43, f3()); Assert.AreEqual(2, lru.Count); lru.Clear(); var f4 = (Func <int>)lru.GetOrAdd(Expression.Lambda(Expression.Constant(42))); Assert.AreEqual(42, f4()); Assert.AreNotSame(f1, f4); Assert.AreEqual(1, lru.Count); }
public void LeastRecentlyUsedCompiledDelegateCache_ArgumentChecking() { Assert.ThrowsException <ArgumentOutOfRangeException>(() => _ = new LeastRecentlyUsedCompiledDelegateCache(0)); Assert.ThrowsException <ArgumentOutOfRangeException>(() => _ = new LeastRecentlyUsedCompiledDelegateCache(-1)); var lru = new LeastRecentlyUsedCompiledDelegateCache(4); Assert.ThrowsException <ArgumentNullException>(() => lru.GetOrAdd(expression: null)); }
public void CachedLambdaCompiler_LRU() { var lru = new LeastRecentlyUsedCompiledDelegateCache(4); int hit = 0, add = 0, evict = 0; var evicted = new List <CacheEventArgs>(); var assert = AssertHelper(() => (hit, add, evict)); lru.Hit += (o, e) => { hit++; }; lru.Added += (o, e) => { add++; }; lru.Evicted += (o, e) => { evict++; evicted.Add(e); }; var l1 = (Expression <Func <int> >)(() => 42); var d1 = lru.GetOrAdd(l1); assert((hit: 0, add: 1, evict: 0)); var d2 = lru.GetOrAdd(l1); assert((hit: 1, add: 1, evict: 0)); Assert.AreSame(d1, d2); var d3 = lru.GetOrAdd(l1); assert((hit: 2, add: 1, evict: 0)); Assert.AreSame(d1, d3); var l2 = (Expression <Func <int> >)(() => 43); var d4 = lru.GetOrAdd(l2); assert((hit: 2, add: 2, evict: 0)); var d5 = lru.GetOrAdd(l2); assert((hit: 3, add: 2, evict: 0)); Assert.AreSame(d4, d5); var d6 = lru.GetOrAdd(l2); assert((hit: 4, add: 2, evict: 0)); Assert.AreSame(d4, d6); var l3 = (Expression <Func <int> >)(() => 44); var d7 = lru.GetOrAdd(l3); assert((hit: 4, add: 3, evict: 0)); var l4 = (Expression <Func <int> >)(() => 45); var d8 = lru.GetOrAdd(l4); assert((hit: 4, add: 4, evict: 0)); var d11 = lru.GetOrAdd(l2); assert((hit: 5, add: 4, evict: 0)); Assert.AreSame(d4, d11); var l5 = (Expression <Func <int> >)(() => 46); var d9 = lru.GetOrAdd(l5); assert((hit: 5, add: 5, evict: 1)); Assert.AreSame(d1, evicted[0].Delegate); Assert.AreSame(l1, evicted[0].Lambda); var d10 = lru.GetOrAdd(l1); assert((hit: 5, add: 6, evict: 2)); Assert.AreSame(d7, evicted[1].Delegate); Assert.AreSame(l3, evicted[1].Lambda); Assert.AreNotSame(d1, d10); }