// 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.MacroStabilityInwards.Data.TestUtil;
namespace Ringtoets.MacroStabilityInwards.Data.Test
{
[TestFixture]
public class MacroStabilityInwardsFailureMechanismSectionResultDetailedAssessmentExtensionsTest
{
[Test]
public void GetDetailedAssessmentProbability_SectionResultNull_ThrowsArgumentNullException()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
// Call
TestDelegate call = () => MacroStabilityInwardsFailureMechanismSectionResultDetailedAssessmentExtensions.GetDetailedAssessmentProbability(
null, Enumerable.Empty(),
new MacroStabilityInwardsFailureMechanism(), 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 MacroStabilityInwardsFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => failureMechanismSectionResult.GetDetailedAssessmentProbability(null, new MacroStabilityInwardsFailureMechanism(), 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 MacroStabilityInwardsFailureMechanismSectionResult(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 MacroStabilityInwardsFailureMechanismSectionResult(section);
// Call
TestDelegate call = () => failureMechanismSectionResult.GetDetailedAssessmentProbability(Enumerable.Empty(),
new MacroStabilityInwardsFailureMechanism(),
null);
// Assert
var exception = Assert.Throws(call);
Assert.AreEqual("assessmentSection", exception.ParamName);
}
[Test]
public void GetDetailedAssessmentProbability_MultipleScenarios_ReturnsValueBasedOnRelevantScenarios()
{
// Setup
var failureMechanism = new MacroStabilityInwardsFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
const double factorOfStability1 = 1.0 / 1000000.0;
const double factorOfStability2 = 1.0 / 2000000.0;
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario1 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenario(factorOfStability1, section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario2 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenario(factorOfStability2, section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario3 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenario(0.0, section);
macroStabilityInwardsCalculationScenario1.IsRelevant = true;
macroStabilityInwardsCalculationScenario1.Contribution = (RoundedDouble) 0.2;
macroStabilityInwardsCalculationScenario2.IsRelevant = true;
macroStabilityInwardsCalculationScenario2.Contribution = (RoundedDouble) 0.8;
macroStabilityInwardsCalculationScenario3.IsRelevant = false;
var calculations = new[]
{
macroStabilityInwardsCalculationScenario1,
macroStabilityInwardsCalculationScenario2,
macroStabilityInwardsCalculationScenario3
};
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(calculations, failureMechanism, assessmentSection);
// Assert
Assert.AreEqual(0.99801160064610306, detailedAssessmentProbability, 1e-8);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_NoScenarios_ReturnsNaN()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var failureMechanism = new MacroStabilityInwardsFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(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 MacroStabilityInwardsFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
var calculationScenarios = new[]
{
MacroStabilityInwardsCalculationScenarioTestFactory.CreateIrrelevantMacroStabilityInwardsCalculationScenario(section)
};
// 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 MacroStabilityInwardsFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
// Call
double detailedAssessmentProbability = failureMechanismSectionResult.GetDetailedAssessmentProbability(new[]
{
macroStabilityInwardsCalculationScenario
}, failureMechanism, assessmentSection);
// Assert
Assert.IsNaN(detailedAssessmentProbability);
mocks.VerifyAll();
}
[Test]
public void GetDetailedAssessmentProbability_ScenarioWithNanResults_ReturnsNaN()
{
// Setup
var failureMechanism = new MacroStabilityInwardsFailureMechanism();
var mocks = new MockRepository();
IAssessmentSection assessmentSection = AssessmentSectionHelper.CreateAssessmentSectionStub(failureMechanism, mocks);
mocks.ReplayAll();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
const double contribution1 = 0.2;
const double contribution2 = 0.8;
MacroStabilityInwardsCalculationScenario calculationScenario1 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenario(0, section);
MacroStabilityInwardsCalculationScenario calculationScenario2 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
calculationScenario1.IsRelevant = true;
calculationScenario1.Contribution = (RoundedDouble) contribution1;
calculationScenario2.IsRelevant = true;
calculationScenario2.Contribution = (RoundedDouble) contribution2;
calculationScenario2.Output = MacroStabilityInwardsOutputTestFactory.CreateOutput();
var calculations = new[]
{
calculationScenario1,
calculationScenario2
};
// 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 MacroStabilityInwardsFailureMechanism();
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
MacroStabilityInwardsCalculationScenario scenarioA = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
MacroStabilityInwardsCalculationScenario scenarioB = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
scenarioA.Contribution = (RoundedDouble) contributionA;
scenarioB.Contribution = (RoundedDouble) contributionB;
var result = new MacroStabilityInwardsFailureMechanismSectionResult(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 = () => ((MacroStabilityInwardsFailureMechanismSectionResult) 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 MacroStabilityInwardsFailureMechanismSectionResult(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 MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
macroStabilityInwardsCalculationScenario.Contribution = (RoundedDouble) 0.3;
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario2 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenarioWithNaNOutput(section);
macroStabilityInwardsCalculationScenario2.Contribution = (RoundedDouble) 0.5;
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario3 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateIrrelevantMacroStabilityInwardsCalculationScenario(section);
var calculationScenarios = new[]
{
macroStabilityInwardsCalculationScenario,
macroStabilityInwardsCalculationScenario2,
macroStabilityInwardsCalculationScenario3
};
// Call
RoundedDouble totalContribution = failureMechanismSectionResult.GetTotalContribution(calculationScenarios);
// Assert
Assert.AreEqual((RoundedDouble) 0.8, totalContribution);
}
[Test]
public void GetCalculationScenarioStatus_SectionResultNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => ((MacroStabilityInwardsFailureMechanismSectionResult) 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 MacroStabilityInwardsFailureMechanismSectionResult(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 MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
macroStabilityInwardsCalculationScenario
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status);
}
[Test]
public void GetCalculationScenarioStatus_ScenarioNaNOutput_ReturnsStatusDone()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenarioWithNaNOutput(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
macroStabilityInwardsCalculationScenario
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.Done, status);
}
[Test]
public void GetCalculationScenarioStatus_ScenariosWithNotCalculatedScenario_ReturnsStatusNotCalculated()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario2 = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenarioWithNaNOutput(section);
var calculationScenarios = new[]
{
macroStabilityInwardsCalculationScenario,
macroStabilityInwardsCalculationScenario2
};
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(calculationScenarios);
// Assert
Assert.AreEqual(CalculationScenarioStatus.NotCalculated, status);
}
[Test]
public void GetCalculationScenarioStatus_ScenarioCalculated_ReturnsStatusDone()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario macroStabilityInwardsCalculationScenario = MacroStabilityInwardsCalculationScenarioTestFactory.CreateMacroStabilityInwardsCalculationScenario(0.1, section);
macroStabilityInwardsCalculationScenario.Contribution = (RoundedDouble) 1.0;
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(new[]
{
macroStabilityInwardsCalculationScenario
});
// Assert
Assert.AreEqual(CalculationScenarioStatus.Done, status);
}
[Test]
public void GetCalculationScenarioStatus_NoScenarios_ReturnsStatusDone()
{
// Setup
FailureMechanismSection section = FailureMechanismSectionTestFactory.CreateFailureMechanismSection();
var failureMechanismSectionResult = new MacroStabilityInwardsFailureMechanismSectionResult(section);
// Call
CalculationScenarioStatus status = failureMechanismSectionResult.GetCalculationScenarioStatus(Enumerable.Empty());
// Assert
Assert.AreEqual(CalculationScenarioStatus.Done, status);
}
[Test]
public void GetCalculationScenarios_SectionResultNull_ThrowsArgumentNullException()
{
// Call
TestDelegate call = () => ((MacroStabilityInwardsFailureMechanismSectionResult) 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 MacroStabilityInwardsFailureMechanismSectionResult(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 MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario calculationScenario =
MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(section);
MacroStabilityInwardsCalculationScenario calculationScenario2 =
MacroStabilityInwardsCalculationScenarioTestFactory.CreateIrrelevantMacroStabilityInwardsCalculationScenario(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 MacroStabilityInwardsFailureMechanismSectionResult(section);
MacroStabilityInwardsCalculationScenario calculationScenario =
MacroStabilityInwardsCalculationScenarioTestFactory.CreateNotCalculatedMacroStabilityInwardsCalculationScenario(
FailureMechanismSectionTestFactory.CreateFailureMechanismSection());
// Call
IEnumerable relevantScenarios = sectionResult.GetCalculationScenarios(new[]
{
calculationScenario
});
// Assert
CollectionAssert.IsEmpty(relevantScenarios);
}
}
}