PageRenderTime 38ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Ninject.Tests/Unit/CacheTests.cs

https://github.com/daniyord/ninject
C# | 198 lines | 156 code | 42 blank | 0 comment | 0 complexity | 48b19a97b1f9125efc313e91c9c0e2d8 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. using System;
  2. using Moq;
  3. using Ninject.Activation;
  4. using Ninject.Activation.Caching;
  5. using Ninject.Planning.Bindings;
  6. using Ninject.Tests.Fakes;
  7. using Xunit;
  8. using Xunit.Should;
  9. namespace Ninject.Tests.Unit.CacheTests
  10. {
  11. public class CacheContext
  12. {
  13. protected Mock<IPipeline> activatorMock;
  14. protected Mock<ICachePruner> cachePrunerMock;
  15. protected Mock<IBinding> bindingMock;
  16. protected Cache cache;
  17. public CacheContext()
  18. {
  19. activatorMock = new Mock<IPipeline>();
  20. cachePrunerMock = new Mock<ICachePruner>();
  21. bindingMock = new Mock<IBinding>();
  22. cache = new Cache(activatorMock.Object, cachePrunerMock.Object);
  23. }
  24. }
  25. public class WhenTryGetInstanceIsCalled : CacheContext
  26. {
  27. [Fact]
  28. public void ReturnsNullIfNoInstancesHaveBeenAddedToCache()
  29. {
  30. var scope = new object();
  31. var contextMock = new Mock<IContext>();
  32. contextMock.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  33. contextMock.Setup(x => x.GetScope()).Returns(scope);
  34. object instance = cache.TryGet(contextMock.Object);
  35. instance.ShouldBeNull();
  36. }
  37. [Fact]
  38. public void ReturnsCachedInstanceIfOneHasBeenAddedWithinSpecifiedScope()
  39. {
  40. var scope = new object();
  41. var reference = new InstanceReference { Instance = new Sword() };
  42. var contextMock1 = new Mock<IContext>();
  43. contextMock1.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  44. contextMock1.Setup(x => x.GetScope()).Returns(scope);
  45. cache.Remember(contextMock1.Object, reference);
  46. var contextMock2 = new Mock<IContext>();
  47. contextMock2.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  48. contextMock2.Setup(x => x.GetScope()).Returns(scope);
  49. object instance = cache.TryGet(contextMock2.Object);
  50. instance.ShouldBeSameAs(reference.Instance);
  51. }
  52. [Fact]
  53. public void ReturnsNullIfNoInstancesHaveBeenAddedWithinSpecifiedScope()
  54. {
  55. var reference = new InstanceReference { Instance = new Sword() };
  56. var contextMock1 = new Mock<IContext>();
  57. contextMock1.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  58. contextMock1.Setup(x => x.GetScope()).Returns(new object());
  59. cache.Remember(contextMock1.Object, reference);
  60. var contextMock2 = new Mock<IContext>();
  61. contextMock2.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  62. contextMock2.Setup(x => x.GetScope()).Returns(new object());
  63. object instance = cache.TryGet(contextMock2.Object);
  64. instance.ShouldBeNull();
  65. }
  66. }
  67. public class WhenTryGetInstanceIsCalledForContextWithGenericInference : CacheContext
  68. {
  69. [Fact]
  70. public void ReturnsInstanceIfOneHasBeenCachedWithSameGenericParameters()
  71. {
  72. var scope = new object();
  73. var reference = new InstanceReference { Instance = new Sword() };
  74. var contextMock1 = new Mock<IContext>();
  75. contextMock1.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  76. contextMock1.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  77. contextMock1.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  78. contextMock1.Setup(x => x.GetScope()).Returns(scope);
  79. cache.Remember(contextMock1.Object, reference);
  80. var contextMock2 = new Mock<IContext>();
  81. contextMock2.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  82. contextMock2.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  83. contextMock2.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  84. contextMock2.Setup(x => x.GetScope()).Returns(scope);
  85. object instance = cache.TryGet(contextMock2.Object);
  86. instance.ShouldBeSameAs(reference.Instance);
  87. }
  88. [Fact]
  89. public void ReturnsNullIfInstanceAddedToCacheHasDifferentGenericParameters()
  90. {
  91. var scope = new object();
  92. var reference = new InstanceReference { Instance = new Sword() };
  93. var contextMock1 = new Mock<IContext>();
  94. contextMock1.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  95. contextMock1.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  96. contextMock1.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  97. contextMock1.Setup(x => x.GetScope()).Returns(scope);
  98. cache.Remember(contextMock1.Object, reference);
  99. var contextMock2 = new Mock<IContext>();
  100. contextMock2.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  101. contextMock2.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  102. contextMock2.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(double) });
  103. contextMock2.Setup(x => x.GetScope()).Returns(scope);
  104. object instance = cache.TryGet(contextMock2.Object);
  105. instance.ShouldBeNull();
  106. }
  107. }
  108. public class WhenReleaseIsCalled : CacheContext
  109. {
  110. [Fact]
  111. public void ReturnsFalseIfInstanceIsNotTracked()
  112. {
  113. bool result = cache.Release(new object());
  114. result.ShouldBeFalse();
  115. }
  116. [Fact]
  117. public void ReturnsTrueIfInstanceIsTracked()
  118. {
  119. var scope = new object();
  120. var instance = new Sword();
  121. var reference = new InstanceReference { Instance = instance };
  122. var writeContext = new Mock<IContext>();
  123. writeContext.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  124. writeContext.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  125. writeContext.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  126. writeContext.Setup(x => x.GetScope()).Returns(scope);
  127. cache.Remember(writeContext.Object, reference);
  128. bool result = cache.Release(instance);
  129. result.ShouldBeTrue();
  130. }
  131. [Fact]
  132. public void InstanceIsRemovedFromCache()
  133. {
  134. var scope = new object();
  135. var sword = new Sword();
  136. var reference = new InstanceReference { Instance = sword };
  137. var writeContext = new Mock<IContext>();
  138. writeContext.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  139. writeContext.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  140. writeContext.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  141. writeContext.Setup(x => x.GetScope()).Returns(scope);
  142. cache.Remember(writeContext.Object, reference);
  143. var readContext = new Mock<IContext>();
  144. readContext.SetupGet(x => x.Binding).Returns(bindingMock.Object);
  145. readContext.SetupGet(x => x.HasInferredGenericArguments).Returns(true);
  146. readContext.SetupGet(x => x.GenericArguments).Returns(new[] { typeof(int) });
  147. readContext.Setup(x => x.GetScope()).Returns(scope);
  148. object instance1 = cache.TryGet(readContext.Object);
  149. instance1.ShouldBeSameAs(reference.Instance);
  150. bool result = cache.Release(instance1);
  151. result.ShouldBeTrue();
  152. object instance2 = cache.TryGet(readContext.Object);
  153. instance2.ShouldBeNull();
  154. }
  155. }
  156. }