From 4308c87f135fde132359bdd5ba9bcd6b7aa602c0 Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Fri, 31 Jul 2015 15:28:29 +0200
Subject: [PATCH] auxiliary tests, adjusted electrical system (included mapping
 for alternator efficiency)

---
 Declaration/VAUX/ALT-Tech.csv                 |   2 +
 .../Models/Declaration/ElectricSystem.cs      |  57 +++++++--
 .../Impl/DirectAuxiliary.cs                   |  86 -------------
 .../Impl/MappingAuxiliary.cs                  | 121 ------------------
 .../Resources/Declaration/VAUX/ALT-Tech.csv   |   2 +
 VectoCore/Utils/VectoCSVFile.cs               |  23 ++--
 VectoCore/VectoCore.csproj                    |   1 +
 .../Models/Declaration/DeclarationDataTest.cs |  29 +++--
 VectoCoreTest/Models/Simulation/AuxTests.cs   |  40 +++---
 .../TestData/Cycles/LongHaul_short.vdri       |  12 ++
 .../TestData/Results/Auxiliaries.vmod         |  12 --
 .../40t_Long_Haul_Truck.vsum}                 |   2 +-
 ...ng_Haul_Truck_Long_Haul_Empty Loading.vmod |  12 ++
 VectoCoreTest/Utils/AssertHelper.cs           |  17 +--
 VectoCoreTest/Utils/ResultFileHelper.cs       |  31 +++--
 VectoCoreTest/VectoCoreTest.csproj            |   7 +-
 16 files changed, 163 insertions(+), 291 deletions(-)
 create mode 100644 Declaration/VAUX/ALT-Tech.csv
 delete mode 100644 VectoCore/Models/SimulationComponent/Impl/DirectAuxiliary.cs
 delete mode 100644 VectoCore/Models/SimulationComponent/Impl/MappingAuxiliary.cs
 create mode 100644 VectoCore/Resources/Declaration/VAUX/ALT-Tech.csv
 create mode 100644 VectoCoreTest/TestData/Cycles/LongHaul_short.vdri
 delete mode 100644 VectoCoreTest/TestData/Results/Auxiliaries.vmod
 rename VectoCoreTest/TestData/Results/{Auxiliaries.vsum => EngineOnlyCycles/40t_Long_Haul_Truck.vsum} (52%)
 create mode 100644 VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod

