// Copyright (C) Stichting Deltares 2017. 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 Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Integration.Data; 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 string 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 double norm = 0.05; var entity = new AssessmentSectionEntity { Id = testId, Name = testName, Composition = (byte) assessmentSectionComposition, Comments = comments, Norm = norm }; entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.IsNotNull(section); Assert.AreEqual(testId, section.Id); Assert.AreEqual(testName, section.Name); Assert.AreEqual(comments, section.Comments.Body); Assert.AreEqual(norm, section.FailureMechanismContribution.Norm); Assert.AreEqual(assessmentSectionComposition, section.Composition); Assert.IsNull(section.HydraulicBoundaryDatabase); Assert.IsNull(section.ReferenceLine); } [Test] [Combinatorial] public void Read_WithBackgroundData_ReturnsNewAssessmentSectionWithBackgroundData( [Values(true, false)] bool isConfigured) { // Setup const string mapDataName = "Background"; const double transparency = 0.0; bool isVisible = isConfigured; const BackgroundDataType backgroundDataType = BackgroundDataType.WellKnown; var random = new Random(21); var wellKnownTileSource = random.NextEnumValue(); string wellKnownTileSourceValue = ((int) wellKnownTileSource).ToString(); var backgroundDataMetaEntities = new[] { new BackgroundDataMetaEntity { Key = BackgroundDataIdentifiers.WellKnownTileSource, Value = wellKnownTileSourceValue } }; AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var backgroundDataEntity = new BackgroundDataEntity { Name = mapDataName, Transparency = transparency, IsVisible = Convert.ToByte(isVisible), BackgroundDataType = Convert.ToByte(backgroundDataType), BackgroundDataMetaEntities = backgroundDataMetaEntities }; entity.BackgroundDataEntities.Add(backgroundDataEntity); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert BackgroundData backgroundData = section.BackgroundData; Assert.AreEqual(isVisible, backgroundData.IsVisible); Assert.AreEqual(transparency, backgroundData.Transparency); Assert.AreEqual(mapDataName, backgroundData.Name); Assert.IsNotNull(backgroundData.Configuration); var configuration = (WellKnownBackgroundDataConfiguration) backgroundData.Configuration; Assert.AreEqual(wellKnownTileSource, configuration.WellKnownTileSource); } [Test] public void Read_WithReferenceLineEntities_ReturnsNewAssessmentSectionWithReferenceLineSet() { // Setup AssessmentSectionEntity 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); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert CollectionAssert.AreEqual(points, section.ReferenceLine.Points); Assert.AreEqual(Math2D.Length(points), section.PipingFailureMechanism.PipingProbabilityAssessmentInput.SectionLength); } [Test] public void Read_WithHydraulicDatabaseLocation_ReturnsNewAssessmentSectionWithHydraulicDatabaseSet() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string testLocation = "testLocation"; const string 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 }); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection 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_WithPipingFailureMechanismProperties_ReturnsNewAssessmentSectionWithPropertiesInPipingFailureMechanism(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var random = new Random(21); double parameterA = random.NextDouble() / 10; const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity { A = parameterA } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.PipingFailureMechanism.IsRelevant); Assert.AreEqual(inputComments, section.PipingFailureMechanism.InputComments.Body); Assert.AreEqual(outputComments, section.PipingFailureMechanism.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.PipingFailureMechanism.NotRelevantComments.Body); Assert.AreEqual(parameterA, section.PipingFailureMechanism.PipingProbabilityAssessmentInput.A); } [Test] public void Read_WithPipingWithStochasticSoilModels_ReturnsPipingWithStochasticSoilModels() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); string emptySegmentPointsXml = new Point2DXmlSerializer().ToXml(new Point2D[0]); const string stochasticSoilModelSourcePath = "path"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity(), StochasticSoilModelEntities = { new StochasticSoilModelEntity { Name = "modelA", StochasticSoilModelSegmentPointXml = emptySegmentPointsXml }, new StochasticSoilModelEntity { Name = "modelB", StochasticSoilModelSegmentPointXml = emptySegmentPointsXml } }, PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity { StochasticSoilModelCollectionSourcePath = stochasticSoilModelSourcePath } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.StochasticSoilModels.Count); Assert.AreEqual(stochasticSoilModelSourcePath, section.PipingFailureMechanism.StochasticSoilModels.SourcePath); } [Test] public void Read_WithPipingWithSurfaceLines_ReturnsPipingWithSurfaceLines() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); string emptyPointsXml = new Point3DXmlSerializer().ToXml(new Point3D[0]); const string surfaceLineSourcePath = "some/path"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity(), SurfaceLineEntities = { new SurfaceLineEntity { PointsXml = emptyPointsXml, Name = "Line A" }, new SurfaceLineEntity { PointsXml = emptyPointsXml, Name = "Line B" } }, PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity { SurfaceLineCollectionSourcePath = surfaceLineSourcePath } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.SurfaceLines.Count); Assert.AreEqual(surfaceLineSourcePath, section.PipingFailureMechanism.SurfaceLines.SourcePath); } [Test] public void Read_WithPipingWithCalculationGroups_ReturnsPipingWithCalculationGroups() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntity1 = { new CalculationGroupEntity { Order = 0 }, new CalculationGroupEntity { Order = 1 } } }, PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity() } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert IList childCalculationGroups = section.PipingFailureMechanism.CalculationsGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); } [Test] public void Read_WithPipingWithFailureMechanismSections_ReturnsPipingWithFailureMechanismSections() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.Piping, CalculationGroupEntity = new CalculationGroupEntity(), FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities(), PipingFailureMechanismMetaEntities = { new PipingFailureMechanismMetaEntity() } }; FailureMechanismSectionEntity sectionA = failureMechanismEntity.FailureMechanismSectionEntities.ElementAt(0); FailureMechanismSectionEntity sectionB = failureMechanismEntity.FailureMechanismSectionEntities.ElementAt(1); sectionA.PipingSectionResultEntities.Add(new PipingSectionResultEntity { FailureMechanismSectionEntity = sectionA }); sectionB.PipingSectionResultEntities.Add(new PipingSectionResultEntity { FailureMechanismSectionEntity = sectionB }); entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(2, section.PipingFailureMechanism.Sections.Count()); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithGrassCoverErosionInwardsWithProperties_ReturnsGrassCoverErosionInwardsWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string originalInput = "Some input text"; const string originalOutput = "Some output text"; const string originalNotRelevantText = "Really not relevant"; int n = new Random(21).Next(1, 20); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentTopErosionAndInwards, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = originalInput, OutputComments = originalOutput, NotRelevantComments = originalNotRelevantText, GrassCoverErosionInwardsFailureMechanismMetaEntities = { new GrassCoverErosionInwardsFailureMechanismMetaEntity { N = n } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.GrassCoverErosionInwards.IsRelevant); Assert.AreEqual(originalInput, section.GrassCoverErosionInwards.InputComments.Body); Assert.AreEqual(originalOutput, section.GrassCoverErosionInwards.OutputComments.Body); Assert.AreEqual(originalNotRelevantText, section.GrassCoverErosionInwards.NotRelevantComments.Body); Assert.AreEqual(n, section.GrassCoverErosionInwards.GeneralInput.N); } [Test] public void Read_WithGrassCoverErosionInwardsWithCalculationGroups_ReturnsGrassCoverErosionInwardsWithCalculationGroups() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentTopErosionAndInwards, GrassCoverErosionInwardsFailureMechanismMetaEntities = { new GrassCoverErosionInwardsFailureMechanismMetaEntity { N = 1 } }, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntity1 = { new CalculationGroupEntity { Order = 0 }, new CalculationGroupEntity { Order = 1 } } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert IList childCalculationGroups = section.GrassCoverErosionInwards.CalculationsGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); } [Test] public void Read_WithGrassCoverErosionInwardsWithFailureMechanismSection_ReturnsGrassCoverErosionInwardsWithFailureMechanismSections() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var rootGroupEntity = new CalculationGroupEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentTopErosionAndInwards, FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities(), GrassCoverErosionInwardsFailureMechanismMetaEntities = { new GrassCoverErosionInwardsFailureMechanismMetaEntity { N = 1 } }, CalculationGroupEntity = rootGroupEntity }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(2, section.GrassCoverErosionInwards.Sections.Count()); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithGrassCoverErosionOutwardsWithProperties_ReturnsGrassCoverErosionOutwardsWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; int n = new Random(21).Next(1, 20); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentErosionOutwards, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, GrassCoverErosionOutwardsFailureMechanismMetaEntities = { new GrassCoverErosionOutwardsFailureMechanismMetaEntity { N = n } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.GrassCoverErosionOutwards.IsRelevant); Assert.AreEqual(inputComments, section.GrassCoverErosionOutwards.InputComments.Body); Assert.AreEqual(outputComments, section.GrassCoverErosionOutwards.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.GrassCoverErosionOutwards.NotRelevantComments.Body); Assert.AreEqual(n, section.GrassCoverErosionOutwards.GeneralInput.N); } [Test] public void Read_WithGrassCoverErosionOutwardsWithWaveConditionsCalculationGroups_ReturnsGrassCoverErosionOutwardsWithWaveConditionsCalculationGroups() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentErosionOutwards, GrassCoverErosionOutwardsFailureMechanismMetaEntities = { new GrassCoverErosionOutwardsFailureMechanismMetaEntity { N = 1 } }, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntity1 = { new CalculationGroupEntity { Order = 0 }, new CalculationGroupEntity { Order = 1 } } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert IList childCalculationGroups = section.GrassCoverErosionOutwards.WaveConditionsCalculationGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); } [Test] public void Read_WithGrassCoverErosionOutwardsWithForeshoreProfile_ReturnsGrassCoverErosionOutwardsWithForeshoreProfiles() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string profileAId = "profileA"; const string profileBId = "profileB"; const string fileLocation = "some/location"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.GrassRevetmentErosionOutwards, GrassCoverErosionOutwardsFailureMechanismMetaEntities = { new GrassCoverErosionOutwardsFailureMechanismMetaEntity { N = 2, ForeshoreProfileCollectionSourcePath = fileLocation } }, CalculationGroupEntity = new CalculationGroupEntity(), ForeshoreProfileEntities = { new ForeshoreProfileEntity { Order = 1, Id = profileAId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) }, new ForeshoreProfileEntity { Order = 0, Id = profileBId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert ForeshoreProfileCollection foreshoreProfiles = section.GrassCoverErosionOutwards.ForeshoreProfiles; Assert.AreEqual(fileLocation, foreshoreProfiles.SourcePath); CollectionAssert.AreEqual(new[] { profileBId, profileAId }, foreshoreProfiles.Select(fp => fp.Id)); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithStabilityStoneCoverWithProperties_ReturnsStabilityStoneCoverWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.StabilityStoneRevetment, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, StabilityStoneCoverFailureMechanismMetaEntities = { new StabilityStoneCoverFailureMechanismMetaEntity() } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.StabilityStoneCover.IsRelevant); Assert.AreEqual(inputComments, section.StabilityStoneCover.InputComments.Body); Assert.AreEqual(outputComments, section.StabilityStoneCover.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.StabilityStoneCover.NotRelevantComments.Body); } [Test] public void Read_WithStabilityStoneCoverWithWaveConditionsCalculationGroups_ReturnsStabilityStoneCoverWithWaveConditionsCalculationGroups() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.StabilityStoneRevetment, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntity1 = { new CalculationGroupEntity { Order = 0 }, new CalculationGroupEntity { Order = 1 } } }, StabilityStoneCoverFailureMechanismMetaEntities = { new StabilityStoneCoverFailureMechanismMetaEntity() } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert IList childCalculationGroups = section.StabilityStoneCover.WaveConditionsCalculationGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithStabilityStoneCoverWithForeshoreProfiles_ReturnsStabilityStoneCoverWithForeshoreProfiles(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string profileAId = "profileA"; const string profileBId = "profileB"; const string fileLocation = "some/file/location"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.StabilityStoneRevetment, CalculationGroupEntity = new CalculationGroupEntity(), ForeshoreProfileEntities = { new ForeshoreProfileEntity { Order = 1, Id = profileAId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) }, new ForeshoreProfileEntity { Order = 0, Id = profileBId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) } }, StabilityStoneCoverFailureMechanismMetaEntities = { new StabilityStoneCoverFailureMechanismMetaEntity { ForeshoreProfileCollectionSourcePath = fileLocation } }, IsRelevant = Convert.ToByte(isRelevant) }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert ForeshoreProfileCollection foreshoreProfiles = section.StabilityStoneCover.ForeshoreProfiles; Assert.AreEqual(fileLocation, foreshoreProfiles.SourcePath); CollectionAssert.AreEqual(new[] { profileBId, profileAId }, foreshoreProfiles.Select(fp => fp.Id)); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithWaveImpactAsphaltCoverWithProperties_ReturnsWaveImpactAsphaltCoverWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.WaveImpactOnAsphaltRevetment, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, WaveImpactAsphaltCoverFailureMechanismMetaEntities = { new WaveImpactAsphaltCoverFailureMechanismMetaEntity() } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.WaveImpactAsphaltCover.IsRelevant); Assert.AreEqual(inputComments, section.WaveImpactAsphaltCover.InputComments.Body); Assert.AreEqual(outputComments, section.WaveImpactAsphaltCover.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.WaveImpactAsphaltCover.NotRelevantComments.Body); } [Test] public void Read_WithWaveImpactAsphaltCoverWithForeshoreProfiles_ReturnsWaveImpactAsphaltCoverWithForeshoreProfiles() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string profileAId = "profileA"; const string profileBId = "profileB"; const string fileLocation = "some/location"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.WaveImpactOnAsphaltRevetment, CalculationGroupEntity = new CalculationGroupEntity(), ForeshoreProfileEntities = { new ForeshoreProfileEntity { Order = 1, Id = profileAId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) }, new ForeshoreProfileEntity { Order = 0, Id = profileBId, GeometryXml = new Point2DXmlSerializer().ToXml(Enumerable.Empty()) } }, WaveImpactAsphaltCoverFailureMechanismMetaEntities = { new WaveImpactAsphaltCoverFailureMechanismMetaEntity { ForeshoreProfileCollectionSourcePath = fileLocation } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert ForeshoreProfileCollection foreshoreProfiles = section.WaveImpactAsphaltCover.ForeshoreProfiles; Assert.AreEqual(fileLocation, foreshoreProfiles.SourcePath); CollectionAssert.AreEqual(new[] { profileBId, profileAId }, foreshoreProfiles.Select(fp => fp.Id)); } [Test] public void Read_WithWaveImpactAsphaltCoverWithWaveConditionsCalculationGroups_ReturnsWaveImpactAsphaltCoverWithWaveConditionsCalculationGroups() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.WaveImpactOnAsphaltRevetment, CalculationGroupEntity = new CalculationGroupEntity { CalculationGroupEntity1 = { new CalculationGroupEntity { Order = 0 }, new CalculationGroupEntity { Order = 1 } } }, WaveImpactAsphaltCoverFailureMechanismMetaEntities = { new WaveImpactAsphaltCoverFailureMechanismMetaEntity() } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert IList childCalculationGroups = section.WaveImpactAsphaltCover.WaveConditionsCalculationGroup.Children; Assert.AreEqual(2, childCalculationGroups.Count); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithHeightStructuresWithProperties_ReturnsHeightStructuresWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.StructureHeight, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, HeightStructuresFailureMechanismMetaEntities = { new HeightStructuresFailureMechanismMetaEntity { N = 5 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.HeightStructures.IsRelevant); Assert.AreEqual(inputComments, section.HeightStructures.InputComments.Body); Assert.AreEqual(outputComments, section.HeightStructures.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.HeightStructures.NotRelevantComments.Body); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithClosingStructuresWithProperties_ReturnsClosingStructuresWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.ReliabilityClosingOfStructure, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, ClosingStructuresFailureMechanismMetaEntities = { new ClosingStructuresFailureMechanismMetaEntity { N2A = 3 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.ClosingStructures.IsRelevant); Assert.AreEqual(inputComments, section.ClosingStructures.InputComments.Body); Assert.AreEqual(outputComments, section.ClosingStructures.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.ClosingStructures.NotRelevantComments.Body); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithStabilityPointStructuresWithProperties_ReturnsStabilityPointStructuresWithProperties(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.StabilityPointStructures, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, StabilityPointStructuresFailureMechanismMetaEntities = { new StabilityPointStructuresFailureMechanismMetaEntity { N = 5 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.StabilityPointStructures.IsRelevant); Assert.AreEqual(inputComments, section.StabilityPointStructures.InputComments.Body); Assert.AreEqual(outputComments, section.StabilityPointStructures.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.StabilityPointStructures.NotRelevantComments.Body); } [Test] public void Read_WithDuneErosionWithProperties_ReturnsDuneErosionWithProperties() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); const string inputComments = "Some input text"; const string outputComments = "Some output text"; const string notRelevantComments = "Really not relevant"; bool isRelevant = new Random().NextBoolean(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.DuneErosion, CalculationGroupEntity = new CalculationGroupEntity(), IsRelevant = Convert.ToByte(isRelevant), InputComments = inputComments, OutputComments = outputComments, NotRelevantComments = notRelevantComments, DuneErosionFailureMechanismMetaEntities = { new DuneErosionFailureMechanismMetaEntity { N = 3 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(isRelevant, section.DuneErosion.IsRelevant); Assert.AreEqual(inputComments, section.DuneErosion.InputComments.Body); Assert.AreEqual(outputComments, section.DuneErosion.OutputComments.Body); Assert.AreEqual(notRelevantComments, section.DuneErosion.NotRelevantComments.Body); } [Test] public void Read_WithDuneErosionWithFailureMechanismSection_ReturnsDuneErosionWithFailureMechanismSections() { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); var failureMechanismEntity = new FailureMechanismEntity { FailureMechanismType = (int) FailureMechanismType.DuneErosion, FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities(), DuneErosionFailureMechanismMetaEntities = { new DuneErosionFailureMechanismMetaEntity { N = 1 } } }; entity.FailureMechanismEntities.Add(failureMechanismEntity); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert Assert.AreEqual(2, section.DuneErosion.Sections.Count()); } [Test] [TestCase(true)] [TestCase(false)] public void Read_WithStandAloneFailureMechanisms_ReturnsNewAssessmentSectionWithFailureMechanismsSet(bool isRelevant) { // Setup AssessmentSectionEntity entity = CreateAssessmentSectionEntity(); FailureMechanismEntity macrostabilityInwards = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.MacroStabilityInwards); FailureMechanismEntity macrostabilityOutwards = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.MacrostabilityOutwards); FailureMechanismEntity microstability = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.Microstability); FailureMechanismEntity strengthAndStabilityParallelConstruction = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.StrengthAndStabilityParallelConstruction); FailureMechanismEntity waterOverpressureAsphaltRevetment = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.WaterOverpressureAsphaltRevetment); FailureMechanismEntity grassRevetmentSlidingOutwards = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.GrassRevetmentSlidingOutwards); FailureMechanismEntity grassRevetmentSlidingInwards = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.GrassRevetmentSlidingInwards); FailureMechanismEntity technicalInnovations = CreateFailureMechanismEntity( isRelevant, FailureMechanismType.TechnicalInnovations); entity.FailureMechanismEntities.Add(macrostabilityInwards); entity.FailureMechanismEntities.Add(macrostabilityOutwards); entity.FailureMechanismEntities.Add(microstability); entity.FailureMechanismEntities.Add(strengthAndStabilityParallelConstruction); entity.FailureMechanismEntities.Add(waterOverpressureAsphaltRevetment); entity.FailureMechanismEntities.Add(grassRevetmentSlidingOutwards); entity.FailureMechanismEntities.Add(grassRevetmentSlidingInwards); entity.FailureMechanismEntities.Add(technicalInnovations); entity.BackgroundDataEntities.Add(CreateBackgroundDataEntity()); var collector = new ReadConversionCollector(); // Call AssessmentSection section = entity.Read(collector); // Assert AssertFailureMechanismEqual(isRelevant, 2, macrostabilityInwards.InputComments, macrostabilityInwards.OutputComments, macrostabilityInwards.NotRelevantComments, section.MacroStabilityInwards); AssertFailureMechanismEqual(isRelevant, 2, macrostabilityOutwards.InputComments, macrostabilityOutwards.OutputComments, macrostabilityOutwards.NotRelevantComments, section.MacrostabilityOutwards); AssertFailureMechanismEqual(isRelevant, 2, microstability.InputComments, microstability.OutputComments, microstability.NotRelevantComments, section.Microstability); AssertFailureMechanismEqual(isRelevant, 2, strengthAndStabilityParallelConstruction.InputComments, strengthAndStabilityParallelConstruction.OutputComments, strengthAndStabilityParallelConstruction.NotRelevantComments, section.StrengthStabilityLengthwiseConstruction); AssertFailureMechanismEqual(isRelevant, 2, waterOverpressureAsphaltRevetment.InputComments, waterOverpressureAsphaltRevetment.OutputComments, waterOverpressureAsphaltRevetment.NotRelevantComments, section.WaterPressureAsphaltCover); AssertFailureMechanismEqual(isRelevant, 2, grassRevetmentSlidingOutwards.InputComments, grassRevetmentSlidingOutwards.OutputComments, grassRevetmentSlidingOutwards.NotRelevantComments, section.GrassCoverSlipOffOutwards); AssertFailureMechanismEqual(isRelevant, 2, technicalInnovations.InputComments, technicalInnovations.OutputComments, technicalInnovations.NotRelevantComments, section.TechnicalInnovation); } private static AssessmentSectionEntity CreateAssessmentSectionEntity() { return new AssessmentSectionEntity { Norm = 1.0 / 30000, Composition = Convert.ToByte(AssessmentSectionComposition.Dike) }; } private static BackgroundDataEntity CreateBackgroundDataEntity() { return new BackgroundDataEntity { Name = "Background", Transparency = 0.0, IsVisible = 0, BackgroundDataType = 1, BackgroundDataMetaEntities = new[] { new BackgroundDataMetaEntity { Key = BackgroundDataIdentifiers.IsConfigured, Value = "0" } } }; } private static FailureMechanismEntity CreateFailureMechanismEntity(bool isRelevant, FailureMechanismType failureMechanismType) { return new FailureMechanismEntity { FailureMechanismType = (short) failureMechanismType, IsRelevant = Convert.ToByte(isRelevant), InputComments = string.Concat("InputComment", failureMechanismType.ToString()), OutputComments = string.Concat("OutputComment", failureMechanismType.ToString()), NotRelevantComments = string.Concat("NotRelevantComment", failureMechanismType.ToString()), FailureMechanismSectionEntities = CreateFailureMechanismSectionEntities() }; } private static void AssertFailureMechanismEqual(bool expectedIsRelevant, int expectedSectionCount, string expectedInputComments, string expectedOutputComments, string expectedNotRelevantComments, IFailureMechanism failureMechanism) { Assert.AreEqual(expectedIsRelevant, failureMechanism.IsRelevant); Assert.AreEqual(expectedInputComments, failureMechanism.InputComments.Body); Assert.AreEqual(expectedOutputComments, failureMechanism.OutputComments.Body); Assert.AreEqual(expectedNotRelevantComments, failureMechanism.NotRelevantComments.Body); 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 { Name = "", FailureMechanismSectionPointXml = dummyPointXml }, new FailureMechanismSectionEntity { Name = "", FailureMechanismSectionPointXml = dummyPointXml } }; } } }