PageRenderTime 56ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/V4/StockTrader RI/Desktop/StockTraderRI.Modules.Position.Tests/Orders/OrderDetailsPresenterFixture.cs

#
C# | 329 lines | 242 code | 53 blank | 34 comment | 2 complexity | c8c90ad2368e7756f1c66a7cbf919eff MD5 | raw file
  1. //===================================================================================
  2. // Microsoft patterns & practices
  3. // Composite Application Guidance for Windows Presentation Foundation and Silverlight
  4. //===================================================================================
  5. // Copyright (c) Microsoft Corporation. All rights reserved.
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
  7. // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
  8. // LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  9. // FITNESS FOR A PARTICULAR PURPOSE.
  10. //===================================================================================
  11. // The example companies, organizations, products, domain names,
  12. // e-mail addresses, logos, people, places, and events depicted
  13. // herein are fictitious. No association with any real company,
  14. // organization, product, domain name, email address, logo, person,
  15. // places, or events is intended or should be inferred.
  16. //===================================================================================
  17. using System;
  18. using System.ComponentModel;
  19. using Microsoft.VisualStudio.TestTools.UnitTesting;
  20. using StockTraderRI.Infrastructure;
  21. using StockTraderRI.Infrastructure.Interfaces;
  22. using StockTraderRI.Infrastructure.Models;
  23. using StockTraderRI.Modules.Position.Interfaces;
  24. using StockTraderRI.Modules.Position.Models;
  25. using StockTraderRI.Modules.Position.Orders;
  26. using StockTraderRI.Modules.Position.Tests.Mocks;
  27. namespace StockTraderRI.Modules.Position.Tests.Orders
  28. {
  29. [TestClass]
  30. public class OrderDetailsPresenterFixture
  31. {
  32. [TestMethod]
  33. public void PresenterCreatesPublicSubmitCommand()
  34. {
  35. var presenter = CreatePresentationModel(null);
  36. Assert.IsNotNull(presenter.SubmitCommand);
  37. }
  38. [TestMethod]
  39. public void CanExecuteChangedIsRaisedForSubmitCommandWhenModelBecomesValid()
  40. {
  41. bool canExecuteChanged = false;
  42. var presenter = CreatePresentationModel(null);
  43. presenter.SubmitCommand.CanExecuteChanged += delegate { canExecuteChanged = true; };
  44. presenter.Shares = 2;
  45. canExecuteChanged = false;
  46. presenter.StopLimitPrice = 2;
  47. Assert.IsTrue(canExecuteChanged);
  48. }
  49. [TestMethod]
  50. [ExpectedException(typeof(InputValidationException))]
  51. public void NonPositiveSharesThrows()
  52. {
  53. var presenter = CreatePresentationModel(null);
  54. presenter.Shares = 0;
  55. }
  56. [TestMethod]
  57. public void CannotSubmitWhenSharesIsNotPositive()
  58. {
  59. var presenter = CreatePresentationModel(null);
  60. presenter.Shares = 2;
  61. presenter.StopLimitPrice = 2;
  62. Assert.IsTrue(presenter.SubmitCommand.CanExecute(null));
  63. try
  64. {
  65. presenter.Shares = 0;
  66. }
  67. catch (InputValidationException) { }
  68. Assert.IsFalse(presenter.SubmitCommand.CanExecute(null));
  69. }
  70. [TestMethod]
  71. [ExpectedException(typeof(InvalidOperationException))]
  72. public void SubmitThrowsIfCanExecuteIsFalse()
  73. {
  74. var presenter = CreatePresentationModel(new MockAccountPositionService());
  75. try
  76. {
  77. presenter.Shares = 0;
  78. }
  79. catch (InputValidationException) { }
  80. Assert.IsFalse(presenter.SubmitCommand.CanExecute(null));
  81. presenter.SubmitCommand.Execute(null);
  82. }
  83. [TestMethod]
  84. public void CancelRaisesCloseViewEvent()
  85. {
  86. bool closeViewRaised = false;
  87. var presenter = CreatePresentationModel(null);
  88. presenter.CloseViewRequested += delegate
  89. {
  90. closeViewRaised = true;
  91. };
  92. presenter.CancelCommand.Execute(null);
  93. Assert.IsTrue(closeViewRaised);
  94. }
  95. [TestMethod]
  96. public void SubmitRaisesCloseViewEvent()
  97. {
  98. bool closeViewRaised = false;
  99. var presenter = CreatePresentationModel(new MockAccountPositionService());
  100. presenter.CloseViewRequested += delegate
  101. {
  102. closeViewRaised = true;
  103. };
  104. presenter.TransactionType = TransactionType.Buy;
  105. presenter.Shares = 1;
  106. presenter.StopLimitPrice = 1;
  107. Assert.IsTrue(presenter.SubmitCommand.CanExecute(null));
  108. presenter.SubmitCommand.Execute(null);
  109. Assert.IsTrue(closeViewRaised);
  110. }
  111. [TestMethod]
  112. public void CannotSubmitOnSellWhenSharesIsHigherThanCurrentPosition()
  113. {
  114. var accountPositionService = new MockAccountPositionService();
  115. accountPositionService.AddPosition(new AccountPosition("TESTFUND", 10m, 15));
  116. var presenter = CreatePresentationModel(accountPositionService);
  117. presenter.TickerSymbol = "TESTFUND";
  118. presenter.TransactionType = TransactionType.Sell;
  119. presenter.Shares = 5;
  120. presenter.StopLimitPrice = 1;
  121. Assert.IsTrue(presenter.SubmitCommand.CanExecute(null));
  122. try
  123. {
  124. presenter.Shares = 16;
  125. }
  126. catch (InputValidationException) { }
  127. Assert.IsFalse(presenter.SubmitCommand.CanExecute(null));
  128. }
  129. [TestMethod]
  130. public void SharesIsHigherThanCurrentPositionOnSellThrows()
  131. {
  132. var accountPositionService = new MockAccountPositionService();
  133. accountPositionService.AddPosition(new AccountPosition("TESTFUND", 10m, 15));
  134. var presenter = CreatePresentationModel(accountPositionService);
  135. presenter.TickerSymbol = "TESTFUND";
  136. presenter.TransactionType = TransactionType.Sell;
  137. try
  138. {
  139. presenter.Shares = 16;
  140. }
  141. catch (InputValidationException)
  142. {
  143. return;
  144. }
  145. Assert.Fail("Exception not thrown.");
  146. }
  147. [TestMethod]
  148. public void PresenterCreatesCallSetOrderTypes()
  149. {
  150. var presenter = new OrderDetailsViewModel(null, null);
  151. Assert.IsNotNull(presenter.AvailableOrderTypes);
  152. Assert.IsTrue(presenter.AvailableOrderTypes.Count > 0);
  153. Assert.AreEqual(GetEnumCount(typeof(OrderType)), presenter.AvailableOrderTypes.Count);
  154. }
  155. [TestMethod]
  156. public void PresenterCreatesCallSetTimeInForce()
  157. {
  158. var presenter = new OrderDetailsViewModel(null, null);
  159. Assert.IsNotNull(presenter.AvailableTimesInForce);
  160. Assert.IsTrue(presenter.AvailableTimesInForce.Count > 0);
  161. Assert.AreEqual(GetEnumCount(typeof(TimeInForce)), presenter.AvailableTimesInForce.Count);
  162. }
  163. [TestMethod]
  164. public void SetTransactionInfoShouldUpdateTheModel()
  165. {
  166. var presenter = new OrderDetailsViewModel(new MockAccountPositionService(), null);
  167. presenter.TransactionInfo = new TransactionInfo { TickerSymbol = "T000", TransactionType = TransactionType.Sell };
  168. Assert.AreEqual("T000", presenter.TickerSymbol);
  169. Assert.AreEqual(TransactionType.Sell, presenter.TransactionType);
  170. }
  171. [TestMethod]
  172. public void SubmitCallsServiceWithCorrectOrder()
  173. {
  174. var ordersService = new MockOrdersService();
  175. var presenter = new OrderDetailsViewModel(new MockAccountPositionService(), ordersService);
  176. presenter.Shares = 2;
  177. presenter.TickerSymbol = "AAAA";
  178. presenter.TransactionType = TransactionType.Buy;
  179. presenter.TimeInForce = TimeInForce.EndOfDay;
  180. presenter.OrderType = OrderType.Limit;
  181. presenter.StopLimitPrice = 15;
  182. Assert.IsNull(ordersService.SubmitArgumentOrder);
  183. presenter.SubmitCommand.Execute(null);
  184. var submittedOrder = ordersService.SubmitArgumentOrder;
  185. Assert.IsNotNull(submittedOrder);
  186. Assert.AreEqual("AAAA", submittedOrder.TickerSymbol);
  187. Assert.AreEqual(TransactionType.Buy, submittedOrder.TransactionType);
  188. Assert.AreEqual(TimeInForce.EndOfDay, submittedOrder.TimeInForce);
  189. Assert.AreEqual(OrderType.Limit, submittedOrder.OrderType);
  190. Assert.AreEqual(15, submittedOrder.StopLimitPrice);
  191. }
  192. [TestMethod]
  193. public void VerifyTransactionInfoModificationsInOrderDetails()
  194. {
  195. var orderDetailsPresenter = new OrderDetailsViewModel(new MockAccountPositionService(), null);
  196. var transactionInfo = new TransactionInfo { TickerSymbol = "Fund0", TransactionType = TransactionType.Buy };
  197. orderDetailsPresenter.TransactionInfo = transactionInfo;
  198. orderDetailsPresenter.TransactionType = TransactionType.Sell;
  199. Assert.AreEqual(TransactionType.Sell, transactionInfo.TransactionType);
  200. orderDetailsPresenter.TickerSymbol = "Fund1";
  201. Assert.AreEqual("Fund1", transactionInfo.TickerSymbol);
  202. }
  203. [TestMethod]
  204. public void CannotSubmitIfStopLimitZero()
  205. {
  206. var accountPositionService = new MockAccountPositionService();
  207. accountPositionService.AddPosition(new AccountPosition("TESTFUND", 10m, 15));
  208. var presenter = CreatePresentationModel(accountPositionService);
  209. presenter.TickerSymbol = "TESTFUND";
  210. presenter.TransactionType = TransactionType.Sell;
  211. presenter.Shares = 5;
  212. presenter.StopLimitPrice = 1;
  213. Assert.IsTrue(presenter.SubmitCommand.CanExecute(null));
  214. try
  215. {
  216. presenter.StopLimitPrice = 0;
  217. }
  218. catch (InputValidationException) { }
  219. Assert.IsFalse(presenter.SubmitCommand.CanExecute(null));
  220. }
  221. //[TestMethod]
  222. //public void ShouldSetStopLimitPriceInModel()
  223. //{
  224. // var accountPositionService = new MockAccountPositionService();
  225. // accountPositionService.AddPosition(new AccountPosition("TESTFUND", 10m, 15));
  226. // var presenter = CreatePresentationModel(new MockOrderDetailsView(), accountPositionService);
  227. // presenter.TickerSymbol = "TESTFUND";
  228. // presenter.TransactionType = TransactionType.Sell;
  229. // presenter.Shares = 5;
  230. // presenter.StopLimitPrice = 0;
  231. // Assert.AreEqual<string>("The stop limit price must be greater than 0", presenter["StopLimitPrice"]);
  232. //}
  233. //[TestMethod]
  234. //public void DisposeUnregistersLocalCommandsFromGlobalCommands()
  235. //{
  236. // var presenter = new TestableOrderDetailsPresentationModel(new MockOrderDetailsView(), null);
  237. // Assert.IsTrue(StockTraderRICommands.SubmitOrderCommand.
  238. //}
  239. [TestMethod]
  240. public void PropertyChangedIsRaisedWhenSharesIsChanged()
  241. {
  242. var presenter = new OrderDetailsViewModel(null, null);
  243. presenter.Shares = 5;
  244. bool sharesPropertyChangedRaised = false;
  245. presenter.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
  246. {
  247. if (e.PropertyName == "Shares")
  248. sharesPropertyChangedRaised = true;
  249. };
  250. presenter.Shares = 1;
  251. Assert.IsTrue(sharesPropertyChangedRaised);
  252. }
  253. private static int GetEnumCount(Type enumType)
  254. {
  255. Array availableOrderTypes;
  256. #if SILVERLIGHT
  257. availableOrderTypes = enumType.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
  258. #else
  259. availableOrderTypes = Enum.GetValues(enumType);
  260. #endif
  261. return availableOrderTypes.Length;
  262. }
  263. private static OrderDetailsViewModel CreatePresentationModel(IAccountPositionService accountPositionService)
  264. {
  265. return new OrderDetailsViewModel(accountPositionService, new MockOrdersService());
  266. }
  267. }
  268. internal class MockOrdersService : IOrdersService
  269. {
  270. public Order SubmitArgumentOrder;
  271. public void Submit(Order order)
  272. {
  273. SubmitArgumentOrder = order;
  274. }
  275. }
  276. }