diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs index f91c48b7f25c66d3086c19fe2184d1b3d92d4f71..9e7a01a5038be7fd3f91be6313e5613da6330921 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs @@ -1,4 +1,5 @@ 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(); diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/ExemptedVehicleTest.cs b/VectoCore/VectoCoreTest/Integration/Declaration/ExemptedVehicleTest.cs index bdd2d7e118053c5c1a97fb5d42d0e511f34f1440..f5a4dcee084b13822b7dc3c0cd20ad38f69cf7f6 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/ExemptedVehicleTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/ExemptedVehicleTest.cs @@ -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()); } } } diff --git a/VectoCore/VectoCoreTest/Utils/AssertHelper.cs b/VectoCore/VectoCoreTest/Utils/AssertHelper.cs index ff45cf7277ab7d3c6c7d80d9c9e9ef046c49cef7..99a01e9f9fe937b9011e3c5cd1b051245d5dab69 100644 --- a/VectoCore/VectoCoreTest/Utils/AssertHelper.cs +++ b/VectoCore/VectoCoreTest/Utils/AssertHelper.cs @@ -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)); + } } }