diff --git a/Declaration/VAUX/ALT-Tech.csv b/Declaration/VAUX/ALT-Tech.csv
new file mode 100644
index 0000000000..7ea13e6650
--- /dev/null
+++ b/Declaration/VAUX/ALT-Tech.csv
@@ -0,0 +1,2 @@
+Technology         ,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction,Heavy Urban,Urban,Suburban,Interurban,Coach
+Standard alternator,0.7      ,0.7              ,0.7           ,0.7              ,0.7         ,1          ,1    ,1       ,1         ,1    
\ No newline at end of file
diff --git a/VectoCore/Models/Declaration/ElectricSystem.cs b/VectoCore/Models/Declaration/ElectricSystem.cs
index 2f25bf0eb0..937f6bcd58 100644
--- a/VectoCore/Models/Declaration/ElectricSystem.cs
+++ b/VectoCore/Models/Declaration/ElectricSystem.cs
@@ -7,6 +7,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 {
 	public class ElectricSystem : LookupData<MissionType, string[], Watt>
 	{
+		private readonly Alternator _alternator = new Alternator();
+
 		private const string BaseLine = "Baseline electric power consumption";
 
 		private readonly Dictionary<Tuple<MissionType, string>, Watt> _data =
@@ -26,7 +28,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 			foreach (DataRow row in table.Rows) {
 				var name = row.Field<string>("Technology");
-				foreach (MissionType mission in Enum.GetValues(typeof (MissionType))) {
+				foreach (MissionType mission in Enum.GetValues(typeof(MissionType))) {
 					_data[Tuple.Create(mission, name)] = row.ParseDouble(mission.ToString().ToLower()).SI<Watt>();
 				}
 			}
@@ -36,15 +38,54 @@ namespace TUGraz.VectoCore.Models.Declaration
 		{
 			var sum = _data[Tuple.Create(missionType, BaseLine)];
 
-			foreach (var s in technologies) {
-				Watt w;
-				if (_data.TryGetValue(Tuple.Create(missionType, s), out w)) {
-					sum += w;
-				} else {
-					Log.Error(string.Format("electric system technology not found: {0}", s));
+			if (technologies != null) {
+				foreach (var s in technologies) {
+					Watt w;
+					if (_data.TryGetValue(Tuple.Create(missionType, s), out w)) {
+						sum += w;
+					} else {
+						Log.Error(string.Format("electric system technology not found: {0}", s));
+					}
 				}
 			}
-			return sum;
+			return sum / _alternator.Lookup(missionType, null);
+		}
+
+		private class Alternator : LookupData<MissionType, string, double>
+		{
+			private const string Default = "Standard alternator";
+
+			private readonly Dictionary<Tuple<MissionType, string>, double> _data =
+				new Dictionary<Tuple<MissionType, string>, double>();
+
+			protected string ResourceId = "TUGraz.VectoCore.Resources.Declaration.VAUX.ALT-Tech.csv";
+
+
+			public Alternator()
+			{
+				ParseData(ReadCsvResource(ResourceId));
+			}
+
+			protected override void ParseData(DataTable table)
+			{
+				NormalizeTable(table);
+
+				foreach (DataRow row in table.Rows) {
+					var name = row.Field<string>("Technology");
+					foreach (MissionType mission in Enum.GetValues(typeof(MissionType))) {
+						_data[Tuple.Create(mission, name)] = row.ParseDouble(mission.ToString().ToLower());
+					}
+				}
+			}
+
+			public override double Lookup(MissionType missionType, string technology)
+			{
+				if (string.IsNullOrWhiteSpace(technology)) {
+					technology = Default;
+				}
+
+				return _data[Tuple.Create(missionType, technology)];
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/Models/SimulationComponent/Impl/DirectAuxiliary.cs b/VectoCore/Models/SimulationComponent/Impl/DirectAuxiliary.cs
deleted file mode 100644
index 053802f958..0000000000
--- a/VectoCore/Models/SimulationComponent/Impl/DirectAuxiliary.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-using TUGraz.VectoCore.Exceptions;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class DirectAuxiliary : VectoSimulationComponent, IAuxiliary, ITnInPort, ITnOutPort
-	{
-		private readonly IAuxiliaryCycleData _demand;
-		private ITnOutPort _outPort;
-		private Watt _powerDemand;
-
-		public DirectAuxiliary(IVehicleContainer container, IAuxiliaryCycleData demand)
-			: base(container)
-		{
-			_demand = demand;
-		}
-
-		#region ITnInProvider
-
-		public ITnInPort InPort()
-		{
-			return this;
-		}
-
-		#endregion
-
-		#region ITnOutProvider
-
-		public ITnOutPort OutPort()
-		{
-			return this;
-		}
-
-		#endregion
-
-		#region ITnInPort
-
-		void ITnInPort.Connect(ITnOutPort other)
-		{
-			_outPort = other;
-		}
-
-		#endregion
-
-		#region ITnOutPort
-
-		IResponse ITnOutPort.Request(Second absTime, Second dt, NewtonMeter torque, PerSecond engineSpeed, bool dryRun)
-		{
-			if (_outPort == null) {
-				Log.ErrorFormat("{0} cannot handle incoming request - no outport available", absTime);
-				throw new VectoSimulationException(
-					string.Format("{0} cannot handle incoming request - no outport available",
-						absTime));
-			}
-
-			_powerDemand = _demand.GetPowerDemand(absTime, dt);
-			var tq = Formulas.PowerToTorque(_powerDemand, engineSpeed);
-			return _outPort.Request(absTime, dt, torque + tq, engineSpeed, dryRun);
-		}
-
-		public IResponse Initialize(NewtonMeter torque, PerSecond engineSpeed)
-		{
-			_powerDemand = _demand.GetPowerDemand(0.SI<Second>(), 0.SI<Second>());
-			var tq = Formulas.PowerToTorque(_powerDemand, engineSpeed);
-			return _outPort.Initialize(torque + tq, engineSpeed);
-		}
-
-		#endregion
-
-		#region VectoSimulationComponent
-
-		protected override void DoWriteModalResults(IModalDataWriter writer)
-		{
-			writer[ModalResultField.Paux] = _powerDemand;
-		}
-
-		protected override void DoCommitSimulationStep() {}
-
-		#endregion
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/Models/SimulationComponent/Impl/MappingAuxiliary.cs b/VectoCore/Models/SimulationComponent/Impl/MappingAuxiliary.cs
deleted file mode 100644
index 94f5ef2ad8..0000000000
--- a/VectoCore/Models/SimulationComponent/Impl/MappingAuxiliary.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-using TUGraz.VectoCore.Exceptions;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class AuxiliaryData
-	{
-		public double EfficiencyToSupply { get; set; }
-		public double TransitionRatio { get; set; }
-		public double EfficiencyToEngine { get; set; }
-
-		public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut)
-		{
-			throw new NotImplementedException();
-		}
-
-		public static AuxiliaryData ReadFromFile(string filePath)
-		{
-			throw new NotImplementedException();
-		}
-	}
-
-	public class MappingAuxiliary : VectoSimulationComponent, IAuxiliary, ITnInPort, ITnOutPort
-	{
-		private readonly IAuxiliaryCycleData _demand;
-		private AuxiliaryData _data;
-		private ITnOutPort _outPort;
-		private Watt _powerDemand;
-
-		public MappingAuxiliary(IVehicleContainer container, IAuxiliaryCycleData demand, AuxiliaryData data)
-			: base(container)
-		{
-			_demand = demand;
-			_data = data;
-		}
-
-		#region ITnInProvider
-
-		public ITnInPort InPort()
-		{
-			return this;
-		}
-
-		#endregion
-
-		#region ITnOutProvider
-
-		public ITnOutPort OutPort()
-		{
-			return this;
-		}
-
-		#endregion
-
-		#region ITnInPort
-
-		void ITnInPort.Connect(ITnOutPort other)
-		{
-			_outPort = other;
-		}
-
-		#endregion
-
-		#region ITnOutPort
-
-		IResponse ITnOutPort.Request(Second absTime, Second dt, NewtonMeter torque, PerSecond angularVelocity, bool dryRun)
-		{
-			if (_outPort == null) {
-				Log.ErrorFormat("{0} cannot handle incoming request - no outport available", absTime);
-				throw new VectoSimulationException(
-					string.Format("{0} cannot handle incoming request - no outport available",
-						absTime));
-			}
-
-			var torqueAux = GetPowerDemand(absTime, dt, angularVelocity);
-
-			return _outPort.Request(absTime, dt, torque + torqueAux, angularVelocity);
-		}
-
-		private NewtonMeter GetPowerDemand(Second absTime, Second dt, PerSecond angularVelocity)
-		{
-			var powerSupply = _demand.GetPowerDemand(absTime, dt);
-			var powerAuxOut = powerSupply / _data.EfficiencyToSupply;
-
-			var nAuxiliary = angularVelocity * _data.TransitionRatio;
-
-			var powerAuxIn = _data.GetPowerDemand(nAuxiliary, powerAuxOut);
-			var powerAux = powerAuxIn / _data.EfficiencyToEngine;
-
-			_powerDemand = powerAux;
-
-			var torqueAux = Formulas.PowerToTorque(powerAux, angularVelocity);
-			return torqueAux;
-		}
-
-		public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity)
-		{
-			var torqueAux = GetPowerDemand(0.SI<Second>(), 0.SI<Second>(), angularVelocity);
-
-			return _outPort.Initialize(torque + torqueAux, angularVelocity);
-		}
-
-		#endregion
-
-		#region VectoSimulationComponent
-
-		protected override void DoWriteModalResults(IModalDataWriter writer)
-		{
-			writer[ModalResultField.Paux_xxx] = _powerDemand;
-		}
-
-		protected override void DoCommitSimulationStep() {}
-
-		#endregion
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/Resources/Declaration/VAUX/ALT-Tech.csv b/VectoCore/Resources/Declaration/VAUX/ALT-Tech.csv
new file mode 100644
index 0000000000..7ea13e6650
--- /dev/null
+++ b/VectoCore/Resources/Declaration/VAUX/ALT-Tech.csv
@@ -0,0 +1,2 @@
+Technology         ,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction,Heavy Urban,Urban,Suburban,Interurban,Coach
+Standard alternator,0.7      ,0.7              ,0.7           ,0.7              ,0.7         ,1          ,1    ,1       ,1         ,1    
\ No newline at end of file
diff --git a/VectoCore/Utils/VectoCSVFile.cs b/VectoCore/Utils/VectoCSVFile.cs
index d15943263a..2fa5b42b57 100644
--- a/VectoCore/Utils/VectoCSVFile.cs
+++ b/VectoCore/Utils/VectoCSVFile.cs
@@ -35,12 +35,13 @@ namespace TUGraz.VectoCore.Utils
 		/// </summary>
 		/// <param name="fileName"></param>
 		/// <param name="ignoreEmptyColumns"></param>
+		/// <param name="fullHeader"></param>
 		/// <exception cref="FileIOException"></exception>
 		/// <returns>A DataTable which represents the CSV File.</returns>
-		public static DataTable Read(string fileName, bool ignoreEmptyColumns = false)
+		public static DataTable Read(string fileName, bool ignoreEmptyColumns = false, bool fullHeader = false)
 		{
 			try {
-				return ReadData(File.ReadAllLines(fileName), ignoreEmptyColumns);
+				return ReadData(File.ReadAllLines(fileName), ignoreEmptyColumns, fullHeader);
 			} catch (Exception e) {
 				throw new VectoException(string.Format("File {0}: {1}", fileName, e.Message));
 			}
@@ -68,11 +69,11 @@ namespace TUGraz.VectoCore.Utils
 			}
 		}
 
-		private static DataTable ReadData(string[] data, bool ignoreEmptyColumns = false)
+		private static DataTable ReadData(string[] data, bool ignoreEmptyColumns = false, bool fullHeader = false)
 		{
 			var lines = RemoveComments(data);
 
-			var validColumns = GetValidHeaderColumns(lines.First());
+			var validColumns = GetValidHeaderColumns(lines.First(), fullHeader).ToArray();
 
 			if (validColumns.Length > 0) {
 				// Valid Columns found => header was valid => skip header line
@@ -108,22 +109,24 @@ namespace TUGraz.VectoCore.Utils
 			return table;
 		}
 
-		private static string[] GetValidHeaderColumns(string line)
+		private static IEnumerable<string> GetValidHeaderColumns(string line, bool fullHeader = false)
 		{
 			Contract.Requires(line != null);
 			double test;
-			var validColumns = GetColumns(line).
+			var validColumns = GetColumns(line, fullHeader).
 				Where(col => !double.TryParse(col, NumberStyles.Any, CultureInfo.InvariantCulture, out test));
 			return validColumns.ToArray();
 		}
 
-		private static IEnumerable<string> GetColumns(string line)
+		private static IEnumerable<string> GetColumns(string line, bool fullHeader = false)
 		{
 			Contract.Requires(line != null);
 
-			line = Regex.Replace(line, @"\[.*?\]", "");
-			line = line.Replace("<", "");
-			line = line.Replace(">", "");
+			if (!fullHeader) {
+				line = Regex.Replace(line, @"\[.*?\]", "");
+				line = line.Replace("<", "");
+				line = line.Replace(">", "");
+			}
 			return line.Split(Delimiter).Select(col => col.Trim());
 		}
 
diff --git a/VectoCore/VectoCore.csproj b/VectoCore/VectoCore.csproj
index 99f1a841b7..6fd2bc46d9 100644
--- a/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore.csproj
@@ -272,6 +272,7 @@
     <EmbeddedResource Include="Resources\Declaration\DefaultTC.vtcc" />
     <EmbeddedResource Include="Resources\Declaration\VCDV\parameters.csv" />
     <EmbeddedResource Include="Resources\Declaration\WHTC-Weighting-Factors.csv" />
+    <EmbeddedResource Include="Resources\Declaration\VAUX\ALT-Tech.csv" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git a/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index e36915c55b..2086b139fa 100644
--- a/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -172,7 +172,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 
 				var angularSpeed = r.Next(1000).SI<PerSecond>();
 				var torque = tc.LookupTorque(exp.nu, angularSpeed, referenceSpeed);
-				AssertHelper.AreRelativeEqual(exp.torque * Math.Pow(angularSpeed.Value() / referenceSpeed.Value(), 2), torque.Value());
+				AssertHelper.AreRelativeEqual(exp.torque * Math.Pow(angularSpeed.Value() / referenceSpeed.Value(), 2),
+					torque.Value());
 			}
 		}
 
@@ -182,25 +183,25 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var es = DeclarationData.ElectricSystem;
 
 			var expected = new[] {
-				new { Mission = MissionType.LongHaul, Base = 1240, LED = 1190 },
-				new { Mission = MissionType.RegionalDelivery, Base = 1055, LED = 1005 },
-				new { Mission = MissionType.UrbanDelivery, Base = 974, LED = 924 },
-				new { Mission = MissionType.MunicipalUtility, Base = 974, LED = 924 },
-				new { Mission = MissionType.Construction, Base = 975, LED = 925 },
-				new { Mission = MissionType.HeavyUrban, Base = 0, LED = 0 },
-				new { Mission = MissionType.Urban, Base = 0, LED = 0 },
-				new { Mission = MissionType.Suburban, Base = 0, LED = 0 },
-				new { Mission = MissionType.Interurban, Base = 0, LED = 0 },
-				new { Mission = MissionType.Coach, Base = 0, LED = 0 }
+				new { Mission = MissionType.LongHaul, Base = 1240.SI<Watt>(), LED = 1190.SI<Watt>(), Efficiency = 0.7 },
+				new { Mission = MissionType.RegionalDelivery, Base = 1055.SI<Watt>(), LED = 1005.SI<Watt>(), Efficiency = 0.7 },
+				new { Mission = MissionType.UrbanDelivery, Base = 974.SI<Watt>(), LED = 924.SI<Watt>(), Efficiency = 0.7 },
+				new { Mission = MissionType.MunicipalUtility, Base = 974.SI<Watt>(), LED = 924.SI<Watt>(), Efficiency = 0.7 },
+				new { Mission = MissionType.Construction, Base = 975.SI<Watt>(), LED = 925.SI<Watt>(), Efficiency = 0.7 },
+				new { Mission = MissionType.HeavyUrban, Base = 0.SI<Watt>(), LED = 0.SI<Watt>(), Efficiency = 1.0 },
+				new { Mission = MissionType.Urban, Base = 0.SI<Watt>(), LED = 0.SI<Watt>(), Efficiency = 1.0 },
+				new { Mission = MissionType.Suburban, Base = 0.SI<Watt>(), LED = 0.SI<Watt>(), Efficiency = 1.0 },
+				new { Mission = MissionType.Interurban, Base = 0.SI<Watt>(), LED = 0.SI<Watt>(), Efficiency = 1.0 },
+				new { Mission = MissionType.Coach, Base = 0.SI<Watt>(), LED = 0.SI<Watt>(), Efficiency = 1.0 }
 			};
 			Assert.AreEqual(expected.Length, Enum.GetValues(typeof(MissionType)).Length);
 
 			foreach (var expectation in expected) {
-				var baseConsumption = es.Lookup(expectation.Mission, technologies: new string[] { });
+				var baseConsumption = es.Lookup(expectation.Mission, technologies: null);
 				var leds = es.Lookup(expectation.Mission, technologies: new[] { "LED lights" });
 
-				Assert.AreEqual(expectation.Base, baseConsumption.Value(), Tolerance);
-				Assert.AreEqual(expectation.LED, leds.Value(), Tolerance);
+				AssertHelper.AreRelativeEqual(expectation.Base / expectation.Efficiency, baseConsumption);
+				AssertHelper.AreRelativeEqual(expectation.LED / expectation.Efficiency, leds);
 			}
 		}
 
diff --git a/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCoreTest/Models/Simulation/AuxTests.cs
index 6af440b505..1ba714965f 100644
--- a/VectoCoreTest/Models/Simulation/AuxTests.cs
+++ b/VectoCoreTest/Models/Simulation/AuxTests.cs
@@ -1,14 +1,12 @@
-using System;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCore.Utils;
 using TUGraz.VectoCore.Exceptions;
+using TUGraz.VectoCore.Tests.Utils;
 using TUGraz.VectoCore.FileIO.Reader;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Tests.Models.Simulation
 {
@@ -18,31 +16,35 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		[TestMethod]
 		public void AuxWriteModFileSumFile()
 		{
-			var dataWriter = new ModalDataWriter(@"TestData\Results\24t Coach AUX.vmod", false);
+			var dataWriter = new ModalDataWriter(@"40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod", false);
 			dataWriter.AddAuxiliary("FAN");
 			dataWriter.AddAuxiliary("PS");
 			dataWriter.AddAuxiliary("STP");
 			dataWriter.AddAuxiliary("ES");
 			dataWriter.AddAuxiliary("AC");
 
-			var sumWriter = new SummaryFileWriter(@"TestData\Results\24t Coach AUX.vsum");
+			var sumWriter = new SummaryFileWriter(@"40t_Long_Haul_Truck.vsum");
 			var deco = new SumWriterDecoratorFullPowertrain(sumWriter, "", "", "");
 
 			var container = new VehicleContainer(dataWriter, deco);
-			var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri");
+			var data = DrivingCycleDataReader.ReadFromFileDistanceBased(@"TestData\Cycles\LongHaul_short.vdri");
 
 			var port = new MockTnOutPort();
 
 			var aux = new Auxiliary(container);
 			aux.InPort().Connect(port);
 
-			aux.AddConstant("FAN", DeclarationData.Fan.Lookup(MissionType.LongHaul, ""));
-			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(MissionType.LongHaul, VehicleClass.Class3));
+			var hdvClass = VehicleClass.Class5;
+			var mission = MissionType.LongHaul;
+
+			aux.AddConstant("FAN",
+				DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump"));
+			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, hdvClass));
 			aux.AddConstant("STP",
-				DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, VehicleClass.Class3, "Fixed displacement"));
-			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(MissionType.LongHaul, new string[0]));
+				DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass, "Variable displacement"));
+			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission, null));
 			aux.AddConstant("AC",
-				DeclarationData.HeatingVentilationAirConditioning.Lookup(MissionType.LongHaul, VehicleClass.Class3));
+				DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hdvClass));
 
 			var speed = 1400.RPMtoRad();
 			var torque = 500.SI<NewtonMeter>();
