Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }