// Copyright (C) Stichting Deltares 2016. 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 Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Read; using Application.Ringtoets.Storage.Serializers; using Core.Common.Base.Geometry; using NUnit.Framework; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.FailureMechanism; namespace Application.Ringtoets.Storage.Test.Read { [TestFixture] public class AssessmentSectionEntityReadExtensionsTest { [Test] public void Read_WithoutCollector_ThrowsArgumentNullException() { // Setup var entity = new AssessmentSectionEntity(); // Call TestDelegate test = () => entity.Read(null); // Assert var parameter = Assert.Throws(test).ParamName; Assert.AreEqual("collector", parameter); } [Test] [TestCase(AssessmentSectionComposition.Dike)] [TestCase(AssessmentSectionComposition.DikeAndDune)] [TestCase(AssessmentSectionComposition.Dune)] public void Read_WithCollector_ReturnsNewAssessmentSection(AssessmentSectionComposition assessmentSectionComposition) { // Setup const string testId = "testId"; const string testName = "testName"; const string comments = "Some text"; const int norm = int.MaxValue; var entityId = new Random(21).Next(1, 502); var entity = new AssessmentSectionEntity { AssessmentSectionEntityId = entityId, Id = testId, Name = testName, Composition = (short) assessmentSectionComposition, Comments = comments, Norm = norm }; var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.IsNotNull(section); Assert.AreEqual(entityId, section.StorageId); Assert.AreEqual(testId, section.Id); Assert.AreEqual(testName, section.Name); Assert.AreEqual(comments, section.Comments); Assert.AreEqual(norm, section.FailureMechanismContribution.Norm); Assert.AreEqual(assessmentSectionComposition, section.Composition); Assert.IsNull(section.HydraulicBoundaryDatabase); Assert.IsNull(section.ReferenceLine); } [Test] public void Read_WithReferenceLineEntities_ReturnsNewAssessmentSectionWithReferenceLineSet() { // Setup var entity = CreateAssessmentSectionEntity(); var random = new Random(21); double firstX = random.NextDouble(); double firstY = random.NextDouble(); double secondX = random.NextDouble(); double secondY = random.NextDouble(); var points = new[] { new Point2D(firstX, firstY), new Point2D(secondX, secondY) }; entity.ReferenceLinePointXml = new Point2DXmlSerializer().ToXml(points); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert CollectionAssert.AreEqual(points, section.ReferenceLine.Points); Assert.AreEqual(Math2D.Length(points), section.PipingFailureMechanism.PipingProbabilityAssessmentInput.SectionLength); } [Test] public void Read_WithHydraulicDatabaseLocationSet_ReturnsNewAssessmentSectionWithHydraulicDatabaseSet() { // Setup var entity = CreateAssessmentSectionEntity(); var testLocation = "testLocation"; var testVersion = "testVersion"; entity.HydraulicDatabaseLocation = testLocation; entity.HydraulicDatabaseVersion = testVersion; entity.HydraulicLocationEntities.Add(new HydraulicLocationEntity { Name = "A", Order = 1 }); entity.HydraulicLocationEntities.Add(new HydraulicLocationEntity { Name = "B", Order = 0 }); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(2, section.HydraulicBoundaryDatabase.Locations.Count); CollectionAssert.AreEqual(new[] { "B", "A" }, section.HydraulicBoundaryDatabase.Locations.Select(l => l.Name)); Assert.AreEqual(testLocation, section.HydraulicBoundaryDatabase.FilePath); Assert.AreEqual(testVersion, section.HydraulicBoundaryDatabase.Version); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithPipingFailureMechnismPropertiesSet_ReturnsNewAssessmentSectionWithPropertiesInPipingFailureMechanism(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var random = new Random(21); var entityId = random.Next(1, 502); var parameterA = random.NextDouble()/10; var parameterUpliftCriticalSafetyFactor = random.NextDouble() + 0.1; const string comments = "Some text"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = 1 }, IsRelevant = Convert.ToByte(isRelevant), Comments = comments, PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity { A = parameterA, UpliftCriticalSafetyFactor = parameterUpliftCriticalSafetyFactor } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(entityId, section.PipingFailureMechanism.StorageId); Assert.AreEqual(isRelevant, section.PipingFailureMechanism.IsRelevant); Assert.AreEqual(comments, section.PipingFailureMechanism.Comments); Assert.AreEqual(parameterA, section.PipingFailureMechanism.PipingProbabilityAssessmentInput.A); } [Test] [TestCase(true, TestName = "PipingStochasticSoilModelsSet_ReturnsNewAssessmentSectionWithStochasticSoilModelsInPipingFailureMechanism(true)")] [TestCase(false, TestName = "PipingStochasticSoilModelsSet_ReturnsNewAssessmentSectionWithStochasticSoilModelsInPipingFailureMechanism(false)")] public void Read_WithPipingFailureMechanismWithStochasticSoilModelsSet_ReturnsNewAssessmentSectionWithStochasticSoilModelsInPipingFailureMechanism(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var entityId = new Random(21).Next(1, 502); string emptySegmentPointsXml = new Point2DXmlSerializer().ToXml(new Point2D[0]); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = 1 }, IsRelevant = Convert.ToByte(isRelevant), StochasticSoilModelEntities = { new StochasticSoilModelEntity { StochasticSoilModelSegmentPointXml = emptySegmentPointsXml }, new StochasticSoilModelEntity { StochasticSoilModelSegmentPointXml = emptySegmentPointsXml } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.StochasticSoilModels.Count); Assert.AreEqual(entityId, section.PipingFailureMechanism.StorageId); Assert.AreEqual(isRelevant, section.PipingFailureMechanism.IsRelevant); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithPipingFailureMechanismWithSurfaceLinesSet_ReturnsNewAssessmentSectionWithSurfaceLinesInPipingFailureMechanism(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var entityId = new Random(21).Next(1, 502); string emptyPointsXml = new Point3DXmlSerializer().ToXml(new Point3D[0]); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = 1 }, IsRelevant = Convert.ToByte(isRelevant), SurfaceLineEntities = { new SurfaceLineEntity { PointsXml = emptyPointsXml }, new SurfaceLineEntity { PointsXml = emptyPointsXml } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.SurfaceLines.Count); Assert.AreEqual(entityId, section.PipingFailureMechanism.StorageId); Assert.AreEqual(isRelevant, section.PipingFailureMechanism.IsRelevant); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithPipingFailureMechanismWithCalculationGroupsSet_ReturnsNewAssessmentSectionWithCalculationGroupsInPipingFailureMechanism(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var entityId = new Random(21).Next(1, 502); const int rootGroupEntityId = 1; const int childGroupEntity1Id = 2; const int childGroupEntity2Id = 3; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = rootGroupEntityId, CalculationGroupEntity1 = { new CalculationGroupEntity { CalculationGroupEntityId = childGroupEntity1Id, Order = 0 }, new CalculationGroupEntity { CalculationGroupEntityId = childGroupEntity2Id, Order = 1 } } }, IsRelevant = Convert.ToByte(isRelevant) }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(rootGroupEntityId, section.PipingFailureMechanism.CalculationsGroup.StorageId); IList childCalculationGroups = section.PipingFailureMechanism.CalculationsGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); Assert.AreEqual(childGroupEntity1Id, ((CalculationGroup) childCalculationGroups[0]).StorageId); Assert.AreEqual(childGroupEntity2Id, ((CalculationGroup) childCalculationGroups[1]).StorageId); } [Test] public void Read_WithPipingFailureMechanismWithFailureMechanismSectionsSet_ReturnsNewAssessmentSectionWithFailureMechanismSectionsInPipingFailureMechanism() { // Setup var random = new Random(21); var entity = CreateAssessmentSectionEntity(); var entityId = random.Next(1, 502); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = 1 }, FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities() }; var sectionA = failureMechanismEntity.FailureMechanismSectionEntities.ElementAt(0); var sectionB = failureMechanismEntity.FailureMechanismSectionEntities.ElementAt(1); long pipingSectionIdA = random.Next(1, 502); long pipingSectionIdB = random.Next(1, 502); sectionA.PipingSectionResultEntities.Add(new PipingSectionResultEntity { PipingSectionResultEntityId = pipingSectionIdA, FailureMechanismSectionEntity = sectionA }); sectionB.PipingSectionResultEntities.Add(new PipingSectionResultEntity { PipingSectionResultEntityId = pipingSectionIdB, FailureMechanismSectionEntity = sectionB }); entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.Sections.Count()); Assert.AreEqual(pipingSectionIdA, section.PipingFailureMechanism.SectionResults.ElementAt(0).StorageId); Assert.AreEqual(pipingSectionIdB, section.PipingFailureMechanism.SectionResults.ElementAt(1).StorageId); } [Test] [TestCase(true, TestName = "GrassCoverErosionInwardsPropertiesSet_ReturnsNewAssessmentSectionWithPropertiesInGrassCoverErosionInwardsFailureMechanism(true)")] [TestCase(false, TestName = "GrassCoverErosionInwardsPropertiesSet_ReturnsNewAssessmentSectionWithPropertiesInGrassCoverErosionInwardsFailureMechanism(false)")] public void Read_WithGrassCoverErosionInwardsFailureMechanismPropertiesSet_ReturnsNewAssessmentSectionWithPropertiesInGrassCoverErosionInwardsFailureMechanism(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var entityId = new Random(21).Next(1, 502); const string comments = "Some text"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.GrassRevetmentTopErosionAndInwards, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntityId = 1 }, IsRelevant = Convert.ToByte(isRelevant), Comments = comments, GrassCoverErosionInwardsFailureMechanismMetaEntities = { new GrassCoverErosionInwardsFailureMechanismMetaEntity { GrassCoverErosionInwardsFailureMechanismMetaEntityId = 2, N = 1 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(entityId, section.GrassCoverErosionInwards.StorageId); Assert.AreEqual(isRelevant, section.GrassCoverErosionInwards.IsRelevant); Assert.AreEqual(comments, section.GrassCoverErosionInwards.Comments); } [Test] public void Read_WithGrassCoverErosionInwardsFailureMechanismWithFailureMechanismSectionsSet_ReturnsNewAssessmentSectionWithFailureMechanismSectionsInGrassCoverErosionInwardsFailureMechanism() { // Setup var entity = CreateAssessmentSectionEntity(); var entityId = new Random(21).Next(1, 502); var rootGroupEntity = new CalculationGroupEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (int) FailureMechanismType.GrassRevetmentTopErosionAndInwards, FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities(), GrassCoverErosionInwardsFailureMechanismMetaEntities = { new GrassCoverErosionInwardsFailureMechanismMetaEntity { GrassCoverErosionInwardsFailureMechanismMetaEntityId = 2, N = 1 } }, CalculationGroupEntity = rootGroupEntity }; entity.FailureMechanismEntities.Add(failureMechanismEntity); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert Assert.AreEqual(2, section.GrassCoverErosionInwards.Sections.Count()); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithStandAloneFailureMechanismsSet_ReturnsNewAssessmentSectionWithFailureMechanismsSet(bool isRelevant) { // Setup var entity = CreateAssessmentSectionEntity(); var macrostabilityInwardsEntityId = 2; var macrostabilityOutwardsEntityId = 3; var microstabilityEntityId = 4; var structureHeightEntityId = 5; var closingEntityId = 16; var failingOfConstructionPointEntityId = 22; var failingOfConstructionLengthwiseEntityId = 23; var stoneRevetmentEntityId = 36; var waveImpactEntityId = 77; var waterPressureEntityId = 78; var grassCoverErosionOutwardsEntityId = 133; var grassCoverSlipoffOutwardsEntityId = 134; var grassCoverSlipoffInwardsEntityId = 135; var duneErosionEntityId = 256; var technicalInnovationsEntityId = 257; entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, macrostabilityInwardsEntityId, FailureMechanismType.MacrostabilityInwards)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, macrostabilityOutwardsEntityId, FailureMechanismType.MacrostabilityOutwards)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, microstabilityEntityId, FailureMechanismType.Microstability)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, structureHeightEntityId, FailureMechanismType.StructureHeight)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, closingEntityId, FailureMechanismType.ReliabilityClosingOfStructure)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, failingOfConstructionPointEntityId, FailureMechanismType.StrengthAndStabilityPointConstruction)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, failingOfConstructionLengthwiseEntityId, FailureMechanismType.StrengthAndStabilityParallelConstruction)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, stoneRevetmentEntityId, FailureMechanismType.StabilityStoneRevetment)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, waveImpactEntityId, FailureMechanismType.WaveImpactOnAsphaltRevetment)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, waterPressureEntityId, FailureMechanismType.WaterOverpressureAsphaltRevetment)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, grassCoverErosionOutwardsEntityId, FailureMechanismType.GrassRevetmentErosionOutwards)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, grassCoverSlipoffOutwardsEntityId, FailureMechanismType.GrassRevetmentSlidingOutwards)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, grassCoverSlipoffInwardsEntityId, FailureMechanismType.GrassRevetmentSlidingInwards)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, duneErosionEntityId, FailureMechanismType.DuneErosion)); entity.FailureMechanismEntities.Add(CreateFailureMechanismEntity(isRelevant, technicalInnovationsEntityId, FailureMechanismType.TechnicalInnovations)); var collector = new ReadConversionCollector(); // Call var section = entity.Read(collector); // Assert AssertFailureMechanismEqual(isRelevant, macrostabilityInwardsEntityId, 2, section.MacrostabilityInwards); AssertFailureMechanismEqual(isRelevant, macrostabilityOutwardsEntityId, 2, section.MacrostabilityOutwards); AssertFailureMechanismEqual(isRelevant, microstabilityEntityId, 2, section.Microstability); AssertFailureMechanismEqual(isRelevant, structureHeightEntityId, 2, section.HeightStructures); AssertFailureMechanismEqual(isRelevant, closingEntityId, 2, section.ClosingStructure); AssertFailureMechanismEqual(isRelevant, failingOfConstructionPointEntityId, 2, section.StrengthStabilityPointConstruction); AssertFailureMechanismEqual(isRelevant, failingOfConstructionLengthwiseEntityId, 2, section.StrengthStabilityLengthwiseConstruction); AssertFailureMechanismEqual(isRelevant, stoneRevetmentEntityId, 2, section.StabilityStoneCover); AssertFailureMechanismEqual(isRelevant, waveImpactEntityId, 2, section.WaveImpactAsphaltCover); AssertFailureMechanismEqual(isRelevant, waterPressureEntityId, 2, section.WaterPressureAsphaltCover); AssertFailureMechanismEqual(isRelevant, grassCoverErosionOutwardsEntityId, 2, section.GrassCoverErosionOutwards); AssertFailureMechanismEqual(isRelevant, grassCoverSlipoffOutwardsEntityId, 2, section.GrassCoverSlipOffOutwards); AssertFailureMechanismEqual(isRelevant, grassCoverSlipoffInwardsEntityId, 2, section.GrassCoverSlipOffInwards); AssertFailureMechanismEqual(isRelevant, duneErosionEntityId, 2, section.DuneErosion); AssertFailureMechanismEqual(isRelevant, technicalInnovationsEntityId, 2, section.TechnicalInnovation); } private static AssessmentSectionEntity CreateAssessmentSectionEntity() { return new AssessmentSectionEntity { Norm = 30000 }; } private static FailureMechanismEntity CreateFailureMechanismEntity(bool isRelevant, int entityId, FailureMechanismType failureMechanismType) { return new FailureMechanismEntity { FailureMechanismEntityId = entityId, FailureMechanismType = (short) failureMechanismType, IsRelevant = Convert.ToByte(isRelevant), Comments = entityId.ToString(), FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities() }; } private static void AssertFailureMechanismEqual(bool expectedIsRelevant, int expectedEntityId, int expectedSectionCount, IFailureMechanism failureMechanism) { Assert.AreEqual(expectedEntityId, failureMechanism.StorageId); Assert.AreEqual(expectedIsRelevant, failureMechanism.IsRelevant); var expectedComments = expectedEntityId.ToString(); Assert.AreEqual(expectedComments, failureMechanism.Comments); Assert.AreEqual(expectedSectionCount, failureMechanism.Sections.Count()); } private static FailureMechanismSectionEntity[] CreateFailureMechanismSectionEntities() { var dummyPointData = new[] { new Point2D(0.0, 0.0) }; string dummyPointXml = new Point2DXmlSerializer().ToXml(dummyPointData); return new[] { new FailureMechanismSectionEntity { FailureMechanismSectionEntityId = 1, Name = "", FailureMechanismSectionPointXml = dummyPointXml }, new FailureMechanismSectionEntity { FailureMechanismSectionEntityId = 2, Name = "", FailureMechanismSectionPointXml = dummyPointXml } }; } } }