// Copyright (C) Stichting Deltares 2017. 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;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
using Core.Common.Base;
using Core.Common.Base.Data;
using Core.Common.Base.Geometry;
using Core.Common.Controls.DataGrid;
using Core.Common.Controls.Views;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using Rhino.Mocks;
using Ringtoets.Common.Data.AssessmentSection;
using Ringtoets.Common.Data.Calculation;
using Ringtoets.Common.Data.FailureMechanism;
using Ringtoets.Common.Data.TestUtil;
using Ringtoets.Common.Forms.Helpers;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Data.TestUtil;
using Ringtoets.Piping.Forms.Views;
using Ringtoets.Piping.Primitives;
namespace Ringtoets.Piping.Forms.Test.Views
{
[TestFixture]
public class PipingScenariosViewTest : NUnitFormTest
{
private const int isRelevantColumnIndex = 0;
private const int contributionColumnIndex = 1;
private const int nameColumnIndex = 2;
private const int failureProbabilityPipingColumnIndex = 3;
private const int failureProbabilityUpliftColumnIndex = 4;
private const int failureProbabilityHeaveColumnIndex = 5;
private const int failureProbabilitySellmeijerColumnIndex = 6;
private Form testForm;
[Test]
public void Constructor_AssessmentSectionNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => new PipingScenariosView(null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("assessmentSection", exception.ParamName);
}
[Test]
public void Constructor_ExpectedValues()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
// Call
using (var pipingScenarioView = new PipingScenariosView(assessmentSection))
{
// Assert
Assert.IsInstanceOf(pipingScenarioView);
Assert.IsInstanceOf(pipingScenarioView);
Assert.IsNull(pipingScenarioView.Data);
Assert.IsNull(pipingScenarioView.PipingFailureMechanism);
}
mocks.VerifyAll();
}
[Test]
public void Constructor_DataGridViewCorrectlyInitialized()
{
// Setup & Call
ShowPipingScenarioView();
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
// Assert
Assert.IsFalse(dataGridView.AutoGenerateColumns);
Assert.AreEqual(7, dataGridView.ColumnCount);
foreach (DataGridViewComboBoxColumn column in dataGridView.Columns.OfType())
{
Assert.AreEqual("This", column.ValueMember);
Assert.AreEqual("DisplayName", column.DisplayMember);
}
}
[Test]
public void Constructor_DataGridViewControlColumnHeadersCorrectlyInitialized_()
{
// Setup
using (ShowPipingScenarioView())
{
// Call
var dataGridViewControl = (DataGridViewControl) new ControlTester("dataGridViewControl").TheObject;
// Assert
DataGridViewColumn isRelevantColumn = dataGridViewControl.GetColumnFromIndex(isRelevantColumnIndex);
Assert.AreEqual("In oordeel", isRelevantColumn.HeaderText);
DataGridViewColumn contributionColumn = dataGridViewControl.GetColumnFromIndex(contributionColumnIndex);
Assert.AreEqual("Bijdrage aan\r\nscenario\r\n[%]", contributionColumn.HeaderText);
DataGridViewColumn nameColumn = dataGridViewControl.GetColumnFromIndex(nameColumnIndex);
Assert.AreEqual("Naam", nameColumn.HeaderText);
DataGridViewColumn failureProbabilityPipingColumn = dataGridViewControl.GetColumnFromIndex(failureProbabilityPipingColumnIndex);
Assert.AreEqual("Faalkans\r\n[1/jaar]", failureProbabilityPipingColumn.HeaderText);
DataGridViewColumn failureProbabilityUpliftColumn = dataGridViewControl.GetColumnFromIndex(failureProbabilityUpliftColumnIndex);
Assert.AreEqual("Kans op\r\nopbarsten\r\n[1/jaar]", failureProbabilityUpliftColumn.HeaderText);
DataGridViewColumn failureProbabilityHeaveColumn = dataGridViewControl.GetColumnFromIndex(failureProbabilityHeaveColumnIndex);
Assert.AreEqual("Kans op\r\nheave\r\n[1/jaar]", failureProbabilityHeaveColumn.HeaderText);
DataGridViewColumn failureProbabilitySellmeijerColumn = dataGridViewControl.GetColumnFromIndex(failureProbabilitySellmeijerColumnIndex);
Assert.AreEqual("Kans op\r\nterugschrijdende erosie\r\n[1/jaar]", failureProbabilitySellmeijerColumn.HeaderText);
Assert.Throws(() => dataGridViewControl.GetColumnFromIndex(failureProbabilitySellmeijerColumnIndex + 1));
}
}
[Test]
public void Constructor_ListBoxCorrectlyInitialized()
{
// Setup & Call
ShowPipingScenarioView();
var listBox = (ListBox) new ControlTester("listBox").TheObject;
// Assert
Assert.AreEqual(0, listBox.Items.Count);
}
[Test]
public void Data_SetToNull_DoesNotThrow()
{
// Setup
PipingScenariosView pipingScenarioView = ShowPipingScenarioView();
// Call
var testDelegate = new TestDelegate(() => pipingScenarioView.Data = null);
// Assert
Assert.DoesNotThrow(testDelegate);
}
[Test]
public void PipingFailureMechanism_PipingFailureMechanismWithSections_SectionsListBoxCorrectlyInitialized()
{
// Setup
var failureMechanism = new PipingFailureMechanism();
var failureMechanismSection1 = new FailureMechanismSection("Section 1", new[]
{
new Point2D(0.0, 0.0),
new Point2D(5.0, 0.0)
});
var failureMechanismSection2 = new FailureMechanismSection("Section 2", new[]
{
new Point2D(5.0, 0.0),
new Point2D(10.0, 0.0)
});
var failureMechanismSection3 = new FailureMechanismSection("Section 3", new[]
{
new Point2D(10.0, 0.0),
new Point2D(15.0, 0.0)
});
FailureMechanismTestHelper.SetSections(failureMechanism, new[]
{
failureMechanismSection1,
failureMechanismSection2,
failureMechanismSection3
});
PipingScenariosView pipingScenarioView = ShowPipingScenarioView();
// Call
pipingScenarioView.PipingFailureMechanism = failureMechanism;
// Assert
var listBox = (ListBox) new ControlTester("listBox").TheObject;
Assert.AreEqual(3, listBox.Items.Count);
Assert.AreSame(failureMechanismSection1, listBox.Items[0]);
Assert.AreSame(failureMechanismSection2, listBox.Items[1]);
Assert.AreSame(failureMechanismSection3, listBox.Items[2]);
}
[Test]
public void GivenPipingScenariosViewWithPipingFailureMechanism_WhenSectionsAddedAndPipingFailureMechanismNotified_ThenSectionsListBoxCorrectlyUpdated()
{
// Given
var failureMechanism = new PipingFailureMechanism();
var failureMechanismSection1 = new FailureMechanismSection("Section 1", new[]
{
new Point2D(0.0, 0.0),
new Point2D(5.0, 0.0)
});
var failureMechanismSection2 = new FailureMechanismSection("Section 2", new[]
{
new Point2D(5.0, 0.0),
new Point2D(10.0, 0.0)
});
var failureMechanismSection3 = new FailureMechanismSection("Section 3", new[]
{
new Point2D(10.0, 0.0),
new Point2D(15.0, 0.0)
});
PipingScenariosView pipingScenarioView = ShowPipingScenarioView();
pipingScenarioView.PipingFailureMechanism = failureMechanism;
var listBox = (ListBox) new ControlTester("listBox").TheObject;
// Precondition
Assert.AreEqual(0, listBox.Items.Count);
FailureMechanismTestHelper.SetSections(failureMechanism, new[]
{
failureMechanismSection1,
failureMechanismSection2,
failureMechanismSection3
});
// When
failureMechanism.NotifyObservers();
// Then
Assert.AreEqual(3, listBox.Items.Count);
Assert.AreSame(failureMechanismSection1, listBox.Items[0]);
Assert.AreSame(failureMechanismSection2, listBox.Items[1]);
Assert.AreSame(failureMechanismSection3, listBox.Items[2]);
}
[Test]
public void PipingScenarioView_CalculationsWithAllDataSet_DataGridViewCorrectlyInitialized()
{
// Setup & Call
ShowFullyConfiguredPipingScenarioView();
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
// Assert
DataGridViewRowCollection rows = dataGridView.Rows;
Assert.AreEqual(2, rows.Count);
DataGridViewCellCollection cells = rows[0].Cells;
Assert.AreEqual(7, cells.Count);
Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue));
Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue);
Assert.AreEqual("Calculation 1", cells[nameColumnIndex].FormattedValue);
Assert.AreEqual("-", cells[failureProbabilityPipingColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityUpliftColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityHeaveColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue);
cells = rows[1].Cells;
Assert.AreEqual(7, cells.Count);
Assert.IsTrue(Convert.ToBoolean(cells[isRelevantColumnIndex].FormattedValue));
Assert.AreEqual(new RoundedDouble(2, 100).ToString(), cells[contributionColumnIndex].FormattedValue);
Assert.AreEqual("Calculation 2", cells[nameColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(2.425418e-4), cells[failureProbabilityPipingColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(2.425418e-4), cells[failureProbabilityUpliftColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(0.038461838), cells[failureProbabilityHeaveColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(0.027777778), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue);
}
[Test]
public void PipingScenarioView_ContributionValueInvalid_ShowsErrorTooltip()
{
// Setup
ShowFullyConfiguredPipingScenarioView();
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
// Call
dataGridView.Rows[0].Cells[contributionColumnIndex].Value = "test";
// Assert
Assert.AreEqual("De tekst moet een getal zijn.", dataGridView.Rows[0].ErrorText);
}
[Test]
[TestCase(1)]
[TestCase(1e-6)]
[TestCase(1e+6)]
[TestCase(14.3)]
public void FailureMechanismResultView_EditValueValid_DoNotShowErrorToolTipAndEditValue(double newValue)
{
// Setup
ShowFullyConfiguredPipingScenarioView();
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
// Call
dataGridView.Rows[0].Cells[contributionColumnIndex].Value = (RoundedDouble) newValue;
// Assert
Assert.IsEmpty(dataGridView.Rows[0].ErrorText);
}
[Test]
[TestCase(isRelevantColumnIndex, true)]
[TestCase(contributionColumnIndex, 30.0)]
public void PipingScenarioView_EditingPropertyViaDataGridView_ObserversCorrectlyNotified(int cellIndex, object newValue)
{
// Setup
var mocks = new MockRepository();
var pipingCalculationObserver = mocks.StrictMock();
var pipingCalculationInputObserver = mocks.StrictMock();
pipingCalculationObserver.Expect(o => o.UpdateObserver());
mocks.ReplayAll();
PipingScenariosView pipingCalculationView = ShowFullyConfiguredPipingScenarioView();
var data = (CalculationGroup) pipingCalculationView.Data;
var pipingCalculation = (PipingCalculationScenario) data.Children.First();
pipingCalculation.Attach(pipingCalculationObserver);
pipingCalculation.InputParameters.Attach(pipingCalculationInputObserver);
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
// Call
dataGridView.Rows[0].Cells[cellIndex].Value = newValue is double ? (RoundedDouble) (double) newValue : newValue;
// Assert
mocks.VerifyAll();
}
[Test]
public void GivenPipingScenarioView_WhenFailureMechanismNotifiesObserver_ThenViewUpdated()
{
// Given
using (PipingScenariosView view = ShowFullyConfiguredPipingScenarioView())
{
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
PipingScenarioRow[] sectionResultRows = dataGridView.Rows.Cast()
.Select(r => r.DataBoundItem)
.Cast()
.ToArray();
// When
view.PipingFailureMechanism.PipingProbabilityAssessmentInput.A = 0.01;
view.PipingFailureMechanism.NotifyObservers();
// Then
PipingScenarioRow[] updatedRows = dataGridView.Rows.Cast()
.Select(r => r.DataBoundItem)
.Cast()
.ToArray();
CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows);
}
}
[Test]
public void GivenPipingScenarioView_WhenCalculationNotifiesObserver_ThenViewUpdated()
{
// Given
using (ShowFullyConfiguredPipingScenarioView())
{
var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject;
var refreshed = 0;
dataGridView.Invalidated += (sender, args) => refreshed++;
DataGridViewRowCollection rows = dataGridView.Rows;
DataGridViewRow calculationRow = rows[1];
PipingCalculationScenario calculation = ((PipingScenarioRow) calculationRow.DataBoundItem).Calculation;
// Precondition
DataGridViewCellCollection cells = calculationRow.Cells;
Assert.AreEqual(7, cells.Count);
Assert.AreEqual(ProbabilityFormattingHelper.Format(2.425418e-4), cells[failureProbabilityPipingColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(2.425418e-4), cells[failureProbabilityUpliftColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(0.038461838), cells[failureProbabilityHeaveColumnIndex].FormattedValue);
Assert.AreEqual(ProbabilityFormattingHelper.Format(0.027777778), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue);
// When
calculation.ClearOutput();
calculation.NotifyObservers();
// Then
Assert.AreEqual(1, refreshed);
Assert.AreEqual("-", cells[failureProbabilityPipingColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityUpliftColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilityHeaveColumnIndex].FormattedValue);
Assert.AreEqual("-".ToString(CultureInfo.CurrentCulture), cells[failureProbabilitySellmeijerColumnIndex].FormattedValue);
}
}
public override void Setup()
{
base.Setup();
testForm = new Form();
}
public override void TearDown()
{
base.TearDown();
testForm.Dispose();
}
private PipingScenariosView ShowFullyConfiguredPipingScenarioView()
{
var surfaceLine1 = new PipingSurfaceLine("Surface line 1")
{
ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0)
};
surfaceLine1.SetGeometry(new[]
{
new Point3D(0.0, 5.0, 0.0),
new Point3D(0.0, 0.0, 1.0),
new Point3D(0.0, -5.0, 0.0)
});
var surfaceLine2 = new PipingSurfaceLine("Surface line 2")
{
ReferenceLineIntersectionWorldPoint = new Point2D(5.0, 0.0)
};
surfaceLine2.SetGeometry(new[]
{
new Point3D(5.0, 5.0, 0.0),
new Point3D(5.0, 0.0, 1.0),
new Point3D(5.0, -5.0, 0.0)
});
var failureMechanism = new PipingFailureMechanism();
FailureMechanismTestHelper.SetSections(failureMechanism, new[]
{
new FailureMechanismSection("Section 1", new[]
{
new Point2D(0.0, 0.0),
new Point2D(5.0, 0.0)
}),
new FailureMechanismSection("Section 2", new[]
{
new Point2D(5.0, 0.0),
new Point2D(10.0, 0.0)
})
});
PipingScenariosView pipingScenarioView = ShowPipingScenarioView();
pipingScenarioView.Data = new CalculationGroup
{
Children =
{
new PipingCalculationScenario(new GeneralPipingInput())
{
Name = "Calculation 1",
InputParameters =
{
SurfaceLine = surfaceLine1,
DampingFactorExit =
{
Mean = (RoundedDouble) 1.1111
},
PhreaticLevelExit =
{
Mean = (RoundedDouble) 2.2222
},
EntryPointL = (RoundedDouble) 3.3333,
ExitPointL = (RoundedDouble) 4.4444
}
},
new PipingCalculationScenario(new GeneralPipingInput())
{
Name = "Calculation 2",
InputParameters =
{
SurfaceLine = surfaceLine2,
DampingFactorExit =
{
Mean = (RoundedDouble) 5.5555
},
PhreaticLevelExit =
{
Mean = (RoundedDouble) 6.6666
},
EntryPointL = (RoundedDouble) 7.7777,
ExitPointL = (RoundedDouble) 8.8888
},
Output = PipingOutputTestFactory.Create(0.26065, 0.81398, 0.38024)
}
}
};
pipingScenarioView.PipingFailureMechanism = failureMechanism;
return pipingScenarioView;
}
private PipingScenariosView ShowPipingScenarioView()
{
var pipingScenarioView = new PipingScenariosView(new AssessmentSectionStub());
testForm.Controls.Add(pipingScenarioView);
testForm.Show();
return pipingScenarioView;
}
}
}