// 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 Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.AssemblyTool.Data; using Ringtoets.AssemblyTool.IO.Model; using Ringtoets.AssemblyTool.IO.Model.DataTypes; using Ringtoets.AssemblyTool.IO.Model.Gml; using Ringtoets.AssemblyTool.IO.Model.Helpers; using Ringtoets.Integration.IO.Assembly; using Ringtoets.Integration.IO.Creators; using Ringtoets.Integration.IO.TestUtil; namespace Ringtoets.Integration.IO.Test.Creators { [TestFixture] public class SerializableAssemblyCreatorTest { [Test] public void Create_AssessmentSectionNull_ThrowsArgumentNullException() { // Call TestDelegate call = () => SerializableAssemblyCreator.Create(null); // Assert var exception = Assert.Throws(call); Assert.AreEqual("assessmentSection", exception.ParamName); } [Test] public void CreateSerializableAssembly_WithValidArguments_ReturnsSerializableAssembly() { // Setup const string assessmentSectionName = "assessmentSectionName"; const string assessmentSectionId = "assessmentSectionId"; IEnumerable geometry = CreateGeometry(); ExportableAssessmentSectionAssemblyResult assessmentSectionAssembly = ExportableAssessmentSectionAssemblyResultTestFactory.CreateResult(); ExportableFailureMechanismAssemblyResultWithProbability failureMechanismAssemblyResultWithProbability = ExportableFailureMechanismAssemblyResultTestFactory.CreateResultWithProbability(); ExportableFailureMechanismAssemblyResult failureMechanismAssemblyResultWithoutProbability = ExportableFailureMechanismAssemblyResultTestFactory.CreateResultWithoutProbability(); IEnumerable> failureMechanismsWithProbability = new[] { CreateFailureMechanismWithProbability(), CreateFailureMechanismWithProbability() }; IEnumerable> failureMechanismsWithoutProbability = new[] { CreateFailureMechanismWithoutProbability(), CreateFailureMechanismWithoutProbability() }; ExportableCombinedSectionAssemblyCollection combinedSectionAssemblyResults = CreateCombinedSectionAssemblyCollection(); var exportableAssessmentSection = new ExportableAssessmentSection(assessmentSectionName, assessmentSectionId, geometry, assessmentSectionAssembly, failureMechanismAssemblyResultWithProbability, failureMechanismAssemblyResultWithoutProbability, failureMechanismsWithProbability, failureMechanismsWithoutProbability, combinedSectionAssemblyResults); // Call SerializableAssembly serializableAssembly = SerializableAssemblyCreator.Create(exportableAssessmentSection); // Assert Assert.AreEqual("Assemblage.0", serializableAssembly.Id); AssertSerializableBoundary(exportableAssessmentSection.Geometry, serializableAssembly.Boundary); SerializableFeatureMember[] serializableAssemblyFeatureMembers = serializableAssembly.FeatureMembers; Assert.AreEqual(24, serializableAssemblyFeatureMembers.Length); var serializableAssessmentSection = (SerializableAssessmentSection) serializableAssemblyFeatureMembers[0]; AssertSerializableAssessmentSection($"Wks.{assessmentSectionId}", assessmentSectionName, geometry, serializableAssessmentSection); var serializableAssessmentProcess = (SerializableAssessmentProcess) serializableAssemblyFeatureMembers[1]; AssertSerializableAssessmentProcess("Bp.1", serializableAssessmentSection, serializableAssessmentProcess); var serializableTotalAssemblyResult = (SerializableTotalAssemblyResult) serializableAssemblyFeatureMembers[2]; AssertSerializableTotalAssemblyResult("Vo.2", failureMechanismAssemblyResultWithoutProbability, failureMechanismAssemblyResultWithProbability, assessmentSectionAssembly, serializableAssessmentProcess, serializableTotalAssemblyResult); AssertFailureMechanismConnections(3, 3, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); AssertFailureMechanismConnections(4, 7, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); AssertFailureMechanismConnections(5, 11, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); AssertFailureMechanismConnections(6, 15, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); var combinedFailureMechanismSectionCollection = (SerializableFailureMechanismSectionCollection) serializableAssemblyFeatureMembers[17]; AssertSerializableFailureMechanismSectionCollection("Vi.19", serializableTotalAssemblyResult, combinedFailureMechanismSectionCollection); AssertCombinedFailureMechanismSectionAssemblyConnections(11, 20, combinedFailureMechanismSectionCollection, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); AssertCombinedFailureMechanismSectionAssemblyConnections(12, 22, combinedFailureMechanismSectionCollection, serializableTotalAssemblyResult, serializableAssemblyFeatureMembers); } #region Test Helpers: Factory Methods private static IEnumerable CreateGeometry() { return new[] { new Point2D(1, 1), new Point2D(4, 4), new Point2D(5, -1) }; } private static ExportableCombinedSectionAssemblyCollection CreateCombinedSectionAssemblyCollection() { ExportableCombinedFailureMechanismSection[] sections = { CreateCombinedFailureMechanismSection(), CreateCombinedFailureMechanismSection() }; return new ExportableCombinedSectionAssemblyCollection(sections, new[] { CreateCombinedSectionAssembly(sections[0]), CreateCombinedSectionAssembly(sections[1]) }); } private static ExportableCombinedFailureMechanismSection CreateCombinedFailureMechanismSection() { var random = new Random(10); return new ExportableCombinedFailureMechanismSection(new[] { new Point2D(random.NextDouble(), random.NextDouble()), new Point2D(random.NextDouble(), random.NextDouble()) }, random.NextDouble(), random.NextDouble(), random.NextEnumValue()); } private static ExportableFailureMechanism CreateFailureMechanismWithProbability() { var random = new Random(21); ExportableFailureMechanismSection failureMechanismSection = ExportableFailureMechanismSectionTestFactory.CreateExportableFailureMechanismSection(); return new ExportableFailureMechanism( ExportableFailureMechanismAssemblyResultTestFactory.CreateResultWithProbability(), new[] { CreateSectionResult(failureMechanismSection) }, random.NextEnumValue(), random.NextEnumValue()); } private static ExportableCombinedSectionAssembly CreateCombinedSectionAssembly(ExportableCombinedFailureMechanismSection section) { return new ExportableCombinedSectionAssembly(section, ExportableSectionAssemblyResultTestFactory.CreateSectionAssemblyResult(), new[] { CreateCombinedSectionAssemblyResult(1), CreateCombinedSectionAssemblyResult(2) }); } private static ExportableFailureMechanismCombinedSectionAssemblyResult CreateCombinedSectionAssemblyResult(int seed) { var random = new Random(seed); return new ExportableFailureMechanismCombinedSectionAssemblyResult(CreateSectionAssemblyResult(), random.NextEnumValue()); } private static ExportableFailureMechanism CreateFailureMechanismWithoutProbability() { var random = new Random(21); ExportableFailureMechanismSection failureMechanismSection = ExportableFailureMechanismSectionTestFactory.CreateExportableFailureMechanismSection(); return new ExportableFailureMechanism( ExportableFailureMechanismAssemblyResultTestFactory.CreateResultWithoutProbability(), new[] { CreateSectionResult(failureMechanismSection) }, random.NextEnumValue(), random.NextEnumValue()); } private static ExportableAggregatedFailureMechanismSectionAssemblyResult CreateSectionResult(ExportableFailureMechanismSection section) { return new ExportableAggregatedFailureMechanismSectionAssemblyResult(section, CreateSectionAssemblyResult(), CreateSectionAssemblyResult(), CreateSectionAssemblyResult(), CreateSectionAssemblyResult()); } private static ExportableSectionAssemblyResult CreateSectionAssemblyResult() { var random = new Random(30); return new ExportableSectionAssemblyResult(random.NextEnumValue(), random.NextEnumValue()); } #endregion #region TestHelper: Asserts private static void AssertSerializableBoundary(IEnumerable geometry, SerializableBoundary actualBoundary) { var expectedLowerCorner = new Point2D(geometry.Select(p => p.X).Min(), geometry.Select(p => p.Y).Min()); var expectedUpperCorner = new Point2D(geometry.Select(p => p.X).Max(), geometry.Select(p => p.Y).Max()); string expectedLowerCornerFormat = GeometrySerializationFormatter.Format(expectedLowerCorner); string expectedUpperCornerFormat = GeometrySerializationFormatter.Format(expectedUpperCorner); SerializableEnvelope envelope = actualBoundary.Envelope; Assert.AreEqual(expectedLowerCornerFormat, envelope.LowerCorner); Assert.AreEqual(expectedUpperCornerFormat, envelope.UpperCorner); } private static void AssertSerializableAssessmentSection(string expectedId, string expectedAssessmentSectionName, IEnumerable expectedGeometry, SerializableAssessmentSection actualAssessmentSection) { Assert.AreEqual(expectedId, actualAssessmentSection.Id); Assert.AreEqual(expectedAssessmentSectionName, actualAssessmentSection.Name); Assert.AreEqual(GeometrySerializationFormatter.Format(expectedGeometry), actualAssessmentSection.ReferenceLineGeometry.LineString.Geometry); } private static void AssertSerializableAssessmentProcess(string expectedId, SerializableAssessmentSection expectedAssessmentSection, SerializableAssessmentProcess serializableAssessmentProcess) { Assert.AreEqual(expectedId, serializableAssessmentProcess.Id); Assert.AreEqual(expectedAssessmentSection.Id, serializableAssessmentProcess.AssessmentSectionId); } private static void AssertSerializableTotalAssemblyResult(string expectedId, ExportableFailureMechanismAssemblyResult expectedFailureMechanismAssemblyResultWithoutProbability, ExportableFailureMechanismAssemblyResultWithProbability expectedFailureMechanismAssemblyResultWithProbability, ExportableAssessmentSectionAssemblyResult expectedAssessmentSectionAssemblyResult, SerializableAssessmentProcess expectedAssessmentProcess, SerializableTotalAssemblyResult serializableTotalAssembly) { Assert.AreEqual(expectedId, serializableTotalAssembly.Id); Assert.AreEqual(expectedAssessmentProcess.Id, serializableTotalAssembly.AssessmentProcessId); SerializableFailureMechanismAssemblyResult serializableAssemblyResultWithoutProbability = serializableTotalAssembly.AssemblyResultWithoutProbability; Assert.AreEqual(SerializableFailureMechanismCategoryGroupCreator.Create(expectedFailureMechanismAssemblyResultWithoutProbability.AssemblyCategory), serializableAssemblyResultWithoutProbability.CategoryGroup); Assert.AreEqual(SerializableAssemblyMethodCreator.Create(expectedFailureMechanismAssemblyResultWithoutProbability.AssemblyMethod), serializableAssemblyResultWithoutProbability.AssemblyMethod); Assert.IsNull(serializableAssemblyResultWithoutProbability.Probability); SerializableFailureMechanismAssemblyResult serializableAssemblyResultWithProbability = serializableTotalAssembly.AssemblyResultWithProbability; Assert.AreEqual(SerializableFailureMechanismCategoryGroupCreator.Create(expectedFailureMechanismAssemblyResultWithProbability.AssemblyCategory), serializableAssemblyResultWithProbability.CategoryGroup); Assert.AreEqual(SerializableAssemblyMethodCreator.Create(expectedFailureMechanismAssemblyResultWithProbability.AssemblyMethod), serializableAssemblyResultWithProbability.AssemblyMethod); Assert.AreEqual(expectedFailureMechanismAssemblyResultWithProbability.Probability, serializableAssemblyResultWithProbability.Probability); SerializableAssessmentSectionAssemblyResult serializableAssessmentSectionAssemblyResult = serializableTotalAssembly.AssessmentSectionAssemblyResult; Assert.AreEqual(SerializableAssemblyMethodCreator.Create(expectedAssessmentSectionAssemblyResult.AssemblyMethod), serializableAssessmentSectionAssemblyResult.AssemblyMethod); Assert.AreEqual(SerializableAssessmentSectionCategoryGroupCreator.Create(expectedAssessmentSectionAssemblyResult.AssemblyCategory), serializableAssessmentSectionAssemblyResult.CategoryGroup); } private static void AssertSerializableFailureMechanismSection(string expectedId, SerializableFailureMechanismSectionCollection expectedSerializableFailureMechanismSectionCollection, SerializableFailureMechanismSection serializableFailureMechanismSection) { Assert.AreEqual(expectedSerializableFailureMechanismSectionCollection.Id, serializableFailureMechanismSection.FailureMechanismSectionCollectionId); Assert.AreEqual(expectedId, serializableFailureMechanismSection.Id); } #region Failure mechanisms private static void AssertFailureMechanismConnections(int indexSerializableFailureMechanism, int startId, SerializableTotalAssemblyResult expectedSerializableTotalAssemblyResult, SerializableFeatureMember[] serializableAssemblyFeatureMembers) { var failureMechanismWithProbability1 = (SerializableFailureMechanism) serializableAssemblyFeatureMembers[indexSerializableFailureMechanism]; AssertSerializableFailureMechanism($"Ts.{startId++}", expectedSerializableTotalAssemblyResult, failureMechanismWithProbability1); var failureMechanismSectionCollection1 = (SerializableFailureMechanismSectionCollection) serializableAssemblyFeatureMembers[indexSerializableFailureMechanism + 10]; AssertSerializableFailureMechanismSectionCollection($"Vi.{startId++}", failureMechanismWithProbability1, failureMechanismSectionCollection1); var serializableFailureMechanismSection1 = (SerializableFailureMechanismSection) serializableAssemblyFeatureMembers[indexSerializableFailureMechanism + 15]; AssertSerializableFailureMechanismSection($"Wks.{startId++}", failureMechanismSectionCollection1, serializableFailureMechanismSection1); AssertSerializableFailureMechanismSectionAssembly($"T.{startId}", failureMechanismWithProbability1, serializableFailureMechanismSection1, (SerializableFailureMechanismSectionAssembly) serializableAssemblyFeatureMembers[indexSerializableFailureMechanism + 4]); } private static void AssertSerializableFailureMechanism(string expectedId, SerializableTotalAssemblyResult expectedSerializableTotalAssembly, SerializableFailureMechanism serializableFailureMechanism) { Assert.AreEqual(expectedSerializableTotalAssembly.Id, serializableFailureMechanism.TotalAssemblyResultId); Assert.AreEqual(expectedId, serializableFailureMechanism.Id); } private static void AssertSerializableFailureMechanismSectionCollection(string expectedId, SerializableFailureMechanism expectedSerializableFailureMechanism, SerializableFailureMechanismSectionCollection serializableFailureMechanismSectionCollection) { Assert.AreEqual(expectedSerializableFailureMechanism.Id, serializableFailureMechanismSectionCollection.FailureMechanismId); Assert.IsNull(serializableFailureMechanismSectionCollection.TotalAssemblyResultId); Assert.AreEqual(expectedId, serializableFailureMechanismSectionCollection.Id); } private static void AssertSerializableFailureMechanismSectionAssembly(string expectedId, SerializableFailureMechanism expectedSerializableFailureMechanism, SerializableFailureMechanismSection expectedSerializableFailureMechanismSection, SerializableFailureMechanismSectionAssembly serializableFailureMechanismSectionAssembly) { Assert.AreEqual(expectedSerializableFailureMechanism.Id, serializableFailureMechanismSectionAssembly.FailureMechanismId); Assert.AreEqual(expectedSerializableFailureMechanismSection.Id, serializableFailureMechanismSectionAssembly.FailureMechanismSectionId); Assert.AreEqual(expectedId, serializableFailureMechanismSectionAssembly.Id); } #endregion #region Combined failure mechanism sections private static void AssertCombinedFailureMechanismSectionAssemblyConnections(int indexSerializableCombinedSectionAssembly, int startId, SerializableFailureMechanismSectionCollection expectedCombinedFailureMechanismSectionCollection, SerializableTotalAssemblyResult expectedSerializableTotalAssemblyResult, SerializableFeatureMember[] serializableAssemblyFeatureMembers) { var combinedFailureMechanismSection1 = (SerializableFailureMechanismSection) serializableAssemblyFeatureMembers[indexSerializableCombinedSectionAssembly + 11]; AssertSerializableFailureMechanismSection($"Wks.{startId++}", expectedCombinedFailureMechanismSectionCollection, combinedFailureMechanismSection1); AssertSerializableCombinedFailureMechanismSectionAssembly($"Gto.{startId}", expectedSerializableTotalAssemblyResult, combinedFailureMechanismSection1, (SerializableCombinedFailureMechanismSectionAssembly) serializableAssemblyFeatureMembers[indexSerializableCombinedSectionAssembly]); } private static void AssertSerializableFailureMechanismSectionCollection(string expectedId, SerializableTotalAssemblyResult expectedSerializableTotalAssemblyResult, SerializableFailureMechanismSectionCollection serializableFailureMechanismSectionCollection) { Assert.AreEqual(expectedSerializableTotalAssemblyResult.Id, serializableFailureMechanismSectionCollection.TotalAssemblyResultId); Assert.IsNull(serializableFailureMechanismSectionCollection.FailureMechanismId); Assert.AreEqual(expectedId, serializableFailureMechanismSectionCollection.Id); } private static void AssertSerializableCombinedFailureMechanismSectionAssembly(string expectedId, SerializableTotalAssemblyResult expectedSerializableTotalAssemblyResult, SerializableFailureMechanismSection expectedSerializableFailureMechanismSection, SerializableCombinedFailureMechanismSectionAssembly serializableCombinedFailureMechanismSectionAssembly) { Assert.AreEqual(expectedSerializableTotalAssemblyResult.Id, serializableCombinedFailureMechanismSectionAssembly.TotalAssemblyResultId); Assert.AreEqual(expectedSerializableFailureMechanismSection.Id, serializableCombinedFailureMechanismSectionAssembly.FailureMechanismSectionId); Assert.AreEqual(expectedId, serializableCombinedFailureMechanismSectionAssembly.Id); } #endregion #endregion } }