Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/TreeNodeInfos/HydraulicBoundaryDatabaseContextTreeNodeInfoTest.cs =================================================================== diff -u -rd5286bfba1709a9e46355d6f1fff0989d78b7f9a -r9071b314bcd289ae645467a8992d57dcbdd1f892 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/TreeNodeInfos/HydraulicBoundaryDatabaseContextTreeNodeInfoTest.cs (.../HydraulicBoundaryDatabaseContextTreeNodeInfoTest.cs) (revision d5286bfba1709a9e46355d6f1fff0989d78b7f9a) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/TreeNodeInfos/HydraulicBoundaryDatabaseContextTreeNodeInfoTest.cs (.../HydraulicBoundaryDatabaseContextTreeNodeInfoTest.cs) (revision 9071b314bcd289ae645467a8992d57dcbdd1f892) @@ -280,7 +280,8 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - AttachObservers(assessmentSection, true); + AttachHydraulicBoundaryDatabaseObserver(assessmentSection, true); + AttachLocationAndCalculationObservers(assessmentSection, true); var hydraulicBoundaryDatabaseContext = new HydraulicBoundaryDatabaseContext(assessmentSection.HydraulicBoundaryDatabase, assessmentSection); @@ -339,7 +340,6 @@ CollectionAssert.AreEqual(hydraulicBoundaryLocations, assessmentSection.WaveHeightCalculationsForSignalingNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); CollectionAssert.AreEqual(hydraulicBoundaryLocations, assessmentSection.WaveHeightCalculationsForLowerLimitNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); CollectionAssert.AreEqual(hydraulicBoundaryLocations, assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); - CollectionAssert.IsNotEmpty(grassCoverErosionOutwardsFailureMechanism.HydraulicBoundaryLocations); CollectionAssert.AreEqual(hydraulicBoundaryLocations, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); CollectionAssert.AreEqual(hydraulicBoundaryLocations, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificSignalingNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); CollectionAssert.AreEqual(hydraulicBoundaryLocations, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm.Select(hblc => hblc.HydraulicBoundaryLocation)); @@ -361,7 +361,8 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - AttachObservers(assessmentSection); + AttachHydraulicBoundaryDatabaseObserver(assessmentSection); + AttachLocationAndCalculationObservers(assessmentSection); var hydraulicBoundaryDatabaseContext = new HydraulicBoundaryDatabaseContext(assessmentSection.HydraulicBoundaryDatabase, assessmentSection); @@ -412,7 +413,8 @@ var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); - AttachObservers(assessmentSection); + AttachHydraulicBoundaryDatabaseObserver(assessmentSection); + AttachLocationAndCalculationObservers(assessmentSection); var hydraulicBoundaryDatabaseContext = new HydraulicBoundaryDatabaseContext(assessmentSection.HydraulicBoundaryDatabase, assessmentSection); @@ -469,14 +471,14 @@ importer.Import(assessmentSection, validFilePath); } - AttachObservers(assessmentSection); + AttachHydraulicBoundaryDatabaseObserver(assessmentSection); + AttachLocationAndCalculationObservers(assessmentSection); ObservableList hydraulicBoundaryLocations = assessmentSection.HydraulicBoundaryDatabase.Locations; GrassCoverErosionOutwardsFailureMechanism grassCoverErosionOutwardsFailureMechanism = assessmentSection.GrassCoverErosionOutwards; assessmentSection.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryLocations); grassCoverErosionOutwardsFailureMechanism.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryLocations); - grassCoverErosionOutwardsFailureMechanism.SetGrassCoverErosionOutwardsHydraulicBoundaryLocations(assessmentSection.HydraulicBoundaryDatabase.Locations); PipingOutput pipingOutput = PipingOutputTestFactory.Create(); var pipingCalculation = new PipingCalculation(new GeneralPipingInput()) @@ -508,7 +510,6 @@ IEnumerable currentWaveHeightCalculationsForSignalingNorm = assessmentSection.WaveHeightCalculationsForSignalingNorm.ToArray(); IEnumerable currentWaveHeightCalculationsForLowerLimitNorm = assessmentSection.WaveHeightCalculationsForLowerLimitNorm.ToArray(); IEnumerable currentWaveHeightCalculationsForFactorizedLowerLimitNorm = assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.ToArray(); - IEnumerable currentGrassCoverErosionOutwardsLocations = grassCoverErosionOutwardsFailureMechanism.HydraulicBoundaryLocations.ToArray(); IEnumerable currentWaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm.ToArray(); IEnumerable currentWaterLevelCalculationsForMechanismSpecificSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificSignalingNorm.ToArray(); IEnumerable currentWaterLevelCalculationsForMechanismSpecificLowerLimitNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm.ToArray(); @@ -564,7 +565,6 @@ CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm); CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificSignalingNorm); CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificLowerLimitNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificLowerLimitNorm); - CollectionAssert.AreEqual(currentGrassCoverErosionOutwardsLocations, grassCoverErosionOutwardsFailureMechanism.HydraulicBoundaryLocations); Assert.AreSame(assessmentSection.HydraulicBoundaryDatabase.Locations.First(), pipingCalculation.InputParameters.HydraulicBoundaryLocation); Assert.AreSame(pipingOutput, pipingCalculation.Output); } @@ -573,14 +573,141 @@ mocks.VerifyAll(); } + [Test] + [Apartment(ApartmentState.STA)] + public void GivenDatabaseLinked_WhenOpeningSameFileOnDifferentPathFromContextMenu_ThenFilePathUpdatedAndSpecificObserversNotified() + { + // Given + string validFilePath1 = Path.Combine(testDataPath, "HRD dutch coast south.sqlite"); + string validFilePath2 = Path.Combine(testDataPath, "copy of HRD dutch coast south.sqlite"); + + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + + using (var importer = new HydraulicBoundaryDatabaseImporter()) + { + importer.Import(assessmentSection, validFilePath1); + } + + AttachHydraulicBoundaryDatabaseObserver(assessmentSection, true); + AttachLocationAndCalculationObservers(assessmentSection); + + ObservableList hydraulicBoundaryLocations = assessmentSection.HydraulicBoundaryDatabase.Locations; + GrassCoverErosionOutwardsFailureMechanism grassCoverErosionOutwardsFailureMechanism = assessmentSection.GrassCoverErosionOutwards; + + assessmentSection.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryLocations); + grassCoverErosionOutwardsFailureMechanism.SetHydraulicBoundaryLocationCalculations(hydraulicBoundaryLocations); + + PipingOutput pipingOutput = PipingOutputTestFactory.Create(); + var pipingCalculation = new PipingCalculation(new GeneralPipingInput()) + { + InputParameters = + { + HydraulicBoundaryLocation = assessmentSection.HydraulicBoundaryDatabase.Locations.First() + }, + Output = pipingOutput + }; + + assessmentSection.Piping.CalculationsGroup.Children.Add(pipingCalculation); + + var hydraulicBoundaryDatabaseContext = new HydraulicBoundaryDatabaseContext(assessmentSection.HydraulicBoundaryDatabase, + assessmentSection); + + // Precondition + Assert.IsTrue(assessmentSection.HydraulicBoundaryDatabase.IsLinked()); + CollectionAssert.IsNotEmpty(assessmentSection.HydraulicBoundaryDatabase.Locations); + + string currentVersion = assessmentSection.HydraulicBoundaryDatabase.Version; + IEnumerable currentHydraulicBoundaryLocations = assessmentSection.HydraulicBoundaryDatabase.Locations.ToArray(); + IEnumerable currentWaterLevelCalculationsForFactorizedSignalingNorm = assessmentSection.WaterLevelCalculationsForFactorizedSignalingNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForSignalingNorm = assessmentSection.WaterLevelCalculationsForSignalingNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForLowerLimitNorm = assessmentSection.WaterLevelCalculationsForLowerLimitNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForFactorizedLowerLimitNorm = assessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForFactorizedSignalingNorm = assessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForSignalingNorm = assessmentSection.WaveHeightCalculationsForSignalingNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForLowerLimitNorm = assessmentSection.WaveHeightCalculationsForLowerLimitNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForFactorizedLowerLimitNorm = assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForMechanismSpecificSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificSignalingNorm.ToArray(); + IEnumerable currentWaterLevelCalculationsForMechanismSpecificLowerLimitNorm = grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForMechanismSpecificSignalingNorm = grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificSignalingNorm.ToArray(); + IEnumerable currentWaveHeightCalculationsForMechanismSpecificLowerLimitNorm = grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificLowerLimitNorm.ToArray(); + + using (var treeViewControl = new TreeViewControl()) + using (var plugin = new RingtoetsPlugin()) + { + var mainWindow = mocks.Stub(); + + var gui = mocks.Stub(); + gui.Stub(g => g.MainWindow).Return(mainWindow); + gui.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + gui.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + gui.Stub(cmp => cmp.Get(hydraulicBoundaryDatabaseContext, treeViewControl)).Return(new CustomItemsOnlyContextMenuBuilder()); + mocks.ReplayAll(); + + DialogBoxHandler = (name, wnd) => + { + var tester = new OpenFileDialogTester(wnd); + tester.OpenFile(validFilePath2); + }; + + TreeNodeInfo info = GetInfo(plugin); + plugin.Gui = gui; + + using (ContextMenuStrip contextMenuAdapter = info.ContextMenuStrip(hydraulicBoundaryDatabaseContext, null, treeViewControl)) + { + // When + Action action = () => contextMenuAdapter.Items[contextMenuImportHydraulicBoundaryDatabaseIndex].PerformClick(); + + // Then + string expectedMessage = $"Database op pad '{validFilePath2}' gekoppeld."; + TestHelper.AssertLogMessageIsGenerated(action, expectedMessage); + + Assert.IsTrue(assessmentSection.HydraulicBoundaryDatabase.IsLinked()); + Assert.AreEqual(validFilePath2, assessmentSection.HydraulicBoundaryDatabase.FilePath); + Assert.AreEqual(currentVersion, assessmentSection.HydraulicBoundaryDatabase.Version); + CollectionAssert.AreEqual(currentHydraulicBoundaryLocations, assessmentSection.HydraulicBoundaryDatabase.Locations); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForFactorizedSignalingNorm, assessmentSection.WaterLevelCalculationsForFactorizedSignalingNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForSignalingNorm, assessmentSection.WaterLevelCalculationsForSignalingNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForLowerLimitNorm, assessmentSection.WaterLevelCalculationsForLowerLimitNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForFactorizedLowerLimitNorm, assessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForFactorizedSignalingNorm, assessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForSignalingNorm, assessmentSection.WaveHeightCalculationsForSignalingNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForLowerLimitNorm, assessmentSection.WaveHeightCalculationsForLowerLimitNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForFactorizedLowerLimitNorm, assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForMechanismSpecificSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificSignalingNorm); + CollectionAssert.AreEqual(currentWaterLevelCalculationsForMechanismSpecificLowerLimitNorm, grassCoverErosionOutwardsFailureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificFactorizedSignalingNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificSignalingNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificSignalingNorm); + CollectionAssert.AreEqual(currentWaveHeightCalculationsForMechanismSpecificLowerLimitNorm, grassCoverErosionOutwardsFailureMechanism.WaveHeightCalculationsForMechanismSpecificLowerLimitNorm); + Assert.AreSame(assessmentSection.HydraulicBoundaryDatabase.Locations.First(), pipingCalculation.InputParameters.HydraulicBoundaryLocation); + Assert.AreSame(pipingOutput, pipingCalculation.Output); + } + } + + mocks.VerifyAll(); + } + public override void Setup() { mocks = new MockRepository(); } - private void AttachObservers(AssessmentSection assessmentSection, bool expectUpdateObserver = false) + private void AttachHydraulicBoundaryDatabaseObserver(AssessmentSection assessmentSection, bool expectUpdateObserver = false) { var hydraulicBoundaryDatabaseObserver = mocks.StrictMock(); + + assessmentSection.HydraulicBoundaryDatabase.Attach(hydraulicBoundaryDatabaseObserver); + + if (expectUpdateObserver) + { + hydraulicBoundaryDatabaseObserver.Expect(o => o.UpdateObserver()); + } + } + + private void AttachLocationAndCalculationObservers(AssessmentSection assessmentSection, bool expectUpdateObserver = false) + { var hydraulicBoundaryLocationsObserver = mocks.StrictMock(); var waterLevelCalculationsForFactorizedSignalingNormObserver = mocks.StrictMock(); @@ -591,9 +718,7 @@ var waveHeightCalculationsForSignalingNormObserver = mocks.StrictMock(); var waveHeightCalculationsForLowerLimitNormObserver = mocks.StrictMock(); var waveHeightCalculationsForFactorizedLowerLimitNormObserver = mocks.StrictMock(); - - var grassCoverErosionOutwardsLocationsObserver = mocks.StrictMock(); - + var waterLevelCalculationsForMechanismSpecificFactorizedSignalingNormObserver = mocks.StrictMock(); var waterLevelCalculationsForMechanismSpecificSignalingNormObserver = mocks.StrictMock(); var waterLevelCalculationsForMechanismSpecificLowerLimitNormObserver = mocks.StrictMock(); @@ -608,7 +733,6 @@ var duneLocationCalculationsForLowerLimitNormObserver = mocks.StrictMock(); var duneLocationCalculationsForFactorizedLowerLimitNormObserver = mocks.StrictMock(); - assessmentSection.HydraulicBoundaryDatabase.Attach(hydraulicBoundaryDatabaseObserver); assessmentSection.HydraulicBoundaryDatabase.Locations.Attach(hydraulicBoundaryLocationsObserver); assessmentSection.WaterLevelCalculationsForFactorizedSignalingNorm.Attach(waterLevelCalculationsForFactorizedSignalingNormObserver); @@ -620,8 +744,6 @@ assessmentSection.WaveHeightCalculationsForLowerLimitNorm.Attach(waveHeightCalculationsForLowerLimitNormObserver); assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.Attach(waveHeightCalculationsForFactorizedLowerLimitNormObserver); - assessmentSection.GrassCoverErosionOutwards.HydraulicBoundaryLocations.Attach(grassCoverErosionOutwardsLocationsObserver); - assessmentSection.GrassCoverErosionOutwards.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm.Attach(waterLevelCalculationsForMechanismSpecificFactorizedSignalingNormObserver); assessmentSection.GrassCoverErosionOutwards.WaterLevelCalculationsForMechanismSpecificSignalingNorm.Attach(waterLevelCalculationsForMechanismSpecificSignalingNormObserver); assessmentSection.GrassCoverErosionOutwards.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm.Attach(waterLevelCalculationsForMechanismSpecificLowerLimitNormObserver); @@ -638,7 +760,6 @@ if (expectUpdateObserver) { - hydraulicBoundaryDatabaseObserver.Expect(o => o.UpdateObserver()); hydraulicBoundaryLocationsObserver.Expect(o => o.UpdateObserver()); waterLevelCalculationsForFactorizedSignalingNormObserver.Expect(o => o.UpdateObserver()); @@ -650,8 +771,6 @@ waveHeightCalculationsForLowerLimitNormObserver.Expect(o => o.UpdateObserver()); waveHeightCalculationsForFactorizedLowerLimitNormObserver.Expect(o => o.UpdateObserver()); - grassCoverErosionOutwardsLocationsObserver.Expect(o => o.UpdateObserver()); - waterLevelCalculationsForMechanismSpecificFactorizedSignalingNormObserver.Expect(o => o.UpdateObserver()); waterLevelCalculationsForMechanismSpecificSignalingNormObserver.Expect(o => o.UpdateObserver()); waterLevelCalculationsForMechanismSpecificLowerLimitNormObserver.Expect(o => o.UpdateObserver());