From 455f9f9bcffff70629166863d84dc9ed8e976a4d Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 13 May 2019 11:14:01 +0200
Subject: [PATCH] refactoring: use enum instead of two booleans for ecoroll
 combination

---
 .../InputData/DeclarationInputData.cs         | 61 ++++++++++++++++++-
 .../FileIO/JSON/JSONComponentInputData.cs     |  9 +--
 .../XMLDeclarationADASDataProvider.cs         | 13 ++--
 .../XMLDeclarationVehicleDataProvider.cs      |  9 +--
 .../DeclarationDataAdapter.cs                 |  3 +-
 .../Models/Declaration/ADASCombinations.cs    | 22 +++----
 .../Models/Declaration/DeclarationData.cs     |  3 +-
 .../SimulationComponent/Data/VehicleData.cs   |  3 +-
 .../OutputData/XML/XMLCustomerReport.cs       |  4 +-
 .../OutputData/XML/XMLManufacturerReport.cs   |  4 +-
 .../Models/Declaration/DeclarationDataTest.cs |  4 +-
 .../XML/XMLDeclarationInputTest.cs            |  4 +-
 12 files changed, 89 insertions(+), 50 deletions(-)

diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index ac9c2e42ec..c32b74e64f 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -33,6 +33,7 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Net.NetworkInformation;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 
@@ -199,9 +200,7 @@ namespace TUGraz.VectoCommon.InputData
 	{
 		bool EngineStopStart { get; }
 
-		bool EcoRollWitoutEngineStop { get; }
-
-		bool EcoRollWithEngineStop { get; }
+		EcoRollType EcoRoll { get; }
 
 		PredictiveCruiseControlType PredictiveCruiseControl { get; }
 	}
@@ -231,8 +230,64 @@ namespace TUGraz.VectoCommon.InputData
 		{
 			return pcc.ToString().Replace(Prefix, "").Replace(SeparatorEnum, SeparatorXML);
 		}
+
+		public static string GetName(this PredictiveCruiseControlType pcc)
+		{
+			return pcc.ToString().Replace(Prefix, Prefix.Replace(SeparatorEnum, " ")).Replace(SeparatorEnum, "&");
+		}
+	}
+
+	public enum EcoRollType
+	{
+		None,
+		WithoutEngineStop,
+		WithEngineStop
 	}
 
+	public static class EcorollTypeHelper
+	{
+		public static EcoRollType Get(bool ecoRollWithoutEngineStop, bool ecoRollWithEngineStop)
+		{
+			if (ecoRollWithEngineStop && ecoRollWithoutEngineStop) {
+				throw new VectoException("invalid combination or EcoRoll");
+			}
+
+			if (ecoRollWithoutEngineStop) {
+				return EcoRollType.WithoutEngineStop;
+			}
+
+			if (ecoRollWithEngineStop) {
+				return EcoRollType.WithEngineStop;
+			}
+
+			return EcoRollType.None;
+		}
+
+		public static EcoRollType Parse(string ecoRoll)
+		{
+			return ecoRoll.ParseEnum<EcoRollType>();
+		}
+
+		public static bool WithoutEngineStop(this EcoRollType ecoRoll)
+		{
+			return ecoRoll == EcoRollType.WithoutEngineStop;
+		}
+
+		public static bool WithEngineStop(this EcoRollType ecoRoll)
+		{
+			return ecoRoll == EcoRollType.WithEngineStop;
+		}
+
+		public static string GetName(this EcoRollType ecoRoll)
+		{
+			switch (ecoRoll) {
+				case EcoRollType.None: return "None";
+				case EcoRollType.WithoutEngineStop: return "without engine stop";
+				case EcoRollType.WithEngineStop: return "with engine stop";
+				default: throw new ArgumentOutOfRangeException(nameof(ecoRoll), ecoRoll, null);
+			}
+		}
+	}
 
 	public enum TankSystem
 	{
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
index e2e4e9563f..4da2a5e537 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
@@ -404,14 +404,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			get { return DeclarationData.Vehicle.ADAS.EngineStopStartDefault; }
 		}
 
-		public bool EcoRollWitoutEngineStop
+		public EcoRollType EcoRoll
 		{
-			get { return DeclarationData.Vehicle.ADAS.EcoRollWitoutEngineStop; }
-		}
-
-		public bool EcoRollWithEngineStop
-		{
-			get { return DeclarationData.Vehicle.ADAS.EcoRollWithEngineStop; }
+			get { return DeclarationData.Vehicle.ADAS.EcoRoll; }
 		}
 
 		public PredictiveCruiseControlType PredictiveCruiseControl
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationADASDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationADASDataProvider.cs
index e0fa06b48b..d3079bbbe9 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationADASDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationADASDataProvider.cs
@@ -41,14 +41,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return XmlConvert.ToBoolean(GetString(XMLNames.Vehicle_ADAS_EngineStopStart)); }
 		}
 
