PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Ninject.Test/Integration/ConditionalBindingTests.cs

https://github.com/wjkhappy14/ninject
C# | 288 lines | 234 code | 52 blank | 2 comment | 4 complexity | f7e114ebfde9145a6aafff4bf9456a51 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. namespace Ninject.Tests.Integration
  2. {
  3. using System;
  4. using System.Linq;
  5. using FluentAssertions;
  6. using Ninject.Tests.Fakes;
  7. using Ninject.Tests.Integration.StandardKernelTests;
  8. using Xunit;
  9. public class ConditionalBindingTests: StandardKernelContext
  10. {
  11. [Fact]
  12. public void GivenADefaultAndSingleSatisfiedConditional_ThenTheConditionalIsUsed()
  13. {
  14. kernel.Bind<IWeapon>().To<Sword>();
  15. kernel.Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Samurai>();
  16. kernel.Bind<Samurai>().ToSelf();
  17. var warrior = kernel.Get<Samurai>();
  18. warrior.Weapon.Should().BeOfType<Shuriken>();
  19. }
  20. [Fact]
  21. public void GivenADefaultAndSingleUnatisfiedConditional_ThenTheDefaultIsUsed()
  22. {
  23. kernel.Bind<IWeapon>().To<Sword>();
  24. kernel.Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Ninja>();
  25. kernel.Bind<Samurai>().ToSelf();
  26. var warrior = kernel.Get<Samurai>();
  27. warrior.Weapon.Should().BeOfType<Sword>();
  28. }
  29. [Fact]
  30. public void GivenADefaultAndAnUnSatisfiedConditional_ThenTheDefaultIsUsed()
  31. {
  32. kernel.Bind<IWeapon>().To<Sword>();
  33. kernel.Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Ninja>();
  34. kernel.Bind<Samurai>().ToSelf();
  35. var warrior = kernel.Get<Samurai>();
  36. warrior.Weapon.Should().BeOfType<Sword>();
  37. }
  38. [Fact]
  39. public void GivenADefaultAndAnManySatisfiedConditionals_ThenAnExceptionIsThrown()
  40. {
  41. kernel.Bind<IWeapon>().To<Sword>();
  42. kernel.Bind<IWeapon>().To<Sword>().WhenInjectedInto<Samurai>();
  43. kernel.Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Samurai>();
  44. kernel.Bind<Samurai>().ToSelf();
  45. Assert.Throws<ActivationException>(() => kernel.Get<Samurai>());
  46. }
  47. [Fact]
  48. public void GivenNoBinding_ThenASelfBindableTypeWillResolve()
  49. {
  50. var weapon = kernel.Get<Sword>();
  51. weapon.Should().BeOfType<Sword>();
  52. }
  53. [Fact]
  54. public void GivenBindingIsMadeAfterImplictBinding_ThenExplicitBindingWillResolve()
  55. {
  56. IWeapon weapon = kernel.Get<Sword>();
  57. weapon.Should().BeOfType<Sword>();
  58. kernel.Bind<Sword>().To<ShortSword>();
  59. weapon = kernel.Get<Sword>();
  60. weapon.Should().BeOfType<ShortSword>();
  61. }
  62. [Fact]
  63. public void GivenBothImplicitAndExplicitConditionalBindings_ThenExplicitBindingWillResolve()
  64. {
  65. IWeapon weapon = kernel.Get<Sword>();
  66. // make the binding conditional
  67. kernel.GetBindings(typeof (Sword)).First().Condition = b => true;
  68. weapon.Should().BeOfType<Sword>();
  69. kernel.Bind<Sword>().To<ShortSword>().When(_ => true);
  70. weapon = kernel.Get<Sword>();
  71. weapon.Should().BeOfType<ShortSword>();
  72. }
  73. [Fact]
  74. public void GivenADefaultAndAConditionalImplicitBinding_ThenConditionalBindingWillResolve()
  75. {
  76. IWeapon weapon = kernel.Get<Sword>();
  77. // make the binding conditional
  78. kernel.GetBindings(typeof (Sword)).First().Condition = b => true;
  79. weapon.Should().BeOfType<Sword>();
  80. kernel.Bind<Sword>().To<ShortSword>();
  81. weapon = kernel.Get<Sword>();
  82. weapon.Should().BeOfType<Sword>();
  83. }
  84. [Fact]
  85. public void GivenADefaultAndAConditionalBinding_AllBindingsWillResolve()
  86. {
  87. var shortSword = new ShortSword();
  88. var shuriken = new Shuriken();
  89. kernel.Bind<IWeapon>().ToConstant(shortSword);
  90. kernel.Bind<IWeapon>().ToConstant(shuriken).When(_ => true);
  91. var result = kernel.GetAll<IWeapon>();
  92. result.Should().Contain(shortSword);
  93. result.Should().Contain(shuriken);
  94. }
  95. [Fact]
  96. public void GivenAMixtureOfBindings_OnlyNonImplicitBindingsWillResolve()
  97. {
  98. var shortSword = new ShortSword();
  99. var sword = new Sword();
  100. var shuriken = new Shuriken();
  101. kernel.Bind<IWeapon>().ToConstant(shortSword);
  102. kernel.Bind<IWeapon>().ToConstant(sword);
  103. kernel.Bind<IWeapon>().ToConstant(shuriken).BindingConfiguration.IsImplicit = true;
  104. var result = kernel.GetAll<IWeapon>();
  105. result.Should().Contain(shortSword);
  106. result.Should().Contain(sword);
  107. result.Should().NotContain(shuriken);
  108. }
  109. [Fact]
  110. public void GivenOnlyImplicitBindings_AllBindingsWillResolve()
  111. {
  112. var shortSword = new ShortSword();
  113. var shuriken = new Shuriken();
  114. kernel.Bind<IWeapon>().ToConstant(shortSword).BindingConfiguration.IsImplicit = true;
  115. kernel.Bind<IWeapon>().ToConstant(shuriken).BindingConfiguration.IsImplicit = true;
  116. var result = kernel.GetAll<IWeapon>();
  117. result.Should().Contain(shortSword);
  118. result.Should().Contain(shuriken);
  119. }
  120. [Fact]
  121. public void WhenInjectedIntoAppliesToBaseTypes()
  122. {
  123. kernel.Bind<IWarrior>().To<Samurai>();
  124. kernel.Bind<IWeapon>().To<Sword>().WhenInjectedInto<IWarrior>();
  125. var warrior = kernel.Get<IWarrior>();
  126. warrior.Weapon.Should().BeOfType<Sword>();
  127. }
  128. [Fact]
  129. public void WhenInjectedIntoAppliesToOpenGenerics()
  130. {
  131. kernel.Bind(typeof(GenericService<>)).ToSelf();
  132. kernel.Bind<IWarrior>().To<Samurai>().WhenInjectedInto(typeof(IGenericService<>));
  133. kernel.Bind<IWeapon>().To<Sword>();
  134. var service = kernel.Get<GenericService<int>>();
  135. service.Warrior.Should().BeOfType<Samurai>();
  136. }
  137. [Fact]
  138. public void WhenInjectedIntoAppliesToOpenGenericsWhenClosedGenericIsRequested()
  139. {
  140. kernel.Bind(typeof(GenericService<>)).ToSelf();
  141. kernel.Bind<IWarrior>().To<Samurai>().WhenInjectedInto(typeof(GenericService<>));
  142. kernel.Bind<IWeapon>().To<Sword>();
  143. var service = kernel.Get<ClosedGenericService>();
  144. service.Warrior.Should().BeOfType<Samurai>();
  145. }
  146. [Fact]
  147. public void WhenInjectedExactlyIntoAppliesToOpenGenerics()
  148. {
  149. kernel.Bind(typeof(GenericService<>)).ToSelf();
  150. kernel.Bind<IWarrior>().To<Samurai>().WhenInjectedExactlyInto(typeof(GenericService<>));
  151. kernel.Bind<IWeapon>().To<Sword>();
  152. var service = kernel.Get<GenericService<int>>();
  153. service.Warrior.Should().BeOfType<Samurai>();
  154. }
  155. [Fact]
  156. public void WhenInjectedExactlyIntoAppliesNotToBaseTypes()
  157. {
  158. kernel.Bind<IWarrior>().To<Samurai>();
  159. kernel.Bind<IWeapon>().To<Sword>().WhenInjectedExactlyInto<IWarrior>();
  160. Action getWarrior = () => kernel.Get<IWarrior>();
  161. getWarrior.ShouldThrow<ActivationException>();
  162. }
  163. [Fact]
  164. public void WhenInjectedExactlyIntoAppliesToServiceType()
  165. {
  166. kernel.Bind<IWarrior>().To<Samurai>();
  167. kernel.Bind<IWeapon>().To<Sword>().WhenInjectedExactlyInto<Samurai>();
  168. var warrior = kernel.Get<IWarrior>();
  169. warrior.Weapon.Should().BeOfType<Sword>();
  170. }
  171. [Fact]
  172. public void WhenAnyAncestorNamedAppliesToGrandParentAndParent()
  173. {
  174. const string Name = "SomeName";
  175. kernel.Bind<Barracks>().ToSelf().Named(Name);
  176. kernel.Bind<IWarrior>().To<Samurai>();
  177. kernel.Bind<IWeapon>().To<Sword>().WhenAnyAncestorNamed(Name);
  178. kernel.Bind<IWeapon>().To<Dagger>();
  179. var barack = kernel.Get<Barracks>();
  180. barack.Weapon.Should().BeOfType<Sword>();
  181. barack.Warrior.Weapon.Should().BeOfType<Sword>();
  182. }
  183. [Fact]
  184. public void WhenNoAncestorNamedAppliesToGrandParentAndParent()
  185. {
  186. const string Name = "SomeName";
  187. kernel.Bind<Barracks>().ToSelf().Named(Name);
  188. kernel.Bind<IWarrior>().To<Samurai>();
  189. kernel.Bind<IWeapon>().To<Sword>().WhenNoAncestorNamed(Name);
  190. kernel.Bind<IWeapon>().To<Dagger>();
  191. var barack = kernel.Get<Barracks>();
  192. barack.Weapon.Should().BeOfType<Dagger>();
  193. barack.Warrior.Weapon.Should().BeOfType<Dagger>();
  194. }
  195. [Fact]
  196. public void WhenAnyAncestorMatchesAppliesToGrandParentAndParent()
  197. {
  198. kernel.Bind<Barracks>().ToSelf().WithMetadata("Id", 1);
  199. kernel.Bind<IWarrior>().To<Samurai>();
  200. kernel.Bind<IWeapon>().To<Sword>().WhenAnyAncestorMatches(ctx => ctx.Binding.Metadata.Get("Id", -1) == 1);
  201. kernel.Bind<IWeapon>().To<Dagger>().WhenAnyAncestorMatches(ctx => ctx.Binding.Metadata.Get("Id", -1) == 2);
  202. var barack = kernel.Get<Barracks>();
  203. barack.Weapon.Should().BeOfType<Sword>();
  204. barack.Warrior.Weapon.Should().BeOfType<Sword>();
  205. }
  206. [Fact]
  207. public void WhenNoAncestorMatchesAppliesToGrandParentAndParent()
  208. {
  209. kernel.Bind<Barracks>().ToSelf().WithMetadata("Id", 1);
  210. kernel.Bind<IWarrior>().To<Samurai>();
  211. kernel.Bind<IWeapon>().To<Sword>().WhenNoAncestorMatches(ctx => ctx.Binding.Metadata.Get("Id", -1) == 1);
  212. kernel.Bind<IWeapon>().To<Dagger>().WhenNoAncestorMatches(ctx => ctx.Binding.Metadata.Get("Id", -1) == 2);
  213. var barack = kernel.Get<Barracks>();
  214. barack.Weapon.Should().BeOfType<Dagger>();
  215. barack.Warrior.Weapon.Should().BeOfType<Dagger>();
  216. }
  217. public interface IGenericService<T>
  218. {
  219. }
  220. public class ClosedGenericService : GenericService<int>
  221. {
  222. public ClosedGenericService(IWarrior warrior)
  223. : base(warrior)
  224. {
  225. }
  226. }
  227. public class GenericService<T> : IGenericService<T>
  228. {
  229. public GenericService(IWarrior warrior)
  230. {
  231. this.Warrior = warrior;
  232. }
  233. public IWarrior Warrior { get; private set; }
  234. }
  235. }
  236. }