@@ -50,7 +52,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			var dt = 1.SI<Second>();
 
 			for (var i = 0; i < data.Entries.Count; i++) {
-				aux.OutPort().Request(t, t, torque, speed);
+				aux.OutPort().Request(t, dt, torque, speed);
 				container.CommitSimulationStep(t, dt);
 				t += dt;
 			}
@@ -58,10 +60,14 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			container.FinishSimulation();
 			sumWriter.Finish();
 
-			ResultFileHelper.TestModFile(@"TestData\Results\Auxiliaries.vmod", @"TestData\Results\24t Coach AUX.vmod");
-			ResultFileHelper.TestSumFile(@"TestData\Results\Auxiliaries.vsum", @"TestData\Results\24t Coach AUX.vsum");
-		}
+			//todo: add aux columns to test
+			var testColumns = new[] { "Paux_FAN", "Paux_STP", "Paux_AC", "Paux_ES", "Paux_PS", "Paux" };
 
+			ResultFileHelper.TestModFile(@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod",
+				@"40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod", testColumns);
+			ResultFileHelper.TestSumFile(@"40t_Long_Haul_Truck.vsum",
+				@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck.vsum");
+		}
 
 		[TestMethod]
 		public void AuxConstant()
diff --git a/VectoCoreTest/TestData/Cycles/LongHaul_short.vdri b/VectoCoreTest/TestData/Cycles/LongHaul_short.vdri
new file mode 100644
index 0000000000..4147227803
--- /dev/null
+++ b/VectoCoreTest/TestData/Cycles/LongHaul_short.vdri
@@ -0,0 +1,12 @@
+<s>,<v>,<grad>,<stop>
+0,0,2.95016969027809,2
+1,60,2.95016969027809,0
+2,60,2.95016969027809,0
+3,60,2.95016969027809,0
+4,60,2.95016969027809,0
+5,60,2.95016969027809,0
+6,60,2.95016969027809,0
+7,60,2.95016969027809,0
+8,60,2.95016969027809,0
+9,60,3.06801369027809,0
+10,60,3.06801369027809,0
\ No newline at end of file
diff --git a/VectoCoreTest/TestData/Results/Auxiliaries.vmod b/VectoCoreTest/TestData/Results/Auxiliaries.vmod
deleted file mode 100644
index 808cd27532..0000000000
--- a/VectoCoreTest/TestData/Results/Auxiliaries.vmod
+++ /dev/null
@@ -1,12 +0,0 @@
-time [s],dt [s], dist [m],v_act [km/h],v_targ [km/h],acc [m/s²],grad [%],n [1/min],Tq_eng [Nm],Tq_clutch [Nm],Tq_full [Nm],Tq_drag [Nm],Pe_eng [kW],Pe_full [kW],Pe_drag [kW],Pe_clutch [kW],Pa Eng [kW],Paux [kW],Gear [-],Ploss GB [kW],Ploss Diff [kW],Ploss Retarder [kW],Pa GB [kW],Pa Veh [kW],Proll [kW],Pair [kW],Pgrad [kW],Pwheel [kW],Pbrake [kW],Paux_FAN [kW],Paux_STP [kW],Paux_AC [kW],Paux_ES [kW],Paux_PS [kW],FC-Map [g/h],FC-AUXc [g/h],FC-WHTCc [g/h]
-1.5,1,0,0,0,0,-0.0007722848,600,62.55471,0,586,-44,3.930429,36.81947,-2.764601,0,0,3.930429,0,0,0,0,0,0,0,0,0,0,0,0.883,0.186,0.15,1.391429,1.32,1387.543,-,1374.777
-2.5,1,0,0,0,0,-0.0007722848,600,62.55471,0,586,-44,3.930429,36.81947,-2.764601,0,0,3.930429,0,0,0,0,0,0,0,0,0,0,0,0.883,0.186,0.15,1.391429,1.32,1387.543,-,1374.777
-3.5,1,0.5,1.8,5.99999985694885,1,-0.0007722848,644.4445,180.6473,105.3896,623.5555,-46.22222,12.19117,42.08131,-3.119356,7.112333,1.148414,3.930429,1,0.2287433,0.2998479,0,0,6.058701,0.5250318,0.0004589302,-0.0004507788,6.583741,0,0.883,0.186,0.15,1.391429,1.32,2806.615,-,2780.795
-4.5,1,2,5.4,11.9999997138977,1,-0.0007722848,950.4012,357.0731,215.7814,851.2568,-60.01605,35.53798,84.72199,-5.973144,21.47582,10.13173,3.930429,1,0.8138651,0.8997127,0,0,18.1761,1.575095,0.01239111,-0.001352336,19.76224,0,0.883,0.186,0.15,1.391429,1.32,7234.365,-,7167.809
-5.5,1,3.95612859725952,7.04206295013428,11.9999997138977,-0.08774281,-0.0007722848,950.4012,39.49156,0,851.2568,-60.01605,3.930429,84.72199,-5.973144,0,0,3.930429,0,0,0,0,0,-2.079785,2.05406,0.02748076,-0.001763563,-8.086558E-06,0,0.883,0.186,0.15,1.391429,1.32,1621.283,-,1606.367
-6.5,1,5.82456469535828,6.72636995315552,40.0000019073486,-0.08764219,-0.0007722848,844.9327,-0.01361027,0,783.757,-55.79731,-0.001204252,69.34772,-4.93701,0,-3.931633,3.930429,0,0,0,0,0,-1.984271,1.961977,0.02394811,-0.001684503,-3.083143E-05,-3.083143E-05,0.883,0.186,0.15,1.391429,1.32,963.1212,-,954.2604
-7.5,1,8.14917969703674,8.36861400604248,68.0000015258789,1,-0.0007722848,785.5349,424.4827,401.148,742.777,-53.27674,34.91838,61.10159,-4.382599,32.99884,-2.01089,3.930429,2,0.9507985,1.394731,0,0,28.16829,2.440994,0.04612004,-0.002095774,30.65331,0,0.883,0.186,0.15,1.391429,1.32,7152.386,-,7086.584
-8.5,1,11.4737946987152,11.9686140060425,68.0000015258789,1,-0.0007722848,1123.455,549.6978,402.4379,892.8764,-69.40732,64.67083,105.0451,-8.165629,47.346,13.3944,3.930429,2,1.441564,1.995763,0,0,40.2857,3.491057,0.1349151,-0.002997332,43.90867,0,0.883,0.186,0.15,1.391429,1.32,12777.98,-,12660.43
-9.5,1,15.7984097003937,15.5686140060425,68.0000015258789,1,-0.0007722848,1461.376,548.1378,403.9429,899,-90.06879,83.88422,137.5784,-13.78367,61.81736,18.13643,3.930429,2,1.982165,2.597918,0,0,52.4031,4.541121,0.296947,-0.003898889,57.23727,0,0.883,0.186,0.15,1.391429,1.32,16443.65,-,16292.37
-10.5,1,20.5762746334076,17.2003137588501,68.0000015258789,-0.09350014,-0.0007722848,1461.376,25.68322,0,899,-90.06879,3.930429,137.5784,-13.78367,0,0,3.930429,0,0,0,0,0,-5.41322,5.017062,0.4004407,-0.00430752,-2.456876E-05,-2.456876E-05,0.883,0.186,0.15,1.391429,1.32,2521.462,-,2498.265
-11.5,1,25.260773897171,16.8641973495483,68.0000015258789,-0.0932312,-0.0007722848,1308.973,-35.28123,0,899,-80.62812,-4.836187,123.2307,-11.05213,0,-8.766616,3.930429,0,0,0,0,0,-5.292172,4.919023,0.3774211,-0.004223346,4.768465E-05,0,0.883,0.186,0.15,1.391429,1.32,973.7392,-,964.7808
diff --git a/VectoCoreTest/TestData/Results/Auxiliaries.vsum b/VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck.vsum
similarity index 52%
rename from VectoCoreTest/TestData/Results/Auxiliaries.vsum
rename to VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck.vsum
index 192c02456d..689d0c5eae 100644
--- a/VectoCoreTest/TestData/Results/Auxiliaries.vsum
+++ b/VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck.vsum
@@ -1,2 +1,2 @@
 Job [-],Input File [-],Cycle [-],time [s],distance [km],speed [km/h],∆altitude [m],Eaux_FAN [kWh],Eaux_PS [kWh],Eaux_STP [kWh],Eaux_ES [kWh],Eaux_AC [kWh],Ppos [kW],Pneg [kW],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],CO2 [g/km],CO2 [g/tkm],FC-Final [g/km],FC-Final [l/100tkm],FC-Final [l/100km],PwheelPos [kW],Pbrake [kW],EposICE [kWh],EnegICE [kWh],Eair [kWh],Eroll [kWh],Egrad [kWh],Eacc [kWh],Eaux [kWh],Ebrake [kWh],Etransm [kWh],Eretarder [kWh],Etorqueconv [kWh],Mass [kg],Loading [kg],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],Acc.Noise [m/s^2],pAcc [%],pDec [%],pCruise [%],pStop [%]
