/DlImageParsrTests/MachineTest.cs

https://github.com/Krizzzn/DLImageParsr · C# · 312 lines · 230 code · 82 blank · 0 comment · 4 complexity · aad6e2b26ca17f674732c61d6ff31a42 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using FluentAssertions;
  6. using Moq;
  7. using NUnit.Framework;
  8. using DlImageParsr.Orchestration;
  9. using DlImageParsr.Contracts;
  10. using DlImageParsr.Model;
  11. namespace DlImageParsrTests
  12. {
  13. [TestFixture]
  14. public class MachineTest
  15. {
  16. [TestCase(true, true, false)]
  17. [TestCase(false, true, true)]
  18. [TestCase(true, true, false)]
  19. [Test]
  20. public void ctor__fails_on_null(bool p1, bool p3, bool p2)
  21. {
  22. Func<DlImageParsr.Model.Dive, IImageParser> theFunc = d => null;
  23. Action act = () => {
  24. new Machine((p1) ? new Mock<IDiveRepository>().Object : null,
  25. (p3) ? new Mock<ISampleFactory>().Object : null,
  26. (p2) ? theFunc : null);
  27. };
  28. act.ShouldThrow<ArgumentNullException>();
  29. }
  30. [Test]
  31. public void ctor__stores_given_objects_in_properties()
  32. {
  33. var dr = new Mock<IDiveRepository>().Object;
  34. var sf = new Mock<ISampleFactory>().Object;
  35. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => new Mock<IImageParser>().Object;
  36. var machine = new Machine(dr, sf, facFunc);
  37. machine.DiveRepository.Should().Be(dr);
  38. machine.SampleFactory.Should().Be(sf);
  39. machine.ImageParserFactory.Should().Be(facFunc);
  40. }
  41. [Test]
  42. public void Process__gets_data_from_repository()
  43. {
  44. var dr = new Mock<IDiveRepository>();
  45. var sf = new Mock<ISampleFactory>();
  46. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => new Mock<IImageParser>().Object;
  47. var machine = new Machine(dr.Object, sf.Object, facFunc);
  48. machine.Process();
  49. dr.Verify(o => o.LoadDives(), Times.Once());
  50. }
  51. [Test]
  52. public void Process__gets_Image_parser_from_factory_method()
  53. {
  54. var accessed = 0;
  55. var dives = new[] { new Dive(15, 50, 23, ""), new Dive(24, 20, 33, "") };
  56. var dr = new Mock<IDiveRepository>();
  57. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  58. var sf = new Mock<ISampleFactory>();
  59. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { accessed += d.DiveLogId; return new Mock<IImageParser>().Object; };
  60. var machine = new Machine(dr.Object, sf.Object, facFunc);
  61. machine.Process();
  62. accessed.Should().Be(39);
  63. }
  64. [Test]
  65. public void Process__raises_message_before_processing_dive()
  66. {
  67. var accessed = 0;
  68. var dives = new[] { new Dive(15, 50, 23, ""), new Dive(24, 20, 33, "") };
  69. var dr = new Mock<IDiveRepository>();
  70. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  71. var sf = new Mock<ISampleFactory>();
  72. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { return new Mock<IImageParser>().Object; };
  73. var machine = new Machine(dr.Object, sf.Object, facFunc);
  74. machine.ProcessMessage += (d) => accessed++;
  75. machine.Process();
  76. accessed.Should().BeGreaterOrEqualTo(2);
  77. }
  78. [Test]
  79. public void Process__gets_Image_parser_from_factory_method_but_not_for_null_values()
  80. {
  81. var accessed = 0;
  82. var dives = new[] { new Dive(15, 50, 23, ""), new Dive(24, 20, 33, ""), null };
  83. var dr = new Mock<IDiveRepository>();
  84. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  85. var sf = new Mock<ISampleFactory>();
  86. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { accessed += d.DiveLogId; return new Mock<IImageParser>().Object; };
  87. var machine = new Machine(dr.Object, sf.Object, facFunc);
  88. machine.Process();
  89. accessed.Should().Be(39);
  90. }
  91. [Test]
  92. public void Process__gets_parses_the_images()
  93. {
  94. var accessed = 0;
  95. var parserMock = new Mock<IImageParser>();
  96. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(24, 20, 33, "") };
  97. var dr = new Mock<IDiveRepository>();
  98. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  99. var sf = new Mock<ISampleFactory>();
  100. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { if (dives.Contains(d)) accessed++; return parserMock.Object; };
  101. var machine = new Machine(dr.Object, sf.Object, facFunc);
  102. machine.Process();
  103. parserMock.Verify(d => d.ReadDocument(), Times.Exactly(2));
  104. }
  105. [Test]
  106. public void Process__put_pixels_into_SampleFactory()
  107. {
  108. var accessed = 0;
  109. var parserMock = new Mock<IImageParser>();
  110. var pixels = new [] { new Pixel(2,3), new Pixel(3,4), new Pixel(5,4) };
  111. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  112. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(24, 20, 33, "") };
  113. var dr = new Mock<IDiveRepository>();
  114. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  115. var sf = new Mock<ISampleFactory>();
  116. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { if (dives.Contains(d)) accessed++; return parserMock.Object; };
  117. var machine = new Machine(dr.Object, sf.Object, facFunc);
  118. machine.Process();
  119. sf.Verify(inp => inp.Create(pixels, dives[0]), Times.Once());
  120. sf.Verify(inp => inp.Create(pixels, dives[1]), Times.Once());
  121. }
  122. [Test]
  123. public void Process__dont_put_pixels_into_SampleFactory_but_not_for_null_values()
  124. {
  125. var accessed = 0;
  126. var parserMock = new Mock<IImageParser>();
  127. Pixel[] pixels = null;
  128. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  129. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(24, 20, 33, "") };
  130. var dr = new Mock<IDiveRepository>();
  131. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  132. var sf = new Mock<ISampleFactory>();
  133. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { if (dives.Contains(d)) accessed++; return parserMock.Object; };
  134. var machine = new Machine(dr.Object, sf.Object, facFunc);
  135. machine.Process();
  136. sf.Verify(inp => inp.Create(pixels, It.IsAny<Dive>()), Times.Never());
  137. parserMock.Verify(inp => inp.Dispose(), Times.Exactly(2));
  138. }
  139. [Test]
  140. public void Process__dont_put_pixels_into_SampleFactory_but_not_for_empty_pixel_array()
  141. {
  142. var parserMock = new Mock<IImageParser>();
  143. Pixel[] pixels = new Pixel[0];
  144. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  145. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(24, 20, 33, "") };
  146. var dr = new Mock<IDiveRepository>();
  147. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  148. var sf = new Mock<ISampleFactory>();
  149. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { return parserMock.Object; };
  150. var machine = new Machine(dr.Object, sf.Object, facFunc);
  151. machine.Process();
  152. sf.Verify(inp => inp.Create(pixels, It.IsAny<Dive>()), Times.Never());
  153. parserMock.Verify(inp => inp.Dispose(), Times.Exactly(2));
  154. }
  155. [Test]
  156. public void Process__disposes_the_image_parser()
  157. {
  158. var parserMock = new Mock<IImageParser>();
  159. var pixels = new[] { new Pixel(2, 3), new Pixel(3, 4), new Pixel(5, 4) };
  160. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  161. var dives = new[] { new Dive(14, 50, 23, "")};
  162. var dr = new Mock<IDiveRepository>();
  163. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  164. var sf = new Mock<ISampleFactory>();
  165. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { return parserMock.Object; };
  166. var machine = new Machine(dr.Object, sf.Object, facFunc);
  167. machine.Process();
  168. parserMock.Verify(dd => dd.Dispose(), Times.Once());
  169. }
  170. [Test]
  171. public void Process__raises_message_event_before_saving_dive()
  172. {
  173. var accessed = 0;
  174. var parserMock = new Mock<IImageParser>();
  175. var pixels = new[] { new Pixel(2, 3), new Pixel(3, 4), new Pixel(5, 4) };
  176. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  177. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(24, 20, 33, "") };
  178. var dr = new Mock<IDiveRepository>();
  179. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  180. var sf = new Mock<ISampleFactory>();
  181. var processed = new[] { new ProcessedDive(dives[0]), new ProcessedDive(dives[0]) };
  182. sf.Setup(inp => inp.Create(It.IsAny< IEnumerable<Pixel>>(), dives[0])).Returns(processed[0]);
  183. sf.Setup(inp => inp.Create(It.IsAny < IEnumerable<Pixel>>(), dives[1])).Returns(processed[1]);
  184. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { return parserMock.Object; };
  185. var machine = new Machine(dr.Object, sf.Object, facFunc);
  186. machine.ProcessMessage += (d) => accessed++;
  187. machine.Process();
  188. accessed.Should().BeGreaterOrEqualTo(4);
  189. }
  190. [Test]
  191. public void Process__bubbles_processed_dive_before_saving_dive()
  192. {
  193. var accessed = 0;
  194. var parserMock = new Mock<IImageParser>();
  195. var pixels = new[] { new Pixel(2, 3), new Pixel(3, 4), new Pixel(5, 4) };
  196. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  197. var dives = new[] { new Dive(15, 50, 23, ""), new Dive(24, 20, 33, "") };
  198. var dr = new Mock<IDiveRepository>();
  199. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  200. var sf = new Mock<ISampleFactory>();
  201. var processed = new[] { new ProcessedDive(dives[0]), new ProcessedDive(dives[0]) };
  202. sf.Setup(inp => inp.Create(It.IsAny<IEnumerable<Pixel>>(), dives[0])).Returns(processed[0]);
  203. sf.Setup(inp => inp.Create(It.IsAny<IEnumerable<Pixel>>(), dives[1])).Returns(processed[1]);
  204. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { return parserMock.Object; };
  205. var machine = new Machine(dr.Object, sf.Object, facFunc);
  206. machine.BeforeSavingDive += (dive) => accessed += dive.DiveLogId;
  207. machine.Process();
  208. accessed.Should().BeGreaterOrEqualTo(25);
  209. }
  210. [Test]
  211. public void Process__stores_processed_dives_but_not_nulls()
  212. {
  213. var accessed = 0;
  214. var parserMock = new Mock<IImageParser>();
  215. var pixels = new[] { new Pixel(2, 3), new Pixel(3, 4), new Pixel(5, 4) };
  216. parserMock.Setup(d => d.ReadDocument()).Returns(pixels);
  217. var dives = new[] { new Dive(14, 50, 23, ""), new Dive(14, 50, 23, "") };
  218. var dr = new Mock<IDiveRepository>();
  219. dr.Setup(inp => inp.LoadDives()).Returns(dives);
  220. var sf = new Mock<ISampleFactory>();
  221. var processed = new[] { new ProcessedDive(dives[0]), null };
  222. sf.Setup(inp => inp.Create(It.IsAny<IEnumerable<Pixel>>(), dives[0])).Returns(processed[0]);
  223. sf.Setup(inp => inp.Create(It.IsAny<IEnumerable<Pixel>>(), dives[1])).Returns(processed[1]);
  224. Func<DlImageParsr.Model.Dive, IImageParser> facFunc = d => { if (dives.Contains(d)) accessed++; return parserMock.Object; };
  225. var machine = new Machine(dr.Object, sf.Object, facFunc);
  226. machine.Process();
  227. dr.Verify(inp => inp.SaveDive(It.IsAny<ProcessedDive>() ), Times.Once());
  228. }
  229. }
  230. }