public void PublicFetchOrCreateItemPassesArgument() { // Arrange ReaderWriterCacheHelper <int, string> helper = new ReaderWriterCacheHelper <int, string>(); Dictionary <int, string> cache = helper.PublicCache; // Act string item = helper.PublicFetchOrCreateItem(42, (string argument) => argument, "new"); // Assert Assert.Equal("new", cache[42]); Assert.Equal("new", item); }
public void PublicFetchOrCreateItemCreatesItemIfNotAlreadyInCache() { // Arrange ReaderWriterCacheHelper <int, string> helper = new ReaderWriterCacheHelper <int, string>(); Dictionary <int, string> cache = helper.PublicCache; // Act string item = helper.PublicFetchOrCreateItem(42, () => "new"); // Assert Assert.Equal("new", cache[42]); Assert.Equal("new", item); }
public void PublicFetchOrCreateItemReturnsExistingItemIfFound() { // Arrange ReaderWriterCacheHelper <int, string> helper = new ReaderWriterCacheHelper <int, string>(); Dictionary <int, string> cache = helper.PublicCache; helper.PublicCache[42] = "original"; // Act string item = helper.PublicFetchOrCreateItem(42, () => "new"); // Assert Assert.Equal("original", cache[42]); Assert.Equal("original", item); }
public void PublicFetchOrCreateItemReturnsFirstItemIfTwoThreadsUpdateCacheSimultaneously() { // Arrange ReaderWriterCacheHelper <int, string> helper = new ReaderWriterCacheHelper <int, string>(); Dictionary <int, string> cache = helper.PublicCache; Func <string> creator = delegate() { // fake a second thread coming along when we weren't looking string firstItem = helper.PublicFetchOrCreateItem(42, () => "original"); Assert.AreEqual("original", cache[42], "Cache should have been updated."); Assert.AreEqual("original", firstItem); return("new"); }; // Act string secondItem = helper.PublicFetchOrCreateItem(42, creator); // Assert Assert.AreEqual("original", cache[42], "Cache should not have been updated by outer thread."); Assert.AreEqual("original", secondItem); }