// Copyright (C) Stichting Deltares 2016. 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.Linq;
using Core.Common.Base.Data;
using Core.Common.TestUtil;
using NUnit.Framework;
using Ringtoets.Common.Data.TestUtil;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Data.TestUtil;
using Ringtoets.Piping.KernelWrapper.SubCalculator;
using Ringtoets.Piping.KernelWrapper.TestUtil;
using Ringtoets.Piping.KernelWrapper.TestUtil.SubCalculator;
using Ringtoets.Piping.Primitives;
namespace Ringtoets.Piping.Service.Test
{
[TestFixture]
public class PipingCalculationServiceTest
{
[Test]
public void Validate_Always_LogStartAndEndOfValidatingInputs()
{
// Setup
const string name = "";
PipingCalculation pipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
pipingCalculation.Name = name;
// Call
Action call = () => PipingCalculationService.Validate(pipingCalculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
}
[Test]
public void Validate_InValidPipingCalculationWithOutput_ReturnsFalseNoOutputChange()
{
// Setup
var output = new TestPipingOutput();
PipingCalculation invalidPipingCalculation = PipingCalculationFactory.CreateCalculationWithInvalidData();
invalidPipingCalculation.Output = output;
// Call
bool isValid = PipingCalculationService.Validate(invalidPipingCalculation);
// Assert
Assert.IsFalse(isValid);
Assert.AreSame(output, invalidPipingCalculation.Output);
}
[Test]
public void Validate_InValidCalculationInput_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
var calculation = new PipingCalculation(new GeneralPipingInput())
{
Name = name
};
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(7, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen hydraulische randvoorwaardenlocatie geselecteerd.", msgs[1]);
StringAssert.StartsWith("Validatie mislukt: Er is geen profielschematisatie geselecteerd.", msgs[2]);
StringAssert.StartsWith("Validatie mislukt: Er is geen ondergrondschematisatie geselecteerd.", msgs[3]);
StringAssert.StartsWith("Validatie mislukt: Er is geen waarde voor het intredepunt opgegeven.", msgs[4]);
StringAssert.StartsWith("Validatie mislukt: Er is geen waarde voor het uittredepunt opgegeven.", msgs[5]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutHydraulicBoundaryLocation_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.HydraulicBoundaryLocation = null;
calculation.Name = name;
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen hydraulische randvoorwaardenlocatie geselecteerd.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithHydraulicBoundaryLocationNotCalculated_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.HydraulicBoundaryLocation.DesignWaterLevel = (RoundedDouble) double.NaN;
calculation.Name = name;
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(4, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan het toetspeil niet afleiden op basis van de invoer.", msgs[1]);
StringAssert.StartsWith("Validatie mislukt: Kan de stijghoogte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[2]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutEntryPointL_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.EntryPointL = (RoundedDouble) double.NaN;
calculation.Name = name;
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen waarde voor het intredepunt opgegeven.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutExitPointL_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.ExitPointL = (RoundedDouble) double.NaN;
calculation.Name = name;
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen waarde voor het uittredepunt opgegeven.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutSurfaceLine_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.SurfaceLine = null;
calculation.InputParameters.ExitPointL = (RoundedDouble) 0.9;
calculation.InputParameters.EntryPointL = (RoundedDouble) 0.1;
calculation.Name = name;
// Call
bool isValid = false;
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen profielschematisatie geselecteerd.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutStochasticSoilProfile_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile = null;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Er is geen ondergrondschematisatie geselecteerd.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutAquiferLayer_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(2.0)
{
IsAquifer = false
}
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(6, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de dikte van het watervoerend pakket niet afleiden op basis van de invoer.", msgs[1]);
StringAssert.StartsWith("Validatie mislukt: Kan de totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[2]);
StringAssert.StartsWith("Validatie mislukt: Geen watervoerende laag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[3]);
StringAssert.StartsWith("Validatie mislukt: Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[4]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutAquitardLayer_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
var random = new Random(21);
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(2.0)
{
IsAquifer = true,
DiameterD70Deviation = random.NextDouble(),
DiameterD70Mean = 0.1 + random.NextDouble(),
PermeabilityDeviation = random.NextDouble(),
PermeabilityMean = 0.1 + random.NextDouble()
}
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(4, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[1]);
StringAssert.StartsWith("Validatie mislukt: Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[2]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithoutCoverageLayer_LogsErrorAndReturnsFalse()
{
// Setup
const string name = "";
var random = new Random(21);
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(13.0)
{
IsAquifer = false
},
new PipingSoilLayer(11.0)
{
IsAquifer = true,
DiameterD70Deviation = random.NextDouble(),
DiameterD70Mean = 0.1 + random.NextDouble(),
PermeabilityDeviation = random.NextDouble(),
PermeabilityMean = 0.1 + random.NextDouble()
}
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(4, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de totale deklaagdikte bij het uittredepunt niet afleiden op basis van de invoer.", msgs[1]);
StringAssert.StartsWith("Validatie mislukt: Geen deklaag gevonden voor de ondergrondschematisatie onder de profielschematisatie bij het uittredepunt.", msgs[2]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
[TestCase(false, false)]
[TestCase(false, true)]
[TestCase(true, false)]
public void Validate_CalculationWithIncompleteDiameterD70Definition_LogsErrorAndReturnsFalse(bool meanSet, bool deviationSet)
{
// Setup
const string name = "";
var random = new Random(21);
var incompletePipingSoilLayer = new PipingSoilLayer(5.0)
{
IsAquifer = true,
PermeabilityDeviation = random.NextDouble(),
PermeabilityMean = 0.1 + random.NextDouble()
};
if (meanSet)
{
incompletePipingSoilLayer.DiameterD70Mean = 0.1 + random.NextDouble();
}
if (deviationSet)
{
incompletePipingSoilLayer.DiameterD70Deviation = random.NextDouble();
}
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(10.5)
{
IsAquifer = false,
BelowPhreaticLevelDeviation = GetRandomDoubleFromRange(random, 1e-6, 999.999),
BelowPhreaticLevelMean = GetRandomDoubleFromRange(random, 10.0, 999.999),
BelowPhreaticLevelShift = GetRandomDoubleFromRange(random, 1e-6, 10.0)
},
incompletePipingSoilLayer
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de definitie voor het 70%-fraktiel van de korreldiameter van de watervoerende laag niet (volledig) afleiden.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
[TestCase(false, false)]
[TestCase(false, true)]
[TestCase(true, false)]
public void Validate_CalculationWithIncompletePermeabilityDefinition_LogsErrorAndReturnsFalse(bool meanSet, bool deviationSet)
{
// Setup
const string name = "";
var random = new Random(21);
var incompletePipingSoilLayer = new PipingSoilLayer(5.0)
{
IsAquifer = true,
DiameterD70Deviation = random.NextDouble(),
DiameterD70Mean = 0.1 + random.NextDouble()
};
if (meanSet)
{
incompletePipingSoilLayer.PermeabilityMean = 0.1 + random.NextDouble();
}
if (deviationSet)
{
incompletePipingSoilLayer.PermeabilityDeviation = random.NextDouble();
}
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(10.5)
{
IsAquifer = false,
BelowPhreaticLevelDeviation = GetRandomDoubleFromRange(random, 1e-6, 999.999),
BelowPhreaticLevelMean = GetRandomDoubleFromRange(random, 10.0, 999.999),
BelowPhreaticLevelShift = GetRandomDoubleFromRange(random, 1e-6, 10.0)
},
incompletePipingSoilLayer
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de definitie voor de doorlatendheid van de watervoerende laag niet (volledig) afleiden.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
[TestCase(false, false, false)]
[TestCase(false, true, true)]
[TestCase(true, false, true)]
[TestCase(true, true, false)]
public void Validate_CalculationWithIncompletSaturatedVolumicWeightDefinition_LogsErrorAndReturnsFalse(bool meanSet, bool deviationSet, bool shiftSet)
{
// Setup
const string name = "";
var random = new Random(21);
var incompletePipingSoilLayer = new PipingSoilLayer(10.5)
{
IsAquifer = false,
};
if (deviationSet)
{
incompletePipingSoilLayer.BelowPhreaticLevelDeviation = random.NextDouble();
}
if (shiftSet)
{
incompletePipingSoilLayer.BelowPhreaticLevelShift = random.NextDouble();
}
if (meanSet)
{
incompletePipingSoilLayer.BelowPhreaticLevelMean = 0.1 + incompletePipingSoilLayer.BelowPhreaticLevelShift + random.NextDouble();
}
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
incompletePipingSoilLayer,
new PipingSoilLayer(5.0)
{
IsAquifer = true,
PermeabilityDeviation = random.NextDouble(),
PermeabilityMean = 0.1 + random.NextDouble(),
DiameterD70Deviation = random.NextDouble(),
DiameterD70Mean = 0.1 + random.NextDouble()
}
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Validatie mislukt: Kan de definitie voor het verzadigd gewicht van de deklaag niet (volledig) afleiden.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsFalse(isValid);
}
[Test]
public void Validate_CalculationWithMultipleCoverageLayer_LogsWarningAndReturnsTrue()
{
// Setup
const string name = "";
var random = new Random(21);
var belowPhreaticLevelDeviation = random.NextDouble();
var belowPhreaticLevelShift = random.NextDouble();
var profile = new PipingSoilProfile(string.Empty, 0.0,
new[]
{
new PipingSoilLayer(10.5)
{
IsAquifer = false,
BelowPhreaticLevelDeviation = belowPhreaticLevelDeviation,
BelowPhreaticLevelShift = belowPhreaticLevelShift,
BelowPhreaticLevelMean = 0.1 + belowPhreaticLevelShift + random.NextDouble()
},
new PipingSoilLayer(8.5)
{
IsAquifer = false,
BelowPhreaticLevelDeviation = belowPhreaticLevelDeviation,
BelowPhreaticLevelShift = belowPhreaticLevelShift,
BelowPhreaticLevelMean = 0.1 + belowPhreaticLevelShift + random.NextDouble()
},
new PipingSoilLayer(5.0)
{
IsAquifer = true,
PermeabilityDeviation = random.NextDouble(),
PermeabilityMean = 0.1 + random.NextDouble(),
DiameterD70Deviation = random.NextDouble(),
DiameterD70Mean = 0.1 + random.NextDouble()
}
},
SoilProfileType.SoilProfile1D, -1);
PipingCalculation calculation = PipingCalculationFactory.CreateCalculationWithValidInput();
calculation.InputParameters.StochasticSoilProfile.SoilProfile = profile;
calculation.Name = name;
bool isValid = false;
// Call
Action call = () => isValid = PipingCalculationService.Validate(calculation);
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
Assert.AreEqual(3, msgs.Length);
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith("Meerdere aaneengesloten deklagen gevonden. De grondeigenschappen worden bepaald door het nemen van een gewogen gemiddelde, mits de standaardafwijkingen en verschuivingen voor alle lagen gelijk zijn.", msgs[1]);
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs.Last());
});
Assert.IsTrue(isValid);
}
[Test]
public void Calculate_ValidPipingCalculation_LogStartAndEndOfValidatingInputsAndCalculation()
{
// Setup
const string name = "";
PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
validPipingCalculation.Name = name;
Action call = () =>
{
// Precondition
Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation));
// Call
PipingCalculationService.Calculate(validPipingCalculation);
};
// Assert
TestHelper.AssertLogMessages(call, messages =>
{
var msgs = messages.ToArray();
StringAssert.StartsWith(string.Format("Validatie van '{0}' gestart om: ", name), msgs.First());
StringAssert.StartsWith(string.Format("Validatie van '{0}' beëindigd om: ", name), msgs[1]);
StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", name), msgs[2]);
StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", name), msgs.Last());
});
}
[Test]
public void Calculate_ValidPipingCalculationNoOutput_ShouldSetOutput()
{
// Setup
PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
// Precondition
Assert.IsNull(validPipingCalculation.Output);
Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation));
// Call
PipingCalculationService.Calculate(validPipingCalculation);
// Assert
Assert.IsNotNull(validPipingCalculation.Output);
}
[Test]
public void Calculate_ValidPipingCalculationWithOutput_ShouldChangeOutput()
{
// Setup
var output = new TestPipingOutput();
PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
validPipingCalculation.Output = output;
// Precondition
Assert.IsTrue(PipingCalculationService.Validate(validPipingCalculation));
// Call
PipingCalculationService.Calculate(validPipingCalculation);
// Assert
Assert.AreNotSame(output, validPipingCalculation.Output);
}
[Test]
public void Validate_CompleteInput_InputSetOnSubCalculators()
{
// Setup
PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
PipingInput input = validPipingCalculation.InputParameters;
using (new PipingSubCalculatorFactoryConfig())
{
// Call
PipingCalculationService.Validate(validPipingCalculation);
// Assert
AssertSubCalculatorInputs(input);
}
}
[Test]
public void Calculate_CompleteInput_InputSetOnSubCalculators()
{
// Setup
PipingCalculation validPipingCalculation = PipingCalculationFactory.CreateCalculationWithValidInput();
PipingInput input = validPipingCalculation.InputParameters;
using (new PipingSubCalculatorFactoryConfig())
{
// Call
PipingCalculationService.Calculate(validPipingCalculation);
// Assert
AssertSubCalculatorInputs(input);
}
}
private void AssertSubCalculatorInputs(PipingInput input)
{
var testFactory = (TestPipingSubCalculatorFactory) PipingSubCalculatorFactory.Instance;
var heaveCalculator = testFactory.LastCreatedHeaveCalculator;
var upliftCalculator = testFactory.LastCreatedUpliftCalculator;
var sellmeijerCalculator = testFactory.LastCreatedSellmeijerCalculator;
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetThicknessCoverageLayer(input).GetDesignValue(),
heaveCalculator.DTotal,
input.ThicknessCoverageLayer.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(),
heaveCalculator.HExit,
input.PhreaticLevelExit.GetAccuracy());
Assert.AreEqual(input.CriticalHeaveGradient, heaveCalculator.Ich);
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(),
heaveCalculator.PhiPolder,
input.PhreaticLevelExit.GetAccuracy());
Assert.AreEqual(input.PiezometricHeadExit.Value, heaveCalculator.PhiExit);
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(),
heaveCalculator.RExit,
input.DampingFactorExit.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(),
upliftCalculator.HExit,
input.PhreaticLevelExit.GetAccuracy());
Assert.AreEqual(input.AssessmentLevel.Value, upliftCalculator.HRiver);
Assert.AreEqual(input.UpliftModelFactor, upliftCalculator.ModelFactorUplift);
Assert.AreEqual(input.PiezometricHeadExit.Value, upliftCalculator.PhiExit);
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(),
upliftCalculator.PhiPolder,
input.PhreaticLevelExit.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDampingFactorExit(input).GetDesignValue(),
upliftCalculator.RExit,
input.DampingFactorExit.GetAccuracy());
Assert.AreEqual(input.WaterVolumetricWeight, upliftCalculator.VolumetricWeightOfWater);
RoundedDouble effectiveStress = PipingSemiProbabilisticDesignValueFactory.GetThicknessCoverageLayer(input).GetDesignValue()*
(PipingSemiProbabilisticDesignValueFactory.GetSaturatedVolumicWeightOfCoverageLayer(input).GetDesignValue() - input.WaterVolumetricWeight);
Assert.AreEqual(effectiveStress, upliftCalculator.EffectiveStress,
effectiveStress.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetSeepageLength(input).GetDesignValue(),
sellmeijerCalculator.SeepageLength,
input.SeepageLength.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(),
sellmeijerCalculator.HExit,
input.PhreaticLevelExit.GetAccuracy());
Assert.AreEqual(input.AssessmentLevel.Value, sellmeijerCalculator.HRiver);
Assert.AreEqual(input.WaterKinematicViscosity, sellmeijerCalculator.KinematicViscosityWater);
Assert.AreEqual(input.SellmeijerModelFactor, sellmeijerCalculator.ModelFactorPiping);
Assert.AreEqual(input.SellmeijerReductionFactor, sellmeijerCalculator.Rc);
Assert.AreEqual(input.WaterVolumetricWeight, sellmeijerCalculator.VolumetricWeightOfWater);
Assert.AreEqual(input.WhitesDragCoefficient, sellmeijerCalculator.WhitesDragCoefficient);
Assert.AreEqual(input.BeddingAngle, sellmeijerCalculator.BeddingAngle);
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetThicknessCoverageLayer(input).GetDesignValue(),
sellmeijerCalculator.DTotal,
input.ThicknessCoverageLayer.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDiameter70(input).GetDesignValue(),
sellmeijerCalculator.D70,
input.Diameter70.GetAccuracy());
Assert.AreEqual(input.MeanDiameter70, sellmeijerCalculator.D70Mean);
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetThicknessAquiferLayer(input).GetDesignValue(),
sellmeijerCalculator.DAquifer,
input.ThicknessAquiferLayer.GetAccuracy());
Assert.AreEqual(PipingSemiProbabilisticDesignValueFactory.GetDarcyPermeability(input).GetDesignValue(),
sellmeijerCalculator.DarcyPermeability,
input.DarcyPermeability.GetAccuracy());
Assert.AreEqual(input.SandParticlesVolumicWeight, sellmeijerCalculator.GammaSubParticles);
Assert.AreEqual(input.Gravity, sellmeijerCalculator.Gravity);
}
private double GetRandomDoubleFromRange(Random random, double lowerLimit, double upperLimit)
{
double difference = upperLimit - lowerLimit;
return lowerLimit + random.NextDouble()*difference;
}
}
}