// Copyright (C) Stichting Deltares 2025. All rights reserved. // // This file is part of the application DAM - UI. // // DAM - UI 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.Linq; using Deltares.Geotechnics.Soils; using Deltares.Standard.Validation; using NUnit.Framework; namespace Deltares.Dam.Data.Tests; [TestFixture] public class DamProjectDataTests { [Test] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CPhi, 5)] // GammaDry, GammaWet, Doc, Cohesion, Phi [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CuCalculated, 5)] // GammaDry, GammaWet, Doc, Cu/Pc, POP [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.StressTable, 3)] // GammaDry, GammaWet, Doc [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.SuTable, 3)] // GammaDry, GammaWet, Doc [TestCase(FailureMechanismSystemType.StabilityOutside, ShearStrengthModel.CPhi, 5)] // GammaDry, GammaWet, Doc, Cohesion, Phi [TestCase(FailureMechanismSystemType.Piping, ShearStrengthModel.None, 4)] // GammaDry, GammaWet, D70, permeability public void GivenInvalidDamSoilOutsideValidRange_WhenValidating_ThenValidationErrorsAreReturnedOnlyForTheParametersUsed(FailureMechanismSystemType failureMechanismSystemType, ShearStrengthModel shearStrengthModel, int expectedErrorsCount) { DamSoil soil = CreateInvalidDamSoilWithParametersOutsideValidRange(); soil.ShearStrengthModel = shearStrengthModel; var damProjectData = new DamProjectData(); damProjectData.Dike = new Dike(); damProjectData.Dike.DamSoils.Add(soil); var damCalculationSpecification = new DamFailureMechanismeCalculationSpecification { FailureMechanismSystemType = failureMechanismSystemType }; damProjectData.DamProjectCalculationSpecification = new DamProjectCalculationSpecification(); damProjectData.DamProjectCalculationSpecification.CurrentSpecification = damCalculationSpecification; ValidationResult[] validationResults = damProjectData.ValidateDamSoils(); bool isPiping = failureMechanismSystemType == FailureMechanismSystemType.Piping; bool isStability = failureMechanismSystemType is FailureMechanismSystemType.StabilityInside or FailureMechanismSystemType.StabilityOutside; bool isMohrCoulomb = soil.ShearStrengthModel == ShearStrengthModel.CPhi; bool isShansep = soil.ShearStrengthModel == ShearStrengthModel.CuCalculated; Assert.That(validationResults, Has.Length.EqualTo(expectedErrorsCount)); Assert.Multiple(() => { Assert.That(validationResults.Any(v => v.Text.Contains("Unsaturated unit weight")), Is.True); Assert.That(validationResults.Any(v => v.Text.Contains("Saturated unit weight")), Is.True); Assert.That(validationResults.Any(v => v.Text.Contains("Traffic load degree of consolidation")), Is.EqualTo(isStability)); Assert.That(validationResults.Any(v => v.Text.Contains("Cohesion")), Is.EqualTo(isStability && isMohrCoulomb)); Assert.That(validationResults.Any(v => v.Text.Contains("Friction")), Is.EqualTo(isStability && isMohrCoulomb)); Assert.That(validationResults.Any(v => v.Text.Contains("Ratio Su/Pc")), Is.EqualTo(isStability && isShansep)); Assert.That(validationResults.Any(v => v.Text.Contains("Strength increase exp (m)")), Is.EqualTo(false)); // Exponent m has no valid range defined Assert.That(validationResults.Any(v => v.Text.Contains("POP")), Is.EqualTo(isStability && isShansep)); Assert.That(validationResults.Any(v => v.Text.Contains("Diameter D70")), Is.EqualTo(isPiping)); Assert.That(validationResults.Any(v => v.Text.Contains("Permeability")), Is.EqualTo(isPiping)); }); } [Test] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CPhi, 4)] // GammaDry, GammaWet, Cohesion, Phi [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CuCalculated, 5)] // GammaDry, GammaWet, Cu/Pc, POP, m [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.StressTable, 2)] // GammaDry, GammaWet, [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.SuTable, 2)] // GammaDry, GammaWet [TestCase(FailureMechanismSystemType.StabilityOutside, ShearStrengthModel.CPhi, 4)] // GammaDry, GammaWet, Cohesion, Phi [TestCase(FailureMechanismSystemType.Piping, ShearStrengthModel.None, 4)] // GammaDry, GammaWet, D70, permeability public void GivenInvalidDamSoilWithEmptyValues_WhenValidating_ThenValidationErrorsAreReturnedOnlyForTheParametersUsed(FailureMechanismSystemType failureMechanismSystemType, ShearStrengthModel shearStrengthModel, int expectedErrorsCount) { DamSoil soil = CreateInvalidDamSoilWithEmptyParameters(); soil.ShearStrengthModel = shearStrengthModel; var damProjectData = new DamProjectData(); damProjectData.Dike = new Dike(); damProjectData.Dike.DamSoils.Add(soil); var damCalculationSpecification = new DamFailureMechanismeCalculationSpecification { FailureMechanismSystemType = failureMechanismSystemType }; damProjectData.DamProjectCalculationSpecification = new DamProjectCalculationSpecification(); damProjectData.DamProjectCalculationSpecification.CurrentSpecification = damCalculationSpecification; ValidationResult[] validationResults = damProjectData.ValidateDamSoils(); bool isPiping = failureMechanismSystemType == FailureMechanismSystemType.Piping; bool isStability = failureMechanismSystemType is FailureMechanismSystemType.StabilityInside or FailureMechanismSystemType.StabilityOutside; bool isMohrCoulomb = soil.ShearStrengthModel == ShearStrengthModel.CPhi; bool isShansep = soil.ShearStrengthModel == ShearStrengthModel.CuCalculated; Assert.That(validationResults, Has.Length.EqualTo(expectedErrorsCount)); Assert.Multiple(() => { Assert.That(validationResults.Any(v => v.Text.Contains("Unsaturated unit weight")), Is.True); Assert.That(validationResults.Any(v => v.Text.Contains("Saturated unit weight")), Is.True); Assert.That(validationResults.Any(v => v.Text.Contains("Traffic load degree of consolidation")), Is.EqualTo(false)); // DoC is not clearable Assert.That(validationResults.Any(v => v.Text.Contains("Cohesion")), Is.EqualTo(isStability && isMohrCoulomb)); Assert.That(validationResults.Any(v => v.Text.Contains("Friction")), Is.EqualTo(isStability && isMohrCoulomb)); Assert.That(validationResults.Any(v => v.Text.Contains("Ratio Su/Pc")), Is.EqualTo(isStability && isShansep)); Assert.That(validationResults.Any(v => v.Text.Contains("Strength increase exp (m)")), Is.EqualTo(isStability && isShansep)); Assert.That(validationResults.Any(v => v.Text.Contains("POP")), Is.EqualTo(isStability && isShansep)); Assert.That(validationResults.Any(v => v.Text.Contains("Diameter D70")), Is.EqualTo(isPiping)); Assert.That(validationResults.Any(v => v.Text.Contains("Permeability")), Is.EqualTo(isPiping)); }); } [Test] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CPhi)] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.CuCalculated)] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.StressTable)] [TestCase(FailureMechanismSystemType.StabilityInside, ShearStrengthModel.SuTable)] [TestCase(FailureMechanismSystemType.StabilityOutside, ShearStrengthModel.CPhi)] [TestCase(FailureMechanismSystemType.Piping, ShearStrengthModel.None)] public void GivenValidDamSoilList_WhenValidating_ThenNoValidationErrorsAreReturned(FailureMechanismSystemType failureMechanismSystemType, ShearStrengthModel shearStrengthModel) { DamSoil soil = CreateValidDamSoil(); soil.ShearStrengthModel = shearStrengthModel; var damProjectData = new DamProjectData(); damProjectData.Dike = new Dike(); damProjectData.Dike.DamSoils.Add(soil); var damCalculationSpecification = new DamFailureMechanismeCalculationSpecification { FailureMechanismSystemType = failureMechanismSystemType }; damProjectData.DamProjectCalculationSpecification = new DamProjectCalculationSpecification(); damProjectData.DamProjectCalculationSpecification.CurrentSpecification = damCalculationSpecification; ValidationResult[] validationResults = damProjectData.ValidateDamSoils(); Assert.That(validationResults, Has.Length.EqualTo(0)); } private static DamSoil CreateValidDamSoil() { var damSoil = new DamSoil(); damSoil.AbovePhreaticLevel = 17; damSoil.BelowPhreaticLevel = 15; damSoil.DiameterD70 = 0.006; damSoil.PermeabKx = 2.5e-5; damSoil.Cohesion = 2.5; damSoil.FrictionAngle = 30; damSoil.RatioCuPc = 0.2; damSoil.StrengthIncreaseExponent = 0.5; damSoil.POP = 25; damSoil.TrafficLoadDegreeOfConsolidation = 20; damSoil.UseDefaultShearStrengthModel = false; return damSoil; } private static DamSoil CreateInvalidDamSoilWithParametersOutsideValidRange() { var damSoil = new DamSoil(); damSoil.AbovePhreaticLevel = -17; damSoil.BelowPhreaticLevel = -15; damSoil.DiameterD70 = -0.006; damSoil.PermeabKx = -2.5e-5; damSoil.Cohesion = -2.5; damSoil.FrictionAngle = -30; damSoil.RatioCuPc = -0.2; damSoil.StrengthIncreaseExponent = -0.5; // Exponent m has no valid range defined damSoil.POP = -25; damSoil.TrafficLoadDegreeOfConsolidation = -20; damSoil.UseDefaultShearStrengthModel = false; return damSoil; } private static DamSoil CreateInvalidDamSoilWithEmptyParameters() { var damSoil = new DamSoil(); damSoil.AbovePhreaticLevel = double.NaN; damSoil.BelowPhreaticLevel = double.NaN; damSoil.DiameterD70 = double.NaN; damSoil.PermeabKx = double.NaN; damSoil.Cohesion = double.NaN; damSoil.FrictionAngle = double.NaN; damSoil.RatioCuPc = double.NaN; damSoil.StrengthIncreaseExponent = double.NaN; damSoil.POP = double.NaN; damSoil.UseDefaultShearStrengthModel = false; return damSoil; } }