Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/HydraulicBoundaryDatabaseUpdateHandler.cs =================================================================== diff -u -r01dc0dc906fd20d82b770717544584621f7ce1cf -rde1b2087ee8fe4b5923ff6655808fdd21f70f3ce --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/HydraulicBoundaryDatabaseUpdateHandler.cs (.../HydraulicBoundaryDatabaseUpdateHandler.cs) (revision 01dc0dc906fd20d82b770717544584621f7ce1cf) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/Handlers/HydraulicBoundaryDatabaseUpdateHandler.cs (.../HydraulicBoundaryDatabaseUpdateHandler.cs) (revision de1b2087ee8fe4b5923ff6655808fdd21f70f3ce) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Ringtoets.Common.Data.Hydraulics; @@ -122,7 +123,12 @@ { hydraulicBoundaryDatabase.FilePath = filePath; hydraulicBoundaryDatabase.Version = readHydraulicBoundaryDatabase.Version; - SetLocations(hydraulicBoundaryDatabase, readHydraulicBoundaryDatabase.Locations); + + ReadHydraulicBoundaryLocation[] locationsToAdd = FilterLocations(readHydraulicBoundaryDatabase.Locations, + readHydraulicLocationConfigurationDatabase.LocationIdMappings, + excludedLocationIds.ToList()).ToArray(); + + SetLocations(hydraulicBoundaryDatabase, locationsToAdd); assessmentSection.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryDatabase.Locations); assessmentSection.GrassCoverErosionOutwards.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryDatabase.Locations); @@ -150,6 +156,31 @@ } } + private static IEnumerable FilterLocations(IEnumerable locations, + IEnumerable locationIdMappings, + List excludedLocationIds) + { + excludedLocationIds.Sort(); + + foreach (ReadHydraulicBoundaryLocation location in locations) + { + long locationConfigurationId = locationIdMappings.Where(m => m.HrdLocationId == location.Id) + .Select(m => m.HlcdLocationId) + .SingleOrDefault(); + + if (locationConfigurationId != 0 && ShouldInclude(excludedLocationIds, locationConfigurationId)) + { + yield return location; + } + } + } + + private static bool ShouldInclude(List excludedLocationIds, long locationId) + { + int matchingIndex = excludedLocationIds.BinarySearch(locationId); + return matchingIndex < 0; + } + private IEnumerable GetLocationsAndCalculationsObservables(HydraulicBoundaryDatabase hydraulicBoundaryDatabase) { return new IObservable[] Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/HydraulicBoundaryDatabaseUpdateHandlerTest.cs =================================================================== diff -u -r01dc0dc906fd20d82b770717544584621f7ce1cf -rde1b2087ee8fe4b5923ff6655808fdd21f70f3ce --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/HydraulicBoundaryDatabaseUpdateHandlerTest.cs (.../HydraulicBoundaryDatabaseUpdateHandlerTest.cs) (revision 01dc0dc906fd20d82b770717544584621f7ce1cf) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/Handlers/HydraulicBoundaryDatabaseUpdateHandlerTest.cs (.../HydraulicBoundaryDatabaseUpdateHandlerTest.cs) (revision de1b2087ee8fe4b5923ff6655808fdd21f70f3ce) @@ -308,7 +308,8 @@ // Call TestDelegate call = () => handler.Update(new HydraulicBoundaryDatabase(), ReadHydraulicBoundaryDatabaseTestFactory.Create(), - ReadHydraulicLocationConfigurationDatabaseTestFactory.Create(), null, ""); ; + ReadHydraulicLocationConfigurationDatabaseTestFactory.Create(), null, ""); + ; // Assert var exception = Assert.Throws(call); @@ -511,6 +512,86 @@ } [Test] + public void Update_HrdLocationIdsNotInHlcdLocationIds_ThenLocationsNotAdded() + { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + + var mocks = new MockRepository(); + var duneLocationsReplacementHandler = mocks.Stub(); + mocks.ReplayAll(); + + const string filePath = "some/file/path"; + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + var handler = new HydraulicBoundaryDatabaseUpdateHandler(assessmentSection, duneLocationsReplacementHandler); + + // Precondition + Assert.IsFalse(hydraulicBoundaryDatabase.IsLinked()); + + var readHydraulicBoundaryLocationsToInclude = new[] + { + new ReadHydraulicBoundaryLocation(1, "location 1", 1, 1), + new ReadHydraulicBoundaryLocation(2, "location 2", 2, 2) + }; + var readHydraulicBoundaryLocationsToExclude = new[] + { + new ReadHydraulicBoundaryLocation(3, "location 3", 3, 3), + new ReadHydraulicBoundaryLocation(4, "location 4", 4, 4) + }; + ReadHydraulicBoundaryDatabase readHydraulicBoundaryDatabase = ReadHydraulicBoundaryDatabaseTestFactory.Create(readHydraulicBoundaryLocationsToInclude + .Concat(readHydraulicBoundaryLocationsToExclude) + .ToList()); + + // Call + handler.Update(hydraulicBoundaryDatabase, readHydraulicBoundaryDatabase, + ReadHydraulicLocationConfigurationDatabaseTestFactory.Create(), + Enumerable.Empty(), filePath); + + // Assert + AssertHydraulicBoundaryLocations(readHydraulicBoundaryLocationsToInclude, hydraulicBoundaryDatabase.Locations); + mocks.VerifyAll(); + } + + [Test] + public void Update_HrdLocationIdsInExcludedLocationIds_LocationsNotAdded() + { + var hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + + var mocks = new MockRepository(); + var duneLocationsReplacementHandler = mocks.Stub(); + mocks.ReplayAll(); + + const string filePath = "some/file/path"; + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + var handler = new HydraulicBoundaryDatabaseUpdateHandler(assessmentSection, duneLocationsReplacementHandler); + + // Precondition + Assert.IsFalse(hydraulicBoundaryDatabase.IsLinked()); + + var readHydraulicBoundaryLocationsToExclude = new[] + { + new ReadHydraulicBoundaryLocation(1, "location 1", 1, 1), + new ReadHydraulicBoundaryLocation(2, "location 2", 2, 2) + }; + var readHydraulicBoundaryLocationsToInclude = new[] + { + new ReadHydraulicBoundaryLocation(3, "location 3", 3, 3), + new ReadHydraulicBoundaryLocation(4, "location 4", 4, 4) + }; + ReadHydraulicBoundaryDatabase readHydraulicBoundaryDatabase = ReadHydraulicBoundaryDatabaseTestFactory.Create(readHydraulicBoundaryLocationsToExclude + .Concat(readHydraulicBoundaryLocationsToInclude) + .ToList()); + + // Call + handler.Update(hydraulicBoundaryDatabase, readHydraulicBoundaryDatabase, + ReadHydraulicLocationConfigurationDatabaseTestFactory.Create(readHydraulicBoundaryLocationsToInclude.Select(l => l.Id)), + readHydraulicBoundaryLocationsToExclude.Select(l => l.Id), filePath); + + // Assert + AssertHydraulicBoundaryLocations(readHydraulicBoundaryLocationsToInclude, hydraulicBoundaryDatabase.Locations); + mocks.VerifyAll(); + } + + [Test] [TestCase(true)] [TestCase(false)] public void GivenDatabase_WhenUpdatingDataWithNewLocations_ThenChangedObjectsReturned(bool isLinked)