-		public virtual bool EcoRollWitoutEngineStop
+		public virtual EcoRollType EcoRoll
 		{
-			get { return XmlConvert.ToBoolean(GetString(XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop)); }
-		}
-
-		public virtual bool EcoRollWithEngineStop
-		{
-			get { return XmlConvert.ToBoolean(GetString(XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart)); }
+			get {
+				return EcorollTypeHelper.Get(
+					XmlConvert.ToBoolean(GetString(XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop)),
+					XmlConvert.ToBoolean(GetString(XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart)));
+			}
 		}
 
 		public virtual PredictiveCruiseControlType PredictiveCruiseControl
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
index e1e7b46966..6db977c721 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
@@ -365,14 +365,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 				get { return false; }
 			}
 
-			public bool EcoRollWitoutEngineStop
+			public EcoRollType EcoRoll
 			{
-				get { return false; }
-			}
-
-			public bool EcoRollWithEngineStop
-			{
-				get { return false; }
+				get { return EcoRollType.None; }
 			}
 
 			public PredictiveCruiseControlType PredictiveCruiseControl
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 66a932a5ff..098b5d1e51 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -160,8 +160,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		{
 			return new VehicleData.ADASData {
 				EngineStopStart = adas.EngineStopStart,
-				EcoRollWithoutEngineStop = adas.EcoRollWitoutEngineStop,
-				EcoRollWithEngineStop = adas.EcoRollWithEngineStop,
+				EcoRoll = adas.EcoRoll,
 				PredictiveCruiseControl = adas.PredictiveCruiseControl
 			};
 		}
diff --git a/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs b/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
index 6e4d470510..f76826c7cd 100644
--- a/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
+++ b/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
@@ -45,21 +45,21 @@ namespace TUGraz.VectoCore.Models.Declaration
 	{
 		public string ID;
 	}
-	public sealed class ADASCombinations : LookupData<bool, bool, bool, PredictiveCruiseControlType, ADASCombination>
+	public sealed class ADASCombinations : LookupData<bool, EcoRollType, PredictiveCruiseControlType, ADASCombination>
 	{
 		private readonly List<Entry> _combinations = new List<Entry>();
 
 		#region Overrides of LookupData
 
-		public override ADASCombination Lookup(bool enginestopstart, bool ecorollwithoutenginestop, bool ecorollwithenginestop, PredictiveCruiseControlType pcc)
+		public override ADASCombination Lookup(bool enginestopstart, EcoRollType ecoRoll, PredictiveCruiseControlType pcc)
 		{
 			try {
 				var entry = _combinations.First(
-					x => x.EngineStopStart == enginestopstart && x.EcoRollWithoutEngineStop == ecorollwithoutenginestop &&
-						x.EcorollWithEngineStop == ecorollwithenginestop && x.PCCType == pcc);
+					x => x.EngineStopStart == enginestopstart && x.EcoRoll == ecoRoll &&
+						x.PCCType == pcc);
 				return new ADASCombination {ID = entry.ADASCombination};
 			} catch (Exception ) { 
-				throw new VectoException(string.Format(ErrorMessage, enginestopstart, ecorollwithoutenginestop, ecorollwithenginestop, pcc));
+				throw new VectoException(string.Format(ErrorMessage, enginestopstart, ecoRoll, pcc));
 			}
 		}
 
@@ -72,7 +72,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 		{
 			get {
 				return
-					"ADAS Combination Lookup Error: No entry found for engine stop/start: {0}, eco roll w/o engine stop: {1}, eco roll w engine stop: {2}, PCC: {3}";
+					"ADAS Combination Lookup Error: No entry found for engine stop/start: {0}, eco roll: {1}, PCC: {2}";
 			}
 		}
 
@@ -81,8 +81,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			foreach (DataRow row in table.Rows) {
 				_combinations.Add(new Entry() {
 					EngineStopStart = row.ParseBoolean("enginestopstart"),
-					EcoRollWithoutEngineStop = row.ParseBoolean("ecorollwithoutenginestop"),
-					EcorollWithEngineStop = row.ParseBoolean("ecorollwithenginestop"),
+					EcoRoll = EcorollTypeHelper.Get(row.ParseBoolean("ecorollwithoutenginestop"), row.ParseBoolean("ecorollwithenginestop")),
 					PCCType = PredictiveCruiseControlTypeHelper.Parse(row.Field<string>("predictivecruisecontrol")),
 					ADASCombination = row.Field<string>("adascombination")
 				});
@@ -94,8 +93,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 		public struct Entry
 		{
 			public bool EngineStopStart;
-			public bool EcoRollWithoutEngineStop;
-			public bool EcorollWithEngineStop;
+			public EcoRollType EcoRoll;
 			public PredictiveCruiseControlType PCCType;
 			public string ADASCombination;
 
@@ -104,13 +102,13 @@ namespace TUGraz.VectoCore.Models.Declaration
 		public ADASCombination Lookup(IAdvancedDriverAssistantSystemDeclarationInputData adas)
 		{
 			return Lookup(
-				adas.EngineStopStart, adas.EcoRollWitoutEngineStop, adas.EcoRollWithEngineStop, adas.PredictiveCruiseControl);
+				adas.EngineStopStart, adas.EcoRoll, adas.PredictiveCruiseControl);
 		}
 
 		internal ADASCombination Lookup(VehicleData.ADASData adas)
 		{
 			return Lookup(
-				adas.EngineStopStart, adas.EcoRollWithoutEngineStop, adas.EcoRollWithEngineStop, adas.PredictiveCruiseControl);
+				adas.EngineStopStart, adas.EcoRoll, adas.PredictiveCruiseControl);
 		}
 	}
 }
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index d6780113b2..31010b77dc 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -543,8 +543,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 			public static class ADAS {
 				public const PredictiveCruiseControlType PredictiveCruiseControlDefault = PredictiveCruiseControlType.None;
-				public const bool EcoRollWithEngineStop = false;
-				public const bool EcoRollWitoutEngineStop = false;
+				public const EcoRollType EcoRoll = EcoRollType.None;
 				public const bool EngineStopStartDefault = false;
 			}
 		}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
