Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Application.Ringtoets.Storage.csproj =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/Application.Ringtoets.Storage.csproj (.../Application.Ringtoets.Storage.csproj) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Application.Ringtoets.Storage.csproj (.../Application.Ringtoets.Storage.csproj) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -36,6 +36,7 @@ ..\..\..\..\packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll True + @@ -54,6 +55,8 @@ + + @@ -94,6 +97,7 @@ + Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismConverterBase.cs =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismConverterBase.cs (.../FailureMechanismConverterBase.cs) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismConverterBase.cs (.../FailureMechanismConverterBase.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -27,15 +27,22 @@ namespace Application.Ringtoets.Storage.Converters { - public abstract class FailureMechanismConverterBase : IEntityConverter where T : IFailureMechanism + /// + /// Common implementation for converting + /// failure mechanisms. + /// + /// The type of failure mechanism used to convert from and to by + /// this converter. + /// + public abstract class FailureMechanismConverterBase : IFailureMechanismEntityConverter where T : IFailureMechanism { public T ConvertEntityToModel(FailureMechanismEntity entity) { if (entity == null) { throw new ArgumentNullException("entity"); } - if (entity.FailureMechanismType != (short)GetFailureMechanismType()) + if (!CorrespondsToFailureMechanismType(entity)) { throw new ArgumentException("Incorrect modelType", "entity"); } @@ -64,6 +71,11 @@ entity.IsRelevant = modelObject.IsRelevant ? (byte)1 : (byte)0; } + public bool CorrespondsToFailureMechanismType(FailureMechanismEntity entity) + { + return (short)GetFailureMechanismType() == entity.FailureMechanismType; + } + protected abstract T ConstructFailureMechanism(); protected abstract FailureMechanismType GetFailureMechanismType(); Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismPlaceholderConverter.cs =================================================================== diff -u --- Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismPlaceholderConverter.cs (revision 0) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/FailureMechanismPlaceholderConverter.cs (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -0,0 +1,55 @@ +// 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 Application.Ringtoets.Storage.DbContext; + +using Ringtoets.Integration.Data.Placeholders; + +namespace Application.Ringtoets.Storage.Converters +{ + /// + /// Converter for to + /// and to . + /// + public class FailureMechanismPlaceholderConverter : FailureMechanismConverterBase + { + private readonly FailureMechanismType type; + + /// + /// Initializes a new instance of the class. + /// + /// The type of failure mechanism where the placeholder is used for. + public FailureMechanismPlaceholderConverter(FailureMechanismType type) + { + this.type = type; + } + + protected override FailureMechanismPlaceholder ConstructFailureMechanism() + { + return new FailureMechanismPlaceholder(GetFailureMechanismType().ToString()); + } + + protected override FailureMechanismType GetFailureMechanismType() + { + return type; + } + } +} \ No newline at end of file Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/IFailureMechanismEntityConverter.cs =================================================================== diff -u --- Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/IFailureMechanismEntityConverter.cs (revision 0) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/IFailureMechanismEntityConverter.cs (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -0,0 +1,22 @@ +using Application.Ringtoets.Storage.DbContext; + +using Ringtoets.Common.Data.FailureMechanism; + +namespace Application.Ringtoets.Storage.Converters +{ + /// + /// Interface that declares a converter that converts between + /// and instances. + /// + /// The type of failure mechanism supported by the converter. + public interface IFailureMechanismEntityConverter : IEntityConverter where T : IFailureMechanism + { + /// + /// Determines if the corresponds to the type + /// of failure mechanism that this converter can deal with. + /// + /// The entity. + /// True if the converter can handle the entity, false if not. + bool CorrespondsToFailureMechanismType(FailureMechanismEntity entity); + } +} \ No newline at end of file Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/PipingFailureMechanismConverter.cs =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/PipingFailureMechanismConverter.cs (.../PipingFailureMechanismConverter.cs) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Converters/PipingFailureMechanismConverter.cs (.../PipingFailureMechanismConverter.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -37,7 +37,7 @@ protected override FailureMechanismType GetFailureMechanismType() { - return FailureMechanismType.PipingFailureMechanism; + return FailureMechanismType.Piping; } } } \ No newline at end of file Index: Application/Ringtoets/src/Application.Ringtoets.Storage/DbContext/FailureMechanismType.cs =================================================================== diff -u -r8b5a6f938fe2b04cd78623649df37580e145055f -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/DbContext/FailureMechanismType.cs (.../FailureMechanismType.cs) (revision 8b5a6f938fe2b04cd78623649df37580e145055f) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/DbContext/FailureMechanismType.cs (.../FailureMechanismType.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -21,16 +21,99 @@ namespace Application.Ringtoets.Storage.DbContext { + /// + /// The type failure mechanism available in the application. + /// public enum FailureMechanismType { - PipingFailureMechanism = 0, - OvertoppingFailureMechanism = 1, - MacrostabilityInwardsFailureMechanism = 2, - StructuresOvertoppingFailureMechanism = 3, - StructuresClosureFailureMechanism = 4, - StructuresStructuralFailureFailureMechanism = 5, - StoneRevetmentFailureMechanism = 6, - AsphaltRevetmentFailureMechanism = 7, - RoughnessRevetmentFailureMechanism = 8 + /// + /// Piping - STPH + /// + Piping = 1, + + /// + /// Macrostability binnenwaarts - STBI + /// + MacrostabilityInwards = 2, + + /// + /// Golfklappen op asfaltbekleding - AGK + /// + WaveImpactOnAsphaltRevetment = 3, + + /// + /// Grasbekleding erosie buitentalud - GEBU + /// + GrassRevetmentErosionOutwards = 4, + + /// + /// Grasbekleding afschuiven buitentalud - GABU + /// + GrassRevetmentSlidingOutwards = 5, + + /// + /// Grasbekleding erosie kruin en binnentalud - GEKB + /// + GrassRevetmentTopErosionAndInwards = 6, + + /// + /// Stabiliteit steenzetting - ZST + /// + StabilityStoneRevetment = 7, + + /// + /// Duinafslag - DA + /// + DuneErosion = 8, + + /// + /// Hoogte kunstwerk - HTKW + /// + StructureHeight = 9, + + /// + /// Betrouwbaarheid sluiting kunstwerk - BSKW + /// + ReliabilityClosingOfStructure = 10, + + /// + /// Piping bij kunstwerk - PKW + /// + PipingAtStructure = 11, + + /// + /// Sterkte en stabiliteit puntconstructies - STKWp + /// + StrengthAndStabilityPointConstruction = 12, + + /// + /// Macrostabiliteit buitenwaarts - STBU + /// + MacrostabilityOutwards = 13, + + /// + /// Microstabiliteit - STMI + /// + Microstability = 14, + + /// + /// Wateroverdruk bij asfaltbekleding - AWO + /// + WaterOverpressureAsphaltRevetment = 15, + + /// + /// Grasbekleding afschuiven binnentalud - GABI + /// + GrassRevetmentSlidingInwards = 16, + + /// + /// Sterkte en stabiliteit langsconstructires - STKWl + /// + StrengthAndStabilityParallelConstruction = 17, + + /// + /// Technische innovaties - INN + /// + TechnicalInnovations = 18 } } \ No newline at end of file Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/AssessmentSectionPersistor.cs =================================================================== diff -u -rc4d2af65ad23757fb3bd11f93458839bc1787ded -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/AssessmentSectionPersistor.cs (.../AssessmentSectionPersistor.cs) (revision c4d2af65ad23757fb3bd11f93458839bc1787ded) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/AssessmentSectionPersistor.cs (.../AssessmentSectionPersistor.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -24,11 +24,14 @@ using System.Data.Entity; using System.Diagnostics; using System.Linq; + using Application.Ringtoets.Storage.Converters; using Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Exceptions; using Application.Ringtoets.Storage.Properties; + using Ringtoets.Integration.Data; +using Ringtoets.Integration.Data.Placeholders; namespace Application.Ringtoets.Storage.Persistors { @@ -43,6 +46,8 @@ private readonly ICollection modifiedList = new List(); private readonly PipingFailureMechanismPersistor pipingFailureMechanismEntityPersistor; + private readonly IDictionary placeholderPersistors; + private readonly HydraulicBoundaryLocationPersistor hydraulicLocationEntityPersistor; private readonly ReferenceLinePersistor referenceLinePersistor; @@ -62,6 +67,8 @@ converter = new AssessmentSectionConverter(); pipingFailureMechanismEntityPersistor = new PipingFailureMechanismPersistor(ringtoetsContext); + placeholderPersistors = CreatePlaceHolderPersistors(ringtoetsContext); + hydraulicLocationEntityPersistor = new HydraulicBoundaryLocationPersistor(ringtoetsContext); referenceLinePersistor = new ReferenceLinePersistor(ringtoetsContext); } @@ -82,10 +89,14 @@ foreach (var failureMechanismEntity in entity.FailureMechanismEntities) { - if (failureMechanismEntity.FailureMechanismType == (int) FailureMechanismType.PipingFailureMechanism) + if (failureMechanismEntity.FailureMechanismType == (int)FailureMechanismType.Piping) { pipingFailureMechanismEntityPersistor.LoadModel(failureMechanismEntity, assessmentSection.PipingFailureMechanism); } + else + { + LoadExternalFailureMechanism(failureMechanismEntity, assessmentSection); + } } assessmentSection.ReferenceLine = referenceLinePersistor.LoadModel(entity.ReferenceLinePointEntities); @@ -169,9 +180,61 @@ UpdateStorageIdsInModel(); pipingFailureMechanismEntityPersistor.PerformPostSaveActions(); + foreach (FailureMechanismPlaceholderPersistor persistor in placeholderPersistors.Values) + { + persistor.PerformPostSaveActions(); + } hydraulicLocationEntityPersistor.PerformPostSaveActions(); } + private IDictionary CreatePlaceHolderPersistors(IRingtoetsEntities ringtoetsContext) + { + return new[] + { + FailureMechanismType.MacrostabilityInwards, + FailureMechanismType.StructureHeight, + FailureMechanismType.ReliabilityClosingOfStructure, + FailureMechanismType.StrengthAndStabilityPointConstruction, + FailureMechanismType.StabilityStoneRevetment, + FailureMechanismType.WaveImpactOnAsphaltRevetment, + FailureMechanismType.GrassRevetmentErosionOutwards, + FailureMechanismType.DuneErosion + }.ToDictionary(type => type, type => new FailureMechanismPlaceholderPersistor(ringtoetsContext, type)); + } + + private void LoadExternalFailureMechanism(FailureMechanismEntity failureMechanismEntity, AssessmentSection assessmentSection) + { + var failureMechanismType = (FailureMechanismType)failureMechanismEntity.FailureMechanismType; + FailureMechanismPlaceholderPersistor persistor = placeholderPersistors[failureMechanismType]; + FailureMechanismPlaceholder failureMechanism = GetFailureMechanismPlaceholder(assessmentSection, failureMechanismType); + persistor.LoadModel(failureMechanismEntity, failureMechanism); + } + + private static FailureMechanismPlaceholder GetFailureMechanismPlaceholder(AssessmentSection assessmentSection, FailureMechanismType failureMechanismType) + { + switch (failureMechanismType) + { + case FailureMechanismType.WaveImpactOnAsphaltRevetment: + return assessmentSection.AsphaltRevetment; + case FailureMechanismType.MacrostabilityInwards: + return assessmentSection.MacrostabilityInwards; + case FailureMechanismType.StructureHeight: + return assessmentSection.Overtopping; + case FailureMechanismType.GrassRevetmentErosionOutwards: + return assessmentSection.GrassRevetment; + case FailureMechanismType.StabilityStoneRevetment: + return assessmentSection.StoneRevetment; + case FailureMechanismType.ReliabilityClosingOfStructure: + return assessmentSection.Closing; + case FailureMechanismType.StrengthAndStabilityPointConstruction: + return assessmentSection.FailingOfConstruction; + case FailureMechanismType.DuneErosion: + return assessmentSection.DuneErosion; + default: + throw new NotImplementedException(); + } + } + /// /// Updates the children of , in reference to , in the storage. /// @@ -182,6 +245,15 @@ pipingFailureMechanismEntityPersistor.UpdateModel(entity.FailureMechanismEntities, model.PipingFailureMechanism); pipingFailureMechanismEntityPersistor.RemoveUnModifiedEntries(entity.FailureMechanismEntities); + foreach (KeyValuePair keyValuePair in placeholderPersistors) + { + FailureMechanismPlaceholder failureMechanism = GetFailureMechanismPlaceholder(model, keyValuePair.Key); + + FailureMechanismPlaceholderPersistor persistor = keyValuePair.Value; + persistor.UpdateModel(entity.FailureMechanismEntities, failureMechanism); + persistor.RemoveUnModifiedEntries(entity.FailureMechanismEntities); + } + hydraulicLocationEntityPersistor.UpdateModel(entity.HydraulicLocationEntities, model.HydraulicBoundaryDatabase); referenceLinePersistor.InsertModel(entity.ReferenceLinePointEntities, model.ReferenceLine); } @@ -196,6 +268,15 @@ pipingFailureMechanismEntityPersistor.InsertModel(entity.FailureMechanismEntities, model.PipingFailureMechanism); pipingFailureMechanismEntityPersistor.RemoveUnModifiedEntries(entity.FailureMechanismEntities); + foreach (KeyValuePair keyValuePair in placeholderPersistors) + { + FailureMechanismPlaceholder failureMechanism = GetFailureMechanismPlaceholder(model, keyValuePair.Key); + + FailureMechanismPlaceholderPersistor persistor = keyValuePair.Value; + persistor.InsertModel(entity.FailureMechanismEntities, failureMechanism); + persistor.RemoveUnModifiedEntries(entity.FailureMechanismEntities); + } + hydraulicLocationEntityPersistor.InsertModel(entity.HydraulicLocationEntities, model.HydraulicBoundaryDatabase); referenceLinePersistor.InsertModel(entity.ReferenceLinePointEntities, model.ReferenceLine); } @@ -268,8 +349,8 @@ { foreach (var entry in insertedList) { - Debug.Assert(entry.Key.AssessmentSectionEntityId > 0, - "AssessmentSectionEntityId is not set. Have you called IRingtoetsEntities.SaveChanges?"); + Debug.Assert(entry.Key.AssessmentSectionEntityId > 0, + "AssessmentSectionEntityId is not set. Have you called IRingtoetsEntities.SaveChanges?"); entry.Value.StorageId = entry.Key.AssessmentSectionEntityId; } insertedList.Clear(); Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPersistorBase.cs =================================================================== diff -u -r35dd019140ab3d11241908744c43ddac43a8989e -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPersistorBase.cs (.../FailureMechanismPersistorBase.cs) (revision 35dd019140ab3d11241908744c43ddac43a8989e) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPersistorBase.cs (.../FailureMechanismPersistorBase.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -40,15 +40,15 @@ private readonly Dictionary insertedList = new Dictionary(); private readonly ICollection modifiedList = new List(); - private readonly IEntityConverter converter; + private readonly FailureMechanismConverterBase converter; /// /// New instance of . /// /// The storage context. /// An implementation of the to use in the persistor. /// Thrown when is null. - protected FailureMechanismPersistorBase(IRingtoetsEntities ringtoetsContext, IEntityConverter converter) + protected FailureMechanismPersistorBase(IRingtoetsEntities ringtoetsContext, FailureMechanismConverterBase converter) { if (ringtoetsContext == null) { @@ -194,8 +194,9 @@ /// Thrown when the is read-only. public void RemoveUnModifiedEntries(ICollection parentNavigationProperty) { - var untouchedModifiedList = parentNavigationProperty.Where(e => e.FailureMechanismEntityId > 0 && !modifiedList.Contains(e)); - failureMechanismSet.RemoveRange(untouchedModifiedList); + IEnumerable failureMechanismOrphans = parentNavigationProperty.Where(e => converter.CorrespondsToFailureMechanismType(e) && + e.FailureMechanismEntityId > 0 && !modifiedList.Contains(e)); + failureMechanismSet.RemoveRange(failureMechanismOrphans); modifiedList.Clear(); } Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPlaceholderPersistor.cs =================================================================== diff -u --- Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPlaceholderPersistor.cs (revision 0) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Persistors/FailureMechanismPlaceholderPersistor.cs (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -0,0 +1,59 @@ +// 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 Application.Ringtoets.Storage.Converters; +using Application.Ringtoets.Storage.DbContext; + +using Ringtoets.Integration.Data.Placeholders; + +namespace Application.Ringtoets.Storage.Persistors +{ + /// + /// The persistor for instances. + /// + public class FailureMechanismPlaceholderPersistor : FailureMechanismPersistorBase + { + /// + /// Initializes a new instance of the class. + /// + /// The storage context. + /// Type of the failure mechanism for which the + /// placeholder is a stand-in. + /// Thrown when is null. + public FailureMechanismPlaceholderPersistor(IRingtoetsEntities ringtoetsContext, FailureMechanismType failureMechanismType) : + base(ringtoetsContext, CreateConverterForType(failureMechanismType)) {} + + protected override void LoadChildren(FailureMechanismPlaceholder model, FailureMechanismEntity entity) {} + + protected override void UpdateChildren(FailureMechanismPlaceholder model, FailureMechanismEntity entity) {} + + protected override void InsertChildren(FailureMechanismPlaceholder model, FailureMechanismEntity entity) {} + + protected override void PerformChildPostSaveAction() {} + + private static FailureMechanismConverterBase CreateConverterForType(FailureMechanismType failureMechanismType) + { + return new FailureMechanismPlaceholderConverter(failureMechanismType); + } + } +} \ No newline at end of file Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Application.Ringtoets.Storage.Test.csproj =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Application.Ringtoets.Storage.Test.csproj (.../Application.Ringtoets.Storage.Test.csproj) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Application.Ringtoets.Storage.Test.csproj (.../Application.Ringtoets.Storage.Test.csproj) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -82,13 +82,15 @@ + + Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismConverterBaseTest.cs =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismConverterBaseTest.cs (.../FailureMechanismConverterBaseTest.cs) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismConverterBaseTest.cs (.../FailureMechanismConverterBaseTest.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -45,12 +45,12 @@ // Setup var converter = new SimpleFailureMechanismConverter { - FailureMechanismType = FailureMechanismType.AsphaltRevetmentFailureMechanism + FailureMechanismType = FailureMechanismType.StrengthAndStabilityParallelConstruction }; var entity = new FailureMechanismEntity { - FailureMechanismType = (short)FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (short)FailureMechanismType.Piping }; // Call @@ -62,8 +62,8 @@ } [Test] - [TestCase(0, FailureMechanismType.PipingFailureMechanism, 1)] - [TestCase(1, FailureMechanismType.OvertoppingFailureMechanism, 5)] + [TestCase(0, FailureMechanismType.Piping, 1)] + [TestCase(1, FailureMechanismType.DuneErosion, 5)] public void ConvertEntityToModel_ValidEntity_ReturnInitializedFailureMechanism( byte isRelevant, FailureMechanismType type, long id) { @@ -97,8 +97,8 @@ } [Test] - [TestCase(true, FailureMechanismType.MacrostabilityInwardsFailureMechanism, 123456789)] - [TestCase(false, FailureMechanismType.StructuresClosureFailureMechanism, 986532)] + [TestCase(true, FailureMechanismType.MacrostabilityInwards, 123456789)] + [TestCase(false, FailureMechanismType.GrassRevetmentSlidingOutwards, 986532)] public void ConvertModelToEntity_ValidFailureMechanism_ProperlyInitializeEntity( bool isRelevant, FailureMechanismType type, long id) { @@ -162,6 +162,51 @@ mocks.VerifyAll(); } + [Test] + public void CorrespondsToFailureMechanismType_TypeMatches_ReturnTrue() + { + // Setup + var type = FailureMechanismType.DuneErosion; + var entity = new FailureMechanismEntity + { + FailureMechanismType = (short)type + }; + + var converter = new SimpleFailureMechanismConverter + { + FailureMechanismType = type + }; + + // Call + bool isCorresponding = converter.CorrespondsToFailureMechanismType(entity); + + // Assert + Assert.IsTrue(isCorresponding); + } + + [Test] + public void CorrespondsToFailureMechanismType_TypeDoesNotMatch_ReturnFalse() + { + // Setup + var type1 = FailureMechanismType.GrassRevetmentSlidingInwards; + var type2 = FailureMechanismType.PipingAtStructure; + var entity = new FailureMechanismEntity + { + FailureMechanismType = (short)type1 + }; + + var converter = new SimpleFailureMechanismConverter + { + FailureMechanismType = type2 + }; + + // Call + bool isCorresponding = converter.CorrespondsToFailureMechanismType(entity); + + // Assert + Assert.IsFalse(isCorresponding); + } + private class SimpleFailureMechanismConverter : FailureMechanismConverterBase where T : IFailureMechanism { protected override T ConstructFailureMechanism() Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismPlaceholderConverterTest.cs =================================================================== diff -u --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismPlaceholderConverterTest.cs (revision 0) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/FailureMechanismPlaceholderConverterTest.cs (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -0,0 +1,79 @@ +using Application.Ringtoets.Storage.Converters; +using Application.Ringtoets.Storage.DbContext; + +using NUnit.Framework; + +using Ringtoets.Integration.Data.Placeholders; + +namespace Application.Ringtoets.Storage.Test.Converters +{ + [TestFixture] + public class FailureMechanismPlaceholderConverterTest + { + [Test] + public void Constructor_ExpectedValues() + { + // Call + var converter = new FailureMechanismPlaceholderConverter(FailureMechanismType.StrengthAndStabilityParallelConstruction); + + // Assert + Assert.IsInstanceOf>(converter); + } + + [Test] + [TestCase(984753874, true)] + [TestCase(123, false)] + public void ConvertEntityToModel_ProperEntity_ReturnNewlyCreatedFailureMechanism( + long id, bool isRelevant) + { + // Setup + var type = FailureMechanismType.StructureHeight; + + var entity = new FailureMechanismEntity + { + FailureMechanismType = (short)type, + FailureMechanismEntityId = id, + IsRelevant = isRelevant ? (byte)1 : (byte)0 + }; + + var converter = new FailureMechanismPlaceholderConverter(type); + + // Call + FailureMechanismPlaceholder failureMechanism = converter.ConvertEntityToModel(entity); + + // Assert + Assert.AreEqual(id, failureMechanism.StorageId); + Assert.AreEqual(isRelevant, failureMechanism.IsRelevant); + } + + [Test] + [TestCase(98546309845, FailureMechanismType.GrassRevetmentSlidingOutwards, true)] + [TestCase(1, FailureMechanismType.StabilityStoneRevetment, false)] + public void ConvertModelToEntity_InitializedFailureMechanism_ChangeValuesForEntity( + long id, FailureMechanismType type, bool isRelevant) + { + // Setup + + var converter = new FailureMechanismPlaceholderConverter(type); + + var failureMechanism = new FailureMechanismPlaceholder("A") + { + StorageId = id, + IsRelevant = isRelevant + }; + + var entity = new FailureMechanismEntity(); + + // Call + converter.ConvertModelToEntity(failureMechanism, entity); + + // Assert + Assert.AreEqual(id, entity.FailureMechanismEntityId); + Assert.AreEqual((short)type, entity.FailureMechanismType); + var expectedIsRelevantValue = isRelevant ? + (byte)1 : + (byte)0; + Assert.AreEqual(expectedIsRelevantValue, entity.IsRelevant); + } + } +} \ No newline at end of file Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/PipingFailureMechanismConverterTest.cs =================================================================== diff -u -r35dd019140ab3d11241908744c43ddac43a8989e -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/PipingFailureMechanismConverterTest.cs (.../PipingFailureMechanismConverterTest.cs) (revision 35dd019140ab3d11241908744c43ddac43a8989e) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Converters/PipingFailureMechanismConverterTest.cs (.../PipingFailureMechanismConverterTest.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -67,7 +67,7 @@ FailureMechanismEntity entity = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.Piping, IsRelevant = isRelevant }; @@ -90,7 +90,7 @@ FailureMechanismEntity entity = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.MacrostabilityInwardsFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.MacrostabilityInwards, IsRelevant = 1 }; Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/AssessmentSectionPersistorTest.cs =================================================================== diff -u -r4e14ed090d09a220a790b3562ceb4232dab1cce6 -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/AssessmentSectionPersistorTest.cs (.../AssessmentSectionPersistorTest.cs) (revision 4e14ed090d09a220a790b3562ceb4232dab1cce6) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/AssessmentSectionPersistorTest.cs (.../AssessmentSectionPersistorTest.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -96,19 +96,21 @@ const string name = "test"; const int norm = 30000; const long pipingFailureMechanismStorageId = 1L; + const long asphaltFailureMechanismStorageId = 2L; + const long overtoppingFailureMechanismStorageId = 3L; const string hydraulicDatabaseVersion = "1.0"; const string hydraulicDatabasePath = "/temp/test"; const string hydraulicDatabaseLocationName = "test"; const double hydraulicDatabaseLocationDesignWaterLevel = 15.6; - const long hydraulicDatabaseLocationLocationId = 1300001; + const long hydraulicDatabaseLocationLocationId = 1300001L; const long hydraulicDatabaseLocationStorageId = 1234L; const decimal hydraulicDatabaseLocationX = 253; const decimal hydraulicDatabaseLocationY = 123; const string otherHydraulicDatabaseLocationName = "test2"; const double otherHydraulicDatabaseLocationDesignWaterLevel = 18.6; - const long otherHydraulicDatabaseLocationLocationId = 1300005; + const long otherHydraulicDatabaseLocationLocationId = 1300005L; const long otherHydraulicDatabaseLocationStorageId = 4321L; const decimal otherHydraulicDatabaseLocationX = 3927; const decimal otherHydraulicDatabaseLocationY = 372; @@ -118,12 +120,27 @@ AssessmentSectionPersistor persistor = new AssessmentSectionPersistor(ringtoetsEntities); var entity = new AssessmentSectionEntity { - AssessmentSectionEntityId = storageId, Name = name, Norm = norm, FailureMechanismEntities = new List + AssessmentSectionEntityId = storageId, Name = name, Norm = norm, + FailureMechanismEntities = new List { new FailureMechanismEntity { - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, FailureMechanismEntityId = pipingFailureMechanismStorageId - } + FailureMechanismType = (int) FailureMechanismType.Piping, + FailureMechanismEntityId = pipingFailureMechanismStorageId, + IsRelevant = 0 + }, + new FailureMechanismEntity + { + FailureMechanismType = (short) FailureMechanismType.WaveImpactOnAsphaltRevetment, + FailureMechanismEntityId = asphaltFailureMechanismStorageId, + IsRelevant = 0 + }, + new FailureMechanismEntity + { + FailureMechanismType = (short) FailureMechanismType.StructureHeight, + FailureMechanismEntityId = overtoppingFailureMechanismStorageId, + IsRelevant = 1 + }, }, HydraulicDatabaseVersion = hydraulicDatabaseVersion, HydraulicDatabaseLocation = hydraulicDatabasePath, Composition = (short) composition, @@ -158,7 +175,16 @@ Assert.AreEqual(name, section.Name); Assert.AreEqual(composition, section.Composition); Assert.AreEqual(norm, section.FailureMechanismContribution.Norm); + Assert.AreEqual(pipingFailureMechanismStorageId, section.PipingFailureMechanism.StorageId); + Assert.IsFalse(section.PipingFailureMechanism.IsRelevant); + + Assert.AreEqual(asphaltFailureMechanismStorageId, section.AsphaltRevetment.StorageId); + Assert.IsFalse(section.AsphaltRevetment.IsRelevant); + + Assert.AreEqual(overtoppingFailureMechanismStorageId, section.Overtopping.StorageId); + Assert.IsTrue(section.Overtopping.IsRelevant); + Assert.AreEqual(hydraulicDatabaseVersion, section.HydraulicBoundaryDatabase.Version); Assert.AreEqual(hydraulicDatabasePath, section.HydraulicBoundaryDatabase.FilePath); Assert.AreEqual(2, section.HydraulicBoundaryDatabase.Locations.Count); @@ -352,6 +378,59 @@ } [Test] + public void InsertModel_PersistingFailureMechanismPlaceholders_FailureMechanismEntitiesHaveElementsAdded() + { + // Setup + var ringtoetsContext = RingtoetsEntitiesHelper.Create(mockRepository); + mockRepository.ReplayAll(); + + var persistor = new AssessmentSectionPersistor(ringtoetsContext); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + PipingFailureMechanism = + { + IsRelevant = false + }, + Closing = + { + IsRelevant = false + }, + AsphaltRevetment = + { + IsRelevant = true + } + }; + + var parentNavigationProperty = new List(); + + // Call + persistor.InsertModel(parentNavigationProperty, assessmentSection, 0); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + AssessmentSectionEntity assessmentSectionEntity = parentNavigationProperty[0]; + Assert.AreEqual(9, assessmentSectionEntity.FailureMechanismEntities.Count); + + FailureMechanismEntity pipingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.Piping); + Assert.AreEqual(0, pipingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity closingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.ReliabilityClosingOfStructure); + Assert.AreEqual(0, closingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity asphaltFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.WaveImpactOnAsphaltRevetment); + Assert.AreEqual(1, asphaltFailureMechanismEntity.IsRelevant, + "Set IsRelevant to true, so expecting a value of 1."); + mockRepository.VerifyAll(); + } + + [Test] public void InsertModel_SingleEntityInParentNavigationPropertySingleAssessmentSectionWithSameStorageId_AssessmentSectionAsEntityInParentNavigationProperty() { // Setup @@ -416,7 +495,7 @@ AssessmentSection assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) { - HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase() + HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase { Locations = { @@ -445,8 +524,8 @@ var entity = parentNavigationProperty.ToList()[0]; Assert.AreNotEqual(assessmentSection, entity); - Assert.AreEqual(1, entity.FailureMechanismEntities.Count); - Assert.AreEqual(1, entity.FailureMechanismEntities.Count(db => db.FailureMechanismType.Equals((int) FailureMechanismType.PipingFailureMechanism))); + Assert.AreEqual(9, entity.FailureMechanismEntities.Count); + Assert.AreEqual(1, entity.FailureMechanismEntities.Count(db => db.FailureMechanismType.Equals((short) FailureMechanismType.Piping))); Assert.AreEqual(1, entity.HydraulicLocationEntities.Count); var locationEntity = entity.HydraulicLocationEntities.First(); Assert.AreEqual(name, locationEntity.Name); @@ -463,6 +542,135 @@ } [Test] + public void UpdateModel_AssessmentSectionNeverPersistedBefore_FailureMechanismEntitiesHaveElementsAdded() + { + // Setup + var ringtoetsContext = RingtoetsEntitiesHelper.Create(mockRepository); + mockRepository.ReplayAll(); + + var persistor = new AssessmentSectionPersistor(ringtoetsContext); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + PipingFailureMechanism = + { + IsRelevant = false + }, + Overtopping = + { + IsRelevant = false + }, + StoneRevetment = + { + IsRelevant = true + } + }; + + // Precondition: + Assert.AreEqual(0, assessmentSection.StorageId, + "StorageId of 0 expected for assessment sections that haven't been persisted before."); + + var parentNavigationProperty = new List(); + + // Call + persistor.UpdateModel(parentNavigationProperty, assessmentSection, 0); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + AssessmentSectionEntity assessmentSectionEntity = parentNavigationProperty[0]; + Assert.AreEqual(9, assessmentSectionEntity.FailureMechanismEntities.Count); + + FailureMechanismEntity pipingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.Piping); + Assert.AreEqual(0, pipingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity closingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.StructureHeight); + Assert.AreEqual(0, closingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity asphaltFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.StabilityStoneRevetment); + Assert.AreEqual(1, asphaltFailureMechanismEntity.IsRelevant, + "Set IsRelevant to true, so expecting a value of 1."); + mockRepository.VerifyAll(); + } + + [Test] + public void UpdateModel_AssessmentSectionHadBeenPersistedBefore_FailureMechanismEntitiesHaveElementsUpdated() + { + // Setup + var ringtoetsContext = RingtoetsEntitiesHelper.Create(mockRepository); + mockRepository.ReplayAll(); + + var persistor = new AssessmentSectionPersistor(ringtoetsContext); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike) + { + PipingFailureMechanism = + { + IsRelevant = false + }, + FailingOfConstruction = + { + IsRelevant = false + }, + MacrostabilityInwards = + { + IsRelevant = true + } + }; + + var parentNavigationProperty = new List(); + + persistor.InsertModel(parentNavigationProperty, assessmentSection, 0); + parentNavigationProperty[0].AssessmentSectionEntityId = 1; + AssessmentSectionEntity sectionEntity = parentNavigationProperty[0]; + for (int i = 0; i < sectionEntity.FailureMechanismEntities.Count; i++) + { + sectionEntity.FailureMechanismEntities.ElementAt(i).FailureMechanismEntityId = i+1; + } + persistor.PerformPostSaveActions(); + + // Precondition: + Assert.AreNotEqual(0, assessmentSection.StorageId, + "StorageId > 0 expected for failure mechanism that have been persisted."); + Assert.AreNotEqual(0, assessmentSection.PipingFailureMechanism.StorageId, + "StorageId > 0 expected for failure mechanisms that have been persisted."); + Assert.AreNotEqual(0, assessmentSection.FailingOfConstruction.StorageId, + "StorageId > 0 expected for failure mechanisms that have been persisted."); + Assert.AreNotEqual(0, assessmentSection.MacrostabilityInwards.StorageId, + "StorageId > 0 expected for failure mechanisms that have been persisted."); + + // Call + persistor.UpdateModel(parentNavigationProperty, assessmentSection, 0); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + AssessmentSectionEntity assessmentSectionEntity = parentNavigationProperty[0]; + Assert.AreEqual(9, assessmentSectionEntity.FailureMechanismEntities.Count); + + FailureMechanismEntity pipingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.Piping); + Assert.AreEqual(0, pipingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity closingFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.StrengthAndStabilityPointConstruction); + Assert.AreEqual(0, closingFailureMechanismEntity.IsRelevant, + "Set IsRelevant to false, so expecting a value of 0."); + + FailureMechanismEntity asphaltFailureMechanismEntity = assessmentSectionEntity.FailureMechanismEntities + .First(fme => fme.FailureMechanismType == (short)FailureMechanismType.MacrostabilityInwards); + Assert.AreEqual(1, asphaltFailureMechanismEntity.IsRelevant, + "Set IsRelevant to true, so expecting a value of 1."); + mockRepository.VerifyAll(); + } + + [Test] public void UpdateModel_NullParentNavigationProperty_ThrowsArgumentNullException() { // Setup @@ -785,8 +993,8 @@ var entity = parentNavigationProperty.ToList()[0]; Assert.AreNotEqual(assessmentSection, entity); - Assert.AreEqual(1, entity.FailureMechanismEntities.Count); - Assert.AreEqual(1, entity.FailureMechanismEntities.Count(db => db.FailureMechanismType.Equals((int) FailureMechanismType.PipingFailureMechanism))); + Assert.AreEqual(9, entity.FailureMechanismEntities.Count); + Assert.AreEqual(1, entity.FailureMechanismEntities.Count(db => db.FailureMechanismType.Equals((short) FailureMechanismType.Piping))); Assert.AreEqual(1, entity.HydraulicLocationEntities.Count); var hydraulicLocationEntity = entity.HydraulicLocationEntities.First(); Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/FailureMechanismPlaceholderPersistorTest.cs =================================================================== diff -u --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/FailureMechanismPlaceholderPersistorTest.cs (revision 0) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/FailureMechanismPlaceholderPersistorTest.cs (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -0,0 +1,172 @@ +using System.Collections.Generic; + +using Application.Ringtoets.Storage.DbContext; +using Application.Ringtoets.Storage.Persistors; + +using NUnit.Framework; + +using Rhino.Mocks; + +using Ringtoets.Integration.Data.Placeholders; + +namespace Application.Ringtoets.Storage.Test.Persistors +{ + [TestFixture] + public class FailureMechanismPlaceholderPersistorTest + { + [Test] + public void Constructor_ExpectedValues() + { + // Setup + var mocks = new MockRepository(); + var storageContext = mocks.Stub(); + mocks.ReplayAll(); + + // Call + var persistor = new FailureMechanismPlaceholderPersistor(storageContext, FailureMechanismType.MacrostabilityInwards); + + // Assert + Assert.IsInstanceOf>(persistor); + mocks.VerifyAll(); + } + + [Test] + [TestCase(FailureMechanismType.Microstability, 12345678, true)] + [TestCase(FailureMechanismType.ReliabilityClosingOfStructure, 546, false)] + public void LoadModel_ValidEntity_ProperlyInitializePlaceholderFailureMechanism( + FailureMechanismType type, long id, bool isRelevant) + { + // Setup + var mocks = new MockRepository(); + var storageContext = mocks.Stub(); + mocks.ReplayAll(); + + var persistor = new FailureMechanismPlaceholderPersistor(storageContext, type); + + var failureMechanism = new FailureMechanismPlaceholder("A"); + var entity = new FailureMechanismEntity + { + FailureMechanismType = (short)type, + FailureMechanismEntityId = id, + IsRelevant = isRelevant ? (byte)1 : (byte)0 + }; + + // Call + persistor.LoadModel(entity, failureMechanism); + + // Assert + Assert.AreEqual(id, failureMechanism.StorageId); + Assert.AreEqual(isRelevant, failureMechanism.IsRelevant); + } + + [Test] + [TestCase(FailureMechanismType.DuneErosion, true)] + [TestCase(FailureMechanismType.StabilityStoneRevetment, false)] + public void UpdateModel_FailureMechanismNotPersisted_FailureMechanismAddedToPersistedCollection( + FailureMechanismType type, bool isRelevant) + { + // Setup + var mocks = new MockRepository(); + var storageContext = mocks.Stub(); + mocks.ReplayAll(); + + var parentNavigationProperty = new List(); + + var persistor = new FailureMechanismPlaceholderPersistor(storageContext, type); + + var failureMechanism = new FailureMechanismPlaceholder("A") + { + IsRelevant = isRelevant + }; + + // Precondition + Assert.AreEqual(0, failureMechanism.StorageId, + "StorageId should be 0 to denote the failure mechanism as unsaved."); + + // Call + persistor.UpdateModel(parentNavigationProperty, failureMechanism); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + FailureMechanismEntity entity = parentNavigationProperty[0]; + Assert.AreEqual((short)type, entity.FailureMechanismType); + var expectedIsRelevantValue = isRelevant ? (byte)1 : (byte)0; + Assert.AreEqual(expectedIsRelevantValue, entity.IsRelevant); + } + + [Test] + [TestCase(FailureMechanismType.DuneErosion, true)] + [TestCase(FailureMechanismType.StabilityStoneRevetment, false)] + public void UpdateModel_FailureMechanismHasBeenPersistedAlready_EntityUpdateWithNewValues( + FailureMechanismType type, bool isRelevant) + { + // Setup + var mocks = new MockRepository(); + var storageContext = mocks.Stub(); + mocks.ReplayAll(); + + const int id = 234567; + FailureMechanismEntity alreadyExistingEntity = new FailureMechanismEntity + { + FailureMechanismEntityId = id, + FailureMechanismType = (short)type + }; + var parentNavigationProperty = new List + { + alreadyExistingEntity, + }; + + var persistor = new FailureMechanismPlaceholderPersistor(storageContext, type); + + var failureMechanism = new FailureMechanismPlaceholder("A") + { + IsRelevant = isRelevant, + StorageId = id + }; + + // Call + persistor.UpdateModel(parentNavigationProperty, failureMechanism); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + Assert.AreEqual((short)type, alreadyExistingEntity.FailureMechanismType); + var expectedIsRelevantValue = isRelevant ? (byte)1 : (byte)0; + Assert.AreEqual(expectedIsRelevantValue, alreadyExistingEntity.IsRelevant); + } + + [Test] + public void PerformPostSaveActions_PlaceholderRecentlyInserted_SetIdOfPlaceholder() + { + // Setup + var mocks = new MockRepository(); + var storageContext = mocks.Stub(); + mocks.ReplayAll(); + + var type = FailureMechanismType.PipingAtStructure; + + var parentNavigationProperty = new List(); + + var persistor = new FailureMechanismPlaceholderPersistor(storageContext, type); + + var failureMechanism = new FailureMechanismPlaceholder("A"); + + // Precondition + Assert.AreEqual(0, failureMechanism.StorageId, + "StorageId should be 0 to denote the failure mechanism as unsaved."); + + const long id = 63547234L; + persistor.UpdateModel(parentNavigationProperty, failureMechanism); + parentNavigationProperty[0].FailureMechanismEntityId = id; + + // Call + persistor.PerformPostSaveActions(); + + // Assert + Assert.AreEqual(1, parentNavigationProperty.Count); + + Assert.AreEqual(id, failureMechanism.StorageId); + } + } +} \ No newline at end of file Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/PipingFailureMechanismPersistorTest.cs =================================================================== diff -u -r35dd019140ab3d11241908744c43ddac43a8989e -r164e03c3a4957d7a0dd4012f146b0ca139a7a4cc --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/PipingFailureMechanismPersistorTest.cs (.../PipingFailureMechanismPersistorTest.cs) (revision 35dd019140ab3d11241908744c43ddac43a8989e) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/Persistors/PipingFailureMechanismPersistorTest.cs (.../PipingFailureMechanismPersistorTest.cs) (revision 164e03c3a4957d7a0dd4012f146b0ca139a7a4cc) @@ -124,7 +124,7 @@ FailureMechanismEntity entity = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.StoneRevetmentFailureMechanism, + FailureMechanismType = (short) FailureMechanismType.StabilityStoneRevetment, }; PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities); @@ -152,7 +152,7 @@ FailureMechanismEntity entity = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.Piping, IsRelevant = 0 }; PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities); @@ -185,7 +185,7 @@ FailureMechanismEntity entity = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.Piping, StochasticSoilModelEntities = new List { new StochasticSoilModelEntity @@ -270,7 +270,7 @@ Assert.AreEqual(1, parentNavigationProperty.Count); FailureMechanismEntity entity = parentNavigationProperty[0]; Assert.AreNotEqual(model, entity); - Assert.AreEqual((int) FailureMechanismType.PipingFailureMechanism, entity.FailureMechanismType); + Assert.AreEqual((int) FailureMechanismType.Piping, entity.FailureMechanismType); Assert.AreEqual(1, entity.IsRelevant); mockRepository.VerifyAll(); @@ -287,7 +287,7 @@ FailureMechanismEntity entityToDelete = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; IList parentNavigationProperty = new List { @@ -419,12 +419,12 @@ new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }, new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping } }; PipingFailureMechanism model = new PipingFailureMechanism @@ -455,7 +455,7 @@ new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.Piping, IsRelevant = 1 } }; @@ -517,7 +517,7 @@ new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism, + FailureMechanismType = (int) FailureMechanismType.Piping, StochasticSoilModelEntities = new List { new StochasticSoilModelEntity @@ -566,7 +566,7 @@ FailureMechanismEntity entityToDelete = new FailureMechanismEntity { FailureMechanismEntityId = 4567L, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; ObservableCollection parentNavigationProperty = new ObservableCollection @@ -610,12 +610,12 @@ FailureMechanismEntity entityToUpdate = new FailureMechanismEntity { FailureMechanismEntityId = storageId, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; FailureMechanismEntity entityToDelete = new FailureMechanismEntity { FailureMechanismEntityId = 4567L, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; ringtoetsEntities.FailureMechanismEntities.Add(entityToUpdate); ringtoetsEntities.FailureMechanismEntities.Add(entityToDelete); @@ -653,12 +653,12 @@ FailureMechanismEntity firstEntityToDelete = new FailureMechanismEntity { FailureMechanismEntityId = 1234L, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; FailureMechanismEntity secondEntityToDelete = new FailureMechanismEntity { FailureMechanismEntityId = 4567L, - FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism + FailureMechanismType = (int) FailureMechanismType.Piping }; ObservableCollection parentNavigationProperty = new ObservableCollection {