From 41716aea4384ca0fcc0b7d7583e3f91d3227cc41 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 15 Dec 2017 10:50:09 +0100
Subject: [PATCH] extend xml declaration input tests to read out allowed
 options from XSD

---
 .../DeclarationDataAdapter.cs                 |  12 +-
 .../VectoCore/Models/Declaration/Segments.cs  |   5 +
 .../XML/XMLDeclarationInputTest.cs            | 340 ++++++++++--------
 3 files changed, 198 insertions(+), 159 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index c5803432b4..c3e9d134a0 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -50,6 +50,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 {
 	public class DeclarationDataAdapter : AbstractSimulationDataAdapter
 	{
+		public static readonly GearboxType[] SupportedGearboxTypes = {GearboxType.MT, GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial};
+
 		public DriverData CreateDriverData()
 		{
 			var lookAheadData = new DriverData.LACData {
@@ -208,13 +210,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				WarnDeclarationMode("GearboxData");
 			}
 			var retVal = SetCommonGearboxData(gearbox);
-			switch (gearbox.Type) {
-				case GearboxType.DrivingCycle:
-				case GearboxType.ATPowerSplit:
-					throw new VectoSimulationException(
-						"Unsupported gearbox type: {0}!", retVal.Type);
-				//case GearboxType.Custom:
-				//	throw new VectoSimulationException("Custom Transmission not supported in DeclarationMode!");
+
+			if (!SupportedGearboxTypes.Contains(gearbox.Type)) {
+				throw new VectoSimulationException("Unsupported gearbox type: {0}!", retVal.Type);
 			}
 			var gearsInput = gearbox.Gears;
 			if (gearsInput.Count < 1) {
diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs
index 90f976b596..9addc962a2 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs
@@ -70,6 +70,11 @@ namespace TUGraz.VectoCore.Models.Declaration
 			return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, false);
 		}
 
+		public VehicleCategory[] GetVehicleCategories(bool declarationOnly = true)
+		{
+			return _segmentTable.AsEnumerable().Where(r => !declarationOnly || r.Field<string>("valid") == "1").Select(r => EnumHelper.ParseEnum<VehicleCategory>(r.Field<string>("vehiclecategory"))).Distinct().ToArray();
+		}
+
 		public Segment Lookup(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
 			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool considerInvalid)
 		{
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index cd0cbd2c76..0d88cb16b4 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -51,10 +51,11 @@ using TUGraz.VectoCore.OutputData.FileIO;
 using TUGraz.VectoCore.Tests.Utils;
 using TUGraz.VectoCore.Utils;
 using NUnit.Framework;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
 
 namespace TUGraz.VectoCore.Tests.XML
 {
-    [TestFixture]
+	[TestFixture]
 	public class XMLDeclarationInputTest
 	{
 		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
@@ -94,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.XML
 
 			Assert.AreEqual("560.00", fcMapTable.Rows[0][0]);
 			var fcMap = FuelConsumptionMapReader.Create(fcMapTable);
-            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(),
+			Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(),
 				fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
 
 			var fldTable = engineDataProvider.FullLoadCurve;
@@ -105,6 +106,39 @@ namespace TUGraz.VectoCore.Tests.XML
 			var fldMap = FullLoadCurveReader.Create(fldTable, true);
 		}
 
+		[TestCase()]
+		public void TestEngineFuelTypes()
+		{
+			var fuelTypes = GetEnumOptions("FuelTypeType", "1.0");
+			foreach (var fuel in fuelTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				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);
+
+				var technology = nav.SelectSingleNode(helper.QueryAbs(
+						helper.NSPrefix(XMLNames.VectoInputDeclaration,
+							Constants.XML.RootNSPrefix),
+						XMLNames.Component_Vehicle,
+						XMLNames.Vehicle_Components,
+						XMLNames.Component_Engine, XMLNames.ComponentDataWrapper, XMLNames.Engine_FuelType),
+					manager);
+				technology.SetValue(fuel);
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+				var techInput = inputDataProvider.JobInputData.Vehicle.EngineInputData.FuelType;
+				Assert.AreEqual(fuel, techInput.ToXMLFormat());
+
+				Assert.NotNull(DeclarationData.FuelData.Lookup(techInput));
+			}
+		}
+
 		[TestCase]
 		public void TestXMLInputGbx()
 		{
@@ -149,7 +183,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
 			Assert.IsNotNull(lossMap);
 
-			AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; });
+			AssertHelper.Exception<VectoException>(() => {
+				var tmp = axlegearDataProvider.Efficiency;
+			});
 		}
 
 		[TestCase]
@@ -184,7 +220,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			var axles = vehicleDataProvider.Axles;
 
 			var tyre = axles[0].Tyre;
-			Assert.AreEqual("315/70 R22.5",tyre.Dimension);
+			Assert.AreEqual("315/70 R22.5", tyre.Dimension);
 			Assert.AreEqual(0.0055, tyre.RollResistanceCoefficient);
 			Assert.AreEqual(31300, tyre.TyreTestLoad.Value());
 			Assert.AreEqual("e12*0815/8051*2017/05E0000*00", tyre.CertificationNumber);
@@ -216,7 +252,7 @@ namespace TUGraz.VectoCore.Tests.XML
 				XMLNames.ComponentDataWrapper,
 				XMLNames.AxleWheels_Axles,
 				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
+			), manager);
 			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
 			firstAxle.SetTypedValue(2);
 