index 4bdc942f18..65bcb06ab1 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
@@ -219,8 +219,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public class ADASData
 		{
 			public bool EngineStopStart { get; internal set; }
-			public bool EcoRollWithoutEngineStop { get; internal set; }
-			public bool EcoRollWithEngineStop { get; internal set; }
+			public EcoRollType EcoRoll { get; internal set; }
 			public PredictiveCruiseControlType PredictiveCruiseControl { get; internal set; }
 		}
 
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
index d3cc68d1c3..b2b00935e6 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
@@ -120,8 +120,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			return new XElement(tns + XMLNames.Vehicle_ADAS,
 								new XElement(tns + XMLNames.Vehicle_ADAS_EngineStopStart, adasData.EngineStopStart),
-								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutEngineStop),
-								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRollWithEngineStop),
+								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRoll.WithoutEngineStop()),
+								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRoll.WithEngineStop()),
 								new XElement(tns + XMLNames.Vehicle_ADAS_PCC, adasData.PredictiveCruiseControl != PredictiveCruiseControlType.None)
 			);
 		}
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
index 1f7f252fdb..59cad7f46a 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
@@ -112,8 +112,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			return new XElement(tns + XMLNames.Vehicle_ADAS,
 				new XElement(tns + XMLNames.Vehicle_ADAS_EngineStopStart, adasData.EngineStopStart),
-				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutEngineStop),
-				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRollWithEngineStop),
+				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRoll.WithoutEngineStop()),
+				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRoll.WithEngineStop()),
 				new XElement(tns + XMLNames.Vehicle_ADAS_PCC, adasData.PredictiveCruiseControl != PredictiveCruiseControlType.None)
 			);
 		}
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index 0d46021d6b..e9eb84f86f 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -1996,7 +1996,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			bool engineStopStart, bool ecoRollWOEngineStop, bool ecoRollWEngineStop, PredictiveCruiseControlType pcc,
 			string expectedADASGroup)
 		{
-			var adas = DeclarationData.ADASCombinations.Lookup(engineStopStart, ecoRollWOEngineStop, ecoRollWEngineStop, pcc);
+			var adas = DeclarationData.ADASCombinations.Lookup(engineStopStart, EcorollTypeHelper.Get(ecoRollWOEngineStop, ecoRollWEngineStop), pcc);
 			Assert.AreEqual(adas.ID, expectedADASGroup);
 		}
 
@@ -2006,7 +2006,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			bool engineStopStart, bool ecoRollWOEngineStop, bool ecoRollWEngineStop, PredictiveCruiseControlType pcc)
 		{
 			AssertHelper.Exception<VectoException>(() => {
-				DeclarationData.ADASCombinations.Lookup(engineStopStart, ecoRollWOEngineStop, ecoRollWEngineStop, pcc);
+				DeclarationData.ADASCombinations.Lookup(engineStopStart, EcorollTypeHelper.Get(ecoRollWOEngineStop, ecoRollWEngineStop), pcc);
 			});
 		}
 
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index 5e28657872..1cf052de56 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -1008,8 +1008,8 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.IsFalse(vehicle.ExemptedVehicle);
 
 			Assert.AreEqual(engineStopStart, adas.EngineStopStart);
-			Assert.AreEqual(ecoRollWith, adas.EcoRollWithEngineStop);
-			Assert.AreEqual(ecoRollWithout, adas.EcoRollWitoutEngineStop);
+			Assert.AreEqual(ecoRollWith, adas.EcoRoll.WithEngineStop());
+			Assert.AreEqual(ecoRollWithout, adas.EcoRoll.WithoutEngineStop());
 			Assert.AreEqual(pcc, adas.PredictiveCruiseControl);
 		}
 
-- 
GitLab