/LightCore.Tests/Integration/ResolvingTests.cs

https://github.com/JuergenGutsch/LightCore · C# · 295 lines · 214 code · 74 blank · 7 comment · 3 complexity · cf5214d858ab75dd767cd85a69ccfcda MD5 · raw file

  1. using System;
  2. using System.Threading.Tasks;
  3. using FluentAssertions;
  4. using LightCore.TestTypes;
  5. using Xunit;
  6. namespace LightCore.Tests.Integration
  7. {
  8. public class Test
  9. {
  10. public Test(IContainer container, TestBar testBar)
  11. {
  12. this.Property = container;
  13. this.PropertyTwo = testBar;
  14. }
  15. public IContainer Property { get; set; }
  16. public TestBar PropertyTwo { get; set; }
  17. }
  18. public class TestBar
  19. {
  20. }
  21. /// <summary>
  22. /// Summary description for ResolvingTests
  23. /// </summary>
  24. public class ResolvingTests
  25. {
  26. [Fact]
  27. public void Lazy_RegistrationSource_Supports_ConcreteTypes_Without_PreInitialization_And_Depdendencies()
  28. {
  29. var builder = new ContainerBuilder();
  30. var container = builder.Build();
  31. var lazyFoo = container.Resolve<Lazy<Test>>().Value;
  32. lazyFoo.Should().NotBeNull();
  33. }
  34. [Fact]
  35. public void Factory_RegistrationSource_Supports_ConcreteTypes_Without_PreInitialization_And_Depdendencies()
  36. {
  37. var builder = new ContainerBuilder();
  38. var container = builder.Build();
  39. var fooFunc = container.Resolve<Func<Test>>();
  40. fooFunc.Should().NotBeNull();
  41. fooFunc().Should().BeOfType<Test>();
  42. }
  43. [Fact]
  44. public void RegistrationContainer_Is_ThreadSafe()
  45. {
  46. var containerBuilder = new ContainerBuilder();
  47. containerBuilder.RegisterFactory<IBar>(c => new Bar());
  48. containerBuilder.Register<Foo, Foo>();
  49. containerBuilder.Register<FooTestTwo, FooTestTwo>();
  50. var container = containerBuilder.Build();
  51. for (var i = 0; i < 10; i++)
  52. {
  53. var task1 = Task.Factory.StartNew(() => Assert.True(null != container.Resolve<Foo>()));
  54. var task2 = Task.Factory.StartNew(() => Assert.True(null != container.Resolve<FooTestTwo>()));
  55. Task.WaitAll(task1, task2);
  56. }
  57. }
  58. public class FooTestTwo
  59. {
  60. public FooTestTwo(IBar bar)
  61. {
  62. }
  63. }
  64. [Fact]
  65. public void Bar_as_argument_will_be_reference_equal_to_the_resolved_bar()
  66. {
  67. var builder = new ContainerBuilder();
  68. builder.Register<IBar, Bar>();
  69. builder.Register<IFoo, Foo>();
  70. var container = builder.Build();
  71. var bar = container.Resolve<IBar>();
  72. var foo = container.Resolve<IFoo>(bar);
  73. bar.Should().BeSameAs(foo.Bar);
  74. }
  75. [Fact]
  76. public void Bar_as_reference_argument_Should_Not_ReUse_Previous_Cached_Arguments()
  77. {
  78. var builder = new ContainerBuilder();
  79. builder.Register<IBar, Bar>();
  80. builder.Register<IFoo, Foo>();
  81. var container = builder.Build();
  82. var bar = container.Resolve<IBar>();
  83. var foo = container.Resolve<IFoo>(bar);
  84. var fooWithOtherBarInstance = container.Resolve<IFoo>(new Bar());
  85. bar.Should().NotBeSameAs(fooWithOtherBarInstance.Bar);
  86. }
  87. [Fact]
  88. public void A_Second_Resolve_Invocation_With_No_Arguments_Should_Not_ReUse_Previous_Cached_Reference_Arguments()
  89. {
  90. var builder = new ContainerBuilder();
  91. builder.Register<IFoo, Foo>();
  92. var container = builder.Build();
  93. var foo = container.Resolve<IFoo>(new Bar());
  94. var fooTwo = container.Resolve<IFoo>();
  95. fooTwo.Bar.Should().BeNull();
  96. }
  97. [Fact]
  98. public void A_Second_Resolve_Invocation_With_No_Arguments_Should_Not_ReUse_Previous_Cached_Arguments()
  99. {
  100. var builder = new ContainerBuilder();
  101. builder.Register<TextHolder, TextHolder>();
  102. var container = builder.Build();
  103. var firstInstance = container.Resolve<TextHolder>("test");
  104. var secondInstance = container.Resolve<TextHolder>();
  105. secondInstance.Text.Should().BeNull();
  106. }
  107. public class TextHolder
  108. {
  109. public string Text
  110. {
  111. get;
  112. set;
  113. }
  114. public TextHolder()
  115. {
  116. }
  117. public TextHolder(string text)
  118. {
  119. Text = text;
  120. }
  121. }
  122. [Fact]
  123. public void Foo_is_resolved_with_default_constructor_if_no_bar_is_registered()
  124. {
  125. var builder = new ContainerBuilder();
  126. builder.Register<IFoo, Foo>();
  127. var container = builder.Build();
  128. var instance = container.Resolve<IFoo>();
  129. }
  130. [Fact]
  131. public void Foo_is_resolved_with_the_bar_only_constructor_if_bar_is_registered()
  132. {
  133. var builder = new ContainerBuilder();
  134. builder.Register<IFoo, Foo>();
  135. builder.Register<IBar, Bar>();
  136. var container = builder.Build();
  137. var actual = container.Resolve<IFoo>();
  138. actual.Should().NotBeNull();
  139. actual.Bar.Should().NotBeNull();
  140. }
  141. [Fact]
  142. public void Foo_is_resolved_with_the_bar_with_arguments_constructor_if_bar_registered_and_arguments_supported()
  143. {
  144. var builder = new ContainerBuilder();
  145. builder.Register<IFoo, Foo>().WithArguments("Test", true);
  146. builder.Register<IBar, Bar>();
  147. var container = builder.Build();
  148. var instance = container.Resolve<IFoo>();
  149. //Assert.IsNotNull(instance);
  150. //Assert.IsNotNull(instance.Bar);
  151. //Assert.IsNotNull((instance as Foo).Arg1);
  152. //Assert.AreEqual(true, (instance as Foo).Arg2);
  153. }
  154. [Fact]
  155. public void Foo_is_resolved_with_bool_argument_constructor_if_only_that_argument_is_supported()
  156. {
  157. var builder = new ContainerBuilder();
  158. builder.Register<IFoo, Foo>().WithArguments(true);
  159. var container = builder.Build();
  160. var actual = container.Resolve<IFoo>() as Foo;
  161. actual.Should().NotBeNull();
  162. actual.Arg2.Should().BeTrue();
  163. }
  164. [Fact]
  165. public void Can_resolve_dependencies_with_injected_container()
  166. {
  167. var builder = new ContainerBuilder();
  168. builder.RegisterFactory<IBar>(c => new Bar());
  169. var container = builder.Build();
  170. var resolvedContainer = container.Resolve<IContainer>();
  171. var actual = resolvedContainer.Resolve<IBar>();
  172. actual.Should().NotBeNull();
  173. actual.Should().BeOfType<Bar>();
  174. resolvedContainer.Should().NotBeNull();
  175. resolvedContainer.Should().BeAssignableTo<IContainer>();
  176. }
  177. [Fact]
  178. public void Container_resolves_registered_interface_registration()
  179. {
  180. var builder = new ContainerBuilder();
  181. builder.Register<IBar, Bar>();
  182. builder.Register<IFoo, Foo>();
  183. var container = builder.Build();
  184. var actual = container.Resolve<IFoo>();
  185. actual.Should().NotBeNull();
  186. actual.Should().BeOfType<Foo>();
  187. }
  188. [Fact]
  189. public void Container_resolves_registed_abstract_class()
  190. {
  191. var builder = new ContainerBuilder();
  192. builder.Register<IBar, Bar>();
  193. builder.Register<FooBase, Foo>();
  194. var container = builder.Build();
  195. var actual = container.Resolve<FooBase>();
  196. actual.Should().NotBeNull();
  197. actual.Should().BeOfType<Foo>();
  198. }
  199. [Fact]
  200. public void Container_resolves_registered_class_mapped_to_itself()
  201. {
  202. var builder = new ContainerBuilder();
  203. builder.Register<Bar>();
  204. var container = builder.Build();
  205. var actual = container.Resolve<Bar>();
  206. actual.Should().NotBeNull();
  207. }
  208. [Fact]
  209. public void Container_resolves_a_whole_object_tree()
  210. {
  211. var builder = new ContainerBuilder();
  212. builder.Register<IFoo, Foo>();
  213. builder.Register<IBar, Bar>();
  214. var container = builder.Build();
  215. var actual = container.Resolve<IFoo>();
  216. actual.Should().NotBeNull();
  217. actual.Should().BeOfType<Foo>();
  218. actual.Bar.Should().NotBeNull();
  219. }
  220. }
  221. }