// 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.Collections.Generic;
using System.Linq;
using Core.Common.Base.Data;
using Core.Common.Base.Geometry;
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.Piping.Data.TestUtil;
namespace Ringtoets.Piping.Data.Test
{
[TestFixture]
public class PipingFailureMechanismSectionResultDetailedAssessmentExtensionsTest
{
[Test]
public void GetDetailedAssessmentProbability_SectionResultNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
// Call
TestDelegate call = () => PipingFailureMechanismSectionResultDetailedAssessmentExtensions.GetDetailedAssessmentProbability(
null, Enumerable.Empty(),
new PipingFailureMechanism(), assessmentSection);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("sectionResult", exception.ParamName);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_CalculationsNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => failureMechanismSectionResult.GetDetailedAssessmentProbability(null, new PipingFailureMechanism(), assessmentSection);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("calculations", exception.ParamName);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_FailureMechanismNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => failureMechanismSectionResult.GetDetailedAssessmentProbability(Enumerable.Empty(),
null,
assessmentSection);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("failureMechanism", exception.ParamName);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_AssessmentSectionNull_ThrowsArgumentNullException()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => failureMechanismSectionResult.GetDetailedAssessmentProbability(Enumerable.Empty(),
new PipingFailureMechanism(),
null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("assessmentSection", exception.ParamName);
}
[Test]
public void GetDetailedAssessmentProbability_MultipleScenarios_ReturnsValueBasedOnRelevantScenarios()
{
// Setup
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario1 = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
PipingCalculationScenario pipingCalculationScenario2 = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
PipingCalculationScenario pipingCalculationScenario3 = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
pipingCalculationScenario1.IsRelevant = true;
pipingCalculationScenario1.Contribution = (RoundedDouble) 0.2;
pipingCalculationScenario2.IsRelevant = true;
pipingCalculationScenario2.Contribution = (RoundedDouble) 0.8;
pipingCalculationScenario3.IsRelevant = false;
var calculations = new[]
{
pipingCalculationScenario1,
pipingCalculationScenario2,
pipingCalculationScenario3
};
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(calculations, failureMechanism, assessmentSection);
// Assert
Assert.AreEqual(0.028693041013187315, detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_NoScenarios_ReturnsNaN()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var failureMechanism = new PipingFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(Enumerable.Empty(),
failureMechanism,
assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_NoRelevantScenarios_ReturnsNaN()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var failureMechanism = new PipingFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario calculationScenario1 = PipingCalculationScenarioTestFactory.CreateIrrelevantPipingCalculationScenario(section);
PipingCalculationScenario calculationScenario2 = PipingCalculationScenarioTestFactory.CreateIrrelevantPipingCalculationScenario(section);
var calculationScenarios = new[]
{
calculationScenario1,
calculationScenario2
};
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(calculationScenarios,
failureMechanism,
assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_ScenarioNotCalculated_ReturnsNaN()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var failureMechanism = new PipingFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(new[]
{
pipingCalculationScenario
}, failureMechanism, assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_ScenarioWithNanResults_ReturnsNaN()
{
// Setup
var failureMechanism = new PipingFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
const double contribution1 = 0.2;
const double contribution2 = 0.8;
PipingCalculationScenario pipingCalculationScenario1 = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
PipingCalculationScenario pipingCalculationScenario2 = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
pipingCalculationScenario1.IsRelevant = true;
pipingCalculationScenario1.Contribution = (RoundedDouble) contribution1;
pipingCalculationScenario2.IsRelevant = true;
pipingCalculationScenario2.Contribution = (RoundedDouble) contribution2;
pipingCalculationScenario2.Output = new PipingOutput(new PipingOutput.ConstructionProperties());
var calculations = new[]
{
pipingCalculationScenario1,
pipingCalculationScenario2
};
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(calculations, failureMechanism, assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
[TestCase(0.2, 0.8 - 1e5)]
[TestCase(0.0, 0.5)]
[TestCase(0.3, 0.7 + 1e-5)]
[TestCase(-5, -8)]
[TestCase(13, 2)]
public void GetDetailedAssessmentProbability_RelevantScenarioContributionDontAddUpTo1_ReturnNaN(double contributionA, double contributionB)
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var failureMechanism = new PipingFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
PipingCalculationScenario scenarioA = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
PipingCalculationScenario scenarioB = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
scenarioA.Contribution = (RoundedDouble) contributionA;
scenarioB.Contribution = (RoundedDouble) contributionB;
var result = new PipingFailureMechanismSectionResult(section);
// Call
double detailedAssessmentProbability = result.GetDetailedAssessmentProbability(new[]
{
scenarioA,
scenarioB
}, failureMechanism, assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetTotalContribution_SectionResultNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => ((PipingFailureMechanismSectionResult) null).GetTotalContribution(Enumerable.Empty());
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("sectionResult", exception.ParamName);
}
[Test]
public void GetTotalContribution_CalculationScenariosNull_ThrowsArgumentNullException()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => sectionResult.GetTotalContribution(null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("calculationScenarios", exception.ParamName);
}
[Test]
public void GetTotalContribution_WithScenarios_ReturnsTotalRelevantScenarioContribution()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
pipingCalculationScenario.Contribution = (RoundedDouble) 0.3;
PipingCalculationScenario pipingCalculationScenario2 = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
pipingCalculationScenario2.Contribution = (RoundedDouble) 0.5;
PipingCalculationScenario pipingCalculationScenario3 = PipingCalculationScenarioTestFactory.CreateIrrelevantPipingCalculationScenario(section);
var calculationScenarios = new[]
{
pipingCalculationScenario,
pipingCalculationScenario2,
pipingCalculationScenario3
};
// Call
RoundedDouble totalContribution = failureMechanismSectionResult.GetTotalContribution(calculationScenarios);
// Assert
Assert.AreEqual((RoundedDouble) 0.8, totalContribution);
}
[Test]
public void GetCalculationScenarioStatus_SectionResultNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => ((PipingFailureMechanismSectionResult) null).GetCalculationScenarioStatus(Enumerable.Empty());
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("sectionResult", exception.ParamName);
}
[Test]
public void GetCalculationScenarioStatus_CalculationScenariosNull_ThrowsArgumentNullException()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => sectionResult.GetCalculationScenarioStatus(null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("calculationScenarios", exception.ParamName);
}
[Test]
public void GetCalculationScenarioStatus_ScenarioNotCalculated_ReturnsStatusNotCalculated()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
pipingCalculationScenario
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status);
}
[Test]
public void GetCalculationScenarioStatus_ScenarioCalculated_ReturnsStatusDone()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
pipingCalculationScenario
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.Done, status);
}
[Test]
public void GetCalculationScenarioStatus_NoScenarios_ReturnsStatusDone()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(Enumerable.Empty());
// Assert
Assert.AreEqual(CalculationScenarioStatus.Done, status);
}
[Test]
public void GetCalculationScenarioStatus_DifferentScenarios_ReturnsStatusNotCalculated()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario pipingCalculationScenario1 = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
PipingCalculationScenario pipingCalculationScenario2 = PipingCalculationScenarioTestFactory.CreatePipingCalculationScenario(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
pipingCalculationScenario1,
pipingCalculationScenario2
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status);
}
[Test]
public void GetCalculationScenarios_SectionResultNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => ((PipingFailureMechanismSectionResult) null).GetCalculationScenarios(Enumerable.Empty());
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("sectionResult", exception.ParamName);
}
[Test]
public void GetCalculationScenarios_CalculationScenariosNull_ThrowsArgumentNullException()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionResult = new PipingFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => sectionResult.GetCalculationScenarios(null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("calculationScenarios", exception.ParamName);
}
[Test]
public void GetCalculationScenarios_WithRelevantAndIrrelevantScenarios_ReturnsRelevantCalculationScenarios()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var sectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario calculationScenario = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(section);
PipingCalculationScenario calculationScenario2 = PipingCalculationScenarioTestFactory.CreateIrrelevantPipingCalculationScenario(section);
// Call
IEnumerable relevantScenarios = sectionResult.GetCalculationScenarios(new[]
{
calculationScenario,
calculationScenario2
});
// Assert
Assert.AreEqual(calculationScenario, relevantScenarios.Single());
}
[Test]
public void GetCalculationScenarios_WithNotIntersectingScenario_ReturnsNoCalculationScenarios()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection(new[]
{
new Point2D(999, 999),
new Point2D(998, 998)
});
var sectionResult = new PipingFailureMechanismSectionResult(section);
PipingCalculationScenario calculationScenario = PipingCalculationScenarioTestFactory.CreateNotCalculatedPipingCalculationScenario(
FailureMechanismSectionTestFactory.CreateFailureMechanismSection());
// Call
IEnumerable relevantScenarios = sectionResult.GetCalculationScenarios(new[]
{
calculationScenario
});
// Assert
CollectionAssert.IsEmpty(relevantScenarios);
}
}
}