@@ -226,7 +262,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 			var vehicleDataProvider = inputDataProvider.JobInputData.Vehicle;
 
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+			AssertHelper.Exception<VectoException>(() => {
+				var axles = vehicleDataProvider.Axles;
+			});
 		}
 
 		[TestCase]
@@ -249,7 +287,7 @@ namespace TUGraz.VectoCore.Tests.XML
 				XMLNames.ComponentDataWrapper,
 				XMLNames.AxleWheels_Axles,
 				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
+			), manager);
 			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
 			firstAxle.SetTypedValue(0);
 
@@ -257,7 +295,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 			AssertHelper.Exception<VectoException>(
-				() => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); });
+				() => {
+					var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+				});
 		}
 
 		[TestCase]
@@ -280,7 +320,7 @@ namespace TUGraz.VectoCore.Tests.XML
 				XMLNames.ComponentDataWrapper,
 				XMLNames.AxleWheels_Axles,
 				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
+			), manager);
 			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
 			firstAxle.SetTypedValue(3);
 
@@ -290,7 +330,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 			var vehicleDataProvider = inputDataProvider.JobInputData.Vehicle;
 
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+			AssertHelper.Exception<VectoException>(() => {
+				var axles = vehicleDataProvider.Axles;
+			});
 		}
 
 		[TestCase]
@@ -312,7 +354,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First());
 		}
 
-		
+
 		[TestCase]
 		public void TestVehicleInput()
 		{
@@ -390,7 +432,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count);
 			Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]);
 
-			AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; });
+			AssertHelper.Exception<VectoException>(() => {
+				var tmp = angledriveDataProvider.Efficiency;
+			});
 		}
 
 		[TestCase]
@@ -478,7 +522,9 @@ namespace TUGraz.VectoCore.Tests.XML
 
 			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 
-			AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.JobInputData.Vehicle.RetarderInputData.Ratio; });
+			AssertHelper.Exception<VectoException>(() => {
+				var tmp = inputDataProvider.JobInputData.Vehicle.RetarderInputData.Ratio;
+			});
 		}
 
 		[TestCase]