-1,12t Delivery Truck.vecto,Long_Haul.vdri,5245,108.1818,74.25249,0.4157933,1.36807084861729,1.71919436802467,0.323441670835018,2.58087303572231,0.291388893230922,68.828245691688,-0.295060687814728,13939.92,187.7368,-,-,14048.65,189.2011,597.8755,-,189.2011,-,22.74052,53.3331431698079,-0.951296060530201,100.278930181362,-0.429887029885625,-53.7217975638455,-21.602133366182,-0.00594433389811052,8.54700596796142E-08,-6.28296870787938,-1.38598551041136,-16.8502154708157,0,0,7750,0,-4.545636E-10,0.432781,-0.5312394,0.2062322,0.0528122,0.04080076,0.8602479,0.04613918
\ No newline at end of file
+1,40t_Long_Haul_Truck.vecto,Long_Haul.vdri,5188,108.1817,75.06826,0.4176572,1.44111111111111,1.93108893699116,0.62256001614862,2.55282541645898,0.504388880299197,84.2005492982813,-1.38841319755122,16373.51,218.1149,-,-,16610.92,221.2776,699.2371,-,221.2776,-,26.59586,71.9230417326127,-2.65873198913168,121.342347155412,-2.00085768580437,-68.5272798927924,-27.4112346063885,-0.000913775395601988,6.82509400778347E-08,-7.05197461869982,-3.8315282110042,-10.5097224537532,-2.00511476749089,0,14600,0,-4.595578E-10,0.4826669,-0.5824779,0.194878,0.04471858,0.03797225,0.870663,0.04664611
\ No newline at end of file
diff --git a/VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod b/VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod
new file mode 100644
index 0000000000..aa2754fb9f
--- /dev/null
+++ b/VectoCoreTest/TestData/Results/EngineOnlyCycles/40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod	
@@ -0,0 +1,12 @@
+time [s],dt,dist [m]        ,v_act [km/h]    ,v_targ [km/h]   ,acc [m/s²],grad [%],n [1/min],Tq_eng [Nm],Tq_clutch [Nm],Tq_full [Nm],Tq_drag [Nm],Pe_eng [kW],Pe_full [kW],Pe_drag [kW],Pe_clutch [kW],Pa Eng [kW],Paux [kW],Gear [-],Ploss GB [kW],Ploss Diff [kW],Ploss Retarder [kW],Pa GB [kW],Pa Veh [kW],Proll [kW],Pair [kW]   ,Pgrad [kW],Pwheel [kW]  ,Pbrake [kW]  ,Paux_FAN [kW],Paux_STP [kW],Paux_AC [kW],Paux_ES [kW],Paux_PS [kW],FC-Map [g/h],FC-AUXc [g/h],FC-WHTCc [g/h]
+1.5     ,1 ,0               ,0               ,0               ,0         ,2.95017 ,560      ,83.44429   ,0             ,1180        ,-149        ,4.893429   ,69.19881    ,-8.737817   ,0             ,0          ,4.893429 ,0       ,0            ,0              ,0                  ,0         ,0          ,0         ,0           ,0         ,0            ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,2065.827    ,-            ,2095.781      
+2.5     ,1 ,0               ,0               ,0               ,0         ,2.95017 ,560      ,83.44429   ,0             ,1180        ,-149        ,4.893429   ,69.19881    ,-8.737817   ,0             ,0          ,4.893429 ,0       ,0            ,0              ,0                  ,0         ,0          ,0         ,0           ,0         ,0            ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,2065.827    ,-            ,2095.781      
+3.5     ,1 ,0.5             ,1.8             ,29.9999988555908,1         ,2.95017 ,593.1891 ,271.5101   ,175.3559      ,1264.632    ,-148.1703   ,16.86583   ,78.55721    ,-9.204132   ,10.89286      ,1.079541   ,4.893429 ,5       ,0.3043601    ,0.2645191      ,0.02653578         ,0         ,7.729102   ,0.4559692 ,0.0005906814,2.111786  ,10.29745     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,4088.593    ,-            ,4147.877      
+4.5     ,1 ,2               ,5.4             ,59.9999977111816,1         ,2.95017 ,593.1891 ,606.1465   ,527.3709      ,1264.632    ,-148.1703   ,37.65298   ,78.55721    ,-9.204132   ,32.75955      ,0          ,4.893429 ,5       ,0.9795703    ,0.7937708      ,0.07968796         ,0         ,23.18731   ,1.367908  ,0.0159484   ,6.335359  ,30.90652     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,8072.336    ,-            ,8189.384      
+5.5     ,1 ,4.5             ,9               ,59.9999977111816,1         ,2.95017 ,714.2208 ,857.2393   ,732.1379      ,1572.692    ,-148.5711   ,64.11552   ,117.6264    ,-11.11208   ,54.75881      ,4.463279   ,4.893429 ,5       ,1.743929     ,1.323674       ,0.1330889          ,0         ,38.64551   ,2.279846  ,0.07383517  ,10.55893  ,51.55812     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,12357.14    ,-            ,12536.31      
+6.5     ,1 ,7.33266353607178,10.1975887298584,59.9999977111816,-0.3346729,2.95017 ,714.2208 ,65.42628   ,0             ,1572.692    ,-148.5711   ,4.893429   ,117.6264    ,-11.11208   ,0             ,0          ,4.893429 ,0       ,0            ,0              ,0                  ,0         ,-14.65462  ,2.583215  ,0.1074059   ,11.96396  ,-4.005432E-05,-4.005432E-05,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,2320.086    ,-            ,2353.727      
+7.5     ,1 ,10.4979906082153,11.3951774597168,59.9999977111816,1         ,3.068014,705.4799 ,1005.703   ,944.2035      ,1550.446    ,-148.5274   ,74.29897   ,114.5434    ,-10.97286   ,69.75556      ,-0.3500228 ,4.893429 ,6       ,2.032654     ,1.684928       ,0.1688475          ,0         ,48.93027   ,2.886481  ,0.1498646   ,13.90252  ,65.86913     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,14211.79    ,-            ,14417.86      
+8.5     ,1 ,14.6633176803589,14.9951774597168,59.9999977111816,1         ,3.068014,928.3573 ,1102.886   ,946.8998      ,2117.669    ,-156.0596   ,107.2196   ,205.8742    ,-15.17171   ,92.05508      ,10.27113   ,4.893429 ,6       ,2.789697     ,2.219431       ,0.2229589          ,0         ,64.38847   ,3.798387  ,0.3414999   ,18.29464  ,86.823       ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,20212.8     ,-            ,20505.89      
+9.5     ,1 ,19.1540021896362,16.1664642333984,59.9999977111816,-0.3492851,3.068014,928.3573 ,50.33493   ,0             ,2117.669    ,-156.0596   ,4.893429   ,205.8742    ,-15.17171   ,0             ,0          ,4.893429 ,0       ,0            ,0              ,0                  ,0         ,-24.24664  ,4.095083  ,0.427938    ,19.72366  ,3.051758E-05 ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,3117.583    ,-            ,3162.787      
+10.5    ,1 ,23.9700441360474,17.3377510070801,59.9999977111816,1         ,3.068014,826.9958 ,1225.68    ,1227.125      ,1859.704    ,-150.4848   ,106.1474   ,161.0556    ,-13.0324    ,106.2725      ,-5.018576  ,4.893429 ,7       ,2.926056     ,2.56818        ,0.258632           ,0         ,74.44735   ,4.391778  ,0.5278543   ,21.15267  ,100.5196     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,20227.41    ,-            ,20520.71      
+11.5    ,1 ,29.7860860824585,20.9377510070801,59.9999977111816,1         ,3.068014,998.7128 ,1362.262   ,1230.922      ,2296.724    ,-159.9292   ,142.4721   ,240.2028    ,-16.72619   ,128.7359      ,8.842758   ,4.893429 ,7       ,3.632432     ,3.105886       ,0.313897           ,0         ,89.90556   ,5.303684  ,0.9296637   ,25.54479  ,121.6837     ,0            ,1            ,0.432        ,0.35        ,1.771429    ,1.34        ,26478.39    ,-            ,26862.32      
\ No newline at end of file
diff --git a/VectoCoreTest/Utils/AssertHelper.cs b/VectoCoreTest/Utils/AssertHelper.cs
index 079d3ef0cc..9925a89ce8 100644
--- a/VectoCoreTest/Utils/AssertHelper.cs
+++ b/VectoCoreTest/Utils/AssertHelper.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Diagnostics;
+using System.Globalization;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using TUGraz.VectoCore.Utils;
 
