PageRenderTime 41ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Blocks/CompositeWeb/UnitTests (VSTS)/CompositeWeb.Tests/ObjectBuilder/BuildPlan/DynamicMethodPlan/Creation/CallConstructorStrategyFixture.cs

#
C# | 384 lines | 278 code | 96 blank | 10 comment | 0 complexity | 43bce4940451ac9b85ff38d6730ef6f6 MD5 | raw file
  1. using Microsoft.Practices.CompositeWeb.ObjectBuilder.BuildPlan;
  2. using Microsoft.Practices.CompositeWeb.ObjectBuilder.BuildPlan.DynamicMethodPlan;
  3. using Microsoft.Practices.CompositeWeb.ObjectBuilder.BuildPlan.DynamicMethodPlan.Creation;
  4. using Microsoft.Practices.CompositeWeb.Tests.Mocks;
  5. using Microsoft.Practices.CompositeWeb.Tests.Mocks.ObjectBuilder.BuildPlan.DynamicMethodPlan.Creation;
  6. using Microsoft.Practices.ObjectBuilder;
  7. using Microsoft.VisualStudio.TestTools.UnitTesting;
  8. namespace Microsoft.Practices.CompositeWeb.Tests.ObjectBuilder.BuildPlan.DynamicMethodPlan.Creation
  9. {
  10. [TestClass]
  11. public class CallConstructorStrategyFixture
  12. {
  13. public CallConstructorStrategyFixture()
  14. {
  15. }
  16. // This unit test is obsolete since DefaultConstructorChooser is used.
  17. //[TestMethod]
  18. //[ExpectedException(typeof(NullReferenceException))]
  19. //[Ignore]
  20. //public void CreateInstanceWithNoContructorChooserRaisesNullException()
  21. //{
  22. // MockBuilderContext ctx = BuildContext();
  23. // MockObject mockInstance = (MockObject)ctx.HeadOfChain.BuildUp(ctx, typeof(MockObject), null, null);
  24. //}
  25. [TestMethod]
  26. public void WhenNoConstructorChooserPolicyDefaultChooserIsUsed()
  27. {
  28. PolicyList policies = new PolicyList();
  29. MockBuilderContext ctx = BuildContext(policies);
  30. MockObject mockInstance = (MockObject) ctx.HeadOfChain.BuildUp(ctx, typeof (MockObject), null, null);
  31. Assert.IsTrue(mockInstance.DefaultConstructorCalled);
  32. }
  33. [TestMethod]
  34. public void CreateInstanceCallDefaultExplicitConstructor()
  35. {
  36. PolicyList policies = new PolicyList();
  37. policies.SetDefault<IConstructorChooserPolicy>(new DefaultConstructorChooserPolicy());
  38. MockBuilderContext ctx = BuildContext(policies);
  39. MockObject mockInstance = (MockObject) ctx.HeadOfChain.BuildUp(ctx, typeof (MockObject), null, null);
  40. Assert.IsTrue(mockInstance.DefaultConstructorCalled);
  41. }
  42. [TestMethod]
  43. public void CreateInstanceCallAttributedCtor()
  44. {
  45. PolicyList policies = new PolicyList();
  46. policies.SetDefault<IConstructorChooserPolicy>(new AttributeBasedConstructorChooser());
  47. MockBuilderContext ctx = BuildContext(policies);
  48. MockObjectWithAttributedCtor mockInstance =
  49. (MockObjectWithAttributedCtor) ctx.HeadOfChain.BuildUp(ctx, typeof (MockObjectWithAttributedCtor), null, null);
  50. Assert.IsTrue(mockInstance.AttributedConstructorCalled);
  51. }
  52. [TestMethod]
  53. public void CreateInstanceWithNoConstructorAtAll()
  54. {
  55. PolicyList policies = new PolicyList();
  56. policies.SetDefault<IConstructorChooserPolicy>(new DefaultConstructorChooserPolicy());
  57. MockBuilderContext ctx = BuildContext(policies);
  58. int mockInstance = (int) ctx.HeadOfChain.BuildUp(ctx, typeof (int), null, null);
  59. //Int instances have zero as initialization value
  60. Assert.AreEqual((int) 0, mockInstance);
  61. }
  62. [TestMethod]
  63. public void CreateInstanceCallCreateInstance()
  64. {
  65. PolicyList policies = new PolicyList();
  66. policies.SetDefault<IConstructorChooserPolicy>(new MockReturnNullConstructor());
  67. MockBuilderContext ctx = BuildContext(policies);
  68. MockObject mockInstance = (MockObject) ctx.HeadOfChain.BuildUp(ctx, typeof (MockObject), null, null);
  69. Assert.IsTrue(mockInstance.DefaultConstructorCalled);
  70. }
  71. [TestMethod]
  72. public void CreateInstanceCreateNewDependingObject()
  73. {
  74. PolicyList policies = new PolicyList();
  75. MockBuilderContext ctx = BuildContext(policies);
  76. MockCreateNewDependingObject mockInstance =
  77. (MockCreateNewDependingObject) ctx.HeadOfChain.BuildUp(ctx, typeof (MockCreateNewDependingObject), null, null);
  78. Assert.IsNotNull(mockInstance);
  79. Assert.IsNotNull(mockInstance.DependentObject);
  80. }
  81. [TestMethod]
  82. public void CreateInstanceCreateNewDependingObjectInTwoLevels()
  83. {
  84. PolicyList policies = new PolicyList();
  85. MockBuilderContext ctx = BuildContext(policies);
  86. MockCreateNewTwoLevelDependingObject mockInstance =
  87. (MockCreateNewTwoLevelDependingObject)
  88. ctx.HeadOfChain.BuildUp(ctx, typeof (MockCreateNewTwoLevelDependingObject), null, null);
  89. Assert.IsNotNull(mockInstance);
  90. Assert.IsNotNull(mockInstance.DependentObject);
  91. Assert.IsNotNull(mockInstance.DependentObject.DependentObject);
  92. }
  93. [TestMethod]
  94. public void CreateInstanceInjectServiceDependencyDependingObject()
  95. {
  96. PolicyList policies = new PolicyList();
  97. MockBuilderContext ctx = BuildContext(policies);
  98. TestableRootCompositionContainer compositionContainer = new TestableRootCompositionContainer();
  99. ctx.Locator.Add(new DependencyResolutionLocatorKey(typeof (CompositionContainer), null), compositionContainer);
  100. MockDependentObject mockDependency = compositionContainer.Services.AddNew<MockDependentObject, MockDependentObject>();
  101. MockDependencyDependingObject mockInstance =
  102. (MockDependencyDependingObject) ctx.HeadOfChain.BuildUp(ctx, typeof (MockDependencyDependingObject), null, null);
  103. Assert.IsNotNull(mockInstance);
  104. Assert.IsNotNull(mockInstance.DependentObject);
  105. Assert.AreSame(mockDependency, mockInstance.DependentObject);
  106. }
  107. [TestMethod]
  108. public void CreateInstancenotInjectsRegisteredInterfaceService()
  109. {
  110. PolicyList policies = new PolicyList();
  111. MockBuilderContext ctx = BuildContext(policies);
  112. TestableRootCompositionContainer compositionContainer = new TestableRootCompositionContainer();
  113. ctx.Locator.Add(new DependencyResolutionLocatorKey(typeof (CompositionContainer), null), compositionContainer);
  114. MockDependentObject mockDependency =
  115. compositionContainer.Services.AddNew<MockDependentObject, IMockDependentObject>();
  116. MockDependencyDependingInterface mockInstance =
  117. (MockDependencyDependingInterface)
  118. ctx.HeadOfChain.BuildUp(ctx, typeof (MockDependencyDependingInterface), null, null);
  119. Assert.IsNotNull(mockInstance);
  120. Assert.IsNotNull(mockInstance.DependentObject);
  121. Assert.AreSame(mockDependency, mockInstance.DependentObject);
  122. }
  123. [TestMethod]
  124. public void CreateInstancenotInjectNonRequiredNotPresentServiceDependency()
  125. {
  126. PolicyList policies = new PolicyList();
  127. MockBuilderContext ctx = BuildContext(policies);
  128. TestableRootCompositionContainer compositionContainer = new TestableRootCompositionContainer();
  129. ctx.Locator.Add(new DependencyResolutionLocatorKey(typeof (CompositionContainer), null), compositionContainer);
  130. MockDependencyDependingObjectNotRequired mockInstance =
  131. (MockDependencyDependingObjectNotRequired)
  132. ctx.HeadOfChain.BuildUp(ctx, typeof (MockDependencyDependingObjectNotRequired), null, null);
  133. Assert.IsNotNull(mockInstance);
  134. Assert.IsNull(mockInstance.DependentObject);
  135. }
  136. [TestMethod]
  137. public void CreateInstanceUseDependencyResolverAndInjectsNamedDependency()
  138. {
  139. PolicyList policies = new PolicyList();
  140. MockBuilderContext ctx = BuildContext(policies);
  141. object dependency = new object();
  142. ctx.Locator.Add(new DependencyResolutionLocatorKey(typeof (object), "Foo"), dependency);
  143. NamedNullMockObject mockInstance =
  144. (NamedNullMockObject) ctx.HeadOfChain.BuildUp(ctx, typeof (NamedNullMockObject), null, null);
  145. Assert.IsNotNull(mockInstance);
  146. Assert.IsNotNull(mockInstance.DependentObject);
  147. Assert.AreSame(dependency, mockInstance.DependentObject);
  148. }
  149. [TestMethod]
  150. public void CreateInstanceValueTypedParameterIsUnboxed()
  151. {
  152. PolicyList policies = new PolicyList();
  153. MockBuilderContext ctx = BuildContext(policies);
  154. int dependency = new int();
  155. ctx.Locator.Add(new DependencyResolutionLocatorKey(typeof (int), "Foo"), dependency);
  156. ValueTypeDependentMockObject mockInstance =
  157. (ValueTypeDependentMockObject) ctx.HeadOfChain.BuildUp(ctx, typeof (ValueTypeDependentMockObject), null, null);
  158. Assert.IsNotNull(mockInstance);
  159. Assert.AreEqual((int) 0, mockInstance.DependentObject);
  160. }
  161. private static MockBuilderContext BuildContext()
  162. {
  163. return BuildContext(new PolicyList());
  164. }
  165. private static MockBuilderContext BuildContext(PolicyList innerPolicies)
  166. {
  167. MockBuilderContext ctx = new MockBuilderContext(new BuildPlanStrategy());
  168. ctx.Policies.SetDefault<IPlanBuilderPolicy>(CreatePlanBuilder(innerPolicies));
  169. return ctx;
  170. }
  171. private static IPlanBuilderPolicy CreatePlanBuilder(PolicyList innerPolicies)
  172. {
  173. BuilderStrategyChain chain = new BuilderStrategyChain();
  174. chain.Add(new CallConstructorStrategy());
  175. return new DynamicMethodPlanBuilderPolicy(chain, innerPolicies);
  176. }
  177. #region Nested type: IMockDependentObject
  178. private interface IMockDependentObject
  179. {
  180. }
  181. #endregion
  182. #region Nested type: MockCreateNewDependingObject
  183. private class MockCreateNewDependingObject
  184. {
  185. public object DependentObject;
  186. public MockCreateNewDependingObject([CreateNew] MockDependentObject dependentObject)
  187. {
  188. DependentObject = dependentObject;
  189. }
  190. }
  191. #endregion
  192. #region Nested type: MockCreateNewTwoLevelDependingObject
  193. private class MockCreateNewTwoLevelDependingObject
  194. {
  195. public MockCreateNewDependingObject DependentObject;
  196. public MockCreateNewTwoLevelDependingObject([CreateNew] MockCreateNewDependingObject dependentObject)
  197. {
  198. DependentObject = dependentObject;
  199. }
  200. }
  201. #endregion
  202. #region Nested type: MockDependencyDependingInterface
  203. private class MockDependencyDependingInterface
  204. {
  205. public object DependentObject;
  206. public MockDependencyDependingInterface(
  207. [ServiceDependency(Type = typeof (IMockDependentObject))] object dependentObject)
  208. {
  209. DependentObject = dependentObject;
  210. }
  211. }
  212. #endregion
  213. #region Nested type: MockDependencyDependingObject
  214. private class MockDependencyDependingObject
  215. {
  216. public object DependentObject;
  217. public MockDependencyDependingObject([ServiceDependency] MockDependentObject dependentObject)
  218. {
  219. DependentObject = dependentObject;
  220. }
  221. }
  222. #endregion
  223. #region Nested type: MockDependencyDependingObjectNotRequired
  224. private class MockDependencyDependingObjectNotRequired
  225. {
  226. public object DependentObject;
  227. public MockDependencyDependingObjectNotRequired(
  228. [ServiceDependency(Required = false)] MockDependentObject dependentObject)
  229. {
  230. DependentObject = dependentObject;
  231. }
  232. }
  233. #endregion
  234. #region Nested type: MockDependentObject
  235. private class MockDependentObject : IMockDependentObject
  236. {
  237. }
  238. #endregion
  239. #region Nested type: MockObject
  240. private class MockObject
  241. {
  242. public bool DefaultConstructorCalled;
  243. public MockObject()
  244. {
  245. DefaultConstructorCalled = true;
  246. }
  247. }
  248. #endregion
  249. #region Nested type: MockObjectWithAttributedCtor
  250. private class MockObjectWithAttributedCtor
  251. {
  252. public bool AttributedConstructorCalled;
  253. public MockObjectWithAttributedCtor()
  254. {
  255. }
  256. [InjectionConstructor]
  257. public MockObjectWithAttributedCtor([CreateNew] MockDependentObject dependentObject)
  258. {
  259. AttributedConstructorCalled = true;
  260. }
  261. }
  262. #endregion
  263. #region Nested type: NamedNullMockObject
  264. private class NamedNullMockObject
  265. {
  266. public object DependentObject;
  267. public NamedNullMockObject(
  268. [Dependency(Name = "Foo", SearchMode=SearchMode.Up, NotPresentBehavior = NotPresentBehavior.ReturnNull)] object
  269. dependentObject)
  270. {
  271. DependentObject = dependentObject;
  272. }
  273. }
  274. #endregion
  275. #region Nested type: ValueTypeDependentMockObject
  276. private class ValueTypeDependentMockObject
  277. {
  278. public int DependentObject;
  279. public ValueTypeDependentMockObject(
  280. [Dependency(Name = "Foo", SearchMode = SearchMode.Up, NotPresentBehavior = NotPresentBehavior.ReturnNull)] int
  281. dependentObject)
  282. {
  283. DependentObject = dependentObject;
  284. }
  285. }
  286. #endregion
  287. }
  288. }