PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

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

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