@@ -10,6 +11,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		/// <summary>
 		/// Assert an expected Exception.
 		/// </summary>
+		[DebuggerHidden]
 		public static void Exception<T>(Action func, string message = null) where T : Exception
 		{
 			try {
@@ -23,6 +25,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 			}
 		}
 
+		[DebuggerHidden]
 		public static void AreRelativeEqual(SI expected, SI actual)
 		{
 			Assert.IsTrue(actual.HasEqualUnit(expected),
@@ -46,16 +49,10 @@ namespace TUGraz.VectoCore.Tests.Utils
 				return;
 			}
 
-			if (expected.IsEqual(0.0)) {
-				Assert.AreEqual(expected, actual, DoubleExtensionMethods.Tolerance,
-					string.Format("Actual value is different. Difference: {3} Expected: {0}, Actual: {1}, Tolerance: {2}{4}",
-						expected, actual, toleranceFactor, expected - actual, message));
-				return;
-			}
-
-			Assert.IsTrue(Math.Abs(actual / expected - 1) < toleranceFactor,
-				string.Format("Actual value is different. Difference: {3} Expected: {0}, Actual: {1}, Tolerance: {2}{4}",
-					expected, actual, toleranceFactor, expected - actual, message));
+			var ratio = expected == 0 ? Math.Abs(actual) : Math.Abs(actual / expected - 1);
+			Assert.IsTrue(ratio < toleranceFactor, string.Format(CultureInfo.InvariantCulture,
+				"Given values are not equal. Expected: {0}, Actual: {1}, Difference: {3} (Tolerance: {2}){4}",
+				expected, actual, toleranceFactor * (expected == 0 ? 1 : expected), expected - actual, message));
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCoreTest/Utils/ResultFileHelper.cs b/VectoCoreTest/Utils/ResultFileHelper.cs
index 4c23cc344c..32100e6ec5 100644
--- a/VectoCoreTest/Utils/ResultFileHelper.cs
+++ b/VectoCoreTest/Utils/ResultFileHelper.cs
@@ -36,7 +36,6 @@ namespace TUGraz.VectoCore.Tests.Utils
 					string.Format("Moddata: Columns differ:\nExpected: {0}\nActual: {1}", string.Join(", ", expectedCols),
 						string.Join(", ", actualCols)));
 
