/src/Cassette.UnitTests/ModuleProcessing/MutablePipeline.cs

https://github.com/lukebennett/cassette · C# · 210 lines · 151 code · 42 blank · 17 comment · 0 complexity · 65d742c1bbd3d6a36fdd7b8bf32f57e5 MD5 · raw file

  1. #region License
  2. /*
  3. Copyright 2011 Andrew Davey
  4. This file is part of Cassette.
  5. Cassette is free software: you can redistribute it and/or modify it under the
  6. terms of the GNU General Public License as published by the Free Software
  7. Foundation, either version 3 of the License, or (at your option) any later
  8. version.
  9. Cassette is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License along with
  13. Cassette. If not, see http://www.gnu.org/licenses/.
  14. */
  15. #endregion
  16. using System.Collections.Generic;
  17. using Moq;
  18. using Should;
  19. using Xunit;
  20. namespace Cassette.ModuleProcessing
  21. {
  22. public class MutablePipeline_Tests
  23. {
  24. public MutablePipeline_Tests()
  25. {
  26. MockStep.count = 0;
  27. }
  28. [Fact]
  29. public void ProcessCallsCreatePipeline()
  30. {
  31. var pipeline = new MockPipeline();
  32. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  33. pipeline.CreatePipelineCalled.ShouldBeTrue();
  34. }
  35. [Fact]
  36. public void ProcessCallsStep()
  37. {
  38. var pipeline = new MockPipeline();
  39. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  40. pipeline.DummyStep.ProcessCalled.ShouldBeTrue();
  41. }
  42. [Fact]
  43. public void WhenRemoveStep_ThenProcessDoesNotCallIt()
  44. {
  45. var pipeline = new MockPipeline();
  46. pipeline.Remove<MockStep>();
  47. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  48. pipeline.DummyStep.ProcessCalled.ShouldBeFalse();
  49. }
  50. [Fact]
  51. public void WhenReplaceStep_ThenProcessCallsNewStep()
  52. {
  53. var pipeline = new MockPipeline();
  54. var newStep = new MockStep();
  55. pipeline.Replace<MockStep>(newStep);
  56. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  57. newStep.ProcessCalled.ShouldBeTrue();
  58. }
  59. [Fact]
  60. public void WhenReplaceStep_ThenProcessDoesNotCallOldStep()
  61. {
  62. var pipeline = new MockPipeline();
  63. var newStep = new MockStep();
  64. pipeline.Replace<MockStep>(newStep);
  65. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  66. pipeline.DummyStep.ProcessCalled.ShouldBeFalse();
  67. }
  68. [Fact]
  69. public void WhenInsertAfterStep_TheProcessCallsTheNewStep()
  70. {
  71. var pipeline = new MockPipeline();
  72. var newStep = new MockStep();
  73. pipeline.InsertAfter<MockStep>(newStep);
  74. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  75. newStep.ProcessCalled.ShouldBeTrue();
  76. }
  77. [Fact]
  78. public void WhenInsertAfterStep_TheProcessCallsTheNewStepAfterOriginalStep()
  79. {
  80. var pipeline = new MockPipeline();
  81. var newStep = new MockStep();
  82. pipeline.InsertAfter<MockStep>(newStep);
  83. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  84. (newStep.CallIndex > pipeline.DummyStep.CallIndex).ShouldBeTrue();
  85. }
  86. [Fact]
  87. public void WhenInsertBeforeStep_TheProcessCallsTheNewStep()
  88. {
  89. var pipeline = new MockPipeline();
  90. var newStep = new MockStep();
  91. pipeline.InsertBefore<MockStep>(newStep);
  92. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  93. newStep.ProcessCalled.ShouldBeTrue();
  94. }
  95. [Fact]
  96. public void WhenInsertBeforeStep_TheProcessCallsTheNewStepBeforeOriginalStep()
  97. {
  98. var pipeline = new MockPipeline();
  99. var newStep = new MockStep();
  100. pipeline.InsertBefore<MockStep>(newStep);
  101. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  102. (newStep.CallIndex < pipeline.DummyStep.CallIndex).ShouldBeTrue();
  103. }
  104. [Fact]
  105. public void WhenUpdateStep_ThenProcessCallsUpdateAction()
  106. {
  107. var pipeline = new MockPipeline();
  108. pipeline.Update<MockStep>(step => step.Updated = true);
  109. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  110. pipeline.DummyStep.Updated.ShouldBeTrue();
  111. }
  112. [Fact]
  113. public void WhenPrependStep_ThenProcessCallsTheStepFirst()
  114. {
  115. var pipeline = new MockPipeline();
  116. var step = new MockStep();
  117. pipeline.Prepend(step);
  118. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  119. (step.CallIndex < pipeline.DummyStep.CallIndex).ShouldBeTrue();
  120. }
  121. [Fact]
  122. public void WhenAppendStep_ThenProcessCallsTheStepLast()
  123. {
  124. var pipeline = new MockPipeline();
  125. var step = new MockStep();
  126. pipeline.Append(step);
  127. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  128. (step.CallIndex > pipeline.DummyStep.CallIndex).ShouldBeTrue();
  129. }
  130. [Fact]
  131. public void CanChainModifications()
  132. {
  133. var pipeline = new MockPipeline();
  134. var step1 = new MockStep();
  135. var step2 = new MockStep();
  136. pipeline.Append(step1).Append(step2);
  137. pipeline.Process(new Module("~"), Mock.Of<ICassetteApplication>());
  138. step1.CallIndex.ShouldEqual(1);
  139. step2.CallIndex.ShouldEqual(2);
  140. }
  141. class MockPipeline : MutablePipeline<Module>
  142. {
  143. protected override IEnumerable<IModuleProcessor<Module>> CreatePipeline(Module module, ICassetteApplication application)
  144. {
  145. CreatePipelineCalled = true;
  146. yield return DummyStep;
  147. }
  148. public readonly MockStep DummyStep = new MockStep();
  149. public bool CreatePipelineCalled;
  150. }
  151. class MockStep : IModuleProcessor<Module>
  152. {
  153. public void Process(Module module, ICassetteApplication application)
  154. {
  155. CallIndex = count++;
  156. ProcessCalled = true;
  157. }
  158. public bool ProcessCalled;
  159. public int CallIndex;
  160. public bool Updated;
  161. public static int count;
  162. }
  163. }
  164. }