/V1/trunk/Source/StockTraderRI/StockTraderRI.Modules.WatchList.Tests/WatchList/WatchListPresentationModelFixture.cs

# · C# · 191 lines · 131 code · 44 blank · 16 comment · 0 complexity · dc2f9e64cb602fb52c7fd263f896a160 MD5 · raw file

  1. //===============================================================================
  2. // Microsoft patterns & practices
  3. // Composite Application Guidance for Windows Presentation Foundation
  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.Collections.Generic;
  19. using System.Linq;
  20. using Microsoft.Practices.Composite.Events;
  21. using Microsoft.Practices.Composite.Wpf.Events;
  22. using Microsoft.VisualStudio.TestTools.UnitTesting;
  23. using StockTraderRI.Infrastructure;
  24. using StockTraderRI.Modules.Watch;
  25. using StockTraderRI.Modules.Watch.WatchList;
  26. using StockTraderRI.Modules.WatchList.Tests.Mocks;
  27. namespace StockTraderRI.Modules.WatchList.Tests.WatchList
  28. {
  29. [TestClass]
  30. public class WatchListPresentationModelFixture
  31. {
  32. MockWatchListView view;
  33. MockWatchListService watchListService;
  34. MockMarketFeedService marketFeedService;
  35. MockEventAggregator eventAggregator;
  36. [TestInitialize]
  37. public void SetUp()
  38. {
  39. view = new MockWatchListView();
  40. watchListService = new MockWatchListService();
  41. marketFeedService = new MockMarketFeedService();
  42. eventAggregator = new MockEventAggregator();
  43. }
  44. [TestMethod]
  45. public void CanInitPresenter()
  46. {
  47. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  48. WatchListPresentationModel presentationModel = CreatePresenter();
  49. Assert.AreEqual<IWatchListView>(view, presentationModel.View);
  50. }
  51. [TestMethod]
  52. public void ClickingOnTheRemoveMenuItemCallsTheRemoveSelectedItemMethod()
  53. {
  54. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  55. watchListService.MockWatchList.Add("TEST");
  56. WatchListPresentationModel presentationModel = CreatePresenter();
  57. Assert.AreEqual(1, watchListService.MockWatchList.Count);
  58. presentationModel.RemoveWatchCommand.Execute("TEST");
  59. Assert.AreEqual(0, watchListService.MockWatchList.Count);
  60. }
  61. [TestMethod]
  62. public void CanGetItemsFromWatchListServiceAndPutInView()
  63. {
  64. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  65. watchListService.MockWatchList.Add("TESTFUND0");
  66. watchListService.MockWatchList.Add("TESTFUND1");
  67. WatchListPresentationModel presentationModel = CreatePresenter();
  68. Assert.IsNotNull(view.Model);
  69. Assert.IsNotNull(view.Model.WatchListItems);
  70. Assert.AreEqual(2, view.Model.WatchListItems.Count);
  71. Assert.AreEqual<string>("TESTFUND0", view.Model.WatchListItems[0].TickerSymbol);
  72. Assert.AreEqual<string>("TESTFUND1", view.Model.WatchListItems[1].TickerSymbol);
  73. }
  74. [TestMethod]
  75. public void PresenterObservesWatchListAndUpdatesView()
  76. {
  77. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  78. watchListService.MockWatchList.Add("TESTFUND0");
  79. WatchListPresentationModel presentationModel = CreatePresenter();
  80. Assert.AreEqual(1, view.Model.WatchListItems.Count());
  81. watchListService.MockWatchList.Add("TESTFUND1");
  82. Assert.AreEqual(2, view.Model.WatchListItems.Count());
  83. Assert.AreEqual<string>("TESTFUND1", view.Model.WatchListItems[1].TickerSymbol);
  84. }
  85. [TestMethod]
  86. public void ViewGetsCurrentPriceForSymbolRetrievedFromMarketFeedService()
  87. {
  88. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  89. watchListService.MockWatchList.Add("TESTFUND0");
  90. marketFeedService.SetPrice("TESTFUND0", 15.5m);
  91. WatchListPresentationModel presentationModel = CreatePresenter();
  92. WatchItem watchItem = view.Model.WatchListItems[0];
  93. Assert.AreEqual<string>("TESTFUND0", watchItem.TickerSymbol);
  94. Assert.IsNotNull(watchItem.CurrentPrice);
  95. Assert.AreEqual<decimal>(15.5m, watchItem.CurrentPrice.Value);
  96. }
  97. [TestMethod]
  98. public void IfPriceIsNotAvailableForSymbolSetsNullCurrentPriceInView()
  99. {
  100. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  101. watchListService.MockWatchList.Add("NONEXISTING");
  102. marketFeedService.MockSymbolExists = false;
  103. WatchListPresentationModel presentationModel = CreatePresenter();
  104. WatchItem watchItem = view.Model.WatchListItems[0];
  105. Assert.AreEqual<string>("NONEXISTING", watchItem.TickerSymbol);
  106. Assert.IsNull(watchItem.CurrentPrice);
  107. }
  108. [TestMethod]
  109. public void PresenterObservesMarketFeedAndUpdatesView()
  110. {
  111. var marketPricesUpdatedEvent = new MockMarketPricesUpdatedEvent();
  112. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(marketPricesUpdatedEvent);
  113. marketFeedService.feedData.Add("TESTFUND0", 15.5m);
  114. watchListService.MockWatchList.Add("TESTFUND0");
  115. WatchListPresentationModel presentationModel = CreatePresenter();
  116. Assert.AreEqual<decimal>(15.5m, view.Model.WatchListItems[0].CurrentPrice.Value);
  117. Assert.IsNotNull(marketPricesUpdatedEvent.SubscribeArgumentAction);
  118. Assert.AreEqual(ThreadOption.UIThread, marketPricesUpdatedEvent.SubscribeArgumentThreadOption);
  119. marketPricesUpdatedEvent.SubscribeArgumentAction(new Dictionary<string, decimal> { { "TESTFUND0", 25.3m } });
  120. Assert.AreEqual<decimal>(25.3m, view.Model.WatchListItems[0].CurrentPrice.Value);
  121. }
  122. [TestMethod]
  123. public void PresentationModelShouldHaveHeaderInfoSet()
  124. {
  125. eventAggregator.AddMapping<MarketPricesUpdatedEvent>(new MockMarketPricesUpdatedEvent());
  126. WatchListPresentationModel presentationModel = CreatePresenter();
  127. Assert.AreEqual("Watch List", view.Model.HeaderInfo);
  128. }
  129. private WatchListPresentationModel CreatePresenter()
  130. {
  131. return new WatchListPresentationModel(view, watchListService, marketFeedService, eventAggregator);
  132. }
  133. }
  134. internal class MockMarketPricesUpdatedEvent : MarketPricesUpdatedEvent
  135. {
  136. public Action<IDictionary<string, decimal>> SubscribeArgumentAction;
  137. public Predicate<IDictionary<string, decimal>> SubscribeArgumentFilter;
  138. public ThreadOption SubscribeArgumentThreadOption;
  139. public override SubscriptionToken Subscribe(Action<IDictionary<string, decimal>> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<IDictionary<string, decimal>> filter)
  140. {
  141. SubscribeArgumentAction = action;
  142. SubscribeArgumentFilter = filter;
  143. SubscribeArgumentThreadOption = threadOption;
  144. return null;
  145. }
  146. }
  147. }