Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit f8af05ce authored by Markus QUARITSCH's avatar Markus QUARITSCH
Browse files

Merge pull request #706 in VECTO/vecto-sim from...

Merge pull request #706 in VECTO/vecto-sim from ~EMQUARIMA/vecto-sim:feature/VECTO-824-throw-exception-for-certain-combinations-of-exempted-vehicle-parameters to develop

* commit '5f7fcba1':
  add check of input data to exempted run. throw exeption in case of invalid input data
  adding testcase for invalid exempted vehicle combinations and exempted he-hdv
parents 9bbcccb3 5f7fcba1
No related branches found
No related tags found
No related merge requests found
using System;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCore.Models.Connector.Ports.Impl;
using TUGraz.VectoCore.Models.Simulation.Data;
......@@ -24,11 +25,28 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
protected override IResponse DoSimulationStep()
{
CheckValidInput();
FinishedWithoutErrors = true;
_writeSumData(null);
return new ResponseCycleFinished();
}
private void CheckValidInput()
{
var vehicleData = Container.RunData.VehicleData;
if (vehicleData.ZeroEmissionVehicle && vehicleData.DualFuelVehicle) {
throw new VectoException("Invalid input: ZE-HDV and DualFuelVehicle are mutually exclusive!");
}
if (!vehicleData.ZeroEmissionVehicle && !vehicleData.HybridElectricHDV && !vehicleData.DualFuelVehicle) {
throw new VectoException("Invalid input: at least one option of ZE-HDV, He-HDV, and DualFuelVehicle has to be set for an exempted vehicle!");
}
if (vehicleData.HybridElectricHDV && (vehicleData.MaxNetPower1 == null || vehicleData.MaxNetPower2 == null)) {
throw new VectoException("For He-HDV both MaxNetPower1 and MaxNetPower2 have to be provided!");
}
}
protected override IResponse Initialize()
{
return new ResponseSuccess();
......
......@@ -2,13 +2,19 @@
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.XPath;
using NUnit.Framework;
using NUnit.Framework.Internal;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Resources;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.OutputData.FileIO;
using TUGraz.VectoCore.Tests.Models.Simulation;
using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Integration
......@@ -31,12 +37,16 @@ namespace TUGraz.VectoCore.Tests.Integration
var customerFile = writer.XMLCustomerReportName;
var manufactuerFile = writer.XMLFullReportName;
var monitoringFile = writer.XMLMonitoringReportName;
if (File.Exists(customerFile)) {
File.Delete(customerFile);
}
if (File.Exists(manufactuerFile)) {
File.Delete(manufactuerFile);
}
if (File.Exists(monitoringFile)) {
File.Delete(monitoringFile);
}
var inputData = new XMLDeclarationInputDataProvider(filename, true); //.ReadJsonJob(relativeJobPath);
var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, writer) {
......@@ -65,6 +75,175 @@ namespace TUGraz.VectoCore.Tests.Integration
var val2 = new XMLValidator(XmlReader.Create(customerFile));
Assert.IsTrue(val2.ValidateXML(XMLValidator.XmlDocumentType.CustomerReport));
var val3 = new XMLValidator(XmlReader.Create(customerFile));
Assert.IsTrue(val3.ValidateXML(XMLValidator.XmlDocumentType.MonitoringReport));
}
[TestCase(ExemptedVehicle, true, true, true, "Invalid input: ZE-HDV and DualFuelVehicle are mutually exclusive!"),
TestCase(ExemptedVehicle, true, false, true, "Invalid input: ZE-HDV and DualFuelVehicle are mutually exclusive!"),
TestCase(ExemptedVehicle, false, false, false, "Invalid input: at least one option of ZE-HDV, He-HDV, and DualFuelVehicle has to be set for an exempted vehicle!")]
public void TestInvalidExemptedCombination(string filename, bool zeroEmission, bool hybrid, bool dualFuel, string exMsg)
{
var writer = new FileOutputWriter(filename);
var customerFile = writer.XMLCustomerReportName;
var manufactuerFile = writer.XMLFullReportName;
var monitoringFile = writer.XMLMonitoringReportName;
if (File.Exists(customerFile)) {
File.Delete(customerFile);
}
if (File.Exists(manufactuerFile)) {
File.Delete(manufactuerFile);
}
if (File.Exists(monitoringFile)) {
File.Delete(monitoringFile);
}
var reader = XmlReader.Create(filename);
var doc = new XmlDocument();
doc.Load(reader);
var nav = doc.CreateNavigator();
SetExemptedParameters(nav, zeroEmission, hybrid, dualFuel);
var modified = XmlReader.Create(new StringReader(nav.OuterXml));
var inputData = new XMLDeclarationInputDataProvider(modified, true);
var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, writer) {
WriteModalResults = true,
ActualModalData = true
};
var jobContainer = new JobContainer(new MockSumWriter());
jobContainer.AddRuns(factory);
AssertHelper.Exception<VectoException>(
() => {
jobContainer.Runs[0].Run.Run();
},
messageContains: exMsg);
Assert.IsFalse(File.Exists(customerFile));
Assert.IsFalse(File.Exists(manufactuerFile));
Assert.IsFalse(File.Exists(monitoringFile));
}
[TestCase(ExemptedVehicle, null, 10000),
TestCase(ExemptedVehicle, 100000, null),
TestCase(ExemptedVehicle, null, null)]
public void TestHybridExemptedRequiresMaxNetPower(string filename, double? maxNetPower1, double? maxNetPower2)
{
var writer = new FileOutputWriter(filename);
var customerFile = writer.XMLCustomerReportName;
var manufactuerFile = writer.XMLFullReportName;
var monitoringFile = writer.XMLMonitoringReportName;
if (File.Exists(customerFile)) {
File.Delete(customerFile);
}
if (File.Exists(manufactuerFile)) {
File.Delete(manufactuerFile);
}
if (File.Exists(monitoringFile)) {
File.Delete(monitoringFile);
}
var reader = XmlReader.Create(filename);
var doc = new XmlDocument();
doc.Load(reader);
var nav = doc.CreateNavigator();
var manager = new XmlNamespaceManager(nav.NameTable);
var helper = new XPathHelper(ExecutionMode.Declaration);
helper.AddNamespaces(manager);
SetExemptedParameters(nav, false, true, false);
var maxPower1 = nav.SelectSingleNode(helper.QueryAbs(
helper.NSPrefix(XMLNames.VectoInputDeclaration,
Constants.XML.RootNSPrefix),
XMLNames.Component_Vehicle,
XMLNames.Vehicle_MaxNetPower1),
manager);
if (maxNetPower1.HasValue) {
maxPower1.SetValue(maxNetPower1.Value.ToXMLFormat(0));
} else {
maxPower1.DeleteSelf();
}
var maxPower2 = nav.SelectSingleNode(helper.QueryAbs(
helper.NSPrefix(XMLNames.VectoInputDeclaration,
Constants.XML.RootNSPrefix),
XMLNames.Component_Vehicle,
XMLNames.Vehicle_MaxNetPower2),
manager);
if (maxNetPower2.HasValue) {
maxPower2.SetValue(maxNetPower2.Value.ToXMLFormat(0));
} else {
maxPower2.DeleteSelf();
}
var modified = XmlReader.Create(new StringReader(nav.OuterXml));
var inputData = new XMLDeclarationInputDataProvider(modified, true);
var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, writer) {
WriteModalResults = true,
ActualModalData = true
};
var jobContainer = new JobContainer(new MockSumWriter());
jobContainer.AddRuns(factory);
AssertHelper.Exception<VectoException>(
() => {
jobContainer.Runs[0].Run.Run();
},
messageContains: "For He-HDV both MaxNetPower1 and MaxNetPower2 have to be provided!");
Assert.IsFalse(File.Exists(customerFile));
Assert.IsFalse(File.Exists(manufactuerFile));
Assert.IsFalse(File.Exists(monitoringFile));
}
private static void SetExemptedParameters(XPathNavigator nav, bool zeroEmission, bool hybrid, bool dualFuel)
{
var manager = new XmlNamespaceManager(nav.NameTable);
var helper = new XPathHelper(ExecutionMode.Declaration);
helper.AddNamespaces(manager);
var zeNode = nav.SelectSingleNode(
helper.QueryAbs(
helper.NSPrefix(
XMLNames.VectoInputDeclaration,
Constants.XML.RootNSPrefix),
XMLNames.Component_Vehicle,
XMLNames.Vehicle_ZeroEmissionVehicle),
manager);
zeNode.SetValue(zeroEmission.ToString().ToLowerInvariant());
var dualfuelNode = nav.SelectSingleNode(
helper.QueryAbs(
helper.NSPrefix(
XMLNames.VectoInputDeclaration,
Constants.XML.RootNSPrefix),
XMLNames.Component_Vehicle,
XMLNames.Vehicle_DualFuelVehicle),
manager);
dualfuelNode.SetValue(dualFuel.ToString().ToLowerInvariant());
var hybridNode = nav.SelectSingleNode(
helper.QueryAbs(
helper.NSPrefix(
XMLNames.VectoInputDeclaration,
Constants.XML.RootNSPrefix),
XMLNames.Component_Vehicle,
XMLNames.Vehicle_HybridElectricHDV),
manager);
hybridNode.SetValue(hybrid.ToString().ToLowerInvariant());
}
}
}
......@@ -49,7 +49,7 @@ namespace TUGraz.VectoCore.Tests.Utils
/// Assert an expected Exception.
/// </summary>
[DebuggerHidden]
public static void Exception<T>(this Action func, string message = null) where T : Exception
public static void Exception<T>(this Action func, string message = null, string messageContains = null) where T : Exception
{
try {
func();
......@@ -58,6 +58,9 @@ namespace TUGraz.VectoCore.Tests.Utils
if (message != null) {
Assert.AreEqual(message, ex.Message);
}
if (messageContains != null) {
Assert.IsTrue(ex.Message.Contains(messageContains));
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment