// Copyright (C) Stichting Deltares 2018. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Controls.DataGrid; using NUnit.Framework; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Common.Data.TestUtil; using Ringtoets.Common.Data.TestUtil.IllustrationPoints; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.Views; namespace Ringtoets.Common.Forms.TestUtil { /// /// Class for testing data and selection synchronization in derivatives. /// /// The type of the calculations contained by the view. [TestFixture] public abstract class CalculationsViewSynchronizationTester where T : class { private Form testForm; /// /// Gets the index of the column containing the calculation output. /// protected abstract int OutputColumnIndex { get; } [SetUp] public virtual void Setup() { testForm = new Form(); } [TearDown] public void TearDown() { testForm.Dispose(); } /// /// Method for obtaining the view selection object related to the selected calculation row. /// /// The calculations view involved. /// The selected calculation row object. /// The view selection object. protected abstract object GetCalculationSelection(CalculationsView view, object selectedRowObject); /// /// Method for showing a fully configured calculations view. /// /// The form to use for showing the view. /// /// The view should contain the following calculation row data: /// /// Row 1: calculation without output /// Row 2: calculation with output not containing a general result /// Row 3: calculation with the flag for reading the general result set to true /// Row 4: calculation with output containing a general result with two top level illustration points /// /// /// The fully configured calculations view. protected abstract CalculationsView ShowFullyConfiguredCalculationsView(Form form); /// /// Method for getting the calculations in . /// /// The view to get the calculations from. /// An of calculations. protected abstract ObservableList GetCalculationsInView(CalculationsView view); private void ReplaceCalculationsAndNotifyObservers(CalculationsView view) { ObservableList calculations = GetCalculationsInView(view); calculations.Clear(); calculations.Add(new HydraulicBoundaryLocationCalculation(new HydraulicBoundaryLocation(10, "10", 10.0, 10.0))); calculations.NotifyObservers(); } private void ClearCalculationOutputAndNotifyObservers(CalculationsView view) { ObservableList calculations = GetCalculationsInView(view); calculations.ForEach(calculation => { calculation.Output = null; calculation.NotifyObservers(); }); } private void SetCalculationOutputAndNotifyObservers(CalculationsView view) { ObservableList calculations = GetCalculationsInView(view); HydraulicBoundaryLocationCalculation hydraulicBoundaryLocationCalculation = calculations.First(); hydraulicBoundaryLocationCalculation.Output = new TestHydraulicBoundaryLocationCalculationOutput(new TestGeneralResultSubMechanismIllustrationPoint()); hydraulicBoundaryLocationCalculation.NotifyObservers(); } private DataGridView GetCalculationsDataGridView() { return ControlTestHelper.GetDataGridView(testForm, "DataGridView"); } private DataGridViewControl GetCalculationsDataGridViewControl() { return ControlTestHelper.GetDataGridViewControl(testForm, "DataGridViewControl"); } private IllustrationPointsControl GetIllustrationPointsControl() { return ControlTestHelper.GetControls(testForm, "IllustrationPointsControl").Single(); } private DataGridView GetIllustrationPointsDataGridView() { return ControlTestHelper.GetDataGridView(GetIllustrationPointsControl(), "DataGridView"); } #region Data synchronization [Test] public void GivenFullyConfiguredView_WhenSelectingCalculationWithoutOutput_ThenIllustrationPointsControlDataSetToEmptyEnumeration() { // Given ShowFullyConfiguredCalculationsView(testForm); IllustrationPointsControl illustrationPointsControl = GetIllustrationPointsControl(); DataGridViewControl calculationsDataGridViewControl = GetCalculationsDataGridViewControl(); // When calculationsDataGridViewControl.SetCurrentCell(calculationsDataGridViewControl.GetCell(0, 1)); // Then CollectionAssert.IsEmpty(illustrationPointsControl.Data); } [Test] public void GivenFullyConfiguredView_WhenSelectingCalculationWithoutGeneralResult_ThenIllustrationPointsControlDataSetToEmptyEnumeration() { // Given ShowFullyConfiguredCalculationsView(testForm); IllustrationPointsControl illustrationPointsControl = GetIllustrationPointsControl(); DataGridViewControl calculationsDataGridViewControl = GetCalculationsDataGridViewControl(); // When calculationsDataGridViewControl.SetCurrentCell(calculationsDataGridViewControl.GetCell(1, 0)); // Then CollectionAssert.IsEmpty(illustrationPointsControl.Data); } [Test] public void GivenFullyConfiguredView_WhenSelectingCalculationWithGeneralResult_ThenGeneralResultSetOnIllustrationPointsControlData() { // Given ShowFullyConfiguredCalculationsView(testForm); IllustrationPointsControl illustrationPointsControl = GetIllustrationPointsControl(); DataGridViewControl calculationsDataGridViewControl = GetCalculationsDataGridViewControl(); // When calculationsDataGridViewControl.SetCurrentCell(calculationsDataGridViewControl.GetCell(3, 0)); // Then Assert.AreEqual(2, illustrationPointsControl.Data.Count()); } [Test] public void GivenFullyConfiguredViewWithFilledIllustrationPointsControl_WhenOutputCleared_ThenDataGridViewsUpdated() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); DataGridViewRowCollection dataGridViewRows = calculationsDataGridView.Rows; calculationsDataGridView.CurrentCell = dataGridViewRows[3].Cells[0]; // Precondition Assert.AreEqual(4, dataGridViewRows.Count); Assert.AreEqual("-", dataGridViewRows[0].Cells[OutputColumnIndex].FormattedValue); Assert.AreNotEqual("-", dataGridViewRows[1].Cells[OutputColumnIndex].FormattedValue); Assert.AreEqual("-", dataGridViewRows[2].Cells[OutputColumnIndex].FormattedValue); Assert.AreNotEqual("-", dataGridViewRows[3].Cells[OutputColumnIndex].FormattedValue); Assert.AreEqual(2, GetIllustrationPointsControl().Data.Count()); var refreshed = false; calculationsDataGridView.Invalidated += (sender, args) => refreshed = true; // When ClearCalculationOutputAndNotifyObservers(view); // Then Assert.IsTrue(refreshed); Assert.AreEqual(4, dataGridViewRows.Count); Assert.AreEqual("-", dataGridViewRows[0].Cells[OutputColumnIndex].FormattedValue); Assert.AreEqual("-", dataGridViewRows[1].Cells[OutputColumnIndex].FormattedValue); Assert.AreEqual("-", dataGridViewRows[2].Cells[OutputColumnIndex].FormattedValue); Assert.AreEqual("-", dataGridViewRows[3].Cells[OutputColumnIndex].FormattedValue); CollectionAssert.IsEmpty(GetIllustrationPointsControl().Data); } #endregion #region Selection synchronization [Test] public void GivenFullyConfiguredView_WhenSelectingCalculation_ThenSelectionUpdated() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); // When calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; // Then DataGridViewRow currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredViewWithCalculationSelection_WhenCalculationsReplaced_ThenSelectionUpdated() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; // Precondition DataGridViewRow currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); // When ReplaceCalculationsAndNotifyObservers(view); // Then currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(0, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredViewWithCalculationSelection_WhenOutputCleared_ThenSelectionPreserved() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; // Precondition DataGridViewRow currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); // When ClearCalculationOutputAndNotifyObservers(view); // Then currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredViewWithCalculationSelection_WhenOutputUpdated_ThenSelectionPreserved() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; // Precondition DataGridViewRow currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); // When SetCalculationOutputAndNotifyObservers(view); // Then currentCalculationRow = GetCalculationsDataGridViewControl().CurrentRow; Assert.AreEqual(3, currentCalculationRow.Index); Assert.AreEqual(GetCalculationSelection(view, currentCalculationRow.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredView_WhenSelectingIllustrationPoint_ThenSelectionUpdated() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; DataGridView illustrationPointsDataGridView = GetIllustrationPointsDataGridView(); // When illustrationPointsDataGridView.CurrentCell = illustrationPointsDataGridView.Rows[1].Cells[0]; // Then AssertIllustrationPointControlSelection(view.Selection); } [Test] public void GivenFullyConfiguredViewWithIllustrationPointSelection_WhenCalculationsReplaced_ThenSelectionSetToCalculation() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; DataGridView illustrationPointsDataGridView = GetIllustrationPointsDataGridView(); illustrationPointsDataGridView.CurrentCell = illustrationPointsDataGridView.Rows[1].Cells[0]; // Precondition Assert.AreEqual(3, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(1, illustrationPointsDataGridView.CurrentRow?.Index); AssertIllustrationPointControlSelection(view.Selection); // When ReplaceCalculationsAndNotifyObservers(view); // Then Assert.AreEqual(0, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(GetCalculationSelection(view, calculationsDataGridView.CurrentRow?.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredViewWithIllustrationPointSelection_WhenOutputCleared_ThenSelectionSetToCalculation() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; DataGridView illustrationPointsDataGridView = GetIllustrationPointsDataGridView(); illustrationPointsDataGridView.CurrentCell = illustrationPointsDataGridView.Rows[1].Cells[0]; // Precondition Assert.AreEqual(3, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(1, illustrationPointsDataGridView.CurrentRow?.Index); AssertIllustrationPointControlSelection(view.Selection); // When ClearCalculationOutputAndNotifyObservers(view); // Then Assert.AreEqual(3, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(GetCalculationSelection(view, calculationsDataGridView.CurrentRow?.DataBoundItem), view.Selection); } [Test] public void GivenFullyConfiguredViewWithIllustrationPointSelection_WhenOutputUpdated_ThenSelectionPreserved() { // Given CalculationsView view = ShowFullyConfiguredCalculationsView(testForm); DataGridView calculationsDataGridView = GetCalculationsDataGridView(); calculationsDataGridView.CurrentCell = calculationsDataGridView.Rows[3].Cells[0]; DataGridView illustrationPointsDataGridView = GetIllustrationPointsDataGridView(); illustrationPointsDataGridView.CurrentCell = illustrationPointsDataGridView.Rows[1].Cells[0]; // Precondition Assert.AreEqual(3, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(1, illustrationPointsDataGridView.CurrentRow?.Index); AssertIllustrationPointControlSelection(view.Selection); // When SetCalculationOutputAndNotifyObservers(view); // Then Assert.AreEqual(3, calculationsDataGridView.CurrentRow?.Index); Assert.AreEqual(1, illustrationPointsDataGridView.CurrentRow?.Index); AssertIllustrationPointControlSelection(view.Selection); } private void AssertIllustrationPointControlSelection(object selection) { var illustrationPointSelection = selection as SelectedTopLevelSubMechanismIllustrationPoint; Assert.IsNotNull(illustrationPointSelection); Assert.AreSame(GetIllustrationPointsControl().Data.ElementAt(1).Source, illustrationPointSelection.TopLevelSubMechanismIllustrationPoint); CollectionAssert.AreEqual(GetIllustrationPointsControl().Data.Select(data => data.ClosingSituation), illustrationPointSelection.ClosingSituations); } #endregion } }