@@ -519,14 +565,9 @@ namespace TUGraz.VectoCore.Tests.XML
 		[TestCase]
 		public void TestRetarderTypes()
 		{
-			var retarderTypes = new Dictionary<string, RetarderType>() {
-				{ "None", RetarderType.None },
-				{ "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission },
-				{ "Engine Retarder", RetarderType.EngineRetarder },
-				{ "Transmission Input Retarder", RetarderType.TransmissionInputRetarder },
-				{ "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder }
-			}
-				;
+			var retarderTypes = GetEnumOptions("RetarderTypeType", "1.0");
+			Assert.IsTrue(retarderTypes.Length > 0);
+
 			foreach (var retarderType in retarderTypes) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -541,30 +582,20 @@ namespace TUGraz.VectoCore.Tests.XML
 					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
 					XMLNames.Component_Vehicle,
 					XMLNames.Vehicle_RetarderType), manager);
-				xmlRetarderType.SetValue(retarderType.Key);
+				xmlRetarderType.SetValue(retarderType);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 
-				Assert.AreEqual(retarderType.Value, inputDataProvider.JobInputData.Vehicle.RetarderInputData.Type);
+				Assert.AreEqual(retarderType, inputDataProvider.JobInputData.Vehicle.RetarderInputData.Type.ToXMLFormat());
 			}
 		}
 
 		[TestCase]
 		public void TestAxleConfigurationTypes()
 		{
-			var axleConfigurations = new Dictionary<string, AxleConfiguration>() {
-				{ "4x2", AxleConfiguration.AxleConfig_4x2 },
-				//{ "4x4", AxleConfiguration.AxleConfig_4x4 },
-				{ "6x2", AxleConfiguration.AxleConfig_6x2 },
-				{ "6x4", AxleConfiguration.AxleConfig_6x4 },
-				//{ "6x6", AxleConfiguration.AxleConfig_6x6 },
-				//{ "8x2", AxleConfiguration.AxleConfig_8x2 },
-				{ "8x4", AxleConfiguration.AxleConfig_8x4 },
-				//{ "8x6", AxleConfiguration.AxleConfig_8x6 },
-				//{ "8x8", AxleConfiguration.AxleConfig_8x8 }
-			};
+			var axleConfigurations = GetEnumOptions("VehicleAxleConfigurationDeclarationType", "1.0");
 			foreach (var axleConfiguration in axleConfigurations) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -575,30 +606,25 @@ namespace TUGraz.VectoCore.Tests.XML
 				var helper = new XPathHelper(ExecutionMode.Declaration);
 				helper.AddNamespaces(manager);
 
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+				var xmlAxleConf = nav.SelectSingleNode(helper.QueryAbs(
 					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
 					XMLNames.Component_Vehicle,
 					XMLNames.Vehicle_AxleConfiguration), manager);
-				xmlRetarderType.SetValue(axleConfiguration.Key);
+				xmlAxleConf.SetValue(axleConfiguration);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 
-				Assert.AreEqual(axleConfiguration.Value, inputDataProvider.JobInputData.Vehicle.AxleConfiguration);
+				Assert.AreEqual(axleConfiguration, inputDataProvider.JobInputData.Vehicle.AxleConfiguration.GetName());
 			}
 		}
 
 		[TestCase]
 		public void TestVehicleCategoryTypes()
 		{
-			var vehicleCategories = new Dictionary<string, VehicleCategory>() {
-				{ "Rigid Truck", VehicleCategory.RigidTruck },
-				{ "Tractor", VehicleCategory.Tractor },
-				//{ "City Bus", VehicleCategory.CityBus },
-				//{ "Interurban Bus", VehicleCategory.InterurbanBus },
-				//{ "Coach", VehicleCategory.Coach }
-			};
+			var vehicleCategories = GetEnumOptions("VehicleCategoryDeclarationType", "1.0");
+			var allowedCategories = DeclarationData.Segments.GetVehicleCategories();
 			foreach (var vehicleCategory in vehicleCategories) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -613,13 +639,15 @@ namespace TUGraz.VectoCore.Tests.XML
 					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
 					XMLNames.Component_Vehicle,
 					XMLNames.Vehicle_VehicleCategory), manager);
-				xmlRetarderType.SetValue(vehicleCategory.Key);
+				xmlRetarderType.SetValue(vehicleCategory);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
 
-				Assert.AreEqual(vehicleCategory.Value, inputDataProvider.JobInputData.Vehicle.VehicleCategory);
+				var vehCategory = inputDataProvider.JobInputData.Vehicle.VehicleCategory;
+				Assert.AreEqual(vehicleCategory, vehCategory.ToXMLFormat());
+				Assert.IsTrue(allowedCategories.Contains(vehCategory));
 			}
 		}
 
@@ -627,8 +655,8 @@ namespace TUGraz.VectoCore.Tests.XML
 		[TestCase]
 		public void TestWheelsTypes()
 		{
-			var retarderTypes = new Dictionary<string, RetarderType>() { };
-			foreach (var retarderType in retarderTypes) {
+			var wheelDimensions = GetEnumOptions("TyreDimensionType", "1.0");
+			foreach (var wheelDimension in wheelDimensions) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
 				var doc = new XmlDocument();
@@ -638,94 +666,97 @@ namespace TUGraz.VectoCore.Tests.XML
 				var helper = new XPathHelper(ExecutionMode.Declaration);
 				helper.AddNamespaces(manager);
 
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_RetarderType),
+				var tyredimensionNode = nav.SelectSingleNode(helper.QueryAbs(
+						helper.NSPrefix(XMLNames.VectoInputDeclaration,
+							Constants.XML.RootNSPrefix),
+						XMLNames.Component_Vehicle, XMLNames.Vehicle_Components, XMLNames.Component_AxleWheels,
+						XMLNames.ComponentDataWrapper,
+						XMLNames.AxleWheels_Axles, XMLNames.AxleWheels_Axles_Axle, XMLNames.AxleWheels_Axles_Axle_Tyre,
+						XMLNames.ComponentDataWrapper, XMLNames.AxleWheels_Axles_Axle_Dimension),
 					manager);
-				xmlRetarderType.SetValue(retarderType.Key);
+				tyredimensionNode.SetValue(wheelDimension);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
 					true);
 
