Index: Riskeer/Storage/src/Riskeer.Storage.Core/Read/AssessmentSectionEntityReadExtensions.cs =================================================================== diff -u -r1da7c54acabe2073a9ab5611828527b91b5f0df7 -re63d76cffd22655ce3e821d57f05e66464eec2cb --- Riskeer/Storage/src/Riskeer.Storage.Core/Read/AssessmentSectionEntityReadExtensions.cs (.../AssessmentSectionEntityReadExtensions.cs) (revision 1da7c54acabe2073a9ab5611828527b91b5f0df7) +++ Riskeer/Storage/src/Riskeer.Storage.Core/Read/AssessmentSectionEntityReadExtensions.cs (.../AssessmentSectionEntityReadExtensions.cs) (revision e63d76cffd22655ce3e821d57f05e66464eec2cb) @@ -265,7 +265,7 @@ entity.SpecificFailureMechanismEntities .OrderBy(e => e.Order); - assessmentSection.SpecificFailureMechanisms.AddRange(specificFailureMechanismEntities.Select(e => e.ReadSpecificFailurePath(collector)).ToArray()); + assessmentSection.SpecificFailureMechanisms.AddRange(specificFailureMechanismEntities.Select(e => e.Read(collector)).ToArray()); } } } \ No newline at end of file Fisheye: Tag e63d76cffd22655ce3e821d57f05e66464eec2cb refers to a dead (removed) revision in file `Riskeer/Storage/src/Riskeer.Storage.Core/Read/FailurePathEntityReadExtensions.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Riskeer/Storage/src/Riskeer.Storage.Core/Read/SpecificFailureMechanismEntityReadExtensions.cs =================================================================== diff -u --- Riskeer/Storage/src/Riskeer.Storage.Core/Read/SpecificFailureMechanismEntityReadExtensions.cs (revision 0) +++ Riskeer/Storage/src/Riskeer.Storage.Core/Read/SpecificFailureMechanismEntityReadExtensions.cs (revision e63d76cffd22655ce3e821d57f05e66464eec2cb) @@ -0,0 +1,84 @@ +// 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.Data; +using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Storage.Core.DbContext; +using Riskeer.Storage.Core.Read.FailureMechanismSectionResults; + +namespace Riskeer.Storage.Core.Read +{ + /// + /// This class defines extension methods for read operations for a based on the + /// + /// + internal static class SpecificFailureMechanismEntityReadExtensions + { + /// + /// Reads the and uses the information to create a . + /// + /// The to create a with. + /// The object keeping track of read operations. + /// Thrown when any argument is null. + internal static SpecificFailureMechanism Read(this SpecificFailureMechanismEntity entity, ReadConversionCollector collector) + { + if (entity == null) + { + throw new ArgumentNullException(nameof(entity)); + } + + if (collector == null) + { + throw new ArgumentNullException(nameof(collector)); + } + + var failureMechanism = new SpecificFailureMechanism + { + Name = entity.Name, + Code = entity.Code, + GeneralInput = + { + N = (RoundedDouble) entity.N, + ApplyLengthEffectInSection = Convert.ToBoolean(entity.ApplyLengthEffectInSection) + } + }; + entity.ReadCommonFailureMechanismProperties(failureMechanism, collector); + ReadFailureMechanismSectionResults(entity, failureMechanism, collector); + return failureMechanism; + } + + private static void ReadFailureMechanismSectionResults(this IFailureMechanismEntity entity, + SpecificFailureMechanism specificFailureMechanism, + ReadConversionCollector collector) + { + foreach (NonAdoptableWithProfileProbabilityFailureMechanismSectionResultEntity sectionResultEntity in + entity.FailureMechanismSectionEntities.SelectMany(fms => fms.NonAdoptableWithProfileProbabilityFailureMechanismSectionResultEntities)) + { + FailureMechanismSection failureMechanismSection = collector.Get(sectionResultEntity.FailureMechanismSectionEntity); + NonAdoptableWithProfileProbabilityFailureMechanismSectionResult sectionResult = specificFailureMechanism.SectionResults.Single(sr => ReferenceEquals(sr.Section, failureMechanismSection)); + + sectionResultEntity.Read(sectionResult); + } + } + } +} \ No newline at end of file Fisheye: Tag e63d76cffd22655ce3e821d57f05e66464eec2cb refers to a dead (removed) revision in file `Riskeer/Storage/test/Riskeer.Storage.Core.Test/Read/FailurePathEntityReadExtensionsTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: Riskeer/Storage/test/Riskeer.Storage.Core.Test/Read/SpecificFailureMechanismEntityReadExtensionsTest.cs =================================================================== diff -u --- Riskeer/Storage/test/Riskeer.Storage.Core.Test/Read/SpecificFailureMechanismEntityReadExtensionsTest.cs (revision 0) +++ Riskeer/Storage/test/Riskeer.Storage.Core.Test/Read/SpecificFailureMechanismEntityReadExtensionsTest.cs (revision e63d76cffd22655ce3e821d57f05e66464eec2cb) @@ -0,0 +1,205 @@ +// 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.Collections.Generic; +using System.Linq; +using Core.Common.Base.Geometry; +using Core.Common.TestUtil; +using NUnit.Framework; +using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.TestUtil; +using Riskeer.Storage.Core.DbContext; +using Riskeer.Storage.Core.Read; +using Riskeer.Storage.Core.Serializers; +using Riskeer.Storage.Core.TestUtil; + +namespace Riskeer.Storage.Core.Test.Read +{ + [TestFixture] + public class SpecificFailureMechanismEntityReadExtensionsTest + { + [Test] + public void Read_EntityNull_ThrowArgumentNullException() + { + // Call + void Call() => ((SpecificFailureMechanismEntity) null).Read(new ReadConversionCollector()); + + // Assert + string paramName = Assert.Throws(Call).ParamName; + Assert.AreEqual("entity", paramName); + } + + [Test] + public void Read_CollectorNull_ThrowArgumentNullException() + { + // Setup + var entity = new SpecificFailureMechanismEntity(); + + // Call + void Call() => entity.Read(null); + + // Assert + string paramName = Assert.Throws(Call).ParamName; + Assert.AreEqual("collector", paramName); + } + + [Test] + public void Read_ValidEntity_ReturnSpecificFailureMechanism() + { + // Setup + var random = new Random(21); + bool inAssembly = random.NextBoolean(); + var probabilityResultType = random.NextEnumValue(); + + const string filePath = "failureMechanismSections/File/Path"; + var entity = new SpecificFailureMechanismEntity + { + Name = "Specific failure mechanism name", + Code = "FAALMECHANISME", + N = random.NextDouble(1.0, 20.0), + ApplyLengthEffectInSection = Convert.ToByte(random.NextBoolean()), + InAssembly = Convert.ToByte(inAssembly), + InAssemblyInputComments = "Some input text", + InAssemblyOutputComments = "Some output text", + NotInAssemblyComments = "Some not in assembly text", + FailureMechanismSectionCollectionSourcePath = filePath, + FailureMechanismAssemblyResultProbabilityResultType = Convert.ToByte(probabilityResultType), + FailureMechanismAssemblyResultManualFailureMechanismAssemblyProbability = random.NextDouble(), + FailureMechanismSectionEntities = + { + CreateSimpleFailureMechanismSectionEntity() + } + }; + + var collector = new ReadConversionCollector(); + + // Call + SpecificFailureMechanism specificFailureMechanism = entity.Read(collector); + + // Assert + FailureMechanismEntityTestHelper.AssertIFailureMechanismEntityProperties(entity, specificFailureMechanism); + + Assert.AreEqual(entity.Name, specificFailureMechanism.Name); + Assert.AreEqual(entity.Code, specificFailureMechanism.Code); + Assert.AreEqual(entity.FailureMechanismSectionEntities.Count, specificFailureMechanism.Sections.Count()); + Assert.AreEqual(filePath, specificFailureMechanism.FailureMechanismSectionSourcePath); + + Assert.AreEqual(entity.N, specificFailureMechanism.GeneralInput.N, specificFailureMechanism.GeneralInput.N.GetAccuracy()); + Assert.AreEqual(Convert.ToBoolean(entity.ApplyLengthEffectInSection), specificFailureMechanism.GeneralInput.ApplyLengthEffectInSection); + } + + [Test] + public void Read_EntityWithNullValues_ReturnSpecificFailureMechanism() + { + // Setup + var entity = new SpecificFailureMechanismEntity + { + N = 1.1 + }; + var collector = new ReadConversionCollector(); + + // Call + SpecificFailureMechanism specificFailureMechanism = entity.Read(collector); + + // Assert + FailureMechanismAssemblyResult assemblyResult = specificFailureMechanism.AssemblyResult; + Assert.IsNaN(assemblyResult.ManualFailureMechanismAssemblyProbability); + } + + [Test] + public void Read_ValidEntityWithoutSections_ReturnSpecificFailureMechanism() + { + // Setup + var entity = new SpecificFailureMechanismEntity + { + N = 1.1 + }; + + var collector = new ReadConversionCollector(); + + // Call + SpecificFailureMechanism specificFailureMechanism = entity.Read(collector); + + // Assert + Assert.AreEqual(entity.FailureMechanismSectionEntities.Count, specificFailureMechanism.Sections.Count()); + Assert.IsNull(specificFailureMechanism.FailureMechanismSectionSourcePath); + } + + [Test] + public void Read_ValidEntityWithSections_ReturnSpecificFailureMechanism() + { + // Setup + const string filePath = "sections/File/Path"; + FailureMechanismSectionEntity failureMechanismSectionEntity = CreateSimpleFailureMechanismSectionEntity(); + + var sectionResultEntity = new NonAdoptableWithProfileProbabilityFailureMechanismSectionResultEntity + { + FailureMechanismSectionEntity = failureMechanismSectionEntity + }; + SectionResultTestHelper.SetSectionResult(sectionResultEntity); + + failureMechanismSectionEntity.NonAdoptableWithProfileProbabilityFailureMechanismSectionResultEntities = new List + { + sectionResultEntity + }; + + var entity = new SpecificFailureMechanismEntity + { + N = 1.1, + FailureMechanismSectionEntities = new List + { + failureMechanismSectionEntity + }, + FailureMechanismSectionCollectionSourcePath = filePath + }; + + var collector = new ReadConversionCollector(); + + // Call + SpecificFailureMechanism specificFailureMechanism = entity.Read(collector); + + // Assert + Assert.AreEqual(filePath, specificFailureMechanism.FailureMechanismSectionSourcePath); + Assert.AreEqual(entity.FailureMechanismSectionEntities.Count, specificFailureMechanism.Sections.Count()); + + SectionResultTestHelper.AssertSectionResult(entity.FailureMechanismSectionEntities + .SelectMany(fms => fms.NonAdoptableWithProfileProbabilityFailureMechanismSectionResultEntities) + .Single(), + specificFailureMechanism.SectionResults.Single()); + } + + private static FailureMechanismSectionEntity CreateSimpleFailureMechanismSectionEntity() + { + var dummyPoints = new[] + { + new Point2D(0, 0) + }; + string dummyPointXml = new Point2DCollectionXmlSerializer().ToXml(dummyPoints); + var failureMechanismSectionEntity = new FailureMechanismSectionEntity + { + Name = "section", + FailureMechanismSectionPointXml = dummyPointXml + }; + return failureMechanismSectionEntity; + } + } +} \ No newline at end of file