-				//todo initial state
 				for (var i = 0; i < expected.Rows.Count; i++) {
 					var expectedRow = expected.Rows[i];
 					var actualRow = actual.Rows[i];
@@ -49,21 +48,33 @@ namespace TUGraz.VectoCore.Tests.Utils
 			}
 		}
 
-		public static void TestSumFile(string expectedFile, string actualFile)
+		public static void TestSumFile(string expectedFile, string actualFile, string[] testColumns = null)
 		{
 			Assert.IsTrue(File.Exists(actualFile), "SUM File is missing: " + actualFile);
 
-			var expected = File.ReadAllLines(expectedFile);
-			var actual = File.ReadAllLines(actualFile);
+			var expected = VectoCSVFile.Read(expectedFile, fullHeader: true);
+			var actual = VectoCSVFile.Read(actualFile, fullHeader: true);
 
-			Assert.AreEqual(expected.Length, actual.Length,
-				string.Format("SUM File row count differs.\nExpected {0} Rows in {1}\nGot {2} Rows in {3}", expected.Length,
-					expectedFile, actual.Length, actualFile));
+			Assert.AreEqual(expected.Rows.Count, actual.Rows.Count,
+				string.Format("SUM File row count differs.\nExpected {0} Rows in {1}\nGot {2} Rows in {3}", expected.Rows.Count,
+					expectedFile, actual.Rows.Count, actualFile));
 
-			Assert.AreEqual(expected.First(), actual.First(),
-				string.Format("SUM File Header differs:\nExpected: '{0}'\nActual  : '{1}'", expected.First(), actual.First()));
+			var actualCols = actual.Columns.Cast<DataColumn>().Select(x => x.ColumnName).OrderBy(x => x).ToList();
+			var expectedCols = expected.Columns.Cast<DataColumn>().Select(x => x.ColumnName).OrderBy(x => x).ToList();
 
-			// todo: test contents of sum file
+			Assert.IsTrue(expectedCols.SequenceEqual(actualCols),
+				string.Format("Moddata: Columns differ:\nExpected: {0}\nActual: {1}", string.Join(", ", expectedCols),
+					string.Join(", ", actualCols)));
+
+			for (var i = 0; i < expected.Rows.Count; i++) {
+				var expectedRow = expected.Rows[i];
+				var actualRow = actual.Rows[i];
+
+				foreach (var field in testColumns ?? new string[0]) {
+					AssertHelper.AreRelativeEqual(expectedRow.ParseDoubleOrGetDefault(field), actualRow.ParseDoubleOrGetDefault(field),
+						string.Format("t: {0}  field: {1}", i, field));
+				}
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCoreTest/VectoCoreTest.csproj b/VectoCoreTest/VectoCoreTest.csproj
index 9efb2ad7be..2559eb7b7f 100644
--- a/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCoreTest/VectoCoreTest.csproj
@@ -192,6 +192,9 @@
     <None Include="TestData\Cycles\Coach_24t_xshort.vdri">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="TestData\Cycles\LongHaul_short.vdri">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="TestData\Cycles\LOT2_rural Engine Only.vmod">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
@@ -306,10 +309,10 @@
     <None Include="TestData\Jobs\EngineOnlyJob.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Results\Auxiliaries.vmod">
+    <None Include="TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck.vsum">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Results\Auxiliaries.vsum">
+    <None Include="TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <None Include="TestData\Results\EngineFullLoadJumps\EngineFLJ_1000rpm_10Hz.csv">
-- 
GitLab