public void TestContains()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache["Entry 1"] = "Hello";
            Assert.IsTrue(comPlusCache.Contains("Entry 1"));
        }
        public void TestSetAndGetViaDictionaryAccess()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache["Entry 1"] = "Hello";
            Assert.AreEqual("Hello", comPlusCache["Entry 1"]);
        }
        public void TestRemove()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache.Add("Entry 1", "Hello");
            Assert.IsTrue(comPlusCache.Contains("Entry 1"));
            comPlusCache.Remove("Entry 1");
            Assert.IsFalse(comPlusCache.Contains("Entry 1"));
        }
        public void TestIterate()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache["Entry 1"] = "Hello";
            foreach (var entry in comPlusCache)
            {
                Assert.AreEqual("Hello", entry.Value);
                Assert.AreEqual("Entry 1", entry.Key);
            }
        }
        public void TestSetAndGet()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache.Set("Entry 1", "Hello", new DateTime(9999, 1, 1));
            Assert.AreEqual("Hello", comPlusCache.Get("Entry 1"));
            comPlusCache.Set("Entry 2", "Hello 2", new TimeSpan(365, 0, 0, 0));
            Assert.AreEqual("Hello 2", comPlusCache.Get("Entry 2"));
            comPlusCache.Set("Entry 3", new object(), new DateTime(9999, 1, 1));
            Assert.IsTrue(comPlusCache.Contains("Entry 3"));
            comPlusCache.Set("Entry 4", new object(), new TimeSpan(365, 0, 0, 0));
            Assert.IsTrue(comPlusCache.Contains("Entry 4"));
        }
        public void TestAddOrUpdate()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache.Clear();
            Assert.AreEqual("World", comPlusCache.AddOrUpdate("Entry 1", () => "World", () => "Hello"));
            Assert.AreEqual("World", comPlusCache["Entry 1"]);
            Assert.AreEqual("Brave New World",
                            comPlusCache.AddOrUpdate("Entry 1", () => "Hello World", () => "Brave New World"));
            Assert.AreEqual("Brave New World 2",
                            comPlusCache.AddOrUpdate("Entry 1", () => "Hello World", () => "Brave New World 2"));
            Assert.AreEqual("Brave New World 3",
                            comPlusCache.AddOrUpdate("Entry 1", () => "Hello World", () => "Brave New World 3"));
            comPlusCache.AddOrUpdate("Entry 2", () => new Dynamo(), () => null);
            Assert.IsNotNull(comPlusCache["Entry 2"]);
            Assert.IsTrue(comPlusCache["Entry 2"] is DynamicObject);
        }
        public void TestAddOrGetExisting()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            comPlusCache.Clear();
            Assert.AreEqual(null, comPlusCache.AddOrGetExisting("Entry 1", "Hello"));
            Assert.AreEqual("Hello", comPlusCache["Entry 1"]);
            var obj = new object();

            Assert.AreEqual(null, comPlusCache.AddOrGetExisting("Entry 2", obj));
            Assert.IsNotNull(comPlusCache["Entry 2"]);
            Assert.IsTrue(comPlusCache["Entry 2"] is DynamicObject);
            Assert.AreEqual("Hi", comPlusCache.GetOrAdd("Entry 3", () => "Hi"));
            Assert.AreEqual("Hi", comPlusCache.GetOrAdd("Entry 3", () => "Hello"));

            Assert.AreEqual(123, comPlusCache.GetOrAdd("Entry 4", () => 123));
            Assert.AreEqual(123, comPlusCache.GetOrAdd("Entry 4", () => 345));
        }
        public void TestAdd()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            Assert.IsTrue(comPlusCache.Add("Entry 1", "Hello"));
            Assert.IsFalse(comPlusCache.Add("Entry 1", "Hello"));
            Assert.IsTrue(comPlusCache.Add("Entry 2", new object()));
            Assert.IsTrue(comPlusCache.Add("Entry 3", "Hello", new DateTime(9999, 1, 1)));
            Assert.IsTrue(comPlusCache.Add("Entry 4", new object(), new DateTime(9999, 1, 1)));
            Assert.IsTrue(comPlusCache.Add("Entry 5", "Hello", new TimeSpan(1, 1, 1, 1)));
            Assert.IsTrue(comPlusCache.Add("Entry 6", new object(), new TimeSpan(1, 1, 1, 1)));
            Assert.IsTrue(comPlusCache.Contains("Entry 1"));
            Assert.IsTrue(comPlusCache.Contains("Entry 2"));
            Assert.IsTrue(comPlusCache.Contains("Entry 3"));
            Assert.IsTrue(comPlusCache.Contains("Entry 4"));
            Assert.IsTrue(comPlusCache.Contains("Entry 5"));
            Assert.IsTrue(comPlusCache.Contains("Entry 6"));
        }
        public void TestAddOrUpdateParallelWithSameComPlusReference()
        {
            var cd = new ComPlusCache("Concurrent");

            //var dict = new ConcurrentDictionary<string, int>();
            cd.Clear();
            var addCnt   = 0;
            var updCnt   = 0;
            var totalCnt = 0;

            Parallel.For(0, 10000, i =>
            {
                Interlocked.Increment(ref totalCnt);
                cd.AddOrUpdate("1", () =>
                {
                    Interlocked.Increment(ref addCnt);
                    return(1);
                }, () =>
                {
                    Interlocked.Increment(ref updCnt);
                    return(new Random().Next(10000));
                });
            });
            var cnt = 0;

            // ReSharper disable once UnusedVariable
            foreach (var item in cd)
            {
                cnt++;
            }
            Assert.AreEqual(1, cnt);
            Assert.AreEqual(10000, totalCnt);
            Assert.AreEqual(1, addCnt);
            Assert.AreEqual(9999, updCnt);
            Assert.AreNotEqual(-1, (int)cd["1"]);

            int value = (int)cd.GetOrAdd("2", () => 100);

            Assert.AreEqual(100, value);

            // Should return 100, as key 2 is already set to that value
            value = (int)cd.GetOrAdd("2", () => 10000);
            Assert.AreEqual(100, value);
        }
        public void TestStressConcurrent()
        {
            const int threadCount = 4;
            const int loops       = 1000;
            var       totalLoops  = 0;
            var       threads     = new Thread[threadCount];

            for (var i = 0; i < threadCount; i++)
            {
                (threads[i] = new Thread(context =>
                {
                    var externalCache = new ComPlusCache();
                    for (var j = 0; j < loops; j++)
                    {
                        var item = new Dynamo();
                        var item2 = new Dynamo();
                        item["P1"] = "Property " + j;
                        externalCache.AddOrUpdate($"Item {(int) context}-{j}", () => item, () => item2);
                        Assert.IsTrue(externalCache.Contains($"Item {(int) context}-{j}"));
                        var returnedItem = (Dynamo)externalCache.Get($"Item {(int) context}-{j}");
                        Assert.AreEqual("Property " + j, returnedItem["P1"]);
                        externalCache.Remove($"Item {(int) context}-{j}");
                        Assert.IsFalse(externalCache.Contains($"Item {(int) context}-{j}"));
                        externalCache.AddOrUpdate($"Item {j}", () => item, () => item2);
                        Assert.IsTrue(externalCache.Contains($"Item {j}"));
                        var item3 = externalCache.GetOrAdd($"Item {j}", () => item2);
                        Assert.IsNotNull(item3);
                        Interlocked.Increment(ref totalLoops);
                    }
                })).Start(i);
            }
            foreach (var thread in threads)
            {
                thread.Join();
            }
            Assert.AreEqual(threadCount * loops, totalLoops);
        }
        public void TestCreateNamed()
        {
            var comPlusCache = new ComPlusCache("TestCache");

            Assert.IsNotNull(comPlusCache);
        }
        public void TestCreate()
        {
            var comPlusCache = new ComPlusCache();

            Assert.IsNotNull(comPlusCache);
        }