-				Assert.AreEqual(retarderType.Value,
-					inputDataProvider.JobInputData.Vehicle.RetarderInputData.Type);
+				var tyreDimension = inputDataProvider.JobInputData.Vehicle.Axles.First().Tyre.Dimension;
+				Assert.AreEqual(wheelDimension, tyreDimension);
+				Assert.IsTrue(DeclarationData.Wheels.GetWheelsDimensions().Contains(tyreDimension), "Unknown tyre dimension {0}",
+					tyreDimension);
 			}
 		}
 
 		[TestCase]
 		public void TestPTOTypeTypes()
 		{
-			var ptoTypes = new string[][] {
-				new[] { "none", "none" },
-				new[] { "only one engaged gearwheel above oil level", "none" },
-				new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" },
-			};
-			foreach (var ptoType in ptoTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				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);
-
-				var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_ShaftsGearWheels),
-					manager);
-				ptoGearWheels.SetValue(ptoType[0]);
-				var ptoOther = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_OtherElements),
-					manager);
-				ptoOther.SetValue(ptoType[1]);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				if (ptoType[0] == "none") {
-					Assert.AreEqual("None",
-						inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
-				} else if (ptoType[0] == "only one engaged gearwheel above oil level") {
-					Assert.AreEqual(ptoType[0],
-						inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
-				} else {
-					Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]),
-						inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
+			var ptoGearWheels = GetEnumOptions("PTOShaftsGearWheelsType", "1.0");
+			var ptoOthers = GetEnumOptions("PTOOtherElementsType", "1.0");
+
+			foreach (var ptoGearWheel in ptoGearWheels) {
+				foreach (var ptoOther in ptoOthers) {
+					if (ptoGearWheel == "none" || ptoGearWheel == "only one engaged gearwheel above oil level") {
+						if (ptoOther != "none") {
+							continue;
+						}
+					} else {
+						if (ptoOther == "none") {
+							continue;
+						}
+					}
+					var reader = XmlReader.Create(SampleVehicleDecl);
+
+					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);
+
+					var ptoGearWheelsNode = nav.SelectSingleNode(helper.QueryAbs(
+							helper.NSPrefix(XMLNames.VectoInputDeclaration,
+								Constants.XML.RootNSPrefix),
+							XMLNames.Component_Vehicle,
+							XMLNames.Vehicle_PTO,
+							XMLNames.Vehicle_PTO_ShaftsGearWheels),
+						manager);
+					ptoGearWheelsNode.SetValue(ptoGearWheel);
+					var ptoOtherNode = nav.SelectSingleNode(helper.QueryAbs(
+							helper.NSPrefix(XMLNames.VectoInputDeclaration,
+								Constants.XML.RootNSPrefix),
+							XMLNames.Component_Vehicle,
+							XMLNames.Vehicle_PTO,
+							XMLNames.Vehicle_PTO_OtherElements),
+						manager);
+					ptoOtherNode.SetValue(ptoOther);
+
+					var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+					var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+						true);
+
+					if (ptoGearWheel == "none") {
+						Assert.AreEqual("None",
+							inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
+					} else if (ptoGearWheel == "only one engaged gearwheel above oil level") {
+						Assert.AreEqual(ptoGearWheel,
+							inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
+					} else {
+						Assert.AreEqual(string.Format("{0} - {1}", ptoGearWheel, ptoOther),
+							inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
+					}
+					Assert.NotNull(DeclarationData.PTOTransmission.Lookup(inputDataProvider.JobInputData.Vehicle
+						.PTOTransmissionInputData
+						.PTOTransmissionType));
 				}
-				DeclarationData.PTOTransmission.Lookup(inputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData.PTOTransmissionType);
 			}
 		}
 
 		[TestCase]
 		public void TestAngledriveTypes()
 		{
-			var angledriveTypes = new Dictionary<string, AngledriveType>() {
-				{ "None", AngledriveType.None },
-				{ "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox },
-				{ "Separate Angledrive", AngledriveType.SeparateAngledrive }
-			};
+			var angledriveTypes = GetEnumOptions("AngledriveTypeType", "1.0");
 			foreach (var angleDrive in angledriveTypes) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -736,32 +767,27 @@ namespace TUGraz.VectoCore.Tests.XML
 				var helper = new XPathHelper(ExecutionMode.Declaration);
 				helper.AddNamespaces(manager);
 
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_AngledriveType),
+				var angledriveNode = nav.SelectSingleNode(helper.QueryAbs(
+						helper.NSPrefix(XMLNames.VectoInputDeclaration,
+							Constants.XML.RootNSPrefix),
+						XMLNames.Component_Vehicle,
+						XMLNames.Vehicle_AngledriveType),
 					manager);
-				xmlRetarderType.SetValue(angleDrive.Key);
+				angledriveNode.SetValue(angleDrive);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
 					true);
 
-				Assert.AreEqual(angleDrive.Value, inputDataProvider.JobInputData.Vehicle.AngledriveInputData.Type);
+				Assert.AreEqual(angleDrive, inputDataProvider.JobInputData.Vehicle.AngledriveInputData.Type.ToXMLFormat());
 			}
 		}
 
 		[TestCase]
 		public void TestGearboxTypes()
 		{
-			var gearboxTypes = new Dictionary<string, GearboxType>() {
-				{ "SMT", GearboxType.MT },
-				{ "AMT", GearboxType.AMT },
-				{ "APT-S", GearboxType.ATSerial },
-				{ "APT-P", GearboxType.ATPowerSplit }
-			};
+			var gearboxTypes = GetEnumOptions("GearboxTransmissionTypeType", "1.0");
 			foreach (var gearboxType in gearboxTypes) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -773,22 +799,24 @@ namespace TUGraz.VectoCore.Tests.XML
 				helper.AddNamespaces(manager);
 
 				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_Components,
-					XMLNames.Component_Gearbox,
-					XMLNames.ComponentDataWrapper,
-					XMLNames.Gearbox_TransmissionType),
+						helper.NSPrefix(XMLNames.VectoInputDeclaration,
+							Constants.XML.RootNSPrefix),
+						XMLNames.Component_Vehicle,
+						XMLNames.Vehicle_Components,
+						XMLNames.Component_Gearbox,
+						XMLNames.ComponentDataWrapper,
+						XMLNames.Gearbox_TransmissionType),
 					manager);
