Index: Wti.Calculation.TestUtil/TestPipingOutput.cs =================================================================== diff -u --- Wti.Calculation.TestUtil/TestPipingOutput.cs (revision 0) +++ Wti.Calculation.TestUtil/TestPipingOutput.cs (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -0,0 +1,9 @@ +using Wti.Data; + +namespace Wti.Calculation.Test.Piping.Stub +{ + public class TestPipingOutput : PipingOutput + { + public TestPipingOutput() : base(0, 0, 0, 0, 0, 0) {} + } +} \ No newline at end of file Index: Wti.Calculation.TestUtil/Wti.Calculation.TestUtil.csproj =================================================================== diff -u -ra3b93c36c2051bd6112327bff0d836ae7883737d -r49b7320ad56bfa60788e8792b79dd537318f68ff --- Wti.Calculation.TestUtil/Wti.Calculation.TestUtil.csproj (.../Wti.Calculation.TestUtil.csproj) (revision a3b93c36c2051bd6112327bff0d836ae7883737d) +++ Wti.Calculation.TestUtil/Wti.Calculation.TestUtil.csproj (.../Wti.Calculation.TestUtil.csproj) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -41,6 +41,7 @@ + Index: src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs =================================================================== diff -u -r325410362b50750d3c291d19c1526799c9b1c583 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 325410362b50750d3c291d19c1526799c9b1c583) +++ src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -1,13 +1,16 @@ using System.Collections.Generic; using System.Linq; +using DelftTools.Shell.Core; namespace Wti.Data { /// /// Model for performing piping calculations. /// - public class PipingFailureMechanism + public class PipingFailureMechanism : IObservable { + private readonly IList observers = new List(); + /// /// Initializes a new instance of the class. /// @@ -26,5 +29,23 @@ /// Gets the input data which contains input and output of a piping calculation /// public PipingData PipingData { get; set; } + + public void Attach(IObserver observer) + { + observers.Add(observer); + } + + public void Detach(IObserver observer) + { + observers.Remove(observer); + } + + public void NotifyObservers() + { + foreach (var observer in observers) + { + observer.UpdateObserver(); + } + } } } \ No newline at end of file Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingContextMenuStrip.cs =================================================================== diff -u -r325410362b50750d3c291d19c1526799c9b1c583 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingContextMenuStrip.cs (.../PipingContextMenuStrip.cs) (revision 325410362b50750d3c291d19c1526799c9b1c583) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingContextMenuStrip.cs (.../PipingContextMenuStrip.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -18,15 +18,25 @@ public Action OnCalculationClick { get; set; } /// + /// Gets or sets the which is performed when the validate item on a is called. + /// + public Action OnValidationClick { get; set; } + + /// /// Creates a new instance of and assigns the to it. /// /// public PipingContextMenuStrip(PipingData pipingData) { this.pipingData = pipingData; + + var validateItem = new ToolStripMenuItem(Resources.PipingDataContextMenuValidate); + validateItem.Click += ValidateItemClick; + var calculateItem = new ToolStripMenuItem(Resources.PipingDataContextMenuCalculate); calculateItem.Click += CalculateItemClick; - Items.Add(calculateItem); + + Items.AddRange(new ToolStripItem[] { validateItem, calculateItem }); } private void CalculateItemClick(object sender, EventArgs e) @@ -36,5 +46,13 @@ OnCalculationClick(pipingData); } } + + private void ValidateItemClick(object sender, EventArgs e) + { + if (OnValidationClick != null) + { + OnValidationClick(pipingData); + } + } } } \ No newline at end of file Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs =================================================================== diff -u -r1689206627a4343d07fafcebb0a931b7a0e9e2d2 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs (.../PipingDataNodePresenter.cs) (revision 1689206627a4343d07fafcebb0a931b7a0e9e2d2) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingDataNodePresenter.cs (.../PipingDataNodePresenter.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -5,7 +5,6 @@ using DelftTools.Controls.Swf; using DelftTools.Utils.Collections; using log4net; -using Wti.Calculation.Piping; using Wti.Data; using Wti.Forms.Properties; using Wti.Service; @@ -78,25 +77,15 @@ public IMenuItem GetContextMenu(ITreeNode sender, object nodeData) { - var contextMenu = new PipingContextMenuStrip((PipingData)nodeData); + var contextMenu = new PipingContextMenuStrip((PipingData) nodeData); var contextMenuAdapter = new MenuItemContextMenuStripAdapter(contextMenu); contextMenu.OnCalculationClick += PerformPipingCalculation; + contextMenu.OnValidationClick += PerformPipingValidation; return contextMenuAdapter; } - private void PerformPipingCalculation(PipingData pipingData) - { - var calculationErrorMessages = PipingCalculationService.PerfromValidatedCalculation(pipingData); - - foreach(var errorMessage in calculationErrorMessages) - { - LogManager.GetLogger(typeof(PipingData)).Error(String.Format(Resources.ErrorInPipingCalculation_0, errorMessage)); - } - pipingData.NotifyObservers(); - } - public void OnPropertyChanged(object sender, ITreeNode node, PropertyChangedEventArgs e) {} public void OnCollectionChanged(object sender, NotifyCollectionChangingEventArgs e) {} @@ -113,5 +102,16 @@ failureMechanism.PipingData = null; return true; } + + private void PerformPipingValidation(PipingData pipingData) + { + PipingCalculationService.Validate(pipingData); + } + + private void PerformPipingCalculation(PipingData pipingData) + { + PipingCalculationService.PerfromValidatedCalculation(pipingData); + pipingData.NotifyObservers(); + } } } \ No newline at end of file Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingOutputNodePresenter.cs =================================================================== diff -u -r5fc71a385897af92ccb092f2f969b5709afab85a -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingOutputNodePresenter.cs (.../PipingOutputNodePresenter.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingOutputNodePresenter.cs (.../PipingOutputNodePresenter.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -75,7 +75,7 @@ public bool CanRemove(object parentNodeData, object nodeData) { - return true; + return false; } public bool RemoveNodeData(object parentNodeData, object nodeData) Index: src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -rbb61ed227cf79e994b84019096e4297b2fbd4527 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision bb61ed227cf79e994b84019096e4297b2fbd4527) +++ src/Plugins/Wti/Wti.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -79,15 +79,6 @@ } /// - /// Looks up a localized string similar to Piping berekening niet gelukt: {0}. - /// - public static string ErrorInPipingCalculation_0 { - get { - return ResourceManager.GetString("ErrorInPipingCalculation_0", resourceCulture); - } - } - - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// public static System.Drawing.Bitmap FolderIcon { @@ -171,6 +162,15 @@ } /// + /// Looks up a localized string similar to Valideren. + /// + public static string PipingDataContextMenuValidate { + get { + return ResourceManager.GetString("PipingDataContextMenuValidate", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Kritiek verhang met betrekking tot heave.. /// public static string PipingDataCriticalHeaveGradientDescription { Index: src/Plugins/Wti/Wti.Forms/Properties/Resources.resx =================================================================== diff -u -rbb61ed227cf79e994b84019096e4297b2fbd4527 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Forms/Properties/Resources.resx (.../Resources.resx) (revision bb61ed227cf79e994b84019096e4297b2fbd4527) +++ src/Plugins/Wti/Wti.Forms/Properties/Resources.resx (.../Resources.resx) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -334,8 +334,8 @@ Voeg piping faalmechanisme toe - - Piping berekening niet gelukt: {0} + + Valideren ..\Resources\table-import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a Index: src/Plugins/Wti/Wti.Service/DateTimeService.cs =================================================================== diff -u --- src/Plugins/Wti/Wti.Service/DateTimeService.cs (revision 0) +++ src/Plugins/Wti/Wti.Service/DateTimeService.cs (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -0,0 +1,21 @@ +using System; + +namespace Wti.Service +{ + /// + /// The class is responsible for providing general operations. + /// + public static class DateTimeService + { + /// + /// Gets the current time in HH:mm:ss format. + /// + public static String CurrentTimeAsString + { + get + { + return DateTime.Now.ToString("HH:mm:ss"); + } + } + } +} \ No newline at end of file Index: src/Plugins/Wti/Wti.Service/PipingCalculationResult.cs =================================================================== diff -u --- src/Plugins/Wti/Wti.Service/PipingCalculationResult.cs (revision 0) +++ src/Plugins/Wti/Wti.Service/PipingCalculationResult.cs (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -0,0 +1,23 @@ +namespace Wti.Service +{ + /// + /// Status result from a calculation or validation performed by the . + /// + public enum PipingCalculationResult + { + /// + /// Value which is returned when no calculation or validation errors occurred. + /// + Successful, + + /// + /// Value which is returned when the validation routine resulted in validation errors. + /// + ValidationErrors, + + /// + /// Value which is returned when the calculation routine encountered problems. + /// + CalculationErrors + } +} \ No newline at end of file Index: src/Plugins/Wti/Wti.Service/PipingCalculationService.cs =================================================================== diff -u -r1689206627a4343d07fafcebb0a931b7a0e9e2d2 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 1689206627a4343d07fafcebb0a931b7a0e9e2d2) +++ src/Plugins/Wti/Wti.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -1,66 +1,101 @@ -using System.Collections.Generic; +using System; +using log4net; using Wti.Calculation.Piping; using Wti.Data; +using Wti.Service.Properties; namespace Wti.Service { /// - /// This class controls the and its PipingDataNodePresenter. - /// Interactions from the PipingDataNodePresenter are handles by this class. + /// This class is responsible for invoking operations on the . Error and status information is + /// logged during the execution of the operation. At the end of an operation, a is returned, + /// representing the result of the operation. /// public static class PipingCalculationService { + private static readonly ILog PipingDataLogger = LogManager.GetLogger(typeof(PipingData)); + /// /// Performs a piping calculation based on the supplied and sets - /// to the if the calculation was successful. + /// to the if the calculation was successful. Error and status information is logged during + /// the execution of the operation. /// /// The to base the input for the calculation upon. - /// A with all the messages that were returned due to validation errors in the given - /// or error message that occurred when performing the calculation. - public static List PerfromValidatedCalculation(PipingData pipingData) + /// If contains validation errors, then is returned. + /// If problems were encountered during the calculation, is returned. + /// Otherwise, is returned. + public static PipingCalculationResult PerfromValidatedCalculation(PipingData pipingData) { - var validationResults = Validate(pipingData); - if (validationResults.Count > 0) + PipingCalculationResult validationResult = Validate(pipingData); + + if (validationResult == PipingCalculationResult.Successful) { ClearOutput(pipingData); - return validationResults; + return Calculate(pipingData); } - try + + return validationResult; + } + + /// + /// Performs validation over the values on the given . Error and status information is logged during + /// the execution of the operation. + /// + /// The for which to validate the values. + /// If contains validation errors, then is returned. + /// Otherwise, is returned. + public static PipingCalculationResult Validate(PipingData pipingData) + { + PipingDataLogger.Info(String.Format(Resources.ValidationStarted_0, DateTimeService.CurrentTimeAsString)); + + var validationResults = new PipingCalculation(CreateInputFromData(pipingData)).Validate(); + LogMessagesAsError(validationResults.ToArray()); + + PipingDataLogger.Info(String.Format(Resources.ValidationEnded_0, DateTimeService.CurrentTimeAsString)); + + return validationResults.Count > 0 ? PipingCalculationResult.ValidationErrors : PipingCalculationResult.Successful; + } + + private static void LogMessagesAsError(params string[] errorMessages) + { + foreach (var errorMessage in errorMessages) { - Calculate(pipingData); + PipingDataLogger.Error(string.Format(Resources.ErrorInPipingCalculation_0, errorMessage)); } - catch (PipingCalculationException e) - { - ClearOutput(pipingData); - return new List{ e.Message }; - } - return new List(); } private static void ClearOutput(PipingData pipingData) { pipingData.Output = null; } - private static void Calculate(PipingData pipingData) + private static PipingCalculationResult Calculate(PipingData pipingData) { - var input = CreateInputFromData(pipingData); - var pipingCalculation = new PipingCalculation(input); + PipingDataLogger.Info(String.Format(Resources.CalculationStarted_0, DateTimeService.CurrentTimeAsString)); - var pipingResult = pipingCalculation.Calculate(); + try + { + var pipingResult = new PipingCalculation(CreateInputFromData(pipingData)).Calculate(); - pipingData.Output = new PipingOutput(pipingResult.UpliftZValue, - pipingResult.UpliftFactorOfSafety, - pipingResult.HeaveZValue, pipingResult.HeaveFactorOfSafety, pipingResult.SellmeijerZValue, pipingResult.SellmeijerFactorOfSafety); + pipingData.Output = new PipingOutput(pipingResult.UpliftZValue, + pipingResult.UpliftFactorOfSafety, + pipingResult.HeaveZValue, + pipingResult.HeaveFactorOfSafety, + pipingResult.SellmeijerZValue, + pipingResult.SellmeijerFactorOfSafety); + } + catch (PipingCalculationException e) + { + LogMessagesAsError(e.Message); + return PipingCalculationResult.CalculationErrors; + } + finally + { + PipingDataLogger.Info(String.Format(Resources.CalculationEnded_0, DateTimeService.CurrentTimeAsString)); + } + return PipingCalculationResult.Successful; } - public static List Validate(PipingData pipingData) - { - var input = CreateInputFromData(pipingData); - - return new PipingCalculation(input).Validate(); - } - private static PipingCalculationInput CreateInputFromData(PipingData pipingData) { return new PipingCalculationInput( Fisheye: Tag 82e08784e174b6b2799fc19cc04e7d7aeb7b84e9 refers to a dead (removed) revision in file `src/Plugins/Wti/Wti.Service/Properties/Resources.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 82e08784e174b6b2799fc19cc04e7d7aeb7b84e9 refers to a dead (removed) revision in file `src/Plugins/Wti/Wti.Service/Properties/Resources.resx'. Fisheye: No comparison available. Pass `N' to diff? Index: src/Plugins/Wti/Wti.Service/Wti.Service.csproj =================================================================== diff -u -r82e08784e174b6b2799fc19cc04e7d7aeb7b84e9 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- src/Plugins/Wti/Wti.Service/Wti.Service.csproj (.../Wti.Service.csproj) (revision 82e08784e174b6b2799fc19cc04e7d7aeb7b84e9) +++ src/Plugins/Wti/Wti.Service/Wti.Service.csproj (.../Wti.Service.csproj) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -53,8 +53,15 @@ Properties\GlobalAssembly.cs + + + + True + True + Resources.resx + @@ -82,6 +89,12 @@ Wti.Data + + + ResXFileCodeGenerator + Resources.Designer.cs + + Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs =================================================================== diff -u -r1689206627a4343d07fafcebb0a931b7a0e9e2d2 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs (.../PipingDataNodePresenterTest.cs) (revision 1689206627a4343d07fafcebb0a931b7a0e9e2d2) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingDataNodePresenterTest.cs (.../PipingDataNodePresenterTest.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -271,8 +271,9 @@ // Assert Assert.NotNull(contextMenu); - Assert.AreEqual(1, contextMenu.ContextMenuStrip.Items.Count); - Assert.AreEqual(WtiFormsResources.PipingDataContextMenuCalculate, contextMenu.ContextMenuStrip.Items[0].Text); + Assert.AreEqual(2, contextMenu.ContextMenuStrip.Items.Count); + Assert.AreEqual(WtiFormsResources.PipingDataContextMenuCalculate, contextMenu.ContextMenuStrip.Items[1].Text); + Assert.AreEqual(WtiFormsResources.PipingDataContextMenuValidate, contextMenu.ContextMenuStrip.Items[0].Text); Assert.IsInstanceOf(contextMenu.ContextMenuStrip); mocks.VerifyAll(); // Expect no calls on arguments } @@ -356,6 +357,11 @@ public void GivenInvalidPipingData_WhenCalculatingFromContextMenu_ThenPipingDataNotifiesObserversAndLogMessageAdded() { // Given + var expectedValidationMessageCount = 6; + var expectedStatusMessageCount = 2; + var expectedLogMessageCount = expectedValidationMessageCount + expectedStatusMessageCount; + + var calculateContextMenuItemIndex = 1; var pipingData = new PipingData(); var observer = mockRepository.StrictMock(); var nodePresenter = new PipingDataNodePresenter(); @@ -367,18 +373,50 @@ var contextMenuAdapter = nodePresenter.GetContextMenu(null, pipingData) as MenuItemContextMenuStripAdapter; // When - Action action = () => contextMenuAdapter.ContextMenuStrip.Items[0].PerformClick(); + Action action = () => contextMenuAdapter.ContextMenuStrip.Items[calculateContextMenuItemIndex].PerformClick(); // Then - TestHelper.AssertLogMessagesCount(action, 6); + TestHelper.AssertLogMessagesCount(action, expectedLogMessageCount); Assert.IsNull(pipingData.Output); mockRepository.VerifyAll(); } [Test] + public void GivenInvalidPipingData_WhenValidatingFromContextMenu_ThenLogMessageAddedAndNoNotifyObserver() + { + // Given + var expectedValidationMessageCount = 6; + var expectedStatusMessageCount = 2; + var expectedLogMessageCount = expectedValidationMessageCount + expectedStatusMessageCount; + + var validateContextMenuItemIndex = 0; + var pipingData = new PipingData(); + var observer = mockRepository.StrictMock(); + var nodePresenter = new PipingDataNodePresenter(); + observer.Expect(o => o.UpdateObserver()).Repeat.Never(); + pipingData.Attach(observer); + + mockRepository.ReplayAll(); + + var contextMenuAdapter = nodePresenter.GetContextMenu(null, pipingData) as MenuItemContextMenuStripAdapter; + + // When + Action action = () => contextMenuAdapter.ContextMenuStrip.Items[validateContextMenuItemIndex].PerformClick(); + + // Then + TestHelper.AssertLogMessagesCount(action, expectedLogMessageCount); + mockRepository.VerifyAll(); + } + + [Test] public void GivenValidPipingData_WhenCalculatingFromContextMenu_ThenPipingDataNotifiesObservers() { // Given + var expectedCalculationStatusMessageCount = 2; + var expectedValidationStatusMessageCount = 2; + var expectedLogMessageCount = expectedCalculationStatusMessageCount + expectedValidationStatusMessageCount; + + var calculateContextMenuItemIndex = 1; var pipingData = new PipingData(); var validPipingInput = new TestPipingInput(); pipingData.AssessmentLevel = validPipingInput.AssessmentLevel; @@ -414,10 +452,10 @@ var contextMenuAdapter = nodePresenter.GetContextMenu(null, pipingData) as MenuItemContextMenuStripAdapter; // When - Action action = () => contextMenuAdapter.ContextMenuStrip.Items[0].PerformClick(); + Action action = () => contextMenuAdapter.ContextMenuStrip.Items[calculateContextMenuItemIndex].PerformClick(); // Then - TestHelper.AssertLogMessagesCount(action, 0); + TestHelper.AssertLogMessagesCount(action, expectedLogMessageCount); Assert.IsNotNull(pipingData.Output); mockRepository.VerifyAll(); } Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs =================================================================== diff -u -rad18963162aaa0d4f16d583f2bd8b51480e1e1ba -r49b7320ad56bfa60788e8792b79dd537318f68ff --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs (.../PipingOutputNodePresenterTest.cs) (revision ad18963162aaa0d4f16d583f2bd8b51480e1e1ba) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/PipingOutputNodePresenterTest.cs (.../PipingOutputNodePresenterTest.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -4,6 +4,7 @@ using DelftTools.Utils.Collections; using NUnit.Framework; using Rhino.Mocks; +using Wti.Calculation.Test.Piping.Stub; using Wti.Data; using Wti.Forms.NodePresenters; using Wti.Forms.Test.Helper; @@ -273,7 +274,7 @@ } [Test] - public void CanRemove_Always_ReturnTrue() + public void CanRemove_Always_ReturnFalse() { // Setup var mocks = new MockRepository(); @@ -287,27 +288,21 @@ bool removalAllowed = nodePresenter.CanRemove(dataMock, nodeMock); // Assert - Assert.IsTrue(removalAllowed); + Assert.IsFalse(removalAllowed); mocks.VerifyAll(); // Expect no calls on arguments } [Test] - public void RemoveNodeData_ProjectWithPipingData_ReturnFalse() + public void RemoveNodeData_Always_ReturnFalse() { // Setup - var pipingData = new PipingData(); - - var project = new Project(); - project.Items.Add(pipingData); - var nodePresenter = new PipingOutputNodePresenter(); // Call - bool removalSuccesful = nodePresenter.RemoveNodeData(project, pipingData); + bool removalSuccesful = nodePresenter.RemoveNodeData(null, null); // Assert Assert.IsFalse(removalSuccesful); - CollectionAssert.Contains(project.Items, pipingData); } } } \ No newline at end of file Index: test/Plugins/Wti/Wti.Forms.Test/PipingContextMenuStripTest.cs =================================================================== diff -u -ra3b93c36c2051bd6112327bff0d836ae7883737d -r49b7320ad56bfa60788e8792b79dd537318f68ff --- test/Plugins/Wti/Wti.Forms.Test/PipingContextMenuStripTest.cs (.../PipingContextMenuStripTest.cs) (revision a3b93c36c2051bd6112327bff0d836ae7883737d) +++ test/Plugins/Wti/Wti.Forms.Test/PipingContextMenuStripTest.cs (.../PipingContextMenuStripTest.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -6,26 +6,43 @@ public class PipingContextMenuStripTest { [Test] - public void Constructor_Always_OneMenuItemIsAdded() + public void Constructor_Always_ValidateAndCalculateItemsAreAdded() { var actual = new PipingContextMenuStrip(null); - Assert.AreEqual(1, actual.Items.Count); + Assert.AreEqual(2, actual.Items.Count); CollectionAssert.AllItemsAreNotNull(actual.Items); } [Test] - public void OnClick_Always_NoExceptions() + public void OnClick_CalculateItemAlways_NoExceptions() { var pipingContextMenu = new PipingContextMenuStrip(null); + pipingContextMenu.Items[1].PerformClick(); + } + + [Test] + public void OnClick_ValidateItemAlways_NoExceptions() + { + var pipingContextMenu = new PipingContextMenuStrip(null); pipingContextMenu.Items[0].PerformClick(); } [Test] - public void OnClick_HandlerActionDefined_ActionIsExecuted() + public void OnClick_CalculateItemOnCalculateHandlerActionDefined_ActionIsExecuted() { var executed = false; var pipingContextMenu = new PipingContextMenuStrip(null); pipingContextMenu.OnCalculationClick += p => executed = true; + pipingContextMenu.Items[1].PerformClick(); + Assert.IsTrue(executed); + } + + [Test] + public void OnClick_ValidateItemOnValidateHandlerActionDefined_ActionIsExecuted() + { + var executed = false; + var pipingContextMenu = new PipingContextMenuStrip(null); + pipingContextMenu.OnValidationClick += p => executed = true; pipingContextMenu.Items[0].PerformClick(); Assert.IsTrue(executed); } Index: test/Plugins/Wti/Wti.Service.Test/PipingCalculationServiceTest.cs =================================================================== diff -u -r1689206627a4343d07fafcebb0a931b7a0e9e2d2 -r49b7320ad56bfa60788e8792b79dd537318f68ff --- test/Plugins/Wti/Wti.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 1689206627a4343d07fafcebb0a931b7a0e9e2d2) +++ test/Plugins/Wti/Wti.Service.Test/PipingCalculationServiceTest.cs (.../PipingCalculationServiceTest.cs) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -1,58 +1,104 @@ using NUnit.Framework; -using Wti.Calculation.Piping; +using Rhino.Mocks; +using Wti.Calculation.Test.Piping.Stub; using Wti.Data; namespace Wti.Service.Test { public class PipingCalculationServiceTest { - private readonly PipingData validPipingData = new PipingData + private PipingData validPipingData; + + [SetUp] + public void SetUp() { - AssessmentLevel = 1.0, - BeddingAngle = 1.0, - CriticalHeaveGradient = 1.0, - DampingFactorExit = 1.0, - DarcyPermeability = 1.0, - Diameter70 = 1.0, - ExitPointXCoordinate = 1.0, - Gravity = 1.0, - MeanDiameter70 = 1.0, - PiezometricHeadExit = 1.0, - PiezometricHeadPolder = 1.0, - PhreaticLevelExit = 2.0, - SandParticlesVolumicWeight = 1.0, - SeepageLength = 1.0, - SellmeijerModelFactor = 1.0, - SellmeijerReductionFactor = 1.0, - ThicknessAquiferLayer = 1.0, - ThicknessCoverageLayer = 1.0, - UpliftModelFactor = 1.0, - WaterKinematicViscosity = 1.0, - WaterVolumetricWeight = 1.0, - WhitesDragCoefficient = 1.0 - }; + validPipingData = new PipingData + { + AssessmentLevel = 1.0, + BeddingAngle = 1.0, + CriticalHeaveGradient = 1.0, + DampingFactorExit = 1.0, + DarcyPermeability = 1.0, + Diameter70 = 1.0, + ExitPointXCoordinate = 1.0, + Gravity = 1.0, + MeanDiameter70 = 1.0, + PiezometricHeadExit = 1.0, + PiezometricHeadPolder = 1.0, + PhreaticLevelExit = 2.0, + SandParticlesVolumicWeight = 1.0, + SeepageLength = 1.0, + SellmeijerModelFactor = 1.0, + SellmeijerReductionFactor = 1.0, + ThicknessAquiferLayer = 1.0, + ThicknessCoverageLayer = 1.0, + UpliftModelFactor = 1.0, + WaterKinematicViscosity = 1.0, + WaterVolumetricWeight = 1.0, + WhitesDragCoefficient = 1.0 + }; + } [Test] - public void Calculate_ValidPipingData_ShouldSetOutput() + public void PerfromValidatedCalculation_ValidPipingDataNoOutput_ShouldSetOutput() { + // Precondition + Assert.IsNull(validPipingData.Output); + // Call - PipingCalculationService.PerfromValidatedCalculation(validPipingData); + var result = PipingCalculationService.PerfromValidatedCalculation(validPipingData); // Assert + Assert.AreEqual(PipingCalculationResult.Successful, result); Assert.NotNull(validPipingData.Output); } [Test] - public void Calculate_InValidPipingData_ReturnsErrorMessages() + public void PerfromValidatedCalculation_ValidPipingDataWithOutput_ShouldChangeOutput() { // Setup - var invalidPipingData = new PipingData(); + var output = new TestPipingOutput(); + validPipingData.Output = output; // Call - var results = PipingCalculationService.PerfromValidatedCalculation(invalidPipingData); + var result = PipingCalculationService.PerfromValidatedCalculation(validPipingData); + + // Assert + Assert.AreEqual(PipingCalculationResult.Successful, result); + Assert.AreNotSame(output, validPipingData.Output); + } + + [Test] + public void PerfromValidatedCalculation_InValidPipingDataWithOutput_ReturnsFalseNoOutputChange() + { + // Setup + var output = new TestPipingOutput(); + var invalidPipingData = new PipingData + { + Output = output + }; + + // Call + var result = PipingCalculationService.PerfromValidatedCalculation(invalidPipingData); // Assert - CollectionAssert.IsNotEmpty(results); + Assert.AreEqual(PipingCalculationResult.ValidationErrors, result); + Assert.AreSame(output, invalidPipingData.Output); } + + [Test] + public void PerformValidatedCalculation_Diameter70AndAquiferPermeabilityZero_CalculationErrorOutputNull() + { + // Setup + validPipingData.Diameter70 = 0; + validPipingData.DarcyPermeability = 0; + + // Call + var result = PipingCalculationService.PerfromValidatedCalculation(validPipingData); + + // Assert + Assert.AreEqual(PipingCalculationResult.CalculationErrors, result); + Assert.Null(validPipingData.Output); + } } } \ No newline at end of file Index: test/Plugins/Wti/Wti.Service.Test/Wti.Service.Test.csproj =================================================================== diff -u -rbcf5bfda6fc2fca0b4229b9181df3d217fe1b33f -r49b7320ad56bfa60788e8792b79dd537318f68ff --- test/Plugins/Wti/Wti.Service.Test/Wti.Service.Test.csproj (.../Wti.Service.Test.csproj) (revision bcf5bfda6fc2fca0b4229b9181df3d217fe1b33f) +++ test/Plugins/Wti/Wti.Service.Test/Wti.Service.Test.csproj (.../Wti.Service.Test.csproj) (revision 49b7320ad56bfa60788e8792b79dd537318f68ff) @@ -34,6 +34,9 @@ ..\..\..\..\lib\nunit.framework.dll + + ..\..\..\..\lib\Rhino.Mocks.dll + @@ -76,6 +79,10 @@ {7cd038e1-e111-4969-aced-22c5bd2974e1} Wti.Forms + + {27E0A5C9-3ABF-426A-A3DA-7D0B83A218C8} + Wti.Calculation.TestUtil +