public void TimedLRUCache_FlushLRU() { TimedLRUCache <int, int> cache; cache = new TimedLRUCache <int, int>(); Assert.IsFalse(cache.RenewTTD); cache.Add(0, 0, TimeSpan.FromSeconds(1.0)); cache.Add(1, 1, TimeSpan.FromSeconds(1.0)); cache.Add(2, 2, TimeSpan.FromSeconds(4.0)); cache.Add(3, 3, TimeSpan.FromSeconds(1.0)); cache.Touch(0); cache.Touch(1); cache.Touch(3); // Item 2 should now head the LRU list Thread.Sleep(TimeSpan.FromSeconds(1) + SysTime.Resolution); cache.FlushLRU(); // All the items should still be present since // item 2 hasn't expired yet and will block any // other items from be purged Assert.IsTrue(cache.ContainsKey(0)); Assert.IsTrue(cache.ContainsKey(1)); Assert.IsTrue(cache.ContainsKey(2)); Assert.IsTrue(cache.ContainsKey(3)); Thread.Sleep(TimeSpan.FromSeconds(3) + SysTime.Resolution); // All of the items should have expired by now cache.FlushLRU(); Assert.IsFalse(cache.ContainsKey(0)); Assert.IsFalse(cache.ContainsKey(1)); Assert.IsFalse(cache.ContainsKey(2)); Assert.IsFalse(cache.ContainsKey(3)); }
public void TimedLRUCache_AutoDispose() { TimedLRUCache <int, TestItem> cache; DisposableItem dItem0 = new DisposableItem(0); DisposableItem dItem1 = new DisposableItem(1); DisposableItem dItem2 = new DisposableItem(2); TestItem item0 = new TestItem(0); TestItem item1 = new TestItem(1); TestItem item2 = new TestItem(2); cache = new TimedLRUCache <int, TestItem>(); cache.AutoDispose = true; cache.DefaultTTL = TimeSpan.FromMilliseconds(200); // Verify that disposable items are disposed when they // are implicitly removed from the cache when the maximum // number of items allowed has been exceeded. cache.MaxItems = 2; cache.Add(0, dItem0); cache.Add(1, dItem1); cache.Add(2, dItem2); Assert.AreEqual(2, cache.Count); Assert.IsTrue(dItem0.IsDisposed); Assert.IsFalse(dItem1.IsDisposed); Assert.IsFalse(dItem2.IsDisposed); // Verify that disposable items are disposed when the // cache is cleared. cache.Clear(); Assert.IsTrue(dItem1.IsDisposed); Assert.IsTrue(dItem2.IsDisposed); // Verify that disposable items are disposed when they // are explicitly removed. dItem0.IsDisposed = false; cache.Add(0, dItem0); cache.Remove(0); Assert.IsTrue(dItem0.IsDisposed); // Verify that disposable items are disposed when they // are replaced in the cache. cache.Clear(); dItem0.IsDisposed = false; dItem1.IsDisposed = false; cache.Add(0, dItem0); cache[0] = dItem1; Assert.IsTrue(dItem0.IsDisposed); // Verify that replacing the same disposable item instance // doesn't dispose the object. cache.Clear(); dItem0.IsDisposed = false; cache.Add(0, dItem0); cache[0] = dItem0; Assert.IsFalse(dItem0.IsDisposed); // Verify disposal after flushing. cache.Clear(); dItem0.IsDisposed = false; dItem1.IsDisposed = false; dItem2.IsDisposed = false; cache.Add(0, dItem0); cache.Add(1, dItem1); cache.Add(2, dItem2); Thread.Sleep(250); cache.Flush(); Assert.IsTrue(dItem0.IsDisposed); Assert.IsTrue(dItem1.IsDisposed); Assert.IsTrue(dItem2.IsDisposed); cache.Clear(); dItem0.IsDisposed = false; dItem1.IsDisposed = false; dItem2.IsDisposed = false; cache.Add(0, dItem0); cache.Add(1, dItem1); cache.Add(2, dItem2); Thread.Sleep(250); cache.FlushLRU(); Assert.IsTrue(dItem0.IsDisposed); Assert.IsTrue(dItem1.IsDisposed); Assert.IsTrue(dItem2.IsDisposed); // Verify that non-disposable items don't cause trouble // when AutoDispose=true cache.Clear(); cache.Add(0, item0); cache.Add(1, item1); cache.Add(2, item2); cache.Remove(1); cache[1] = new TestItem(3); cache[2] = cache[2]; cache.Clear(); cache.Add(0, item0); cache.Add(1, item1); cache.Add(2, item2); Thread.Sleep(250); cache.Flush(); cache.Add(0, item0); cache.Add(1, item1); cache.Add(2, item2); Thread.Sleep(250); cache.FlushLRU(); }