Index: Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneLocationCalculationsViewBaseTest.cs =================================================================== diff -u -rf228e12299b35a4cc8c96741362da8c1c002e2c7 -re70d344e7e5a117cb2b16fc32820adc921d0bf98 --- Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneLocationCalculationsViewBaseTest.cs (.../DuneLocationCalculationsViewBaseTest.cs) (revision f228e12299b35a4cc8c96741362da8c1c002e2c7) +++ Riskeer/DuneErosion/test/Riskeer.DuneErosion.Forms.Test/Views/DuneLocationCalculationsViewBaseTest.cs (.../DuneLocationCalculationsViewBaseTest.cs) (revision e70d344e7e5a117cb2b16fc32820adc921d0bf98) @@ -22,12 +22,16 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Globalization; using System.IO; using System.Linq; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using Core.Common.TestUtil; +using Core.Common.Util; +using Core.Common.Util.Extensions; using Core.Common.Util.Reflection; using Core.Gui.TestUtil; using NUnit.Extensions.Forms; @@ -38,10 +42,11 @@ using Riskeer.Common.Data.TestUtil; using Riskeer.Common.Service.TestUtil; using Riskeer.DuneErosion.Data; -using Riskeer.DuneErosion.Data.TestUtil; using Riskeer.DuneErosion.Forms.GuiServices; using Riskeer.DuneErosion.Forms.Views; using Riskeer.HydraRing.Calculation.Calculator.Factory; +using Riskeer.HydraRing.Calculation.Data.Input; +using Riskeer.HydraRing.Calculation.Data.Input.Hydraulics; using Riskeer.HydraRing.Calculation.TestUtil.Calculator; namespace Riskeer.DuneErosion.Forms.Test.Views @@ -257,6 +262,80 @@ } [Test] + public void Constructor_WithCalculations_DataGridViewCorrectlyInitialized() + { + // Setup + var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); + + var hydraulicBoundaryData = new HydraulicBoundaryData + { + HydraulicLocationConfigurationDatabase = + { + FilePath = validHlcdFilePath + }, + HydraulicBoundaryDatabases = + { + new HydraulicBoundaryDatabase + { + FilePath = validHrdFilePath, + Locations = + { + hydraulicBoundaryLocation + } + } + } + }; + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(a => a.HydraulicBoundaryData).Return(hydraulicBoundaryData); + mocks.ReplayAll(); + + // Call + using (DuneLocationCalculationsView view = ShowFullyConfiguredDuneLocationCalculationsView(assessmentSection, + hydraulicBoundaryLocation)) + { + // Assert + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + DataGridViewRowCollection rows = dataGridView.Rows; + Assert.AreEqual(2, rows.Count); + + var expectedRow0Values = new object[] + { + false, + "1", + "0", + new Point2D(0, 0).ToString(), + "50", + "320", + "-", + "-", + "-", + "-", + "-", + "-" + }; + DataGridViewTestHelper.AssertExpectedRowFormattedValues(expectedRow0Values, rows[0]); + + var expectedRow1Values = new object[] + { + false, + "2", + "0", + new Point2D(0, 0).ToString(), + "60", + "230", + 1.23.ToString(CultureInfo.CurrentCulture), + 2.34.ToString(CultureInfo.CurrentCulture), + 3.45.ToString(CultureInfo.CurrentCulture), + 4.35.ToString(CultureInfo.CurrentCulture), + 5.54.ToString(CultureInfo.CurrentCulture), + 6.45.ToString(CultureInfo.CurrentCulture) + }; + DataGridViewTestHelper.AssertExpectedRowFormattedValues(expectedRow1Values, rows[1]); + } + } + + [Test] public void GivenFullyConfiguredView_WhenSelectingCellInRow_ThenSelectionChangedFired() { // Given @@ -288,6 +367,32 @@ } [Test] + public void Selection_WithSelectedCalculation_ReturnsSelectedCalculation() + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + using (DuneLocationCalculationsView view = ShowFullyConfiguredDuneLocationCalculationsView(assessmentSection, + new TestHydraulicBoundaryLocation())) + { + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + DataGridViewRow selectedCalculationRow = dataGridView.Rows[0]; + + // Call + selectedCalculationRow.Cells[0].Value = true; + + // Assert + var selection = view.Selection as DuneLocationCalculation; + var dataBoundItem = selectedCalculationRow.DataBoundItem as DuneLocationCalculationRow; + + Assert.NotNull(selection); + Assert.NotNull(dataBoundItem); + Assert.AreSame(dataBoundItem.CalculatableObject, selection); + } + } + + [Test] public void SelectAllButton_SelectAllButtonClicked_AllCalculationsSelected() { // Setup @@ -372,6 +477,204 @@ } [Test] + public void GivenFullyConfiguredDuneLocationCalculationsView_WhenDuneLocationCalculationsUpdatedAndNotified_ThenDataGridCorrectlyUpdated() + { + // Given + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var calculations = new ObservableList(); + using (DuneLocationCalculationsView view = ShowDuneLocationCalculationsView(calculations, + new DuneErosionFailureMechanism(), + assessmentSection)) + { + // Precondition + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + object originalDataSource = dataGridView.DataSource; + DataGridViewRowCollection rows = dataGridView.Rows; + Assert.AreEqual(0, rows.Count); + + // When + var duneLocation = new DuneLocation( + "10", new HydraulicBoundaryLocation(10, string.Empty, 10.0, 10.0), + new DuneLocation.ConstructionProperties + { + CoastalAreaId = 3, + Offset = 80 + }); + var duneLocationCalculation = new DuneLocationCalculation(duneLocation) + { + Output = new DuneLocationCalculationOutput( + CalculationConvergence.CalculatedConverged, + new DuneLocationCalculationOutput.ConstructionProperties + { + WaterLevel = 3.21, + WaveHeight = 4.32, + WavePeriod = 5.43, + MeanTidalAmplitude = 4.35, + WaveDirectionalSpread = 5.54, + TideSurgePhaseDifference = 6.45 + }) + }; + calculations.Add(duneLocationCalculation); + calculations.NotifyObservers(); + + // Then + Assert.AreNotSame(originalDataSource, dataGridView.DataSource); + + var expectedRowValues = new object[] + { + false, + "10", + "10", + new Point2D(10, 10).ToString(), + "3", + "80", + 3.21.ToString(CultureInfo.CurrentCulture), + 4.32.ToString(CultureInfo.CurrentCulture), + 5.43.ToString(CultureInfo.CurrentCulture), + 4.35.ToString(CultureInfo.CurrentCulture), + 5.54.ToString(CultureInfo.CurrentCulture), + 6.45.ToString(CultureInfo.CurrentCulture) + }; + DataGridViewTestHelper.AssertExpectedRowFormattedValues(expectedRowValues, rows[0]); + } + } + + [Test] + public void GivenFullyConfiguredDuneLocationCalculationsView_WhenEachDuneLocationCalculationOutputClearedAndNotified_ThenDataGridViewRowsRefreshedWithNewValues() + { + // Given + var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); + + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + IObservableEnumerable calculations = GenerateDuneLocationCalculations(hydraulicBoundaryLocation); + using (DuneLocationCalculationsView view = ShowDuneLocationCalculationsView(calculations, + new DuneErosionFailureMechanism(), + assessmentSection)) + { + // Precondition + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + DataGridViewRowCollection rows = dataGridView.Rows; + Assert.AreEqual(2, rows.Count); + DataGridViewRow firstRow = rows[0]; + DataGridViewRow secondRow = rows[1]; + + Assert.AreEqual("-", firstRow.Cells[waterLevelColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[waveHeightColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[wavePeriodColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[meanTidalAmplitudeColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[waveDirectionalSpreadColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[tideSurgePhaseDifferenceColumnIndex].FormattedValue); + + Assert.AreEqual(1.23.ToString(CultureInfo.CurrentCulture), secondRow.Cells[waterLevelColumnIndex].FormattedValue); + Assert.AreEqual(2.34.ToString(CultureInfo.CurrentCulture), secondRow.Cells[waveHeightColumnIndex].FormattedValue); + Assert.AreEqual(3.45.ToString(CultureInfo.CurrentCulture), secondRow.Cells[wavePeriodColumnIndex].FormattedValue); + Assert.AreEqual(4.35.ToString(CultureInfo.CurrentCulture), secondRow.Cells[meanTidalAmplitudeColumnIndex].FormattedValue); + Assert.AreEqual(5.54.ToString(CultureInfo.CurrentCulture), secondRow.Cells[waveDirectionalSpreadColumnIndex].FormattedValue); + Assert.AreEqual(6.45.ToString(CultureInfo.CurrentCulture), secondRow.Cells[tideSurgePhaseDifferenceColumnIndex].FormattedValue); + // When + calculations.ForEachElementDo(calculation => + { + calculation.Output = null; + calculation.NotifyObservers(); + }); + + // Then + Assert.AreEqual(2, rows.Count); + Assert.AreEqual("-", firstRow.Cells[waterLevelColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[waveHeightColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[wavePeriodColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[meanTidalAmplitudeColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[waveDirectionalSpreadColumnIndex].FormattedValue); + Assert.AreEqual("-", firstRow.Cells[tideSurgePhaseDifferenceColumnIndex].FormattedValue); + + Assert.AreEqual("-", secondRow.Cells[waterLevelColumnIndex].FormattedValue); + Assert.AreEqual("-", secondRow.Cells[waveHeightColumnIndex].FormattedValue); + Assert.AreEqual("-", secondRow.Cells[wavePeriodColumnIndex].FormattedValue); + Assert.AreEqual("-", secondRow.Cells[meanTidalAmplitudeColumnIndex].FormattedValue); + Assert.AreEqual("-", secondRow.Cells[waveDirectionalSpreadColumnIndex].FormattedValue); + Assert.AreEqual("-", secondRow.Cells[tideSurgePhaseDifferenceColumnIndex].FormattedValue); + } + } + + [Test] + public void CalculateForSelectedButton_OneCalculationSelected_CalculateForSelectedCalculationAndKeepOriginalSelection() + { + // Setup + var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); + + var hydraulicBoundaryData = new HydraulicBoundaryData + { + HydraulicLocationConfigurationDatabase = + { + FilePath = validHlcdFilePath + }, + HydraulicBoundaryDatabases = + { + new HydraulicBoundaryDatabase + { + FilePath = validHrdFilePath, + Version = validHrdFileVersion, + Locations = + { + hydraulicBoundaryLocation + } + } + } + }; + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(a => a.Id).Return("1"); + assessmentSection.Stub(a => a.FailureMechanismContribution).Return(FailureMechanismContributionTestFactory.CreateFailureMechanismContribution()); + assessmentSection.Stub(a => a.HydraulicBoundaryData).Return(hydraulicBoundaryData); + assessmentSection.Stub(a => a.Attach(null)).IgnoreArguments(); + assessmentSection.Stub(a => a.Detach(null)).IgnoreArguments(); + + var calculationsObserver = mocks.StrictMock(); + + var calculatorFactory = mocks.StrictMock(); + calculatorFactory.Expect(cf => cf.CreateDunesBoundaryConditionsCalculator(null)) + .IgnoreArguments() + .Return(new TestDunesBoundaryConditionsCalculator()); + mocks.ReplayAll(); + + IObservableEnumerable calculations = GenerateDuneLocationCalculations(hydraulicBoundaryLocation); + var failureMechanism = new DuneErosionFailureMechanism(); + + using (DuneLocationCalculationsView view = ShowDuneLocationCalculationsView(calculations, + failureMechanism, + assessmentSection)) + { + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + object originalDataSource = dataGridView.DataSource; + DataGridViewRowCollection rows = dataGridView.Rows; + rows[0].Cells[calculateColumnIndex].Value = true; + + calculations.Attach(calculationsObserver); + + var buttonTester = new ButtonTester("CalculateForSelectedButton", testForm); + + using (var viewParent = new TestViewParentForm()) + using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) + { + view.CalculationGuiService = new DuneLocationCalculationGuiService(viewParent); + + // Call + buttonTester.Click(); + + // Assert + Assert.AreSame(originalDataSource, dataGridView.DataSource); + + Assert.IsTrue((bool) rows[0].Cells[calculateColumnIndex].Value); + Assert.IsFalse((bool) rows[1].Cells[calculateColumnIndex].Value); + } + } + } + + [Test] public void CalculateForSelectedButton_OneSelectedButCalculationGuiServiceNotSet_DoesNotThrowException() { // Setup @@ -482,6 +785,93 @@ } } + [Test] + [TestCase(true)] + [TestCase(false)] + public void CalculateForSelectedButton_HydraulicBoundaryDatabaseWithCanUsePreprocessorFalse_CreateDunesBoundaryConditionsCalculatorCalledAsExpected(bool usePreprocessorClosure) + { + // Setup + const double targetProbability = 0.01; + + var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation(); + + IObservableEnumerable duneLocationCalculations = GenerateDuneLocationCalculations(hydraulicBoundaryLocation); + + var hydraulicBoundaryData = new HydraulicBoundaryData + { + HydraulicLocationConfigurationDatabase = + { + FilePath = validHlcdFilePath + }, + HydraulicBoundaryDatabases = + { + new HydraulicBoundaryDatabase + { + FilePath = validHrdFilePath, + UsePreprocessorClosure = usePreprocessorClosure, + Version = validHrdFileVersion, + Locations = + { + hydraulicBoundaryLocation + } + } + } + }; + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(a => a.Id).Return("1"); + assessmentSection.Stub(a => a.FailureMechanismContribution).Return(FailureMechanismContributionTestFactory.CreateFailureMechanismContribution()); + assessmentSection.Stub(a => a.HydraulicBoundaryData).Return(hydraulicBoundaryData); + assessmentSection.Stub(a => a.Attach(null)).IgnoreArguments(); + assessmentSection.Stub(a => a.Detach(null)).IgnoreArguments(); + + var calculatorFactory = mocks.StrictMock(); + var dunesBoundaryConditionsCalculator = new TestDunesBoundaryConditionsCalculator(); + calculatorFactory.Expect(cf => cf.CreateDunesBoundaryConditionsCalculator(Arg.Is.NotNull)) + .WhenCalled(invocation => + { + HydraRingCalculationSettingsTestHelper.AssertHydraRingCalculationSettings( + HydraulicBoundaryCalculationSettingsFactory.CreateSettings(hydraulicBoundaryData, + hydraulicBoundaryLocation), + (HydraRingCalculationSettings) invocation.Arguments[0]); + }) + .Return(dunesBoundaryConditionsCalculator); + mocks.ReplayAll(); + + var failureMechanism = new DuneErosionFailureMechanism(); + + using (var view = new DuneLocationCalculationsView(duneLocationCalculations, + failureMechanism, + assessmentSection, + () => targetProbability, + () => "1/100")) + { + testForm.Controls.Add(view); + testForm.Show(); + + var dataGridView = (DataGridView) view.Controls.Find("dataGridView", true)[0]; + DataGridViewRowCollection rows = dataGridView.Rows; + rows[0].Cells[calculateColumnIndex].Value = true; + + var buttonTester = new ButtonTester("CalculateForSelectedButton", testForm); + + using (var viewParent = new TestViewParentForm()) + using (new HydraRingCalculatorFactoryConfig(calculatorFactory)) + { + view.CalculationGuiService = new DuneLocationCalculationGuiService(viewParent); + + // Call + buttonTester.Click(); + + // Assert + DunesBoundaryConditionsCalculationInput dunesBoundaryConditionsCalculationInput = dunesBoundaryConditionsCalculator.ReceivedInputs.First(); + + Assert.AreEqual(0, dunesBoundaryConditionsCalculationInput.HydraulicBoundaryLocationId); + Assert.AreEqual(StatisticsConverter.ProbabilityToReliability(targetProbability), dunesBoundaryConditionsCalculationInput.Beta); + } + } + } + private DuneLocationCalculationsView ShowFullyConfiguredDuneLocationCalculationsView() { var hydraulicBoundaryLocation = new TestHydraulicBoundaryLocation();