// Copyright (C) Stichting Deltares 2018. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets 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.Collections.Generic; using System.Linq; using Core.Common.Util.Extensions; using NUnit.Framework; using Ringtoets.ClosingStructures.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Primitives; using Ringtoets.DuneErosion.Data; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.HeightStructures.Data; using Ringtoets.Integration.Data.StandAlone; using Ringtoets.Integration.Data.StandAlone.SectionResults; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.Piping.Data; using Ringtoets.StabilityPointStructures.Data; using Ringtoets.StabilityStoneCover.Data; using Ringtoets.WaveImpactAsphaltCover.Data; using Riskeer.AssemblyTool.Data; namespace Ringtoets.Integration.Data.TestUtil { /// /// Helper which creates configurations of /// which can be used for testing assembly results. /// public static class AssessmentSectionAssemblyTestHelper { /// /// Gets a collection of configurations of /// failure mechanisms having an assembly result with probability, such that: /// /// All other failure mechanisms are marked as irrelevant, except one failure mechanism. /// The relevant failure mechanism will have one section which contains manual assembly data. /// /// /// A collection of with configurations /// and the affected . public static IEnumerable GetAssessmentSectionWithConfiguredFailureMechanismsWithProbability() { return GenerateTestCaseDataWithAffectedFailureMechanism(GetFailureMechanismWithProbabilityTestConfigurations()); } /// /// Gets a collection of configurations of /// failure mechanisms having an assembly result without probability, such that: /// /// All other failure mechanisms are marked as irrelevant, except one failure mechanism. /// The relevant failure mechanism will have one section which contains manual assembly data. /// /// /// A collection of with configurations /// and the affected . public static IEnumerable GetAssessmentSectionWithConfiguredFailureMechanismsWithoutProbability() { return GenerateTestCaseDataWithAffectedFailureMechanism(GetFailureMechanismsWithoutProbabilityTestConfigurations()); } /// /// Gets a collection of configurations of /// failure mechanisms having an assembly result with probability, such that: /// /// All other failure mechanisms are marked as irrelevant, except one failure mechanism. /// The relevant failure mechanism will have one section which contains manual assembly data. /// /// /// A collection of with configurations. public static IEnumerable GetAssessmentSectionWithoutConfiguredFailureMechanismWithProbability() { return GenerateTestCaseDataWithoutAffectedFailureMechanism(GetFailureMechanismWithProbabilityTestConfigurations()); } /// /// Gets a collection of configurations of /// failure mechanisms having an assembly result without probability, such that: /// /// All other failure mechanisms are marked as irrelevant, except one failure mechanism. /// The relevant failure mechanism will have one section which contains manual assembly data. /// /// /// A collection of with configurations. public static IEnumerable GetAssessmentSectionWithoutConfiguredFailureMechanismWithoutProbability() { return GenerateTestCaseDataWithoutAffectedFailureMechanism(GetFailureMechanismsWithoutProbabilityTestConfigurations()); } private static IEnumerable GenerateTestCaseDataWithAffectedFailureMechanism(IEnumerable configurations) { foreach (AssessmentSectionConfiguration configuration in configurations) { AssessmentSection assessmentSection = CreateAssessmentSectionWithIrrelevantFailureMechanisms(); configuration.ConfigureAssessmentSectionAction(assessmentSection); IFailureMechanism configuredFailureMechanism = configuration.GetFailureMechanismFunc(assessmentSection); yield return new TestCaseData(assessmentSection, configuredFailureMechanism).SetName(configuredFailureMechanism.Name); } } private static IEnumerable GenerateTestCaseDataWithoutAffectedFailureMechanism(IEnumerable configurations) { foreach (AssessmentSectionConfiguration configuration in configurations) { AssessmentSection assessmentSection = CreateAssessmentSectionWithIrrelevantFailureMechanisms(); configuration.ConfigureAssessmentSectionAction(assessmentSection); IFailureMechanism configuredFailureMechanism = configuration.GetFailureMechanismFunc(assessmentSection); yield return new TestCaseData(assessmentSection).SetName(configuredFailureMechanism.Name); } } private static AssessmentSection CreateAssessmentSectionWithIrrelevantFailureMechanisms() { var assessmentSection = new AssessmentSection(AssessmentSectionComposition.DikeAndDune); assessmentSection.GetFailureMechanisms().ForEachElementDo(fm => fm.IsRelevant = false); return assessmentSection; } private static IEnumerable GetFailureMechanismWithProbabilityTestConfigurations() { const double manualAssemblyProbability = 0.5; yield return new AssessmentSectionConfiguration(assessmentSection => { PipingFailureMechanism failureMechanism = assessmentSection.Piping; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); PipingFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.Piping); yield return new AssessmentSectionConfiguration(assessmentSection => { MacroStabilityInwardsFailureMechanism failureMechanism = assessmentSection.MacroStabilityInwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); MacroStabilityInwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.MacroStabilityInwards); yield return new AssessmentSectionConfiguration(assessmentSection => { GrassCoverErosionInwardsFailureMechanism failureMechanism = assessmentSection.GrassCoverErosionInwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); GrassCoverErosionInwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.GrassCoverErosionInwards); yield return new AssessmentSectionConfiguration(assessmentSection => { ClosingStructuresFailureMechanism failureMechanism = assessmentSection.ClosingStructures; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); ClosingStructuresFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.ClosingStructures); yield return new AssessmentSectionConfiguration(assessmentSection => { HeightStructuresFailureMechanism failureMechanism = assessmentSection.HeightStructures; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); HeightStructuresFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.HeightStructures); yield return new AssessmentSectionConfiguration(assessmentSection => { StabilityPointStructuresFailureMechanism failureMechanism = assessmentSection.StabilityPointStructures; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); StabilityPointStructuresFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyProbability = manualAssemblyProbability; }, assessmentSection => assessmentSection.StabilityPointStructures); } private static IEnumerable GetFailureMechanismsWithoutProbabilityTestConfigurations() { const FailureMechanismSectionAssemblyCategoryGroup sectionAssemblyCategoryGroup = FailureMechanismSectionAssemblyCategoryGroup.Vv; const ManualFailureMechanismSectionAssemblyCategoryGroup manualSectionAssemblyCategoryGroup = ManualFailureMechanismSectionAssemblyCategoryGroup.Vv; yield return new AssessmentSectionConfiguration(assessmentSection => { DuneErosionFailureMechanism failureMechanism = assessmentSection.DuneErosion; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); DuneErosionFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = sectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.DuneErosion); yield return new AssessmentSectionConfiguration(assessmentSection => { GrassCoverErosionOutwardsFailureMechanism failureMechanism = assessmentSection.GrassCoverErosionOutwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); GrassCoverErosionOutwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = sectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.GrassCoverErosionOutwards); yield return new AssessmentSectionConfiguration(assessmentSection => { StabilityStoneCoverFailureMechanism failureMechanism = assessmentSection.StabilityStoneCover; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); StabilityStoneCoverFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = sectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.StabilityStoneCover); yield return new AssessmentSectionConfiguration(assessmentSection => { WaveImpactAsphaltCoverFailureMechanism failureMechanism = assessmentSection.WaveImpactAsphaltCover; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); WaveImpactAsphaltCoverFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = sectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.WaveImpactAsphaltCover); yield return new AssessmentSectionConfiguration(assessmentSection => { GrassCoverSlipOffInwardsFailureMechanism failureMechanism = assessmentSection.GrassCoverSlipOffInwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); GrassCoverSlipOffInwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.GrassCoverSlipOffInwards); yield return new AssessmentSectionConfiguration(assessmentSection => { GrassCoverSlipOffOutwardsFailureMechanism failureMechanism = assessmentSection.GrassCoverSlipOffOutwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); GrassCoverSlipOffOutwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.GrassCoverSlipOffOutwards); yield return new AssessmentSectionConfiguration(assessmentSection => { PipingStructureFailureMechanism failureMechanism = assessmentSection.PipingStructure; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); PipingStructureFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.PipingStructure); yield return new AssessmentSectionConfiguration(assessmentSection => { StrengthStabilityLengthwiseConstructionFailureMechanism failureMechanism = assessmentSection.StrengthStabilityLengthwiseConstruction; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); StrengthStabilityLengthwiseConstructionFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.StrengthStabilityLengthwiseConstruction); yield return new AssessmentSectionConfiguration(assessmentSection => { TechnicalInnovationFailureMechanism failureMechanism = assessmentSection.TechnicalInnovation; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); TechnicalInnovationFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.TechnicalInnovation); yield return new AssessmentSectionConfiguration(assessmentSection => { MicrostabilityFailureMechanism failureMechanism = assessmentSection.Microstability; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); MicrostabilityFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.Microstability); yield return new AssessmentSectionConfiguration(assessmentSection => { MacroStabilityOutwardsFailureMechanism failureMechanism = assessmentSection.MacroStabilityOutwards; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); MacroStabilityOutwardsFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.MacroStabilityOutwards); yield return new AssessmentSectionConfiguration(section => { WaterPressureAsphaltCoverFailureMechanism failureMechanism = section.WaterPressureAsphaltCover; failureMechanism.IsRelevant = true; FailureMechanismTestHelper.AddSections(failureMechanism, 1); WaterPressureAsphaltCoverFailureMechanismSectionResult sectionResult = failureMechanism.SectionResults.Single(); sectionResult.UseManualAssembly = true; sectionResult.ManualAssemblyCategoryGroup = manualSectionAssemblyCategoryGroup; }, assessmentSection => assessmentSection.WaterPressureAsphaltCover); } /// /// Class which holds the information to configure a failure mechanism in an . /// private class AssessmentSectionConfiguration { /// /// Creates a new instance of . /// /// The to configure a failure mechanism /// that belongs in a . /// The to retrieve the affected failure mechanism. public AssessmentSectionConfiguration(Action configureAssessmentSectionAction, Func getFailureMechanismFunc) { ConfigureAssessmentSectionAction = configureAssessmentSectionAction; GetFailureMechanismFunc = getFailureMechanismFunc; } /// /// Gets the to configure a failure mechanism in an . /// public Action ConfigureAssessmentSectionAction { get; } /// /// Gets the to retrieve the configured /// from the . /// public Func GetFailureMechanismFunc { get; } } } }