Index: Riskeer/Integration/src/Riskeer.Integration.Plugin/RiskeerPlugin.cs =================================================================== diff -u -rf28bacd4157b1ab0ad15a8d95dcd4220aab396be -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/src/Riskeer.Integration.Plugin/RiskeerPlugin.cs (.../RiskeerPlugin.cs) (revision f28bacd4157b1ab0ad15a8d95dcd4220aab396be) +++ Riskeer/Integration/src/Riskeer.Integration.Plugin/RiskeerPlugin.cs (.../RiskeerPlugin.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -435,6 +435,9 @@ yield return CreateFailureMechanismResultViewInfo( fm => fm.GeneralInput.N, fm => fm.GeneralInput.ApplyLengthEffectInSection); + yield return CreateFailureMechanismResultViewInfo( + fp => fp.GeneralInput.N, fp => fp.GeneralInput.ApplyLengthEffectInSection); + yield return new RiskeerViewInfo(() => Gui) { GetViewName = (view, context) => context.WrappedData.Name, @@ -1428,7 +1431,8 @@ #region FailureMechanismResults ViewInfo - private static bool CloseFailureMechanismResultViewForData(TView view, object dataToCloseFor) + private static bool CloseFailureMechanismResultViewForData( + TView view, object dataToCloseFor) where TFailureMechanism : class, IFailurePath where TSectionResult : FailureMechanismSectionResult where TSectionResultRow : FailureMechanismSectionResultRow @@ -1439,10 +1443,13 @@ { failureMechanism = assessmentSection.GetFailureMechanisms() .OfType() - .FirstOrDefault(); + .FirstOrDefault() + ?? assessmentSection.SpecificFailurePaths + .Cast() + .FirstOrDefault(fp => fp == view.FailureMechanism); } - if (dataToCloseFor is IFailurePathContext failureMechanismContext) + if (dataToCloseFor is IFailurePathContext failureMechanismContext) { failureMechanism = failureMechanismContext.WrappedData as TFailureMechanism; } Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/RiskeerPluginTest.cs =================================================================== diff -u -rf28bacd4157b1ab0ad15a8d95dcd4220aab396be -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/RiskeerPluginTest.cs (.../RiskeerPluginTest.cs) (revision f28bacd4157b1ab0ad15a8d95dcd4220aab396be) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/RiskeerPluginTest.cs (.../RiskeerPluginTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -337,7 +337,7 @@ propertyInfos, typeof(FailureMechanismSectionAssemblyGroupsContext), typeof(FailureMechanismSectionAssemblyGroupsProperties)); - + PluginTestHelper.AssertPropertyInfoDefined( propertyInfos, typeof(AssessmentSectionAssemblyGroupsContext), @@ -392,7 +392,7 @@ ViewInfo[] viewInfos = plugin.GetViewInfos().ToArray(); // Assert - Assert.AreEqual(26, viewInfos.Length); + Assert.AreEqual(27, viewInfos.Length); PluginTestHelper.AssertViewInfoDefined( viewInfos, @@ -464,6 +464,12 @@ PluginTestHelper.AssertViewInfoDefined( viewInfos, + typeof(SpecificFailurePathSectionResultContext), + typeof(IObservableEnumerable), + typeof(NonAdoptableWithProfileProbabilityFailureMechanismResultView)); + + PluginTestHelper.AssertViewInfoDefined( + viewInfos, typeof(Comment), typeof(CommentView)); Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffInwardsFailureMechanismResultViewInfoTest.cs =================================================================== diff -u -re3b8937a862993685f17f944a7656a7def8b8c3b -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffInwardsFailureMechanismResultViewInfoTest.cs (.../GrassCoverSlipOffInwardsFailureMechanismResultViewInfoTest.cs) (revision e3b8937a862993685f17f944a7656a7def8b8c3b) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffInwardsFailureMechanismResultViewInfoTest.cs (.../GrassCoverSlipOffInwardsFailureMechanismResultViewInfoTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -28,6 +28,7 @@ using Riskeer.AssemblyTool.Data.TestUtil; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.Forms.Views; using Riskeer.Integration.Data.StandAlone; @@ -99,6 +100,7 @@ // Setup var assessmentSection = mocks.Stub(); assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(new IFailureMechanism[0]); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new GrassCoverSlipOffInwardsFailureMechanism(); @@ -129,6 +131,7 @@ { otherFailureMechanism }); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new GrassCoverSlipOffInwardsFailureMechanism(); Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffOutwardsFailureMechanismResultViewInfoTest.cs =================================================================== diff -u -re3b8937a862993685f17f944a7656a7def8b8c3b -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffOutwardsFailureMechanismResultViewInfoTest.cs (.../GrassCoverSlipOffOutwardsFailureMechanismResultViewInfoTest.cs) (revision e3b8937a862993685f17f944a7656a7def8b8c3b) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/GrassCoverSlipOffOutwardsFailureMechanismResultViewInfoTest.cs (.../GrassCoverSlipOffOutwardsFailureMechanismResultViewInfoTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -28,6 +28,7 @@ using Riskeer.AssemblyTool.Data.TestUtil; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.Forms.Views; using Riskeer.Integration.Data.StandAlone; @@ -99,6 +100,7 @@ // Setup var assessmentSection = mocks.Stub(); assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(new IFailureMechanism[0]); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new GrassCoverSlipOffOutwardsFailureMechanism(); @@ -129,6 +131,7 @@ { otherFailureMechanism }); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new GrassCoverSlipOffOutwardsFailureMechanism(); Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/MicrostabilityFailureMechanismResultViewInfoTest.cs =================================================================== diff -u -re3b8937a862993685f17f944a7656a7def8b8c3b -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/MicrostabilityFailureMechanismResultViewInfoTest.cs (.../MicrostabilityFailureMechanismResultViewInfoTest.cs) (revision e3b8937a862993685f17f944a7656a7def8b8c3b) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/MicrostabilityFailureMechanismResultViewInfoTest.cs (.../MicrostabilityFailureMechanismResultViewInfoTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -28,6 +28,7 @@ using Riskeer.AssemblyTool.Data.TestUtil; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.Forms.Views; using Riskeer.Integration.Data.StandAlone; @@ -98,6 +99,7 @@ // Setup var assessmentSection = mocks.Stub(); assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(new IFailureMechanism[0]); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new MicrostabilityFailureMechanism(); @@ -128,6 +130,7 @@ { otherFailureMechanism }); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new MicrostabilityFailureMechanism(); Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/PipingStructureFailureMechanismResultViewInfoTest.cs =================================================================== diff -u -r3f7958e07bed38f4dba407be2fd4715048f3c849 -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/PipingStructureFailureMechanismResultViewInfoTest.cs (.../PipingStructureFailureMechanismResultViewInfoTest.cs) (revision 3f7958e07bed38f4dba407be2fd4715048f3c849) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/PipingStructureFailureMechanismResultViewInfoTest.cs (.../PipingStructureFailureMechanismResultViewInfoTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -27,6 +27,7 @@ using Rhino.Mocks; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.Forms.Views; using Riskeer.Integration.Data.StandAlone; @@ -98,6 +99,7 @@ // Setup var assessmentSection = mocks.Stub(); assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(new IFailureMechanism[0]); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new PipingStructureFailureMechanism(); @@ -124,6 +126,7 @@ { otherFailureMechanism }); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new PipingStructureFailureMechanism(); Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/SpecificFailurePathResultViewInfoTest.cs =================================================================== diff -u --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/SpecificFailurePathResultViewInfoTest.cs (revision 0) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/SpecificFailurePathResultViewInfoTest.cs (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -0,0 +1,256 @@ +// Copyright (C) Stichting Deltares 2021. All rights reserved. +// +// This file is part of Riskeer. +// +// Riskeer is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using System.Linq; +using Core.Common.Base; +using Core.Common.Controls.Views; +using Core.Gui.Plugin; +using NUnit.Framework; +using Rhino.Mocks; +using Riskeer.AssemblyTool.Data.TestUtil; +using Riskeer.Common.Data.AssessmentSection; +using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; +using Riskeer.Common.Forms.Views; +using Riskeer.Integration.Forms.PresentationObjects; + +namespace Riskeer.Integration.Plugin.Test.ViewInfos +{ + [TestFixture] + public class SpecificFailurePathResultViewInfoTest + { + private MockRepository mocks; + private RiskeerPlugin plugin; + private ViewInfo info; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + plugin = new RiskeerPlugin(); + info = plugin.GetViewInfos().First(tni => tni.ViewType == typeof(NonAdoptableWithProfileProbabilityFailureMechanismResultView)); + } + + [TearDown] + public void TearDown() + { + plugin.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(SpecificFailurePathSectionResultContext), info.DataType); + Assert.AreEqual(typeof(IObservableEnumerable), info.ViewDataType); + } + + [Test] + public void GetViewData_WithContext_ReturnsWrappedFailureMechanismResult() + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + var context = new SpecificFailurePathSectionResultContext( + failureMechanism.SectionResults, failureMechanism, assessmentSection); + + // Call + object viewData = info.GetViewData(context); + + // Assert + Assert.AreSame(failureMechanism.SectionResults, viewData); + mocks.VerifyAll(); + } + + [Test] + public void GetViewName_Always_ReturnsViewName() + { + // Call + string viewName = info.GetViewName(null, null); + + // Assert + Assert.AreEqual("Resultaat", viewName); + } + + [Test] + public void CloseForData_AssessmentSectionRemovedWithoutFailurePath_ReturnsFalse() + { + // Setup + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(Array.Empty()); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + + using (var view = new NonAdoptableWithProfileProbabilityFailureMechanismResultView( + failureMechanism.SectionResults, failureMechanism, + fm => fm.GeneralInput.N, + fm => fm.GeneralInput.ApplyLengthEffectInSection, + sr => FailureMechanismSectionAssemblyResultTestFactory.CreateFailureMechanismSectionAssemblyResult())) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsFalse(closeForData); + } + + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedAssessmentSection_ReturnsFalse() + { + // Setup + var otherFailureMechanism = new SpecificFailurePath(); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(Array.Empty()); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList + { + otherFailureMechanism + }); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + + using (var view = new NonAdoptableWithProfileProbabilityFailureMechanismResultView( + failureMechanism.SectionResults, failureMechanism, + fm => fm.GeneralInput.N, + fm => fm.GeneralInput.ApplyLengthEffectInSection, + sr => FailureMechanismSectionAssemblyResultTestFactory.CreateFailureMechanismSectionAssemblyResult())) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsFalse(closeForData); + } + + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedAssessmentSection_ReturnsTrue() + { + // Setup + var failureMechanism = new SpecificFailurePath(); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(Array.Empty()); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList + { + failureMechanism + }); + mocks.ReplayAll(); + + using (var view = new NonAdoptableWithProfileProbabilityFailureMechanismResultView( + failureMechanism.SectionResults, failureMechanism, + fm => fm.GeneralInput.N, + fm => fm.GeneralInput.ApplyLengthEffectInSection, + sr => FailureMechanismSectionAssemblyResultTestFactory.CreateFailureMechanismSectionAssemblyResult())) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsTrue(closeForData); + } + + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedFailurePathContext_ReturnsTrue() + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + var failurePathContext = new SpecificFailurePathContext(failureMechanism, assessmentSection); + + using (var view = new NonAdoptableWithProfileProbabilityFailureMechanismResultView( + failureMechanism.SectionResults, failureMechanism, + fm => fm.GeneralInput.N, + fm => fm.GeneralInput.ApplyLengthEffectInSection, + sr => FailureMechanismSectionAssemblyResultTestFactory.CreateFailureMechanismSectionAssemblyResult())) + { + // Call + bool closeForData = info.CloseForData(view, failurePathContext); + + // Assert + Assert.IsTrue(closeForData); + } + + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedFailureMechanismContext_ReturnsFalse() + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + var failurePathContext = new SpecificFailurePathContext(new SpecificFailurePath(), assessmentSection); + + using (var view = new NonAdoptableWithProfileProbabilityFailureMechanismResultView( + failureMechanism.SectionResults, failureMechanism, + fm => fm.GeneralInput.N, + fm => fm.GeneralInput.ApplyLengthEffectInSection, + sr => FailureMechanismSectionAssemblyResultTestFactory.CreateFailureMechanismSectionAssemblyResult())) + { + // Call + bool closeForData = info.CloseForData(view, failurePathContext); + + // Assert + Assert.IsFalse(closeForData); + } + + mocks.VerifyAll(); + } + + [Test] + public void CreateInstance_WithContext_ReturnsView() + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new SpecificFailurePath(); + var context = new SpecificFailurePathSectionResultContext( + failureMechanism.SectionResults, failureMechanism, assessmentSection); + + // Call + IView view = info.CreateInstance(context); + + // Assert + Assert.IsInstanceOf>(view); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/WaterPressureAsphaltCoverFailureMechanismResultViewInfoTest.cs =================================================================== diff -u -re3b8937a862993685f17f944a7656a7def8b8c3b -rb8d08895ef52959938de7f7e48ee06a7d51f16d0 --- Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/WaterPressureAsphaltCoverFailureMechanismResultViewInfoTest.cs (.../WaterPressureAsphaltCoverFailureMechanismResultViewInfoTest.cs) (revision e3b8937a862993685f17f944a7656a7def8b8c3b) +++ Riskeer/Integration/test/Riskeer.Integration.Plugin.Test/ViewInfos/WaterPressureAsphaltCoverFailureMechanismResultViewInfoTest.cs (.../WaterPressureAsphaltCoverFailureMechanismResultViewInfoTest.cs) (revision b8d08895ef52959938de7f7e48ee06a7d51f16d0) @@ -28,6 +28,7 @@ using Riskeer.AssemblyTool.Data.TestUtil; using Riskeer.Common.Data.AssessmentSection; using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.FailurePath; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.Forms.Views; using Riskeer.Integration.Data.StandAlone; @@ -99,6 +100,7 @@ // Setup var assessmentSection = mocks.Stub(); assessmentSection.Stub(asm => asm.GetFailureMechanisms()).Return(new IFailureMechanism[0]); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new WaterPressureAsphaltCoverFailureMechanism(); @@ -129,6 +131,7 @@ { otherFailureMechanism }); + assessmentSection.Stub(asm => asm.SpecificFailurePaths).Return(new ObservableList()); mocks.ReplayAll(); var failureMechanism = new WaterPressureAsphaltCoverFailureMechanism();