/Src/Projects/BOPE.SQLRepository.Tests/BuildActionExecutionTableTests.cs

http://codemadesimple.codeplex.com · C# · 240 lines · 180 code · 59 blank · 1 comment · 15 complexity · cf2ebee919fb95dbf0f785b977bcfbe2 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NUnit.Framework;
  6. using CodeMadeSimple.Common.Tests;
  7. using CodeMadeSimple.BOPE.Core;
  8. using Moq;
  9. using Microsoft.SqlServer.Server;
  10. using System.Data;
  11. namespace CodeMadeSimple.BOPE.SQLRepository.Tests
  12. {
  13. [TestFixture]
  14. public class BuildActionExecutionTableTests
  15. {
  16. [Test]
  17. public void Constructor_NullListArg_ThrowsException()
  18. {
  19. ExceptionAssert.AssertNullArgumentException("list", () => new BuildActionExecutionTable(null));
  20. }
  21. [Test]
  22. public void Constructor_NonNullListArg_SetsList()
  23. {
  24. Mock<IEnumerable<BuildProcessExecution>> list = new Mock<IEnumerable<BuildProcessExecution>>(MockBehavior.Strict);
  25. Assert.AreSame(list.Object, new BuildActionExecutionTable(list.Object).InnerList);
  26. }
  27. [Test]
  28. public void GetEnumerator_EmptyList_ReturnsEmptyEnumerator()
  29. {
  30. List<BuildProcessExecution> list = new List<BuildProcessExecution>();
  31. IEnumerator<SqlDataRecord> records = new BuildActionExecutionTable(list).GetEnumerator();
  32. Assert.IsFalse(records.MoveNext());
  33. }
  34. [TestCase(1)]
  35. [TestCase(3)]
  36. public void GetEnumerator_NonEmptyListButNullActions_ReturnsEmptyEnumerator(int count)
  37. {
  38. List<BuildProcessExecution> list = new List<BuildProcessExecution>();
  39. for (int i = 0; i < count; i++)
  40. {
  41. Mock<BuildProcessExecution> exec = new Mock<BuildProcessExecution>();
  42. exec.Setup(x => x.Actions).Returns((IEnumerable<BuildActionExecution>)null);
  43. list.Add(exec.Object);
  44. }
  45. IEnumerator<SqlDataRecord> records = new BuildActionExecutionTable(list).GetEnumerator();
  46. Assert.IsFalse(records.MoveNext());
  47. }
  48. [TestCase(1)]
  49. [TestCase(3)]
  50. public void GetEnumerator_NonEmptyListButNoActions_ReturnsEmptyEnumerator(int count)
  51. {
  52. List<BuildProcessExecution> list = new List<BuildProcessExecution>();
  53. for (int i = 0; i < count; i++)
  54. {
  55. Mock<BuildProcessExecution> exec = new Mock<BuildProcessExecution>();
  56. exec.Setup(x => x.Actions).Returns(new List<BuildActionExecution>());
  57. list.Add(exec.Object);
  58. }
  59. IEnumerator<SqlDataRecord> records = new BuildActionExecutionTable(list).GetEnumerator();
  60. Assert.IsFalse(records.MoveNext());
  61. }
  62. [TestCase(1, 2, 3, 1)]
  63. [TestCase(4, 3, 2, 5)]
  64. public void GetEnumerator_NonEmptyListWithActionsAndSubActions_ReturnsExpectedIterator(int procCount, int actCount, int childActCount, int depthCount)
  65. {
  66. List<BuildActionExecution> allActs = new List<BuildActionExecution>();
  67. List<BuildProcessExecution> procs = new List<BuildProcessExecution>();
  68. for (int i = 0; i < procCount; i++)
  69. {
  70. Mock<BuildProcessExecution> proc = new Mock<BuildProcessExecution>();
  71. proc.Setup(x => x.Id).Returns(Guid.NewGuid());
  72. List<BuildActionExecution> acts = new List<BuildActionExecution>();
  73. for (int j = 0; j < actCount; j++)
  74. {
  75. Mock<BuildActionExecution> act = CreateAct(proc.Object, allActs);
  76. act.Setup(x => x.ParentStep).Returns((BuildActionExecution)null);
  77. allActs.Add(act.Object);
  78. acts.Add(act.Object);
  79. int currentDepth = 0;
  80. SetChildActions(proc.Object, childActCount, allActs, act, depthCount, ref currentDepth);
  81. }
  82. proc.Setup(x => x.Actions).Returns(acts);
  83. procs.Add(proc.Object);
  84. }
  85. BuildActionExecutionTable table = new BuildActionExecutionTable(procs);
  86. int procCounter = 0;
  87. int actFromSameProcCounter = 0;
  88. int allActsCounter = 0;
  89. int expectedActsPerProc = ((childActCount * depthCount) + 1) * actCount;
  90. foreach (SqlDataRecord dr in table)
  91. {
  92. BuildProcessExecution proc = procs[procCounter];
  93. BuildActionExecution act = allActs[allActsCounter];
  94. Assert.AreEqual(allActsCounter.ToString(), act.Name);
  95. Assert.AreEqual(act.Id, dr.GetGuid(0));
  96. Assert.AreEqual(proc.Id, dr.GetGuid(1));
  97. Assert.AreEqual(act.Name, dr.GetString(2));
  98. if (act.ParentStep != null)
  99. {
  100. Assert.AreEqual(act.ParentStep.Id, dr.GetGuid(6));
  101. Assert.AreEqual(new List<BuildActionExecution>(act.ParentStep.GetSubActions()).IndexOf(act), dr.GetInt32(3));
  102. }
  103. else
  104. {
  105. Assert.IsTrue(dr.IsDBNull(6));
  106. Assert.AreEqual(new List<BuildActionExecution>(proc.Actions).IndexOf(act), dr.GetInt32(3));
  107. }
  108. if (act.StartTime != null)
  109. Assert.AreEqual(act.StartTime, dr.GetDateTime(4));
  110. else
  111. Assert.IsTrue(dr.IsDBNull(4));
  112. if (act.EndTime != null)
  113. Assert.AreEqual(act.EndTime, dr.GetDateTime(5));
  114. else
  115. Assert.IsTrue(dr.IsDBNull(5));
  116. actFromSameProcCounter++;
  117. if (actFromSameProcCounter >= expectedActsPerProc)
  118. {
  119. // If all the acts from same process were asserted, go to next process
  120. procCounter++;
  121. actFromSameProcCounter = 0;
  122. }
  123. allActsCounter++;
  124. }
  125. Assert.AreEqual(allActs.Count, allActsCounter);
  126. }
  127. private static void SetChildActions(BuildProcessExecution proc, int childActCount, List<BuildActionExecution> allActs, Mock<BuildActionExecution> act, int depthCount, ref int currentDepth)
  128. {
  129. if (currentDepth < depthCount)
  130. {
  131. currentDepth++;
  132. List<BuildActionExecution> subActs = new List<BuildActionExecution>();
  133. for (int k = 0; k < childActCount; k++)
  134. {
  135. Mock<BuildActionExecution> subAct = CreateAct(proc, allActs);
  136. subAct.Setup(x => x.ParentStep).Returns(act.Object);
  137. allActs.Add(subAct.Object);
  138. subActs.Add(subAct.Object);
  139. SetChildActions(proc, childActCount, allActs, subAct, depthCount, ref currentDepth);
  140. }
  141. act.Setup(x => x.GetSubActions()).Returns(subActs.ToArray());
  142. }
  143. else
  144. {
  145. act.Setup(x => x.GetSubActions()).Returns((BuildActionExecution[])null);
  146. }
  147. }
  148. private static Mock<BuildActionExecution> CreateAct(BuildProcessExecution proc, List<BuildActionExecution> allActs)
  149. {
  150. Random random = new Random();
  151. Mock<BuildActionExecution> act = new Mock<BuildActionExecution>(MockBehavior.Strict);
  152. act.Setup(x => x.BuildProcess).Returns(proc);
  153. act.Setup(x => x.Name).Returns(allActs.Count.ToString());
  154. act.Setup(x => x.Id).Returns(Guid.NewGuid());
  155. if (Convert.ToBoolean(random.Next(0, 1)))
  156. act.Setup(x => x.StartTime).Returns(new DateTime(allActs.Count));
  157. else
  158. act.Setup(x => x.StartTime).Returns((DateTime?)null);
  159. if (Convert.ToBoolean(random.Next(0, 1)))
  160. act.Setup(x => x.EndTime).Returns(new DateTime(allActs.Count + 1));
  161. else
  162. act.Setup(x => x.EndTime).Returns((DateTime?)null);
  163. return act;
  164. }
  165. [Test]
  166. public void CreateDataRecord_ReturnsExpectedDataRecord()
  167. {
  168. BuildActionExecutionTable table = new BuildActionExecutionTable(new Mock<IEnumerable<BuildProcessExecution>>().Object);
  169. SqlDataRecord rec = table.CreateDataRecord();
  170. Assert.NotNull(rec);
  171. Assert.AreEqual(7, rec.FieldCount);
  172. Helper.AssertMetadata(rec.GetSqlMetaData(0), "Id", SqlDbType.UniqueIdentifier);
  173. Helper.AssertMetadata(rec.GetSqlMetaData(1), "BuildProcessId", SqlDbType.UniqueIdentifier);
  174. Helper.AssertMetadata(rec.GetSqlMetaData(2), "BuildActionName", SqlDbType.VarChar);
  175. Helper.AssertMetadata(rec.GetSqlMetaData(3), "ExecutionOrder", SqlDbType.Int);
  176. Helper.AssertMetadata(rec.GetSqlMetaData(4), "StartTime", SqlDbType.DateTime2);
  177. Helper.AssertMetadata(rec.GetSqlMetaData(5), "EndTime", SqlDbType.DateTime2);
  178. Helper.AssertMetadata(rec.GetSqlMetaData(6), "ParentId", SqlDbType.UniqueIdentifier);
  179. }
  180. }
  181. }