-				xmlRetarderType.SetValue(gearboxType.Key);
+				xmlRetarderType.SetValue(gearboxType);
 
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
 
 				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
 					true);
 
-				Assert.AreEqual(gearboxType.Value, inputDataProvider.JobInputData.Vehicle.GearboxInputData.Type);
+				var gbxType = inputDataProvider.JobInputData.Vehicle.GearboxInputData.Type;
+				Assert.AreEqual(gearboxType, gbxType.ToXMLFormat());
+				Assert.IsTrue(DeclarationDataAdapter.SupportedGearboxTypes.Contains(gbxType));
 			}
 		}
 
@@ -823,10 +851,14 @@ namespace TUGraz.VectoCore.Tests.XML
 
 			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
 
-			Assert.AreEqual(CertificationMethod.Option2, inputDataProvider.JobInputData.Vehicle.GearboxInputData.CertificationMethod);
-			Assert.AreEqual(CertificationMethod.Measured, inputDataProvider.JobInputData.Vehicle.AxleGearInputData.CertificationMethod);
-			Assert.AreEqual(CertificationMethod.Measured, inputDataProvider.JobInputData.Vehicle.RetarderInputData.CertificationMethod);
-			Assert.AreEqual(CertificationMethod.Measured, inputDataProvider.JobInputData.Vehicle.AirdragInputData.CertificationMethod);
+			Assert.AreEqual(CertificationMethod.Option2,
+				inputDataProvider.JobInputData.Vehicle.GearboxInputData.CertificationMethod);
+			Assert.AreEqual(CertificationMethod.Measured,
+				inputDataProvider.JobInputData.Vehicle.AxleGearInputData.CertificationMethod);
+			Assert.AreEqual(CertificationMethod.Measured,
+				inputDataProvider.JobInputData.Vehicle.RetarderInputData.CertificationMethod);
+			Assert.AreEqual(CertificationMethod.Measured,
+				inputDataProvider.JobInputData.Vehicle.AirdragInputData.CertificationMethod);
 		}
 
 		[TestCase]
