Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationExporter.cs =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationExporter.cs (.../GrassCoverErosionOutwardsConfigurationExporter.cs) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationExporter.cs (.../GrassCoverErosionOutwardsConfigurationExporter.cs) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -19,10 +19,56 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using Core.Common.Base.IO; +using Core.Common.IO.Exceptions; +using Core.Common.Utils; +using log4net; +using Ringtoets.Common.Data.Calculation; + namespace Ringtoets.GrassCoverErosionOutwards.IO { - public class GrassCoverErosionOutwardsConfigurationExporter + /// + /// Exports a grass cover erosion outwards configuration and stores it as an XML file. + /// + public class GrassCoverErosionOutwardsConfigurationExporter : IFileExporter { - + private static readonly ILog log = LogManager.GetLogger(typeof(GrassCoverErosionOutwardsConfigurationExporter)); + + private CalculationGroup calculationGroup; + private string filePath; + + /// + /// Creates a new instance of . + /// + /// The calculation group to export. + /// The path of the XML file to export to. + /// Thrown when is null. + /// Thrown when is invalid. + public GrassCoverErosionOutwardsConfigurationExporter(CalculationGroup calculationGroup, string filePath) + { + if (calculationGroup == null) + { + throw new ArgumentNullException(nameof(calculationGroup)); + } + IOUtils.ValidateFilePath(filePath); + this.calculationGroup = calculationGroup; + this.filePath = filePath; + } + + public bool Export() + { + try + { + new GrassCoverErosionOutwardsConfigurationWriter().Write(calculationGroup, filePath); + } + catch (CriticalFileWriteException e) + { + log.ErrorFormat("{0} Er is geen configuratie geëxporteerd.", e.Message); + return false; + } + + return true; + } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationWriter.cs =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationWriter.cs (.../GrassCoverErosionOutwardsConfigurationWriter.cs) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/GrassCoverErosionOutwardsConfigurationWriter.cs (.../GrassCoverErosionOutwardsConfigurationWriter.cs) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -20,11 +20,16 @@ // All rights reserved. using System.Xml; +using Ringtoets.Common.Data.Calculation; using Ringtoets.GrassCoverErosionOutwards.Data; using Ringtoets.Revetment.IO; namespace Ringtoets.GrassCoverErosionOutwards.IO { + /// + /// A writer for writing out configurations of and + /// , to XML format. + /// public class GrassCoverErosionOutwardsConfigurationWriter : WaveConditionsInputConfigurationWriter { protected override void WriteCalculation(GrassCoverErosionOutwardsWaveConditionsCalculation calculation, XmlWriter writer) Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/Ringtoets.GrassCoverErosionOutwards.IO.csproj =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/Ringtoets.GrassCoverErosionOutwards.IO.csproj (.../Ringtoets.GrassCoverErosionOutwards.IO.csproj) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/Ringtoets.GrassCoverErosionOutwards.IO.csproj (.../Ringtoets.GrassCoverErosionOutwards.IO.csproj) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -32,6 +32,10 @@ AllRules.ruleset + + ..\..\..\..\packages\log4net.2.0.4\lib\net40-full\log4net.dll + True + @@ -49,6 +53,7 @@ Copying.licenseheader + @@ -61,6 +66,11 @@ Core.Common.IO False + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/packages.config =================================================================== diff -u --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/packages.config (revision 0) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.IO/packages.config (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/GrassCoverErosionOutwardsConfigurationExporterTest.cs =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/GrassCoverErosionOutwardsConfigurationExporterTest.cs (.../GrassCoverErosionOutwardsConfigurationExporterTest.cs) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/GrassCoverErosionOutwardsConfigurationExporterTest.cs (.../GrassCoverErosionOutwardsConfigurationExporterTest.cs) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -19,13 +19,163 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using System.IO; +using System.Security.AccessControl; +using Core.Common.Base.Data; +using Core.Common.Base.IO; +using Core.Common.TestUtil; using NUnit.Framework; +using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Data.Hydraulics; +using Ringtoets.Common.Data.TestUtil; +using Ringtoets.GrassCoverErosionOutwards.Data; namespace Ringtoets.GrassCoverErosionOutwards.IO.Test { [TestFixture] public class GrassCoverErosionOutwardsConfigurationExporterTest { - + [Test] + public void Constructor_ExpectedValues() + { + // Call + var exporter = new GrassCoverErosionOutwardsConfigurationExporter(new CalculationGroup(), "test.xml"); + + // Assert + Assert.IsInstanceOf(exporter); + } + + [Test] + public void Constructor_CalculationGroupNull_ThrowArgumentNullException() + { + // Call + TestDelegate test = () => new GrassCoverErosionOutwardsConfigurationExporter(null, "test.xml"); + + // Assert + var exception = Assert.Throws(test); + Assert.AreEqual("calculationGroup", exception.ParamName); + } + + [Test] + [TestCase("")] + [TestCase(" ")] + [TestCase("c:\\>")] + public void Constructor_FilePathInvalid_ThrowArgumentException(string filePath) + { + // Call + TestDelegate test = () => new GrassCoverErosionOutwardsConfigurationExporter(new CalculationGroup(), filePath); + + // Assert + Assert.Throws(test); + } + + [Test] + public void Export_ValidData_ReturnTrueAndWritesFile() + { + // Setup + string filePath = TestHelper.GetScratchPadPath($"{nameof(Export_ValidData_ReturnTrueAndWritesFile)}.xml"); + + var calculation1 = new GrassCoverErosionOutwardsWaveConditionsCalculation + { + Name = "Calculation A", + InputParameters = + { + ForeshoreProfile = new TestForeshoreProfile("ForeshoreA") + } + }; + + var calculation2 = new GrassCoverErosionOutwardsWaveConditionsCalculation + { + Name = "PK001_0002 W1-6_4_1D1", + InputParameters = + { + HydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, "HydraulicLocationA", 0, 0), + UseBreakWater = true + } + }; + + var calculationGroup2 = new CalculationGroup("PK001_0002", false) + { + Children = + { + calculation2 + } + }; + + var calculationGroup = new CalculationGroup("PK001_0001", false) + { + Children = + { + calculation1, + calculationGroup2 + } + }; + + var rootGroup = new CalculationGroup("root", false) + { + Children = + { + calculationGroup + } + }; + + var exporter = new GrassCoverErosionOutwardsConfigurationExporter(rootGroup, filePath); + + try + { + // Call + bool isExported = exporter.Export(); + + // Assert + Assert.IsTrue(isExported); + Assert.IsTrue(File.Exists(filePath)); + + string actualXml = File.ReadAllText(filePath); + string testDirSubPath = Path.Combine(nameof(GrassCoverErosionOutwardsConfigurationExporter), "fullValidConfiguration.xml"); + string expectedXmlFilePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.GrassCoverErosionOutwards.IO, + testDirSubPath); + string expectedXml = File.ReadAllText(expectedXmlFilePath); + + Assert.AreEqual(expectedXml, actualXml); + } + finally + { + File.Delete(filePath); + } + } + + [Test] + public void Export_InvalidDirectoryRights_LogErrorAndReturnFalse() + { + // Setup + var calculationGroup = new CalculationGroup + { + Children = + { + new GrassCoverErosionOutwardsWaveConditionsCalculation() + } + }; + + string directoryPath = TestHelper.GetScratchPadPath(nameof(Export_InvalidDirectoryRights_LogErrorAndReturnFalse)); + using (var disposeHelper = new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), nameof(Export_InvalidDirectoryRights_LogErrorAndReturnFalse))) + { + string filePath = Path.Combine(directoryPath, "test.xml"); + + var exporter = new GrassCoverErosionOutwardsConfigurationExporter(calculationGroup, filePath); + + disposeHelper.LockDirectory(FileSystemRights.Write); + + // Call + var isExported = true; + Action call = () => isExported = exporter.Export(); + + // Assert + string expectedMessage = $"Er is een onverwachte fout opgetreden tijdens het schrijven van het bestand '{filePath}'. " + + "Er is geen configuratie geëxporteerd."; + TestHelper.AssertLogMessageIsGenerated(call, expectedMessage); + Assert.IsFalse(isExported); + } + } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/test-data/GrassCoverErosionOutwardsConfigurationExporter/fullValidConfiguration.xml =================================================================== diff -u --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/test-data/GrassCoverErosionOutwardsConfigurationExporter/fullValidConfiguration.xml (revision 0) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.IO.Test/test-data/GrassCoverErosionOutwardsConfigurationExporter/fullValidConfiguration.xml (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -0,0 +1,37 @@ + + + + + NaN + NaN + NaN + NaN + 0.5 + ForeshoreA + 0 + + false + havendam + 0 + false + + + + + HydraulicLocationA + NaN + NaN + NaN + NaN + 0.5 + NaN + + true + havendam + 0 + false + + + + + \ No newline at end of file Index: Ringtoets/Revetment/src/Ringtoets.Revetment.IO/WaveConditionsInputConfigurationWriter.cs =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/Revetment/src/Ringtoets.Revetment.IO/WaveConditionsInputConfigurationWriter.cs (.../WaveConditionsInputConfigurationWriter.cs) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.IO/WaveConditionsInputConfigurationWriter.cs (.../WaveConditionsInputConfigurationWriter.cs) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -24,6 +24,7 @@ using System.Xml; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.IO.Schema; using Ringtoets.Common.IO.Writers; using Ringtoets.Revetment.Data; @@ -48,10 +49,9 @@ writer.WriteStartElement(ConfigurationSchemaIdentifiers.CalculationElement); writer.WriteAttributeString(ConfigurationSchemaIdentifiers.NameAttribute, name); + WriteHydraulicBoundaryLocation(input.HydraulicBoundaryLocation, writer); + writer.WriteElementString( - WaveConditionsInputConfigurationSchemaIdentifiers.HydraulicBoundaryLocationElement, - input.HydraulicBoundaryLocation.Name); - writer.WriteElementString( WaveConditionsInputConfigurationSchemaIdentifiers.UpperBoundaryRevetment, XmlConvert.ToString(input.UpperBoundaryRevetment)); writer.WriteElementString( @@ -66,10 +66,10 @@ writer.WriteElementString( WaveConditionsInputConfigurationSchemaIdentifiers.StepSize, string.Format(CultureInfo.InvariantCulture, "{0:0.0}", input.StepSize.AsValue())); + + WriteForeshoreProfile(input.ForeshoreProfile, writer); + writer.WriteElementString( - WaveConditionsInputConfigurationSchemaIdentifiers.ForeshoreProfile, - input.ForeshoreProfile.Name); - writer.WriteElementString( WaveConditionsInputConfigurationSchemaIdentifiers.Orientation, XmlConvert.ToString(input.Orientation)); @@ -78,26 +78,56 @@ writer.WriteEndElement(); } + private static void WriteHydraulicBoundaryLocation(HydraulicBoundaryLocation hydraulicBoundaryLocation, XmlWriter writer) + { + if (hydraulicBoundaryLocation != null) + { + writer.WriteElementString( + WaveConditionsInputConfigurationSchemaIdentifiers.HydraulicBoundaryLocationElement, + hydraulicBoundaryLocation.Name); + } + } + + private static void WriteForeshoreProfile(ForeshoreProfile foreshoreProfile, XmlWriter writer) + { + if (foreshoreProfile != null) + { + writer.WriteElementString( + WaveConditionsInputConfigurationSchemaIdentifiers.ForeshoreProfile, + foreshoreProfile.Name); + } + } + private static void WriteWaveReduction(WaveConditionsInput input, XmlWriter writer) { writer.WriteStartElement(WaveConditionsInputConfigurationSchemaIdentifiers.WaveReduction); writer.WriteElementString( WaveConditionsInputConfigurationSchemaIdentifiers.UseBreakWater, XmlConvert.ToString(input.UseBreakWater)); + + WriteBreakWaterProperties(input.BreakWater, writer); + writer.WriteElementString( - WaveConditionsInputConfigurationSchemaIdentifiers.BreakWaterType, - BreakWaterTypeAsXmlString(input.BreakWater.Type)); - writer.WriteElementString( - WaveConditionsInputConfigurationSchemaIdentifiers.BreakWaterHeight, - XmlConvert.ToString(input.BreakWater.Height)); - writer.WriteElementString( WaveConditionsInputConfigurationSchemaIdentifiers.UseForeshore, XmlConvert.ToString(input.UseForeshore)); writer.WriteEndElement(); } + private static void WriteBreakWaterProperties(BreakWater breakWater, XmlWriter writer) + { + if (breakWater != null) + { + writer.WriteElementString( + WaveConditionsInputConfigurationSchemaIdentifiers.BreakWaterType, + BreakWaterTypeAsXmlString(breakWater.Type)); + writer.WriteElementString( + WaveConditionsInputConfigurationSchemaIdentifiers.BreakWaterHeight, + XmlConvert.ToString(breakWater.Height)); + } + } + private static string BreakWaterTypeAsXmlString(BreakWaterType type) { switch (type) Index: Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/WaveConditionsInputConfigurationWriterTest.cs =================================================================== diff -u -r90555cd02cecb2d187e60946deb3d5415cbb3b18 -r467a5dba1d4b29b2035d6d034a083125854077dc --- Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/WaveConditionsInputConfigurationWriterTest.cs (.../WaveConditionsInputConfigurationWriterTest.cs) (revision 90555cd02cecb2d187e60946deb3d5415cbb3b18) +++ Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/WaveConditionsInputConfigurationWriterTest.cs (.../WaveConditionsInputConfigurationWriterTest.cs) (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -48,18 +48,61 @@ } [Test] - public void WriteConfiguration_SingleCalculation_WritesCompleteConfigurationToFile() + public void WriteConfiguration_SparseCalculation_WritesSparseConfigurationToFile() { // Setup - string filePath = TestHelper.GetScratchPadPath("WriteConfiguration_SingleCalculation.xml"); + string filePath = TestHelper.GetScratchPadPath( + $"{nameof(WriteConfiguration_SparseCalculation_WritesSparseConfigurationToFile)}.xml"); + string expectedXmlFilePath = TestHelper.GetTestDataPath( TestDataPath.Ringtoets.Revetment.IO, + Path.Combine(nameof(WaveConditionsInputConfigurationWriter), "sparseConfiguration.xml")); + + var calculation = new SimpleWaveConditionsCalculation + { + Name = "Berekening 1" + }; + + try + { + using (XmlWriter xmlWriter = XmlWriter.Create(filePath, new XmlWriterSettings + { + Indent = true + })) + { + var writer = new SimpleWaveConditionsInputConfigurationWriter(); + + // Call + writer.PublicWriteCalculation(calculation, xmlWriter); + } + + // Assert + string actualXml = File.ReadAllText(filePath); + string expectedXml = File.ReadAllText(expectedXmlFilePath); + + Assert.AreEqual(expectedXml, actualXml); + } + finally + { + File.Delete(filePath); + } + } + + [Test] + public void WriteConfiguration_CompleteCalculation_WritesCompleteConfigurationToFile() + { + // Setup + string filePath = TestHelper.GetScratchPadPath( + $"{nameof(WriteConfiguration_CompleteCalculation_WritesCompleteConfigurationToFile)}.xml"); + + string expectedXmlFilePath = TestHelper.GetTestDataPath( + TestDataPath.Ringtoets.Revetment.IO, Path.Combine(nameof(WaveConditionsInputConfigurationWriter), "completeConfiguration.xml")); var calculation = new SimpleWaveConditionsCalculation { Name = "Berekening 1", - Input = new WaveConditionsInput + Input = { HydraulicBoundaryLocation = new TestHydraulicBoundaryLocation("Locatie1"), UpperBoundaryRevetment = (RoundedDouble) 1.5, @@ -129,6 +172,6 @@ throw new System.NotImplementedException(); } - public WaveConditionsInput Input { get; set; } + public WaveConditionsInput Input { get; } = new WaveConditionsInput(); } } \ No newline at end of file Index: Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/test-data/WaveConditionsInputConfigurationWriter/sparseConfiguration.xml =================================================================== diff -u --- Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/test-data/WaveConditionsInputConfigurationWriter/sparseConfiguration.xml (revision 0) +++ Ringtoets/Revetment/test/Ringtoets.Revetment.IO.Test/test-data/WaveConditionsInputConfigurationWriter/sparseConfiguration.xml (revision 467a5dba1d4b29b2035d6d034a083125854077dc) @@ -0,0 +1,15 @@ + + + NaN + NaN + NaN + NaN + 0.5 + NaN + + false + havendam + 0 + false + + \ No newline at end of file