public void TestOrderByWithTake() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache .OrderBy(x => x.Key) .Select(x => new { x.Key, x.Name }) .Take(3) .ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(3, result.Count); Assert.AreEqual("0", result[0].Key); Assert.AreEqual("Dummy Item 0", result[0].Name); Assert.AreEqual("1", result[1].Key); Assert.AreEqual("Dummy Item 1", result[1].Name); Assert.AreEqual("10", result[2].Key); Assert.AreEqual("Dummy Item 10", result[2].Name); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); //ok that's not nice Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestWhereWithFilterByString() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var data = context.DummyEntitiesWithCache .Where(x => (x.Name ?? string.Empty).IndexOf("11", StringComparison.InvariantCultureIgnoreCase) >= 0) .Select(x => new { Id = x.Key, x.Name }) .ToList(); stopWatch.Stop(); // Assert var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); // only identifiers are used Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); // proves that Where is replaced Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestFilterWithCachedProperties() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var result = context.DummyEntitiesWithCache.Any(x => x.Name.Contains("100")); stopWatch.Stop(); // Assert var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); // That's vary from 1 to 129, but we ultimately want it only once Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); //effectively gets data from cache Assert.IsTrue(result); Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); }
public void TestCombinesWithPendingChangesAddUpdate() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var newItem = new DummyEntity { Key = "1051", Name = "Test 1051" }; var newItem2 = new DummyEntity { Key = "751", Name = "Test 751" }; context.DummyEntitiesWithCache.Add(newItem); context.DummyEntitiesWithCache.Update(newItem2); // Act var addedItem = context.DummyEntitiesWithCache.FirstOrDefault(x => x.Key == "1051"); var updatedItem = context.DummyEntitiesWithCache.FirstOrDefault(x => x.Key == "751"); // Assert Assert.AreEqual(newItem2, updatedItem); Assert.AreEqual(newItem, addedItem); Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); }
public void TestGroupByWithToList() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.GroupBy(x => int.Parse(x.Key) % 10) .Select(g => new { g.Key, Data = g.ToList() }) .ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(10, result.Count); foreach (var x in result) { Assert.AreEqual(100, x.Data.Count); foreach (var d in x.Data) { Assert.IsNotNull(d.NonCachedField); } } var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(1000, methodCounter.EntityCallsCount); }
public void TestFirstOrDefaultWithContainsFilter() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var identifiers = Enumerable.Range(177, 20000).Select(i => i.ToString()); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); //var data = context.DummyEntitiesWithCache // .FirstOrDefault(x => identifiers.Contains(x.Key)); var data = context.DummyEntitiesWithCache .FirstOrDefault(x => x.Key == "177"); stopWatch.Stop(); // Assert var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); //YSV: one call to the datastorage // Ok, that's a problem here Assert.AreEqual(1, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); Assert.IsNotNull(data); }
public void TestCountWithContainsFilter() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var identifiers = Enumerable.Range(177, 20000).Select(i => i.ToString()); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var data = context.DummyEntitiesWithCache .Count(x => identifiers.Contains(x.Key)); stopWatch.Stop(); // Assert var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.IsTrue(stopWatch.ElapsedMilliseconds < 40); //YSV: successive call might take only 20 ms. Not sure what happens when it call it first Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); Assert.AreEqual(823, data); }
public void TestEffectivelyProcessesContains() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var identifiers = Enumerable.Range(0, 20000).Select(i => i.ToString()); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var data = context.DummyEntitiesWithCache .Where(x => identifiers.Contains(x.Key)) .Select(x => x.Key) .ToList(); stopWatch.Stop(); // Assert var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); // only identifiers are used Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); // proves that Where is replaced Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestSelectManySimple() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache .SelectMany(x => x.ListData.Select(i => new { x.Key, Number = i }).ToList()) .Where(x => x.Key.Contains(x.Number)) .ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(813, result.Count); foreach (var x in result) { Assert.IsTrue(x.Key.Contains(x.Number)); } var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(1000, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestSelectManyCombinesWithPendingChangesAddOrUpdate() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); context.DummyEntitiesWithCache.Add(new DummyEntity { Key = "1001", ListData = new[] { "1", "2", "10" } }); context.DummyEntitiesWithCache.Update(new DummyEntity { Key = "0", ListData = new[] { "0", "1", "2" } }); // Act var result = context.DummyEntitiesWithCache .SelectMany(x => x.ListData.Select(i => new { x.Key, Number = i }).ToList()) .Where(x => x.Key.Contains(x.Number)) .ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(816, result.Count); foreach (var x in result) { Assert.IsTrue(x.Key.Contains(x.Number)); } Assert.IsNotNull(result.FirstOrDefault(x => x.Key == "1001" && x.Number == "1")); Assert.IsNotNull(result.FirstOrDefault(x => x.Key == "1001" && x.Number == "10")); Assert.IsNotNull(result.FirstOrDefault(x => x.Key == "0" && x.Number == "0")); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(1000, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestWhereWithExpressionPredicateDefinedInAnotherMethod() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Where(ExprPredicate()).FirstOrDefault(); // Assert Assert.IsNotNull(result); Assert.AreEqual(1, methodCounter.EntityCallsCount); // proves that cache is not used }
public void TestWhereWithNotEqual() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Where(x => x.Key != "2" && x.Key != "32").FirstOrDefault(); // Assert Assert.IsNotNull(result); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestDontUseCacheIfReturnsEntity() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Where(x => x.Key == "324").FirstOrDefault(); // Assert Assert.AreEqual("NonCachedData324", result.NonCachedField); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestFirstOrDefaultWithoutFilter() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.FirstOrDefault(); // Assert Assert.IsNotNull(result); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestToList() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act context.DummyEntitiesWithCache.Add(new DummyEntity { }); var result = context.DummyEntitiesWithCache.ToList(); // Assert Assert.AreEqual(1001, result.Count); }
public void TestDontUseCacheIfReturnsListOfEntites() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.ToList(); // Assert var nonCachedData = result.Select(x => x.NonCachedField).Where(x => x.Contains("NonCachedData")).ToList(); Assert.AreEqual(1000, nonCachedData.Count); Assert.AreEqual(1000, methodCounter.EntityCallsCount); }
public void TestWhereWithFuncDefinedInAnotherMethod() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Where(x => Predicate()(x)).FirstOrDefault(); // NOTE: Just Where(Predicate()) will not work // Assert Assert.IsNotNull(result); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestToDictionaryWithTake() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Take(4).ToDictionary(x => x.Key, x => x.Name); // Assert Assert.IsNotNull(result); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(4, methodCounter.EntityCallsCount); }
public void TestFirstOrDefaultWithFilterReturningOneItem() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.FirstOrDefault(x => x.Name == "Dummy Item 75"); // Assert Assert.IsNotNull(result); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); // not expecting creating instances from cache - only quereing cache Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestFirstOrDefaultWithSingleId() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.FirstOrDefault(x => x.Key == "75"); // Assert Assert.IsNotNull(result); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestFilterWithCachedPropertiesComplexPredicate() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.FirstOrDefault(x => x.Name.Contains("Dummy Item ") && !x.Key.StartsWith("1")); // Assert Assert.IsNotNull(result); //Assert.AreEqual("2", result.Key); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(1, methodCounter.EntityCallsCount); }
public void TestWhereWithInlinePredicate() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act Func <DummyEntity, int> func = e => int.Parse(e.Key); var result = context.DummyEntitiesWithCache.Where(x => func(x) == 4).ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(1, result.Count); Assert.AreEqual("4", result[0].Key); Assert.AreEqual(1, methodCounter.EntityCallsCount); // 1 call for it process filter on cache first }
public void TestCombinesWithPendingChanges() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act - Removing var entity = context.DummyEntitiesWithCache.Where(x => x.Key == "2").FirstOrDefault(); Assert.AreEqual(1, methodCounter.EntityCallsCount); context.DummyEntitiesWithCache.Remove(entity); // Assert Assert.AreEqual(999, context.DummyEntitiesWithCache.Count()); Assert.AreEqual(1, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); // Act - Adding & Update var newItem = new DummyEntity { Key = "1051", Name = "Test 1051" }; var newItem2 = new DummyEntity { Key = "1071", Name = "Test 1071" }; var newItem3 = new DummyEntity { Key = "751", Name = "Test 751" }; context.DummyEntitiesWithCache.Add(newItem); context.DummyEntitiesWithCache.Add(newItem2); context.DummyEntitiesWithCache.Update(newItem3); // Assert Assert.AreEqual(1001, context.DummyEntitiesWithCache.Count()); Assert.AreEqual(1, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); }
public void TestCorrectlyProcessBadWhereWithNonCachedProperties() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var identifiers = (new[] { "1", "2", "17" }).AsEnumerable(); // Act var data = context.DummyEntitiesWithCache .Where(x => identifiers.Contains(x.Key) && x.NonCachedField == "NonCachedData17") .Select(x => x.Key) .ToArray(); // Assert CollectionAssert.AreEquivalent(new[] { "17" }, data); //must be equivalent if is gotten not from cache Assert.AreEqual(1000, methodCounter.EntityCallsCount); //ensure calls data store to get data }
public void TestSelectKey() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache.Select(x => x.Key).FirstOrDefault(); // Assert Assert.IsNotNull(result); Assert.IsTrue(!string.IsNullOrEmpty(result)); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); Assert.AreEqual(0, methodCounter.EntityCallsCount); }
public void TestAnyWithContainsFilter() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act (exists) var identifiers = Enumerable.Range(177, 20000).Select(i => i.ToString()); var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var result = context.DummyEntitiesWithCache .Any(x => identifiers.Contains(x.Key)); stopWatch.Stop(); // Assert Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); // only identifiers are used Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); Assert.IsTrue(result); // Act (do not exists) var identifiers2 = Enumerable.Range(1770, 20000).Select(i => i.ToString()); stopWatch.Restart(); var result2 = context.DummyEntitiesWithCache .Any(x => identifiers2.Contains(x.Key)); stopWatch.Stop(); // Assert Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); //Ok, it takes longer for it need to check the range Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); Assert.IsFalse(result2); }
public void TestCombinesWithPendingChanges() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act - Removing for (var i = 0; i < 1000; i++) { context.DummyEntitiesWithCache.Remove(new DummyEntity { Key = i.ToString() }); } // Assert Assert.IsFalse(context.DummyEntitiesWithCache.Any()); Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); // Act - Adding var newItem = new DummyEntity { Key = "1051", Name = "Test 1051" }; var newItem2 = new DummyEntity { Key = "1071", Name = "Test 1071" }; context.DummyEntitiesWithCache.Add(newItem); context.DummyEntitiesWithCache.Add(newItem2); // Assert Assert.IsTrue(context.DummyEntitiesWithCache.Any()); Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); }
public void TestOrderByReturningAnonymousWithDependencyOfEntity_NotNice() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var result = context.DummyEntitiesWithCache .OrderBy(x => x.Key) .Select(x => new { x.Key, Value = x }) .Take(3) .ToList(); // Assert Assert.IsNotNull(result); Assert.AreEqual(3, result.Count); Assert.AreEqual("0", result[0].Key); Assert.AreEqual("0", result[0].Value.Key); Assert.AreEqual("Dummy Item 0", result[0].Value.Name); Assert.AreEqual("NonCachedData0", result[0].Value.NonCachedField); Assert.AreEqual("1", result[1].Key); Assert.AreEqual("1", result[1].Value.Key); Assert.AreEqual("Dummy Item 1", result[1].Value.Name); Assert.AreEqual("NonCachedData1", result[1].Value.NonCachedField); Assert.AreEqual("10", result[2].Key); Assert.AreEqual("10", result[2].Value.Key); Assert.AreEqual("Dummy Item 10", result[2].Value.Name); Assert.AreEqual("NonCachedData10", result[2].Value.NonCachedField); var cacheProvider = ReflectionHelper.WinkleCacheDataProviderOut(context.DummyEntitiesWithCache); Assert.AreEqual(0, cacheProvider.CreateEntityFromCachedEntryCount); //ok that's not nice Assert.AreEqual(1000, methodCounter.EntityCallsCount); }
public void TestAnyWithoutFilter() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); // Act var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Restart(); var result = context.DummyEntitiesWithCache.Any(); stopWatch.Stop(); // Assert Assert.IsTrue(stopWatch.ElapsedMilliseconds < 30); //effectively gets data from cache Assert.AreEqual(0, methodCounter.EntityCallsCount); Assert.AreEqual(0, methodCounter.GetIdentifiersCallsCount); Assert.IsTrue(result); }
public void TestCanGetFromCache() { // Arrange var methodCounter = new DaoMethodCallsCounter(); var context = new DummyContext(_folder, methodCounter); var identifiers = (new[] { "196", "235", "11" }).AsEnumerable(); // Act var data = context.DummyEntitiesWithCache .Where(x => x.SomeData.Contains("A") && x.Created > new DateTime(2018, 9, 19) || identifiers.Contains(x.Key)) .Select(x => x.Key) .ToArray(); // Assert Assert.IsTrue(data.Count() > 3); CollectionAssert.Contains(data, "196"); CollectionAssert.Contains(data, "235"); CollectionAssert.Contains(data, "11"); Assert.AreEqual(0, methodCounter.EntityCallsCount); //ensure gets everything from cache }