Index: Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs =================================================================== diff -u -r538ae03387505acc57bc78715c2b9e428f526281 -r4fc96d31a69029557095247c8ff890d06239b65a --- Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 538ae03387505acc57bc78715c2b9e428f526281) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 4fc96d31a69029557095247c8ff890d06239b65a) @@ -1768,16 +1768,6 @@ } /// - /// Looks up a localized string similar to Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}'.. - /// - public static string StochasticSoilModelImporter_ValidateStochasticSoilModel_No_profiles_found_in_stochastic_soil_model_0 { - get { - return ResourceManager.GetString("StochasticSoilModelImporter_ValidateStochasticSoilModel_No_profiles_found_in_stoc" + - "hastic_soil_model_0", resourceCulture); - } - } - - /// /// Looks up a localized string similar to De som van de kansen van voorkomen in het stochastich ondergrondmodel '{0}' is niet gelijk aan 100%.. /// public static string StochasticSoilModelImporter_ValidateStochasticSoilModel_Sum_of_probabilities_of_stochastic_soil_model_0_is_not_correct { @@ -1809,7 +1799,7 @@ } /// - /// Looks up a localized string similar to Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}'. + /// Looks up a localized string similar to Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}'.. /// public static string StochasticSoilModelReader_ReadStochasticSoilProfiles_No_profiles_found_in_stochastic_soil_model_Name_0_ { get { Index: Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx =================================================================== diff -u -r538ae03387505acc57bc78715c2b9e428f526281 -r4fc96d31a69029557095247c8ff890d06239b65a --- Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx (.../Resources.resx) (revision 538ae03387505acc57bc78715c2b9e428f526281) +++ Ringtoets/Common/src/Ringtoets.Common.IO/Properties/Resources.resx (.../Resources.resx) (revision 4fc96d31a69029557095247c8ff890d06239b65a) @@ -846,7 +846,7 @@ ..\Resources\XmlGeometrySchema.xsd;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}' + Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}'. Het stochastische ondergrondmodel '{0}' moet een geometrie bevatten. @@ -868,9 +868,6 @@ Inlezen van de stochastische ondergrondmodellen. - - Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '{0}'. - De som van de kansen van voorkomen in het stochastich ondergrondmodel '{0}' is niet gelijk aan 100%. Index: Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/StochasticSoilModelImporter.cs =================================================================== diff -u -r538ae03387505acc57bc78715c2b9e428f526281 -r4fc96d31a69029557095247c8ff890d06239b65a --- Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/StochasticSoilModelImporter.cs (.../StochasticSoilModelImporter.cs) (revision 538ae03387505acc57bc78715c2b9e428f526281) +++ Ringtoets/Common/src/Ringtoets.Common.IO/SoilProfile/StochasticSoilModelImporter.cs (.../StochasticSoilModelImporter.cs) (revision 4fc96d31a69029557095247c8ff890d06239b65a) @@ -167,13 +167,27 @@ return GetStochasticSoilModelReadResult(stochasticSoilModelReader); } } - catch (CriticalFileReadException e) + catch (Exception e) when (e is StochasticSoilModelException + || e is CriticalFileReadException) { HandleException(e); } return new ReadResult(true); } + /// + /// Reads all stochastic soil models from the . + /// + /// The . + /// Returns a collection of read stochastic soil models. + /// Thrown when the database returned incorrect + /// values for required properties. + /// Thrown when: + /// + /// no stochastic soil profiles could be read; + /// the read failure mechanism type is not supported. + /// + /// private ReadResult GetStochasticSoilModelReadResult(StochasticSoilModelReader stochasticSoilModelReader) { int totalNumberOfSteps = stochasticSoilModelReader.StochasticSoilModelCount; @@ -186,18 +200,11 @@ { return new ReadResult(false); } - try - { - NotifyProgress(Resources.StochasticSoilModelImporter_GetStochasticSoilModelReadResult_Reading_stochastic_soil_models_from_database, - currentStep++, - totalNumberOfSteps); - soilModels.Add(stochasticSoilModelReader.ReadStochasticSoilModel()); - } - catch (StochasticSoilModelException e) - { - HandleException(e); - return new ReadResult(true); - } + + NotifyProgress(Resources.StochasticSoilModelImporter_GetStochasticSoilModelReadResult_Reading_stochastic_soil_models_from_database, + currentStep++, + totalNumberOfSteps); + soilModels.Add(stochasticSoilModelReader.ReadStochasticSoilModel()); } return new ReadResult(false) @@ -252,17 +259,10 @@ /// Validate the definition of a . /// /// The to validate. - /// false when the stochastic soil model does not contain any stochastic soil profiles - /// or when a stochastic soil profile does not have a definition for a soil profile; true - /// otherwise. + /// false when the sum of the stochastic soil profiles in the stochastic + /// soil model does add up to 100%, true otherwise. private bool ValidateStochasticSoilModel(StochasticSoilModel stochasticSoilModel) { - if (!stochasticSoilModel.StochasticSoilProfiles.Any()) - { - Log.ErrorFormat(Resources.StochasticSoilModelImporter_ValidateStochasticSoilModel_No_profiles_found_in_stochastic_soil_model_0, - stochasticSoilModel.Name); - return false; - } if (!IsSumOfAllProbabilitiesEqualToOne(stochasticSoilModel)) { Log.ErrorFormat(Resources.StochasticSoilModelImporter_ValidateStochasticSoilModel_Sum_of_probabilities_of_stochastic_soil_model_0_is_not_correct, Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelImporterTest.cs =================================================================== diff -u -rd1b245c6bfa60fe7f0661c45818342178a59d185 -r4fc96d31a69029557095247c8ff890d06239b65a --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelImporterTest.cs (.../StochasticSoilModelImporterTest.cs) (revision d1b245c6bfa60fe7f0661c45818342178a59d185) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelImporterTest.cs (.../StochasticSoilModelImporterTest.cs) (revision 4fc96d31a69029557095247c8ff890d06239b65a) @@ -628,6 +628,131 @@ } [Test] + public void Import_ReadingStochsaticSoilModelThrowsException_StopsImportAndLogs() + { + // Setup + var messageProvider = mocks.StrictMock(); + var updateStrategy = mocks.StrictMock>(); + var filter = mocks.StrictMock(); + mocks.ReplayAll(); + + string validFilePath = Path.Combine(testDataPath, "invalidSegmentPoint.soil"); + + var importer = new StochasticSoilModelImporter( + new TestStochasticSoilModelCollection(), + validFilePath, + messageProvider, + new StochasticSoilModelImporterConfiguration( + transformer, + filter, + updateStrategy)); + + var importResult = true; + + // Call + Action call = () => importResult = importer.Import(); + + // Assert + TestHelper.AssertLogMessagesWithLevelAndLoggedExceptions(call, tuples => + { + Tuple[] tupleArray = tuples.ToArray(); + Assert.AreEqual(1, tupleArray.Length); + + Tuple actualLog = tupleArray[0]; + + string expectedMessage = "Het stochastische ondergrondmodel 'StochasticSoilModelName' moet een geometrie bevatten. " + + $"{Environment.NewLine}Het bestand wordt overgeslagen."; + + Assert.AreEqual(expectedMessage, actualLog.Item1); + Assert.AreEqual(Level.Error, actualLog.Item2); + Assert.IsInstanceOf(actualLog.Item3); + }); + + Assert.IsFalse(importResult); + } + + [Test] + public void Import_StochasticSoilModelWithoutStochasticSoilProfiles_StopsImportAndLogs() + { + // Setup + var messageProvider = mocks.StrictMock(); + var updateStrategy = mocks.StrictMock>(); + var filter = mocks.StrictMock(); + mocks.ReplayAll(); + + string validFilePath = Path.Combine(testDataPath, "modelWithoutProfile.soil"); + + var importer = new StochasticSoilModelImporter( + new TestStochasticSoilModelCollection(), + validFilePath, + messageProvider, + new StochasticSoilModelImporterConfiguration( + transformer, + filter, + updateStrategy)); + + var importResult = true; + + // Call + Action call = () => importResult = importer.Import(); + + // Assert + TestHelper.AssertLogMessagesWithLevelAndLoggedExceptions(call, tuples => + { + Tuple[] tupleArray = tuples.ToArray(); + Assert.AreEqual(1, tupleArray.Length); + + Tuple actualLog = tupleArray[0]; + + string expectedMessage = "Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '36006_Piping'. " + + $"{Environment.NewLine}Het bestand wordt overgeslagen."; + + Assert.AreEqual(expectedMessage, actualLog.Item1); + Assert.AreEqual(Level.Error, actualLog.Item2); + Assert.IsInstanceOf(actualLog.Item3); + }); + + Assert.IsFalse(importResult); + } + + [Test] + public void Import_IncorrectProbability_LogAndImportSoilModelToCollection() + { + // Setup + var messageProvider = mocks.StrictMock(); + var updateStrategy = mocks.StrictMock>(); + var filter = mocks.StrictMock(); + filter.Expect(f => f.IsValidForFailureMechanism(null)) + .IgnoreArguments() + .Return(true) + .Repeat + .AtLeastOnce(); + mocks.ReplayAll(); + + string validFilePath = Path.Combine(testDataPath, "incorrectProbability.soil"); + + var importer = new StochasticSoilModelImporter( + new TestStochasticSoilModelCollection(), + validFilePath, + messageProvider, + new StochasticSoilModelImporterConfiguration( + transformer, + filter, + updateStrategy)); + + var importResult = false; + + // Call + Action call = () => importResult = importer.Import(); + + // Assert + const string expectedLogMessage = "De som van de kansen van voorkomen in het stochastich ondergrondmodel 'Name' is niet gelijk aan 100%."; + Tuple expectedLogMessageAndLevel = Tuple.Create(expectedLogMessage, LogLevelConstant.Error); + TestHelper.AssertLogMessageWithLevelIsGenerated(call, expectedLogMessageAndLevel, 1); + Assert.IsFalse(importResult); + } + + [Test] public void Import_TransformationThrowsException_StopsImportAndLogs() { // Setup @@ -714,6 +839,8 @@ TestHelper.AssertLogMessagesWithLevelAndLoggedExceptions(call, tuples => { Tuple[] tupleArray = tuples.ToArray(); + Assert.AreEqual(1, tupleArray.Length); + Tuple actualLog = tupleArray[0]; Assert.AreEqual(updateDataException.Message, actualLog.Item1); @@ -724,6 +851,52 @@ Assert.IsFalse(importResult); } + [Test] + public void DoPostImport_AfterImport_ObserversNotified() + { + // Setup + var observableA = mocks.StrictMock(); + observableA.Expect(o => o.NotifyObservers()); + var observableB = mocks.StrictMock(); + observableB.Expect(o => o.NotifyObservers()); + + var messageProvider = mocks.StrictMock(); + messageProvider.Expect(mp => mp.GetAddDataToModelProgressText()).Return(""); + var updateStrategy = mocks.StrictMock>(); + updateStrategy.Expect(u => u.UpdateModelWithImportedData(null, null)) + .IgnoreArguments() + .Return(new[] + { + observableA, + observableB + }); + var filter = mocks.StrictMock(); + filter.Expect(f => f.IsValidForFailureMechanism(null)) + .IgnoreArguments() + .Return(true) + .Repeat + .AtLeastOnce(); + mocks.ReplayAll(); + + string validFilePath = Path.Combine(testDataPath, "complete.soil"); + + var importer = new StochasticSoilModelImporter( + new TestStochasticSoilModelCollection(), + validFilePath, + messageProvider, + new StochasticSoilModelImporterConfiguration( + transformer, + filter, + updateStrategy)); + + importer.Import(); + + // Call + importer.DoPostImport(); + + // Asserts done in the TearDown method + } + private static void FilterFailureMechanismSpecificModel(MethodInvocation invocation, FailureMechanismType failureMechanismType) { invocation.ReturnValue = failureMechanismType == ((StochasticSoilModel) invocation.Arguments[0]).FailureMechanismType; Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelReaderTest.cs =================================================================== diff -u -rd06750a4979861471df64a5f49dca99c33d34ce6 -r4fc96d31a69029557095247c8ff890d06239b65a --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelReaderTest.cs (.../StochasticSoilModelReaderTest.cs) (revision d06750a4979861471df64a5f49dca99c33d34ce6) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/SoilProfile/StochasticSoilModelReaderTest.cs (.../StochasticSoilModelReaderTest.cs) (revision 4fc96d31a69029557095247c8ff890d06239b65a) @@ -348,7 +348,7 @@ CollectionAssert.AreEqual(expectedProfileCount, readModels.Select(m => m.StochasticSoilProfiles.Count)); Assert.IsInstanceOf(expectedException); - Assert.AreEqual("Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '36006_Piping'", + Assert.AreEqual("Er zijn geen ondergrondschematisaties gevonden in het stochastische ondergrondmodel '36006_Piping'.", expectedException.Message); Assert.IsTrue(TestHelper.CanOpenFileForWrite(dbFile)); Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/StochasticSoilModelReader/incorrectProbability.soil =================================================================== diff -u Binary files differ