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

/Branches/0.9.5-DeltaShell/test/Common/DelftTools.Tests/Core/WorkFlow/CompositeModelTest.cs

#
C# | 455 lines | 263 code | 86 blank | 106 comment | 4 complexity | 4263597abbb70da882d6188705161d1d MD5 | raw file
Possible License(s): LGPL-2.1
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using DelftTools.Shell.Core;
  5. using DelftTools.Shell.Core.Workflow;
  6. using DelftTools.Tests.Core.Mocks;
  7. using DelftTools.TestUtils;
  8. using DelftTools.Utils;
  9. using DelftTools.Utils.Collections.Generic;
  10. using DelftTools.Utils.Workflow;
  11. using log4net.Config;
  12. using NUnit.Framework;
  13. using Rhino.Mocks;
  14. namespace DelftTools.Tests.Core.WorkFlow
  15. {
  16. [TestFixture]
  17. public class CompositeModelTest
  18. {
  19. [TestFixtureSetUp]
  20. public void TestFixtureSetUp()
  21. {
  22. LogHelper.ConfigureLogging();
  23. }
  24. [TestFixtureTearDown]
  25. public void TestFixtureTearDown()
  26. {
  27. LogHelper.ResetLogging();
  28. }
  29. [Test]
  30. public void TestProgressIndication()
  31. {
  32. string result = "";
  33. var model1 = new SimplerModel { Name = "source" };
  34. model1.Executing += (s, e) => result += ((SimplerModel)s).Name;
  35. var model2 = new SimplerModel { Name = "target" };
  36. model2.Executing += (s, e) => result += ((SimplerModel)s).Name;
  37. var compositeModel = new CompositeModel
  38. {
  39. Name = "composite model",
  40. Models = { model1, model2 }
  41. };
  42. var progressList = new List<string>();
  43. compositeModel.ProgressChanged += delegate
  44. {
  45. progressList.Add(compositeModel.GetProgressText());
  46. };
  47. compositeModel.Initialize();
  48. compositeModel.Execute();
  49. Assert.AreEqual("50.00 %", progressList[0]);
  50. Assert.AreEqual("100.00 %", progressList[1]);
  51. }
  52. [Test]
  53. public void TestSequenceLinkFirstSourceThenTarget()
  54. {
  55. string result = "";
  56. SimplerModel sourceModel = new SimplerModel {Name = "source"};
  57. sourceModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  58. SimplerModel targetModel = new SimplerModel { Name = "target" };
  59. targetModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  60. IDataItem sourceInput = new DataItem { Name = "SI", Tag = "SI", Value = new object(), Role = DataItemRole.Input };
  61. IDataItem sourceOutput = new DataItem { Name = "SO", Tag = "SO", Value = new object(), Role = DataItemRole.Output };
  62. IDataItem targetInput = new DataItem { Name = "TI", Tag = "TI", Value = new object(), Role = DataItemRole.Input };
  63. IDataItem targetOutput = new DataItem { Name = "TO", Tag = "TO", Value = new object(), Role = DataItemRole.Output };
  64. sourceModel.DataItems.Add(sourceInput);
  65. sourceModel.DataItems.Add(sourceOutput);
  66. targetModel.DataItems.Add(targetInput);
  67. targetModel.DataItems.Add(targetOutput);
  68. var compositeModel = new CompositeModel
  69. {
  70. Name = "composite model",
  71. Models = { sourceModel, targetModel }
  72. };
  73. targetInput.LinkTo(sourceOutput);
  74. compositeModel.Initialize();
  75. compositeModel.Execute();
  76. Assert.AreEqual("sourcetarget", result);
  77. }
  78. [Test]
  79. public void TestSequenceLinkFirstTargetThenSource()
  80. {
  81. string result = "";
  82. SimplerModel sourceModel = new SimplerModel { Name = "source" };
  83. sourceModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  84. SimplerModel targetModel = new SimplerModel { Name = "target" };
  85. targetModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  86. IDataItem sourceInput = new DataItem { Name = "SI", Tag = "SI", Value = new object(), Role = DataItemRole.Input };
  87. IDataItem sourceOutput = new DataItem { Name = "SO", Tag = "SO", Value = new object(), Role = DataItemRole.Output };
  88. IDataItem targetInput = new DataItem { Name = "TI", Tag = "TI", Value = new object(), Role = DataItemRole.Input };
  89. IDataItem targetOutput = new DataItem { Name = "TO", Tag = "TO", Value = new object(), Role = DataItemRole.Output };
  90. sourceModel.DataItems.Add(sourceInput);
  91. sourceModel.DataItems.Add(sourceOutput);
  92. targetModel.DataItems.Add(targetInput);
  93. targetModel.DataItems.Add(targetOutput);
  94. var compositeModel = new CompositeModel
  95. {
  96. Name = "composite model",
  97. Models = { sourceModel, targetModel }
  98. };
  99. sourceInput.LinkTo(targetOutput);
  100. compositeModel.Initialize();
  101. compositeModel.Execute();
  102. Assert.AreEqual("targetsource", result);
  103. }
  104. [Test]
  105. public void TestSequenceLinkFirstSourceThenTargetUseDataSets()
  106. {
  107. string result = "";
  108. SimplerModel sourceModel = new SimplerModel { Name = "source" };
  109. sourceModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  110. SimplerModel targetModel = new SimplerModel { Name = "target" };
  111. targetModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  112. IDataItemSet sourceInputSet = new DataItemSet { Name = "input", Tag = "intput", Role = DataItemRole.Input };
  113. IDataItem sourceInput = new DataItem { Name = "SI", Tag = "SI", Value = new object(), Role = DataItemRole.Input };
  114. sourceInputSet.DataItems.Add(sourceInput);
  115. IDataItemSet sourceOutputSet = new DataItemSet { Name = "output", Tag = "output", Role = DataItemRole.Output };
  116. IDataItem sourceOutput = new DataItem { Name = "SO", Tag = "SO", Value = new object(), Role = DataItemRole.Output };
  117. sourceOutputSet.DataItems.Add(sourceOutput);
  118. IDataItemSet targetInputSet = new DataItemSet { Name = "input", Tag = "intput", Role = DataItemRole.Input };
  119. IDataItem targetInput = new DataItem { Name = "TI", Tag = "TI", Value = new object(), Role = DataItemRole.Input };
  120. targetInputSet.DataItems.Add(targetInput);
  121. IDataItemSet targetOutputSet = new DataItemSet { Name = "output", Tag = "output", Role = DataItemRole.Output };
  122. IDataItem targetOutput = new DataItem { Name = "TO", Tag = "TO", Value = new object(), Role = DataItemRole.Output };
  123. targetOutputSet.DataItems.Add(targetOutput);
  124. sourceModel.DataItems.Add(sourceInputSet);
  125. sourceModel.DataItems.Add(sourceOutputSet);
  126. targetModel.DataItems.Add(targetInputSet);
  127. targetModel.DataItems.Add(targetOutputSet);
  128. var compositeModel = new CompositeModel
  129. {
  130. Name = "composite model",
  131. Models = { sourceModel, targetModel }
  132. };
  133. targetInput.LinkTo(sourceOutput);
  134. compositeModel.Initialize();
  135. compositeModel.Execute();
  136. Assert.AreEqual("sourcetarget", result);
  137. }
  138. [Test]
  139. public void TestSequenceLinkFirstTargetThenSourceUseDataSets()
  140. {
  141. string result = "";
  142. SimplerModel sourceModel = new SimplerModel { Name = "source" };
  143. sourceModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  144. SimplerModel targetModel = new SimplerModel { Name = "target" };
  145. targetModel.Executing += (s, e) => result += ((SimplerModel)s).Name;
  146. IDataItemSet sourceInputSet = new DataItemSet { Name = "input", Tag = "intput", Role = DataItemRole.Input };
  147. IDataItem sourceInput = new DataItem { Name = "SI", Tag = "SI", Value = new object(), Role = DataItemRole.Input };
  148. sourceInputSet.DataItems.Add(sourceInput);
  149. IDataItemSet sourceOutputSet = new DataItemSet { Name = "output", Tag = "output", Role = DataItemRole.Output };
  150. IDataItem sourceOutput = new DataItem { Name = "SO", Tag = "SO", Value = new object(), Role = DataItemRole.Output };
  151. sourceOutputSet.DataItems.Add(sourceOutput);
  152. IDataItemSet targetInputSet = new DataItemSet { Name = "input", Tag = "intput", Role = DataItemRole.Input };
  153. IDataItem targetInput = new DataItem { Name = "TI", Value = new object(), Role = DataItemRole.Input };
  154. targetInputSet.DataItems.Add(targetInput);
  155. IDataItemSet targetOutputSet = new DataItemSet { Name = "output", Tag = "output", Role = DataItemRole.Output };
  156. IDataItem targetOutput = new DataItem { Name = "TO", Tag = "TO", Value = new object(), Role = DataItemRole.Output };
  157. targetOutputSet.DataItems.Add(targetOutput);
  158. sourceModel.DataItems.Add(sourceInputSet);
  159. sourceModel.DataItems.Add(sourceOutputSet);
  160. targetModel.DataItems.Add(targetInputSet);
  161. targetModel.DataItems.Add(targetOutputSet);
  162. var compositeModel = new CompositeModel
  163. {
  164. Name = "composite model",
  165. Models = { sourceModel, targetModel }
  166. };
  167. sourceInput.LinkTo(targetOutput);
  168. compositeModel.Initialize();
  169. compositeModel.Execute();
  170. Assert.AreEqual("targetsource", result);
  171. }
  172. /// <summary>
  173. /// Links models as model2 to model1 and runs parent composition model.
  174. /// Composition model should detect correct order to run models: model2 then model1
  175. /// </summary>
  176. /* move to TestPlugin1.Tests
  177. [Test]
  178. public void LinkModelDataAndRun()
  179. {
  180. var sourceModel = new SimpleModel {Name = "source model"};
  181. var targetModel = new SimpleModel {Name = "target model"};
  182. var compositeModel = new CompositeModel
  183. {
  184. Name = "composite model",
  185. Models = {targetModel, sourceModel},
  186. // note that models are added in reverse order
  187. StartTime = new DateTime(2009, 1, 1, 0, 0, 0),
  188. StopTime = new DateTime(2009, 1, 1, 5, 0, 0),
  189. TimeStep = new TimeSpan(1, 0, 0)
  190. };
  191. // define input for model2
  192. var time = compositeModel.StartTime;
  193. sourceModel.InputTimeSeries[time] = 1.0;
  194. sourceModel.InputTimeSeries[time.AddHours(1)] = 2.0;
  195. sourceModel.InputTimeSeries[time.AddHours(2)] = 3.0;
  196. sourceModel.InputTimeSeries[time.AddHours(3)] = 4.0;
  197. sourceModel.InputTimeSeries[time.AddHours(4)] = 5.0;
  198. // link model2.OutputTimeSeries -> model1.InputTimeSeries
  199. var outputDataItem = sourceModel.GetDataItemByValue(sourceModel.OutputTimeSeries);
  200. var inputTimeSeries = targetModel.GetDataItemByValue(targetModel.InputTimeSeries);
  201. inputTimeSeries.LinkTo(outputDataItem);
  202. Assert.AreEqual(sourceModel.OutputTimeSeries, targetModel.InputTimeSeries,
  203. "Linking should set value of InputTimeSeries of target model to OutputTimeSeries of source model");
  204. // initialize
  205. compositeModel.Initialize();
  206. Assert.AreEqual(0, sourceModel.OutputTimeSeries.Components[0].Values.Count,
  207. "Output values of the source model after initialize are not filled in yet");
  208. Assert.AreEqual(0, targetModel.OutputTimeSeries.Components[0].Values.Count,
  209. "Output values of the target model after initialize are not filled in yet");
  210. // run model
  211. compositeModel.Execute();
  212. Assert.AreEqual(ActivityStatus.Executing, compositeModel.Status);
  213. Assert.AreEqual(ActivityStatus.Executing, sourceModel.Status);
  214. Assert.AreEqual(ActivityStatus.Executing, targetModel.Status);
  215. Assert.AreEqual(1, sourceModel.OutputTimeSeries.Components[0].Values.Count,
  216. "Source model should fill in a new value in the output time series");
  217. Assert.AreEqual(1, targetModel.OutputTimeSeries.Components[0].Values.Count,
  218. "Target model should fill in a new value in the output time series");
  219. }
  220. */
  221. private static readonly MockRepository mocks = new MockRepository();
  222. /// <summary>
  223. /// Composite model should clone contained model (deep clone)
  224. /// </summary>
  225. [Test]
  226. public void CloneModel()
  227. {
  228. var compositeModel = new CompositeModel();
  229. var containedModel = mocks.StrictMock<IModel>();
  230. var modelClone = mocks.StrictMock<IModel>();
  231. using (mocks.Record())
  232. {
  233. Expect.Call(containedModel.Owner = compositeModel);
  234. Expect.Call(containedModel.DataItems).Return(new EventedList<IDataItem>()).Repeat.Any();
  235. Expect.Call(containedModel.GetDirectChildren()).Return(new EventedList<object>()).Repeat.Any();
  236. Expect.Call(containedModel.DeepClone()).Return(modelClone);
  237. containedModel.StatusChanged += null;
  238. LastCall.IgnoreArguments();
  239. //containedModel.StatusChanged -= null;
  240. //LastCall.IgnoreArguments();
  241. Expect.Call(modelClone.Owner = null).IgnoreArguments();
  242. modelClone.StatusChanged += null;
  243. LastCall.IgnoreArguments();
  244. Expect.Call(modelClone.DataItems).Return(new EventedList<IDataItem>()).Repeat.Any();
  245. Expect.Call(modelClone.GetDirectChildren()).Return(new EventedList<object>()).Repeat.Any();
  246. }
  247. CompositeModel clonedModel;
  248. using (mocks.Playback())
  249. {
  250. compositeModel.Models.Add(containedModel);
  251. clonedModel = (CompositeModel) compositeModel.DeepClone();
  252. }
  253. Assert.AreEqual(compositeModel.Models.Count, clonedModel.Models.Count);
  254. }
  255. [Test]
  256. public void CloneShouldUpdateLinksWithinModel()
  257. {
  258. //Situation
  259. // CompositeModel
  260. // |-SourceModel
  261. // |-LinkedModel (->SourceModel)
  262. //Clone this composite model and expect the c-linkedmodel to be connected to the cloned-sourcemodel.
  263. var compositeModel = new CompositeModel();
  264. IModel sourceModel = new TestModel("source");
  265. IDataItem sourceDataItem = new DataItem(new Url(), "sourceItem");
  266. sourceModel.DataItems.Add(sourceDataItem);
  267. compositeModel.Models.Add(sourceModel);
  268. IModel linkedModel = new TestModel("linked");
  269. IDataItem linkedDataItem = new DataItem {Name = "linkedItem"};
  270. linkedModel.DataItems.Add(linkedDataItem);
  271. compositeModel.Models.Add(linkedModel);
  272. linkedDataItem.LinkTo(sourceDataItem);
  273. var clonedModel = (CompositeModel) compositeModel.DeepClone();
  274. IModel clonedSourceModel = clonedModel.Models.Where(m => m.Name == "source").First();
  275. IModel clonedLinkedModel = clonedModel.Models.Where(m => m.Name == "linked").First();
  276. IDataItem clonedLinkedItem = clonedLinkedModel.DataItems.Where(d => d.Name == "linkedItem").First();
  277. IDataItem clonedSourceItem = clonedSourceModel.DataItems.Where(d => d.Name == "sourceItem").First();
  278. //the cloned sourceitem should not be the the sourcedataitem.
  279. Assert.AreNotEqual(clonedSourceItem.Value, sourceDataItem.Value);
  280. Assert.IsTrue(clonedLinkedItem.IsLinked);
  281. Assert.AreEqual(clonedSourceItem, clonedLinkedItem.LinkedTo);
  282. }
  283. /// <summary>
  284. /// Composite model should clone contained model (deep clone)
  285. /// </summary>
  286. /* [Test] TODO: move to integration tests?
  287. public void CloneModelWithLinkedModels()
  288. {
  289. var compositeModel = new CompositeModel();
  290. var model1 = new SimpleModel { Name = "model1" };
  291. var model2 = new SimpleModel { Name = "model2" };
  292. compositeModel.Models.Add(model1);
  293. compositeModel.Models.Add(model2);
  294. // link model input to model output
  295. var sourceDataItem = model1.GetDataItemByValue(model1.OutputTimeSeries);
  296. var targetDataItem = model2.GetDataItemByValue(model2.InputTimeSeries);
  297. targetDataItem.LinkTo(sourceDataItem);
  298. var compositeModelClone = (CompositeModel) compositeModel.DeepClone();
  299. Assert.AreEqual(compositeModel.DataItems.Count, compositeModelClone.DataItems.Count);
  300. var model1Clone = (SimpleModel) compositeModelClone.Models[0];
  301. var model2Clone = (SimpleModel) compositeModelClone.Models[1];
  302. var sourceDataItemClone = model1Clone.GetDataItemByValue(model1Clone.OutputTimeSeries);
  303. var targetDataItemClone = model2Clone.GetDataItemByValue(model2Clone.InputTimeSeries);
  304. Assert.AreEqual(sourceDataItemClone, targetDataItemClone.LinkedTo);
  305. }
  306. */
  307. [Test]
  308. public void GetAllItemsRecursiveShouldReturnModels()
  309. {
  310. var compositeModel = new CompositeModel();
  311. var model = new SimplerModel();
  312. compositeModel.Models.Add(model);
  313. IEnumerable<object> enumerable = compositeModel.GetAllItemsRecursive();
  314. Assert.IsTrue(enumerable.Contains(model));
  315. Assert.AreEqual(
  316. 1 + compositeModel.DataItems.Count*2 +model.GetAllItemsRecursive().Count(),
  317. enumerable.Count());
  318. }
  319. [Test]
  320. public void CompositeModelBubblesStatusChangesOfChildModels()
  321. {
  322. var compositeModel = new CompositeModel();
  323. var childModel = new TestModel();
  324. compositeModel.Models.Add(childModel);
  325. int callCount = 0;
  326. compositeModel.StatusChanged += (s, e) =>
  327. {
  328. Assert.AreEqual(s, childModel);
  329. callCount++;
  330. };
  331. //action change status of child model
  332. childModel.Status = ActivityStatus.Initialized;
  333. Assert.AreEqual(1, callCount);
  334. compositeModel.Models.Remove(childModel);
  335. childModel.Status = ActivityStatus.None;
  336. }
  337. [Test]
  338. public void CompositeModelUnSubscribesFromChildModelsWhenRemoved()
  339. {
  340. var compositeModel = new CompositeModel();
  341. var childModel = new TestModel();
  342. compositeModel.Models.Add(childModel);
  343. compositeModel.Models.Remove(childModel);
  344. compositeModel.StatusChanged += (s, e) => Assert.Fail("Should have unsubscribed!");
  345. childModel.Status = ActivityStatus.Initializing;
  346. }
  347. }
  348. }