// Copyright (C) Stichting Deltares and State of the Netherlands 2025. All rights reserved.
//
// This file is part of Riskeer.
//
// Riskeer 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 Core.Common.Base.Geometry;
using Core.Common.TestUtil;
using NUnit.Framework;
using Rhino.Mocks;
using Riskeer.Common.Data.AssessmentSection;
using Riskeer.Common.Data.FailureMechanism;
using Riskeer.Common.Data.Probability;
using Riskeer.Common.Data.TestUtil;
using Riskeer.Common.Forms.TypeConverters;
using Riskeer.Piping.Data;
using Riskeer.Piping.Data.SemiProbabilistic;
using Riskeer.Piping.Data.TestUtil;
using Riskeer.Piping.Forms.Views;
namespace Riskeer.Piping.Forms.Test.Views
{
[TestFixture]
public class SemiProbabilisticPipingScenarioRowTest
{
[Test]
public void Constructor_AssessmentSectionNull_ThrowsArgumentNullException()
{
// Setup
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
// Call
void Call() => new SemiProbabilisticPipingScenarioRow(new SemiProbabilisticPipingCalculationScenario(),
new PipingFailureMechanism(), sectionConfiguration, null);
// Assert
var exception = Assert.Throws(Call);
Assert.AreEqual("assessmentSection", exception.ParamName);
}
[Test]
public void Constructor_FailureMechanismNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
// Call
void Call() => new SemiProbabilisticPipingScenarioRow(new SemiProbabilisticPipingCalculationScenario(),
null, sectionConfiguration, assessmentSection);
// Assert
var exception = Assert.Throws(Call);
Assert.AreEqual("failureMechanism", exception.ParamName);
mocks.VerifyAll();
}
[Test]
public void Construction_SectionConfigurationNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
// Call
void Call() => new SemiProbabilisticPipingScenarioRow(new SemiProbabilisticPipingCalculationScenario(),
new PipingFailureMechanism(), null, assessmentSection);
// Assert
var exception = Assert.Throws(Call);
Assert.AreEqual("sectionConfiguration", exception.ParamName);
mocks.VerifyAll();
}
[Test]
public void Constructor_ExpectedValues()
{
// Setup
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario();
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
// Call
var row = new SemiProbabilisticPipingScenarioRow(calculation, failureMechanism, sectionConfiguration, assessmentSection);
// Assert
Assert.IsInstanceOf>(row);
Assert.AreSame(calculation, row.CalculationScenario);
TestHelper.AssertTypeConverter(
nameof(SemiProbabilisticPipingScenarioRow.FailureProbabilityUplift));
TestHelper.AssertTypeConverter(
nameof(SemiProbabilisticPipingScenarioRow.FailureProbabilityHeave));
TestHelper.AssertTypeConverter(
nameof(SemiProbabilisticPipingScenarioRow.FailureProbabilitySellmeijer));
}
[Test]
[TestCase(1)]
[TestCase(1000)]
public void Constructor_CalculationWithOutput_ExpectedValues(double sectionLength)
{
// Setup
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario
{
Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput()
};
var failureMechanismSection = new FailureMechanismSection("test", new[]
{
new Point2D(0, 0),
new Point2D(sectionLength, 0)
});
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
// Call
var row = new SemiProbabilisticPipingScenarioRow(calculation, failureMechanism, sectionConfiguration, assessmentSection);
// Assert
DerivedSemiProbabilisticPipingOutput expectedDerivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(calculation.Output, assessmentSection.FailureMechanismContribution.NormativeProbability);
Assert.AreEqual(expectedDerivedOutput.PipingProbability, row.FailureProbability);
Assert.AreEqual(expectedDerivedOutput.UpliftProbability, row.FailureProbabilityUplift);
Assert.AreEqual(expectedDerivedOutput.HeaveProbability, row.FailureProbabilityHeave);
Assert.AreEqual(expectedDerivedOutput.SellmeijerProbability, row.FailureProbabilitySellmeijer);
Assert.AreEqual(Math.Min(1.0, expectedDerivedOutput.PipingProbability * sectionConfiguration.GetN(
failureMechanism.GeneralInput.B)),
row.SectionFailureProbability);
mocks.VerifyAll();
}
[Test]
public void Constructor_CalculationWithoutOutput_ExpectedValues()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario();
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
// Call
var row = new SemiProbabilisticPipingScenarioRow(calculation, new PipingFailureMechanism(), sectionConfiguration, assessmentSection);
// Assert
Assert.IsNaN(row.FailureProbability);
Assert.IsNaN(row.FailureProbabilityUplift);
Assert.IsNaN(row.FailureProbabilityHeave);
Assert.IsNaN(row.FailureProbabilitySellmeijer);
Assert.IsNaN(row.SectionFailureProbability);
mocks.VerifyAll();
}
[Test]
public void GivenScenarioRow_WhenOutputSetAndUpdate_ThenDerivedOutputUpdated()
{
// Given
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario();
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
var row = new SemiProbabilisticPipingScenarioRow(calculation, failureMechanism, sectionConfiguration, assessmentSection);
// Precondition
Assert.IsNaN(row.FailureProbability);
Assert.IsNaN(row.FailureProbabilityUplift);
Assert.IsNaN(row.FailureProbabilityHeave);
Assert.IsNaN(row.FailureProbabilitySellmeijer);
Assert.IsNaN(row.SectionFailureProbability);
// When
calculation.Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput();
row.Update();
// Then
DerivedSemiProbabilisticPipingOutput expectedDerivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(calculation.Output, assessmentSection.FailureMechanismContribution.NormativeProbability);
Assert.AreEqual(expectedDerivedOutput.PipingProbability, row.FailureProbability);
Assert.AreEqual(expectedDerivedOutput.UpliftProbability, row.FailureProbabilityUplift);
Assert.AreEqual(expectedDerivedOutput.HeaveProbability, row.FailureProbabilityHeave);
Assert.AreEqual(expectedDerivedOutput.SellmeijerProbability, row.FailureProbabilitySellmeijer);
Assert.AreEqual(expectedDerivedOutput.PipingProbability * sectionConfiguration.GetN(
failureMechanism.GeneralInput.B),
row.SectionFailureProbability);
mocks.VerifyAll();
}
[Test]
public void GivenScenarioRow_WhenOutputSetToNullAndUpdate_ThenDerivedOutputUpdated()
{
// Given
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario
{
Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput()
};
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
var row = new SemiProbabilisticPipingScenarioRow(calculation, failureMechanism, sectionConfiguration, assessmentSection);
// Precondition
DerivedSemiProbabilisticPipingOutput expectedDerivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(calculation.Output, assessmentSection.FailureMechanismContribution.NormativeProbability);
Assert.AreEqual(expectedDerivedOutput.PipingProbability, row.FailureProbability);
Assert.AreEqual(expectedDerivedOutput.UpliftProbability, row.FailureProbabilityUplift);
Assert.AreEqual(expectedDerivedOutput.HeaveProbability, row.FailureProbabilityHeave);
Assert.AreEqual(expectedDerivedOutput.SellmeijerProbability, row.FailureProbabilitySellmeijer);
Assert.AreEqual(expectedDerivedOutput.PipingProbability * sectionConfiguration.GetN(
failureMechanism.GeneralInput.B),
row.SectionFailureProbability);
// When
calculation.Output = null;
row.Update();
// Then
Assert.IsNaN(row.FailureProbability);
Assert.IsNaN(row.FailureProbabilityUplift);
Assert.IsNaN(row.FailureProbabilityHeave);
Assert.IsNaN(row.FailureProbabilitySellmeijer);
Assert.IsNaN(row.SectionFailureProbability);
mocks.VerifyAll();
}
[Test]
public void GivenScenarioRow_WhenOutputChangedAndUpdate_ThenDerivedOutputUpdated()
{
// Given
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionTestHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
var calculation = new SemiProbabilisticPipingCalculationScenario
{
Output = PipingTestDataGenerator.GetRandomSemiProbabilisticPipingOutput()
};
FailureMechanismSection failureMechanismSection = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionConfiguration = new PipingFailureMechanismSectionConfiguration(failureMechanismSection);
var row = new SemiProbabilisticPipingScenarioRow(calculation, failureMechanism, sectionConfiguration, assessmentSection);
// Precondition
DerivedSemiProbabilisticPipingOutput expectedDerivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(calculation.Output, assessmentSection.FailureMechanismContribution.NormativeProbability);
Assert.AreEqual(expectedDerivedOutput.PipingProbability, row.FailureProbability);
Assert.AreEqual(expectedDerivedOutput.UpliftProbability, row.FailureProbabilityUplift);
Assert.AreEqual(expectedDerivedOutput.HeaveProbability, row.FailureProbabilityHeave);
Assert.AreEqual(expectedDerivedOutput.SellmeijerProbability, row.FailureProbabilitySellmeijer);
Assert.AreEqual(expectedDerivedOutput.PipingProbability * sectionConfiguration.GetN(
failureMechanism.GeneralInput.B),
row.SectionFailureProbability);
var random = new Random(11);
// When
calculation.Output = PipingTestDataGenerator.GetSemiProbabilisticPipingOutput(random.NextDouble(), random.NextDouble(), random.NextDouble());
row.Update();
// Then
DerivedSemiProbabilisticPipingOutput newExpectedDerivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(calculation.Output, assessmentSection.FailureMechanismContribution.NormativeProbability);
Assert.AreEqual(newExpectedDerivedOutput.PipingProbability, row.FailureProbability);
Assert.AreEqual(newExpectedDerivedOutput.UpliftProbability, row.FailureProbabilityUplift);
Assert.AreEqual(newExpectedDerivedOutput.HeaveProbability, row.FailureProbabilityHeave);
Assert.AreEqual(newExpectedDerivedOutput.SellmeijerProbability, row.FailureProbabilitySellmeijer);
Assert.AreEqual(newExpectedDerivedOutput.PipingProbability * sectionConfiguration.GetN(
failureMechanism.GeneralInput.B),
row.SectionFailureProbability);
mocks.VerifyAll();
}
}
}