@@ -838,7 +870,8 @@ namespace TUGraz.VectoCore.Tests.XML
 		[TestCase]
 		public void TestAuxElectricSystemTechTypes()
 		{
-			TestAuxTech(AuxiliaryType.ElectricSystem, GetEnumOptions("AuxESTechnologyType", "1.0"), DeclarationData.ElectricSystem);
+			TestAuxTech(AuxiliaryType.ElectricSystem, GetEnumOptions("AuxESTechnologyType", "1.0"),
+				DeclarationData.ElectricSystem);
 		}
 
 		[TestCase]
@@ -850,13 +883,15 @@ namespace TUGraz.VectoCore.Tests.XML
 		[TestCase]
 		public void TestAuxPneumaticSystemTechTypes()
 		{
-			TestAuxTech(AuxiliaryType.PneumaticSystem, GetEnumOptions("AuxPSTechnologyType", "1.0"), DeclarationData.PneumaticSystem);
+			TestAuxTech(AuxiliaryType.PneumaticSystem, GetEnumOptions("AuxPSTechnologyType", "1.0"),
+				DeclarationData.PneumaticSystem);
 		}
 
 		[TestCase]
 		public void TestAuxHVACTechTypes()
 		{
-			TestAuxTech(AuxiliaryType.HVAC, GetEnumOptions("AuxHVACTechnologyType", "1.0"), DeclarationData.HeatingVentilationAirConditioning);
+			TestAuxTech(AuxiliaryType.HVAC, GetEnumOptions("AuxHVACTechnologyType", "1.0"),
+				DeclarationData.HeatingVentilationAirConditioning);
 		}
 
 		private string[] GetEnumOptions(string xmlType, string schemaVersion)
@@ -870,7 +905,8 @@ namespace TUGraz.VectoCore.Tests.XML
 			}
 			var reader = new XPathDocument(resource);
 			var nav = reader.CreateNavigator();
-			var nodes = nav.Select(string.Format("//*[local-name()='simpleType' and @name='{0}']//*[local-name()='enumeration']/@value", xmlType));
+			var nodes = nav.Select(
+				string.Format("//*[local-name()='simpleType' and @name='{0}']//*[local-name()='enumeration']/@value", xmlType));
 			var retVal = new List<string>();
 			foreach (var node in nodes) {
 				retVal.Add(node.ToString());
@@ -879,7 +915,7 @@ namespace TUGraz.VectoCore.Tests.XML
 		}
 
 		private void TestAuxTech(AuxiliaryType aux, string[] techs, IDeclarationAuxiliaryTable auxLookup)
-		{ 
+		{
 			foreach (var tech in techs) {
 				var reader = XmlReader.Create(SampleVehicleDecl);
 
@@ -895,7 +931,8 @@ namespace TUGraz.VectoCore.Tests.XML
 							Constants.XML.RootNSPrefix),
 						XMLNames.Component_Vehicle,
 						XMLNames.Vehicle_Components,
-						XMLNames.Component_Auxiliaries, XMLNames.ComponentDataWrapper, aux.ToString(), XMLNames.Auxiliaries_Auxiliary_Technology),
+						XMLNames.Component_Auxiliaries, XMLNames.ComponentDataWrapper, aux.ToString(),
+						XMLNames.Auxiliaries_Auxiliary_Technology),
 					manager);
 				technology.SetValue(tech);
 				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
@@ -906,10 +943,9 @@ namespace TUGraz.VectoCore.Tests.XML
 					.First().Technology.First();
 				Assert.AreEqual(tech, techInput);
 
-				Assert.IsTrue(auxLookup.GetTechnologies().Contains(techInput), "technology '{0}' for aux type '{1}' not known!", techInput, aux);
+				Assert.IsTrue(auxLookup.GetTechnologies().Contains(techInput), "technology '{0}' for aux type '{1}' not known!",
+					techInput, aux);
 			}
 		}
-
-		
 	}
-}
+}
\ No newline at end of file
-- 
GitLab