Index: Core/Common/src/Core.Common.Base/ObservableUniqueItemCollectionWithSourcePath.cs =================================================================== diff -u -r48e2db6c910f4ec279d2d63fbb1cc05a1196b7f1 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Core/Common/src/Core.Common.Base/ObservableUniqueItemCollectionWithSourcePath.cs (.../ObservableUniqueItemCollectionWithSourcePath.cs) (revision 48e2db6c910f4ec279d2d63fbb1cc05a1196b7f1) +++ Core/Common/src/Core.Common.Base/ObservableUniqueItemCollectionWithSourcePath.cs (.../ObservableUniqueItemCollectionWithSourcePath.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -170,22 +170,23 @@ return GetEnumerator(); } + /// + /// Validates the items of an based on their feature. + /// + /// + /// Thrown when + /// + /// one of the items is null + /// when a duplicate item was found. + /// + /// private void InternalValidateItems(IEnumerable items) { if (items.Contains(null)) { - throw new ArgumentException("Collection cannot contain null.", nameof(items)); + throw new ArgumentException(@"Collection cannot contain null.", nameof(items)); } - ValidateItems(items); - } - /// - /// Validates the items of an based on their feature. - /// - /// Thrown when any parameters are null. - /// Thrown when a duplicate item was found. - private void ValidateItems(IEnumerable items) - { IEnumerable> duplicateItems = items.Concat(collection).GroupBy(getUniqueFeature) .Where(group => group.Count() > 1); Index: Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/FileImporters/ClosingStructureUpdateDataStrategyTest.cs =================================================================== diff -u -r12cec002453a1828efc68633fbd25219632c6c47 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/FileImporters/ClosingStructureUpdateDataStrategyTest.cs (.../ClosingStructureUpdateDataStrategyTest.cs) (revision 12cec002453a1828efc68633fbd25219632c6c47) +++ Ringtoets/ClosingStructures/test/Ringtoets.ClosingStructures.Plugin.Test/FileImporters/ClosingStructureUpdateDataStrategyTest.cs (.../ClosingStructureUpdateDataStrategyTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -27,17 +27,16 @@ using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; +using Ringtoets.ClosingStructures.Data; +using Ringtoets.ClosingStructures.Data.TestUtil; +using Ringtoets.ClosingStructures.Plugin.FileImporters; using Ringtoets.Common.Data; using Ringtoets.Common.Data.Exceptions; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Data.UpdateDataStrategies; -using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.Structures; -using Ringtoets.ClosingStructures.Data; -using Ringtoets.ClosingStructures.Data.TestUtil; -using Ringtoets.ClosingStructures.Plugin.FileImporters; using Ringtoets.Common.Utils; namespace Ringtoets.ClosingStructures.Plugin.Test.FileImporters @@ -71,7 +70,7 @@ }).SetName("Different AllowedLevelIncreaseStorage"); yield return new TestCaseData(new TestClosingStructure { - AreaFlowApertures = + AreaFlowApertures = { Mean = (RoundedDouble) random.Next(), Shift = random.NextRoundedDouble(), @@ -97,15 +96,15 @@ }).SetName("Different FlowWidthAtBottomProtection"); yield return new TestCaseData(new TestClosingStructure { - InsideWaterLevel = + InsideWaterLevel = { Mean = (RoundedDouble) random.Next(), StandardDeviation = random.NextRoundedDouble() } }).SetName("Different InsideWaterLevel"); yield return new TestCaseData(new TestClosingStructure { - LevelCrestStructureNotClosing = + LevelCrestStructureNotClosing = { Mean = (RoundedDouble) random.Next(), StandardDeviation = random.NextRoundedDouble() @@ -121,7 +120,7 @@ }).SetName("Different StorageStructureArea"); yield return new TestCaseData(new TestClosingStructure { - ThresholdHeightOpenWeir = + ThresholdHeightOpenWeir = { Mean = (RoundedDouble) random.Next(), StandardDeviation = random.NextRoundedDouble() @@ -291,7 +290,7 @@ // Assert var exception = Assert.Throws(call); - string expectedMessage = $"Kunstwerken moeten een unieke id hebben. Gevonden dubbele elementen: {duplicateId}."; + const string expectedMessage = "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(expectedMessage, exception.Message); CollectionAssert.IsEmpty(targetCollection); Index: Ringtoets/Common/src/Ringtoets.Common.Data/UpdateDataStrategies/UpdateDataStrategyBase.cs =================================================================== diff -u -r48e2db6c910f4ec279d2d63fbb1cc05a1196b7f1 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/Common/src/Ringtoets.Common.Data/UpdateDataStrategies/UpdateDataStrategyBase.cs (.../UpdateDataStrategyBase.cs) (revision 48e2db6c910f4ec279d2d63fbb1cc05a1196b7f1) +++ Ringtoets/Common/src/Ringtoets.Common.Data/UpdateDataStrategies/UpdateDataStrategyBase.cs (.../UpdateDataStrategyBase.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -120,10 +120,6 @@ { throw new UpdateDataException(e.Message, e); } - catch (InvalidOperationException e) - { - throw new UpdateDataException(Resources.UpdateDataStrategyBase_UpdateTargetCollectionData_Imported_data_must_contain_unique_items, e); - } } /// @@ -138,8 +134,8 @@ /// A with affected objects. /// Thrown when duplicate items are being added to the /// . - /// Thrown when duplicate items are found during the - /// update of the items to be updated in the . + /// Thrown when duplicate items are found in the + /// . private IEnumerable ModifyDataCollection(ObservableUniqueItemCollectionWithSourcePath targetDataCollection, IEnumerable importedDataCollection, string sourceFilePath) @@ -184,12 +180,16 @@ /// The objects that need to be updated. /// The data to update from. /// A of affected items. - /// Thrown when the imported + /// Thrown when the imported /// contains duplicate items. private IEnumerable UpdateData(IEnumerable objectsToUpdate, IEnumerable importedDataCollection) { var affectedObjects = new List(); + if (importedDataCollection.Count() != importedDataCollection.Distinct(equalityComparer).Count()) + { + throw new UpdateDataException(Resources.UpdateDataStrategyBase_UpdateTargetCollectionData_Imported_data_must_contain_unique_items); + } foreach (TTargetData objectToUpdate in objectsToUpdate) { Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/UpdateDataStrategies/UpdateDataStrategyBaseTest.cs =================================================================== diff -u -rb3b6c13cf736c134476b3db34281332d01ca86b1 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/UpdateDataStrategies/UpdateDataStrategyBaseTest.cs (.../UpdateDataStrategyBaseTest.cs) (revision b3b6c13cf736c134476b3db34281332d01ca86b1) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/UpdateDataStrategies/UpdateDataStrategyBaseTest.cs (.../UpdateDataStrategyBaseTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -208,9 +208,10 @@ { // Setup var collection = new TestUniqueItemCollection(); + var testItem = new TestItem("I am an expected item"); collection.AddRange(new[] { - new TestItem("I am an expected item") + testItem }, sourceFilePath); const string duplicateName = "Duplicate Name"; @@ -227,11 +228,13 @@ // Assert var exception = Assert.Throws(call); - string message = $"TestItem moeten een unieke naam hebben. Gevonden dubbele elementen: {duplicateName}."; + const string message = "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(message, exception.Message); - Assert.IsInstanceOf(exception.InnerException); - CollectionAssert.IsEmpty(collection); + CollectionAssert.AreEqual(new[] + { + testItem + }, collection); } [Test] @@ -469,7 +472,6 @@ // Assert var exception = Assert.Throws(call); Assert.AreEqual("Geïmporteerde data moet unieke elementen bevatten.", exception.Message); - Assert.IsInstanceOf(exception.InnerException); } [Test] Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/FileImporters/GrassCoverErosionInwardsDikeProfileUpdateDataStrategyTest.cs =================================================================== diff -u -r064653222d1d4df89ac7c644f2227f2fe0aa2070 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/FileImporters/GrassCoverErosionInwardsDikeProfileUpdateDataStrategyTest.cs (.../GrassCoverErosionInwardsDikeProfileUpdateDataStrategyTest.cs) (revision 064653222d1d4df89ac7c644f2227f2fe0aa2070) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/FileImporters/GrassCoverErosionInwardsDikeProfileUpdateDataStrategyTest.cs (.../GrassCoverErosionInwardsDikeProfileUpdateDataStrategyTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -182,7 +182,7 @@ var exception = Assert.Throws(call); string expectedMessage = "Het bijwerken van de dijkprofielen is mislukt: " + - $"Dijkprofielen moeten een unieke id hebben. Gevonden dubbele elementen: {duplicateId}."; + "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); Index: Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Plugin.Test/FileImporters/HeightStructureUpdateDataStrategyTest.cs =================================================================== diff -u -r8c97f59adda15f1eb2a4550a06d2f7fb8bee91bf -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Plugin.Test/FileImporters/HeightStructureUpdateDataStrategyTest.cs (.../HeightStructureUpdateDataStrategyTest.cs) (revision 8c97f59adda15f1eb2a4550a06d2f7fb8bee91bf) +++ Ringtoets/HeightStructures/test/Ringtoets.HeightStructures.Plugin.Test/FileImporters/HeightStructureUpdateDataStrategyTest.cs (.../HeightStructureUpdateDataStrategyTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -216,7 +216,7 @@ } [Test] - public void UpdateStructuresWithImportedData_WithoutCurrentStructuresAndReadStructuresHaveDuplicateNames_ThrowsUpdateDataException() + public void UpdateStructuresWithImportedData_WithoutCurrentStructuresAndReadStructuresHaveDuplicateIds_ThrowsUpdateDataException() { // Setup const string duplicateId = "I am a duplicate id"; @@ -237,8 +237,7 @@ // Assert var exception = Assert.Throws(call); - string expectedMessage = "Kunstwerken moeten een unieke id hebben. " + - $"Gevonden dubbele elementen: {duplicateId}."; + const string expectedMessage = "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(expectedMessage, exception.Message); CollectionAssert.IsEmpty(targetCollection); Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs =================================================================== diff -u -ra8d5814e2cb003b85852c499cbc25ca0156887d4 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs) (revision a8d5814e2cb003b85852c499cbc25ca0156887d4) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -300,8 +300,7 @@ // Assert var exception = Assert.Throws(call); - string expectedMessage = "Profielschematisaties moeten een unieke naam hebben. " + - $"Gevonden dubbele elementen: {duplicateName}."; + const string expectedMessage = "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(expectedMessage, exception.Message); CollectionAssert.IsEmpty(targetCollection); Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/StochasticSoilModelUpdateDataStrategyTest.cs =================================================================== diff -u -r50597fbeb76b752bc250107dfa91b696bb6c4995 -rb7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/StochasticSoilModelUpdateDataStrategyTest.cs (.../StochasticSoilModelUpdateDataStrategyTest.cs) (revision 50597fbeb76b752bc250107dfa91b696bb6c4995) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/StochasticSoilModelUpdateDataStrategyTest.cs (.../StochasticSoilModelUpdateDataStrategyTest.cs) (revision b7f91e5d6aaac3c9a52cfda9b1bdd3a74ee4f8b1) @@ -152,8 +152,7 @@ // Assert var exception = Assert.Throws(test); - const string expectedMessage = "Stochastische ondergrondmodellen moeten een unieke naam hebben. " + - "Gevonden dubbele elementen: non-unique name."; + const string expectedMessage = "Geïmporteerde data moet unieke elementen bevatten."; Assert.AreEqual(expectedMessage, exception.Message); CollectionAssert.IsEmpty(targetCollection);