diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs index ef2e843c343d63b9d4548377517c69ba3ac56e48..7df4c4ad66a80c30ee482655a0673ac17e5cbbe5 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs @@ -39,7 +39,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData throw new VectoException("PTO Idle LossMap must contain at least 2 entries."); } - if (!data.Columns.Contains(Fields.EngineSpeed) || !data.Columns.Contains(Fields.PTOTorque)) { + if (!(data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PTOTorque))) { data.Columns[0].ColumnName = Fields.EngineSpeed; data.Columns[1].ColumnName = Fields.PTOTorque; LoggingObject.Logger<RetarderLossMap>().Warn( diff --git a/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs b/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs index 3b8c7eedc9062c08f6c967825db663885a420adc..e588cee7a07a5ec4bfb68fa7bee7887da1da2eb6 100644 --- a/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/DrivingCycleDataReader.cs @@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.InputData.Reader /// <exception cref="VectoException">CycleFile Format is unknown.</exception> public static CycleType DetectCycleType(DataTable cycleData) { - var cols = cycleData.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToArray(); + var cols = cycleData.Columns; if (PTOCycleDataParser.ValidateHeader(cols, false)) { return CycleType.PTO; @@ -336,10 +336,12 @@ namespace TUGraz.VectoCore.InputData.Reader private abstract class AbstractCycleDataParser : LoggingObject, ICycleDataParser { - protected static bool CheckColumns(string[] header, IEnumerable<string> allowedCols, IEnumerable<string> requiredCols, - bool throwExceptions, bool allowAux) + protected static bool CheckColumns(DataColumnCollection header, IEnumerable<string> allowedCols, + IEnumerable<string> requiredCols, bool throwExceptions, bool allowAux) { - var diff = header.GroupBy(c => c).Where(g => g.Count() > 2).SelectMany(g => g).ToList(); + var headerStr = header.Cast<DataColumn>().Select(col => col.ColumnName.ToLowerInvariant()).ToArray(); + + var diff = headerStr.GroupBy(c => c).Where(g => g.Count() > 2).SelectMany(g => g).ToList(); if (diff.Any()) { if (throwExceptions) { throw new VectoException("Column(s) defined more than once: " + string.Join(", ", diff.OrderBy(x => x))); @@ -348,10 +350,10 @@ namespace TUGraz.VectoCore.InputData.Reader } if (allowAux) { - header = header.Where(c => !c.ToUpper().StartsWith(Constants.Auxiliaries.Prefix)).ToArray(); + headerStr = headerStr.Where(c => !c.ToUpper().StartsWith(Constants.Auxiliaries.Prefix)).ToArray(); } - diff = header.Except(allowedCols).ToList(); + diff = headerStr.Except(allowedCols.Select(x => x.ToLowerInvariant())).ToList(); if (diff.Any()) { if (throwExceptions) { throw new VectoException("Column(s) not allowed: " + string.Join(", ", diff)); @@ -359,7 +361,7 @@ namespace TUGraz.VectoCore.InputData.Reader return false; } - diff = requiredCols.Except(header).ToList(); + diff = requiredCols.Select(x => x.ToLowerInvariant()).Except(headerStr).ToList(); if (diff.Any()) { if (throwExceptions) { throw new VectoException("Column(s) required: " + string.Join(", ", diff)); @@ -369,9 +371,12 @@ namespace TUGraz.VectoCore.InputData.Reader return true; } - protected static bool CheckComboColumns(string[] header, string[] cols, bool throwExceptions) + protected static bool CheckComboColumns(DataColumnCollection header, string[] cols, bool throwExceptions) { - var colCount = header.Intersect(cols).Count(); + var colCount = header.Cast<DataColumn>() + .Select(col => col.ColumnName.ToLowerInvariant()) + .Intersect(cols.Select(x => x.ToLowerInvariant())).Count(); + if (colCount != 0 && colCount != cols.Length) { if (throwExceptions) { throw new VectoException("Either all columns have to be defined or none of them: {0}", string.Join(", ", cols)); @@ -389,7 +394,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); return table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { Distance = row.ParseDouble(Fields.Distance).SI<Meter>(), @@ -407,7 +412,7 @@ namespace TUGraz.VectoCore.InputData.Reader }); } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { Fields.Distance, @@ -441,7 +446,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); var absTime = 0; foreach (DataRow row in table.Rows) { @@ -472,7 +477,7 @@ namespace TUGraz.VectoCore.InputData.Reader } } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { //Fields.Time not needed --> if missing 1 second resolution is assumed @@ -520,7 +525,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); var entries = table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { Time = row.ParseDouble(Fields.Time).SI<Second>(), @@ -533,7 +538,7 @@ namespace TUGraz.VectoCore.InputData.Reader return entries; } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { Fields.Time, @@ -561,7 +566,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); var entries = table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { Time = row.ParseDouble(Fields.Time).SI<Second>(), @@ -577,7 +582,7 @@ namespace TUGraz.VectoCore.InputData.Reader return entries; } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { Fields.Time, @@ -608,7 +613,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); var entries = table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { Time = row.ParseDouble(Fields.Time).SI<Second>(), @@ -630,7 +635,7 @@ namespace TUGraz.VectoCore.InputData.Reader return entries; } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { Fields.Time, @@ -664,7 +669,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public override IEnumerable<DrivingCycleData.DrivingCycleEntry> Parse(DataTable table, bool crossWindRequired) { - ValidateHeader(table.Columns.Cast<DataColumn>().Select(col => col.ColumnName).ToArray()); + ValidateHeader(table.Columns); var entries = table.Rows.Cast<DataRow>().Select(row => new DrivingCycleData.DrivingCycleEntry { Time = row.ParseDouble(Fields.Time).SI<Second>(), @@ -675,7 +680,7 @@ namespace TUGraz.VectoCore.InputData.Reader return entries; } - public static bool ValidateHeader(string[] header, bool throwExceptions = true) + public static bool ValidateHeader(DataColumnCollection header, bool throwExceptions = true) { var requiredCols = new[] { Fields.Time, diff --git a/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs index b16fabc724a236dbf597ef4ce28f794878ef719c..5c61430a62ce97e9655982ddace47fd7f31e4459 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs @@ -31,6 +31,7 @@ using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; +using NUnit.Framework; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -41,13 +42,14 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.Tests.Utils; using TUGraz.VectoCore.Utils; +using Assert = Microsoft.VisualStudio.TestTools.UnitTesting.Assert; namespace TUGraz.VectoCore.Tests.Models.Simulation { - [TestClass] + [TestFixture] public class DrivingCycleTests { - [TestMethod] + [TestCase()] public void TestEngineOnly() { var dataWriter = new MockModalDataContainer(); @@ -79,7 +81,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation Assert.AreEqual(0.SI<NewtonMeter>(), outPort.Torque); } - [TestMethod] + [TestCase()] public void TestEngineOnlyWithTimestamps() { var container = new VehicleContainer(ExecutionMode.Engineering); @@ -151,176 +153,227 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation } } - [TestMethod] - public void DrivingCycle_AutoDetect() - { + [ // declaration mode - distance based - TestCycleDetect("<s>,<v>,<grad>,<stop>", CycleType.DistanceBased); - TestCycleDetect("<s>,<<v>,>grad>,<stop>", CycleType.DistanceBased); + TestCase("<s>,<v>,<grad>,<stop>", CycleType.DistanceBased), + TestCase("<s>,<<v>,>grad>,<stop>", CycleType.DistanceBased), // engineering mode - distance based - TestCycleDetect("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased); - TestCycleDetect("<s>,<v>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased); - TestCycleDetect("<s>,<v>,<grad>,<stop>,<Padd>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased); - TestCycleDetect("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>", CycleType.DistanceBased); - TestCycleDetect("<s>,<v>,<stop>,<Padd>", CycleType.DistanceBased); - TestCycleDetect("s,v,stop,Padd", CycleType.DistanceBased); - TestCycleDetect("s,v,stop", CycleType.DistanceBased); + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased), + TestCase("<s>,<v>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased), + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<Aux_ELE>,<Aux_SP>", CycleType.DistanceBased), + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>", CycleType.DistanceBased), + TestCase("<s>,<v>,<stop>,<Padd>", CycleType.DistanceBased), + TestCase("s,v,stop,Padd", CycleType.DistanceBased), + TestCase("s,v,stop", CycleType.DistanceBased), // engineering mode - time based // mk 2016-03-01: plain time based cycle does not exist anymore. replaced by measuredspeed, measuredspeed gear, engineonly and pwheel // engine only - TestCycleDetect("<t>,<n>,<Me>,<Padd>", CycleType.EngineOnly); - TestCycleDetect("<t>,<n>,<Me>", CycleType.EngineOnly); - TestCycleDetect("<t>,<n>,<Me>,<Pe>,<Padd>", CycleType.EngineOnly); - TestCycleDetect("<t>,<n>,<Pe>,<Padd>", CycleType.EngineOnly); - TestCycleDetect("<t>,<n>,<Pe>", CycleType.EngineOnly); - TestCycleDetect("<Me>,<n>,<Padd>,<t>", CycleType.EngineOnly); - TestCycleDetect("t,n,Me,Padd", CycleType.EngineOnly); + TestCase("<t>,<n>,<Me>,<Padd>", CycleType.EngineOnly), + TestCase("<t>,<n>,<Me>", CycleType.EngineOnly), + TestCase("<t>,<n>,<Me>,<Pe>,<Padd>", CycleType.EngineOnly), + TestCase("<t>,<n>,<Pe>,<Padd>", CycleType.EngineOnly), + TestCase("<t>,<n>,<Pe>", CycleType.EngineOnly), + TestCase("<Me>,<n>,<Padd>,<t>", CycleType.EngineOnly), + TestCase("t,n,Me,Padd", CycleType.EngineOnly), // p_wheel - TestCycleDetect("<t>,<Pwheel>,<gear>,<n>,<Padd>", CycleType.PWheel); - TestCycleDetect("<gear>,<t>,<n>,<Padd>,<Pwheel>", CycleType.PWheel); - TestCycleDetect("<t>,<Pwheel>,<gear>,<n>", CycleType.PWheel); - TestCycleDetect("t,Pwheel,gear,n,Padd", CycleType.PWheel); - TestCycleDetect("Pwheel,t,gear,n,Padd", CycleType.PWheel); + TestCase("<t>,<Pwheel>,<gear>,<n>,<Padd>", CycleType.PWheel), + TestCase("<gear>,<t>,<n>,<Padd>,<Pwheel>", CycleType.PWheel), + TestCase("<t>,<Pwheel>,<gear>,<n>", CycleType.PWheel), + TestCase("t,Pwheel,gear,n,Padd", CycleType.PWheel), + TestCase("Pwheel,t,gear,n,Padd", CycleType.PWheel), // measured speed - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.MeasuredSpeed); - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>", CycleType.MeasuredSpeed); - TestCycleDetect("<t>,<v>,<grad>,<Padd>", CycleType.MeasuredSpeed); - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<Aux_ALT>,<Aux_ES>", CycleType.MeasuredSpeed); - TestCycleDetect("<t>,<v>,<grad>", CycleType.MeasuredSpeed); - TestCycleDetect("<t>,<Padd>,<grad>,<v>", CycleType.MeasuredSpeed); - TestCycleDetect("t,v,grad,Padd", CycleType.MeasuredSpeed); - TestCycleDetect("t,v,grad", CycleType.MeasuredSpeed); + TestCase("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>", CycleType.MeasuredSpeed), + TestCase("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>", CycleType.MeasuredSpeed), + TestCase("<t>,<v>,<grad>,<Padd>", CycleType.MeasuredSpeed), + TestCase("<t>,<v>,<grad>,<Padd>,<Aux_ALT>,<Aux_ES>", CycleType.MeasuredSpeed), + TestCase("<t>,<v>,<grad>", CycleType.MeasuredSpeed), + TestCase("<t>,<Padd>,<grad>,<v>", CycleType.MeasuredSpeed), + TestCase("t,v,grad,Padd", CycleType.MeasuredSpeed), + TestCase("t,v,grad", CycleType.MeasuredSpeed), // measured speed with gear - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>", - CycleType.MeasuredSpeedGear); - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>", CycleType.MeasuredSpeedGear); - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<Aux_HVAC>,<Aux_HP>", CycleType.MeasuredSpeedGear); - TestCycleDetect("<t>,<v>,<grad>,<Padd>,<n>,<gear>", CycleType.MeasuredSpeedGear); - TestCycleDetect("<t>,<v>,<grad>,<n>,<gear>", CycleType.MeasuredSpeedGear); - TestCycleDetect("<n>,<Padd>,<gear>,<v>,<grad>,<t>", CycleType.MeasuredSpeedGear); - TestCycleDetect("t,v,grad,Padd,n,gear", CycleType.MeasuredSpeedGear); + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>", + CycleType.MeasuredSpeedGear), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>", CycleType.MeasuredSpeedGear), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<Aux_HVAC>,<Aux_HP>", CycleType.MeasuredSpeedGear), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>", CycleType.MeasuredSpeedGear), + TestCase("<t>,<v>,<grad>,<n>,<gear>", CycleType.MeasuredSpeedGear), + TestCase("<n>,<Padd>,<gear>,<v>,<grad>,<t>", CycleType.MeasuredSpeedGear), + TestCase("t,v,grad,Padd,n,gear", CycleType.MeasuredSpeedGear), + ] + public void DrivingCycle_AutoDetect(string cycle, CycleType type) + { + TestCycleDetect(cycle, type); + } + [ // wrong cycles - AssertHelper.Exception<VectoException>(() => TestCycleDetect("v,grad,Padd,n,gear", CycleType.MeasuredSpeedGear)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("<t>,<grad>", CycleType.MeasuredSpeed)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("<t>,<Pwheel>,<n>,<Padd>", CycleType.PWheel)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("<t>,<Pwheel>,<Pwheel>,<n>,<Padd>", CycleType.PWheel)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("<t>,<n>,<torque>,<>,<Padd>", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("x,y,z", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("x", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleDetect("", CycleType.MeasuredSpeed)); - AssertHelper.Exception<VectoException>( - () => - TestCycleDetect("<t>,<v>,<gear>,<Pwheel>,<s>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>", - CycleType.MeasuredSpeedGear)); + TestCase("v,grad,Padd,n,gear", CycleType.MeasuredSpeedGear), + TestCase("<t>,<grad>", CycleType.MeasuredSpeed), + TestCase("<t>,<Pwheel>,<n>,<Padd>", CycleType.PWheel), + TestCase("<t>,<Pwheel>,<Pwheel>,<n>,<Padd>", CycleType.PWheel), + TestCase("<t>,<n>,<torque>,<>,<Padd>", CycleType.EngineOnly), + TestCase("x,y,z", CycleType.EngineOnly), + TestCase("x", CycleType.EngineOnly), + TestCase("", CycleType.MeasuredSpeed), + TestCase("<t>,<v>,<gear>,<Pwheel>,<s>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>", + CycleType.MeasuredSpeedGear),] + public void DrivingCycle_AutoDetect_Exception(string cycle, CycleType type) + { + AssertHelper.Exception<VectoException>(() => TestCycleDetect(cycle, type)); } - [TestMethod] - public void DrivingCycle_Read() - { + [ // declaration mode - distance based - TestCycleRead("<s>,<v>,<grad>,<stop>\n1,1,1,0", CycleType.DistanceBased, 2); - TestCycleRead("<s>,<v>,<grad>,<stop>\n1,0,1,1", CycleType.DistanceBased, 3); - AssertHelper.Exception<VectoException>(() => TestCycleRead("<s>,<v>,<grad>,<stop>\n1,1,1,1", CycleType.DistanceBased)); - TestCycleRead("<s>,<<v>,>grad>,<stop>\n1,1,1,0", CycleType.DistanceBased, 2); + TestCase("<s>,<v>,<grad>,<stop>\n1,1,1,0", CycleType.DistanceBased, 2), + TestCase("<s>,<v>,<grad>,<stop>\n1,0,1,1", CycleType.DistanceBased, 3), + TestCase("<s>,<<v>,>grad>,<stop>\n1,1,1,0", CycleType.DistanceBased, 2), // engineering mode - distance based - TestCycleRead("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1,1,1", - CycleType.DistanceBased, 2); - TestCycleRead("<s>,<v>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,0,1,1,1,1,1", - CycleType.DistanceBased, 2); - TestCycleRead("<s>,<v>,<grad>,<stop>,<Padd>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1", CycleType.DistanceBased, 2); - TestCycleRead("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>\n1,1,1,0,1,1,1", CycleType.DistanceBased, 2); - TestCycleRead("<s>,<v>,<stop>,<Padd>\n1,1,0,1", CycleType.DistanceBased, 2); - TestCycleRead("s,v,stop,Padd\n1,1,0,1", CycleType.DistanceBased, 2); - TestCycleRead("s,v,stop\n1,1,0", CycleType.DistanceBased, 2); + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1,1,1", + CycleType.DistanceBased, 2), + TestCase("<s>,<v>,<stop>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,0,1,1,1,1,1", + CycleType.DistanceBased, 2), + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1", CycleType.DistanceBased, 2), + TestCase("<s>,<v>,<grad>,<stop>,<Padd>,<vair_res>,<vair_beta>\n1,1,1,0,1,1,1", CycleType.DistanceBased, 2), + TestCase("<s>,<v>,<stop>,<Padd>\n1,1,0,1", CycleType.DistanceBased, 2), + TestCase("s,v,stop,Padd\n1,1,0,1", CycleType.DistanceBased, 2), + TestCase("s,v,stop\n1,1,0", CycleType.DistanceBased, 2), // engineering mode - time based // mk 2016-03-01: plain time based cycle does not exist anymore. replaced by measuredspeed, measuredspeed gear, engineonly and pwheel // engine only - TestCycleRead("<t>,<n>,<Me>,<Padd>\n1,1,1,1", CycleType.EngineOnly); - TestCycleRead("<t>,<n>,<Me>\n1,1,1", CycleType.EngineOnly); - TestCycleRead("<t>,<n>,<Me>,<Pe>,<Padd>\n1,1,1,1,1", CycleType.EngineOnly); - TestCycleRead("<t>,<n>,<Pe>,<Padd>\n1,1,1,1", CycleType.EngineOnly); - TestCycleRead("<t>,<n>,<Pe>\n1,1,1", CycleType.EngineOnly); - TestCycleRead("<Me>,<n>,<Padd>,<t>\n1,1,1,1", CycleType.EngineOnly); - TestCycleRead("t,n,Me,Padd\n1,1,1,1", CycleType.EngineOnly); + TestCase("<t>,<n>,<Me>,<Padd>\n1,1,1,1", CycleType.EngineOnly, 1), + TestCase("<t>,<n>,<Me>\n1,1,1", CycleType.EngineOnly, 1), + TestCase("<t>,<n>,<Me>,<Pe>,<Padd>\n1,1,1,1,1", CycleType.EngineOnly, 1), + TestCase("<t>,<n>,<Pe>,<Padd>\n1,1,1,1", CycleType.EngineOnly, 1), + TestCase("<t>,<n>,<Pe>\n1,1,1", CycleType.EngineOnly, 1), + TestCase("<Me>,<n>,<Padd>,<t>\n1,1,1,1", CycleType.EngineOnly, 1), + TestCase("t,n,Me,Padd\n1,1,1,1", CycleType.EngineOnly, 1), // p_wheel - TestCycleRead("<t>,<Pwheel>,<gear>,<n>,<Padd>\n1,1,1,1,1", CycleType.PWheel); - TestCycleRead("<gear>,<t>,<n>,<Padd>,<Pwheel>\n1,1,1,1,1", CycleType.PWheel); - TestCycleRead("<t>,<Pwheel>,<gear>,<n>\n1,1,1,1", CycleType.PWheel); - TestCycleRead("t,Pwheel,gear,n,Padd\n1,1,1,1,1", CycleType.PWheel); - TestCycleRead("Pwheel,t,gear,n,Padd\n1,1,1,1,1", CycleType.PWheel); + TestCase("<t>,<Pwheel>,<gear>,<n>,<Padd>\n1,1,1,1,1", CycleType.PWheel, 1), + TestCase("<gear>,<t>,<n>,<Padd>,<Pwheel>\n1,1,1,1,1", CycleType.PWheel, 1), + TestCase("<t>,<Pwheel>,<gear>,<n>\n1,1,1,1", CycleType.PWheel, 1), + TestCase("t,Pwheel,gear,n,Padd\n1,1,1,1,1", CycleType.PWheel, 1), + TestCase("Pwheel,t,gear,n,Padd\n1,1,1,1,1", CycleType.PWheel, 1), // measured speed - TestCycleRead("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,1,1,1,1,1", - CycleType.MeasuredSpeed); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ALT>,<Aux_ES>\n1,1,1,1,1,1,1,1", - CycleType.MeasuredSpeed); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>\n1,1,1,1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("<t>,<v>,<grad>,<Padd>\n1,1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<Aux_ALT>,<Aux_ES>\n1,1,1,1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("<t>,<v>,<grad>\n1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("<t>,<Padd>,<grad>,<v>\n1,1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("t,v,grad,Padd\n1,1,1,1", CycleType.MeasuredSpeed); - TestCycleRead("t,v,grad\n1,1,1", CycleType.MeasuredSpeed); + TestCase("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,1,1,1,1,1", + CycleType.MeasuredSpeed, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>,<Aux_ALT>,<Aux_ES>\n1,1,1,1,1,1,1,1", + CycleType.MeasuredSpeed, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<vair_res>,<vair_beta>\n1,1,1,1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("<t>,<v>,<grad>,<Padd>\n1,1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<Aux_ALT>,<Aux_ES>\n1,1,1,1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("<t>,<v>,<grad>\n1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("<t>,<Padd>,<grad>,<v>\n1,1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("t,v,grad,Padd\n1,1,1,1", CycleType.MeasuredSpeed, 1), + TestCase("t,v,grad\n1,1,1", CycleType.MeasuredSpeed, 1), // measured speed with gear - TestCycleRead("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>\n1,1,1,1,1,1,1,1,1,1", - CycleType.MeasuredSpeedGear); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>\n1,1,1,1,1,1,1,1", - CycleType.MeasuredSpeedGear); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<Aux_HVAC>,<Aux_HP>\n1,1,1,1,1,1,1,1", CycleType.MeasuredSpeedGear); - TestCycleRead("<t>,<v>,<grad>,<Padd>,<n>,<gear>\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear); - TestCycleRead("<t>,<v>,<grad>,<n>,<gear>\n1,1,1,1,1", CycleType.MeasuredSpeedGear); - TestCycleRead("<n>,<Padd>,<gear>,<v>,<grad>,<t>\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear); - TestCycleRead("t,v,grad,Padd,n,gear\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear); + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>\n1,1,1,1,1,1,1,1,1,1", + CycleType.MeasuredSpeedGear, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>\n1,1,1,1,1,1,1,1", + CycleType.MeasuredSpeedGear, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>,<Aux_HVAC>,<Aux_HP>\n1,1,1,1,1,1,1,1", CycleType.MeasuredSpeedGear, 1), + TestCase("<t>,<v>,<grad>,<Padd>,<n>,<gear>\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear, 1), + TestCase("<t>,<v>,<grad>,<n>,<gear>\n1,1,1,1,1", CycleType.MeasuredSpeedGear, 1), + TestCase("<n>,<Padd>,<gear>,<v>,<grad>,<t>\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear, 1), + TestCase("t,v,grad,Padd,n,gear\n1,1,1,1,1,1", CycleType.MeasuredSpeedGear, 1), + ] + public void DrivingCycle_Read(string cycle, CycleType type, int entryCount) + { + TestCycleRead(cycle, type, entryCount); + } + + [ // wrong cycles - AssertHelper.Exception<VectoException>( - () => TestCycleRead("v,grad,Padd,n,gear\n1,1,1,1,1", CycleType.MeasuredSpeedGear)); - AssertHelper.Exception<VectoException>(() => TestCycleRead("<t>,<grad>\n1,1,1,1,1,1,1,1,1", CycleType.MeasuredSpeed)); - AssertHelper.Exception<VectoException>( - () => TestCycleRead("<t>,<Pwheel>,<n>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.PWheel)); - AssertHelper.Exception<VectoException>( - () => TestCycleRead("<t>,<Pwheel>,<Pwheel>,<n>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.PWheel)); - AssertHelper.Exception<VectoException>( - () => TestCycleRead("<t>,<n>,<torque>,<>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleRead("x,y,z\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleRead("x\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly)); - AssertHelper.Exception<VectoException>(() => TestCycleRead("\n1,1,1,1,1,1,1,1,1", CycleType.MeasuredSpeed)); - AssertHelper.Exception<VectoException>(() => TestCycleRead( + TestCase("<s>,<v>,<grad>,<stop>\n1,1,1,1", CycleType.DistanceBased), + TestCase("v,grad,Padd,n,gear\n1,1,1,1,1", CycleType.MeasuredSpeedGear), + TestCase("<t>,<grad>\n1,1,1,1,1,1,1,1,1", CycleType.MeasuredSpeed), + TestCase("<t>,<Pwheel>,<n>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.PWheel), + TestCase("<t>,<Pwheel>,<Pwheel>,<n>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.PWheel), + TestCase("<t>,<n>,<torque>,<>,<Padd>\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly), + TestCase("x,y,z\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly), + TestCase("x\n1,1,1,1,1,1,1,1,1", CycleType.EngineOnly), + TestCase("\n1,1,1,1,1,1,1,1,1", CycleType.MeasuredSpeed), + TestCase( "<t>,<v>,<gear>,<Pwheel>,<s>,<grad>,<Padd>,<n>,<gear>,<vair_res>,<vair_beta>,<Aux_HVAC>,<Aux_HP>\n1,1,1,1,1,1,1,1,1", - CycleType.MeasuredSpeedGear)); + CycleType.MeasuredSpeedGear), + ] + public void DrivingCycle_Read_Exception(string cycle, CycleType type) + { + AssertHelper.Exception<VectoException>(() => TestCycleRead(cycle, type)); } - [TestMethod] - public void DrivingCycle_Read_File() + [TestCase(@"TestData\Cycles\Coach.vdri", CycleType.DistanceBased), + TestCase(@"TestData\Cycles\Engine Only1.vdri", CycleType.EngineOnly), + TestCase(@"TestData\Pwheel\RD_#1_Pwheel_AuxStd.vdri", CycleType.PWheel), + TestCase(@"TestData\MeasuredSpeed\MeasuredSpeedVairAux.vdri", CycleType.MeasuredSpeed), + TestCase(@"TestData\MeasuredSpeed\MeasuredSpeed_Gear_Rural_VairAux.vdri", + CycleType.MeasuredSpeedGear), + ] + public void DrivingCycle_Detect_File(string filename, CycleType type) { - TestCycleDetect(File.ReadAllText(@"TestData\Cycles\Coach.vdri"), CycleType.DistanceBased); - TestCycleRead(File.ReadAllText(@"TestData\Cycles\Coach.vdri"), CycleType.DistanceBased, 6116); - - TestCycleDetect(File.ReadAllText(@"TestData\Cycles\Engine Only1.vdri"), CycleType.EngineOnly); - TestCycleRead(File.ReadAllText(@"TestData\Cycles\Engine Only1.vdri"), CycleType.EngineOnly, 696); + TestCycleDetect(File.ReadAllText(filename), type); + } - TestCycleDetect(File.ReadAllText(@"TestData\Pwheel\RD_#1_Pwheel_AuxStd.vdri"), CycleType.PWheel); - TestCycleRead(File.ReadAllText(@"TestData\Pwheel\RD_#1_Pwheel_AuxStd.vdri"), CycleType.PWheel, 3917); + [TestCase(@"TestData\Cycles\Coach.vdri", CycleType.DistanceBased, 6116), + TestCase(@"TestData\Cycles\Engine Only1.vdri", CycleType.EngineOnly, 696), + TestCase(@"TestData\Pwheel\RD_#1_Pwheel_AuxStd.vdri", CycleType.PWheel, 3917), + TestCase(@"TestData\MeasuredSpeed\MeasuredSpeedVairAux.vdri", CycleType.MeasuredSpeed, 1300), + TestCase(@"TestData\MeasuredSpeed\MeasuredSpeed_Gear_Rural_VairAux.vdri", + CycleType.MeasuredSpeedGear, 1300), + ] + public void DrivingCycle_Read_File(string filename, CycleType type, int entryCount) + { + TestCycleRead(File.ReadAllText(filename), type, entryCount); + } - TestCycleDetect(File.ReadAllText(@"TestData\MeasuredSpeed\MeasuredSpeedVairAux.vdri"), CycleType.MeasuredSpeed); - TestCycleRead(File.ReadAllText(@"TestData\MeasuredSpeed\MeasuredSpeedVairAux.vdri"), CycleType.MeasuredSpeed, 1300); + [ + TestCase("t, Engine Speed, PTO Torque\n1,2,3", CycleType.PTO), + TestCase("t, engine speed, PTO Torque\n1,2,3", CycleType.PTO), + TestCase("t, Engine Speed, pto torque\n1,2,3", CycleType.PTO), + TestCase("t, engine speed, pto torque\n1,2,3", CycleType.PTO), + TestCase("T, ENGINE SPEED, PTO TORQUE\n1,2,3", CycleType.PTO), + TestCase("<Me>,<n>,<Padd>,<t>\n1,1,1,1", CycleType.EngineOnly), + TestCase("t,n,Me,Padd\n1,1,1,1", CycleType.EngineOnly), + TestCase("<s>,<v>,<Grad>,<STOP>\n1,0,1,1", CycleType.DistanceBased), + TestCase("<s>,<V>,<grad>,<stop>,<PADD>,<vAir_res>,<vAir_Beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1,1,1", + CycleType.DistanceBased), + TestCase("<S>,<v>,<stop>,<pAdd>,<Vair_res>,<vair_BETA>,<Aux_ELE>,<Aux_SP>\n1,1,0,1,1,1,1,1", + CycleType.DistanceBased) + ] + public void DrivingCycleDetect_CaseInsensitive(string cycle, CycleType type) + { + TestCycleDetect(cycle, type); + } - TestCycleDetect(File.ReadAllText(@"TestData\MeasuredSpeed\MeasuredSpeed_Gear_Rural_VairAux.vdri"), - CycleType.MeasuredSpeedGear); - TestCycleRead(File.ReadAllText(@"TestData\MeasuredSpeed\MeasuredSpeed_Gear_Rural_VairAux.vdri"), - CycleType.MeasuredSpeedGear, 1300); + [ + TestCase("t, Engine Speed, PTO Torque\n1,2,3", CycleType.PTO, 1), + TestCase("t, engine speed, PTO Torque\n1,2,3", CycleType.PTO, 1), + TestCase("t, Engine Speed, pto torque\n1,2,3", CycleType.PTO, 1), + TestCase("t, engine speed, pto torque\n1,2,3", CycleType.PTO, 1), + TestCase("T, ENGINE SPEED, PTO TORQUE\n1,2,3", CycleType.PTO, 1), + TestCase("<Me>,<n>,<Padd>,<t>\n1,1,1,1", CycleType.EngineOnly, 1), + TestCase("t,n,Me,Padd\n1,1,1,1", CycleType.EngineOnly, 1), + TestCase("<s>,<v>,<Grad>,<STOP>\n1,0,1,1", CycleType.DistanceBased, 3), + TestCase("<s>,<V>,<grad>,<stop>,<PADD>,<vAir_res>,<vAir_Beta>,<Aux_ELE>,<Aux_SP>\n1,1,1,0,1,1,1,1,1", + CycleType.DistanceBased, 2), + TestCase("<S>,<v>,<stop>,<pAdd>,<Vair_res>,<vair_BETA>,<Aux_ELE>,<Aux_SP>\n1,1,0,1,1,1,1,1", + CycleType.DistanceBased, 2) + ] + public void DrivingCycleRead_CaseInsensitive(string cycle, CycleType type, int entryCount) + { + TestCycleRead(cycle, type, entryCount); } private static void TestCycleDetect(string inputData, CycleType cycleType) diff --git a/VectoCore/VectoCoreTest/Models/Simulation/PTOIdleLossTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/PTOIdleLossTest.cs index 3f95338fbd232c3f3c0f6a88c16a8e32ff04f065..9ba9231b9f15ce9d7878abf4b9f3dc75346d48e4 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/PTOIdleLossTest.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/PTOIdleLossTest.cs @@ -33,14 +33,32 @@ using System; using System.Collections.Generic; using NUnit.Framework; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Tests.Models.Simulation { [TestFixture] public class PTOIdleLossTest { + [TestCase] + public void PTOLossMapCaseSensitiveTest() + { + var data = new[] { + "0, 0", + "10, 100" + }; + var tbl = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("pto torque, engine speed", data)); + + var pto = PTOIdleLossMapReader.Create(tbl); + + var loss = pto.GetTorqueLoss(100.RPMtoRad()); + Assert.AreEqual(10, loss.Value()); + } + + [TestCase] public void PTOIdleLosses_FixPoints() {