From 94eee31ff91064a35f86454901d50e5d623f30d5 Mon Sep 17 00:00:00 2001
From: "harald.martini@student.tugraz.at" <harald.martini@student.tugraz.at>
Date: Thu, 17 Jun 2021 10:43:16 +0200
Subject: [PATCH] Updated VehicleWriter for exempted Vehicle, added Testcase
 Loading Exempted vif and save inputdata

---
 .../ComponentWriter/XMLVehicleWriter.cs       |  49 +++++--
 .../InterimStageBusVehicleViewModel_v2_8.cs   |  35 ++++-
 .../MultistageJobViewModel_v0_1.cs            |  10 +-
 .../Views/Multistage/MultiStageView.xaml      |   4 +-
 .../Multistage/VehicleView_v2_8_exempted.xaml |  13 --
 .../exempted_primary_heavyBus.VIF.xml         |  60 +++++++++
 Vecto3GUI2020Test/Vecto3GUI2020Test.csproj    |   3 +
 .../ViewModelTests/LoadAndSaveVehicleData.cs  | 126 ++++++++++++++----
 .../ViewModelTests/ViewModelTestBase.cs       |  19 ++-
 9 files changed, 256 insertions(+), 63 deletions(-)
 create mode 100644 Vecto3GUI2020Test/TestData/exempted_primary_heavyBus.VIF.xml

diff --git a/VECTO3GUI2020/Util/XML/Implementation/ComponentWriter/XMLVehicleWriter.cs b/VECTO3GUI2020/Util/XML/Implementation/ComponentWriter/XMLVehicleWriter.cs
index 9be3eb5d59..b7cb66ceea 100644
--- a/VECTO3GUI2020/Util/XML/Implementation/ComponentWriter/XMLVehicleWriter.cs
+++ b/VECTO3GUI2020/Util/XML/Implementation/ComponentWriter/XMLVehicleWriter.cs
@@ -51,7 +51,6 @@ namespace VECTO3GUI2020.Util.XML.Implementation
         {
 			if (_Xelement == null) {
 				Initialize();
-				
 				CreateElements();
 			}
 			return _Xelement;
@@ -192,12 +191,13 @@ namespace VECTO3GUI2020.Util.XML.Implementation
 
 	public class XMLVehicleWriter_v2_8 : XMLVehicleWriter
 	{
+		private readonly bool _exempted;
 		public static readonly string[] SUPPORTEDVERSIONS = {
 			typeof(DeclarationInterimStageBusVehicleViewModel_v2_8).ToString()
 		};
 		public XMLVehicleWriter_v2_8(IVehicleDeclarationInputData inputData, IXMLWriterFactory xmlWriterFactory) : base(inputData, xmlWriterFactory)
 		{
-			
+			_exempted = inputData.ExemptedVehicle;
 
 		}
 
@@ -210,13 +210,20 @@ namespace VECTO3GUI2020.Util.XML.Implementation
 			_Xelement = new XElement(XMLNamespaces.V20 + XMLNames.Component_Vehicle);
 			
 			_Xelement.Add(new XAttribute(XMLNames.Component_ID_Attr, "TODO_ADDIDENTIFIER"));
-			_Xelement.Add(new XAttribute(XMLNamespaces.Xsi + XMLNames.Attr_Type, "InterimStageInputType"));
+			if (_exempted) {
+				_Xelement.Add(new XAttribute(XMLNamespaces.Xsi + XMLNames.Attr_Type, "ExemptedInterimStageInputType"));
+			} else {
+				_Xelement.Add(new XAttribute(XMLNamespaces.Xsi + XMLNames.Attr_Type, "InterimStageInputType"));
+			}
+			
 		}
 
 		protected override void CreateElements()
 		{
-
-
+			if (_exempted) {
+				CreateExemptedElements();
+				return;
+			}
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_Manufacturer, _inputData.Manufacturer));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_ManufacturerAddress,
 				_inputData.ManufacturerAddress));
@@ -226,14 +233,10 @@ namespace VECTO3GUI2020.Util.XML.Implementation
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_Model, _inputData.Model));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_LegislativeCategory, _inputData.LegislativeClass.ToXMLFormat()));
 
-			
-
-
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_CorrectedActualMass, _inputData.CurbMassChassis?.ToXMLFormat(0)));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_TPMLM,
 				_inputData.GrossVehicleMassRating?.ToXMLFormat(0)));
 
-
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_AirdragModifiedMultistage, _inputData.AirdragModifiedMultistage));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_NgTankSystem, _inputData.TankSystem));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_RegisteredClass, _inputData.RegisteredClass.ToXMLFormat()));
@@ -246,7 +249,6 @@ namespace VECTO3GUI2020.Util.XML.Implementation
 
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_LowEntry, _inputData.LowEntry));
 
-
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_HeighIntegratedBody, _inputData.Height?.ConvertToMilliMeter()));
 			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_VehicleLength, _inputData.Length?.ConvertToMilliMeter()));
 
@@ -309,6 +311,33 @@ namespace VECTO3GUI2020.Util.XML.Implementation
 			
 		}
 
+		private void CreateExemptedElements()
+		{
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_Manufacturer, _inputData.Manufacturer));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_ManufacturerAddress,
+				_inputData.ManufacturerAddress));
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_VIN, _inputData.VIN));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_Date, DateTime.Today.ToXmlFormat()));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Component_Model, _inputData.Model));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_LegislativeCategory, _inputData.LegislativeClass.ToXMLFormat()));
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_CorrectedActualMass, _inputData.CurbMassChassis?.ToXMLFormat(0)));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_TPMLM,
+				_inputData.GrossVehicleMassRating?.ToXMLFormat(0)));
+
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_RegisteredClass, _inputData.RegisteredClass.ToXMLFormat()));
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_NumberPassengersLowerDeck, _inputData.NumberPassengerSeatsLowerDeck));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_NumberPassengersUpperDeck, _inputData.NumberPassengerSeatsUpperDeck));
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Vehicle_BodyworkCode, _inputData.VehicleCode.ToXMLFormat()));
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_LowEntry, _inputData.LowEntry));
+
+			_Xelement.Add(new XElement(_defaultNamespace + XMLNames.Bus_HeighIntegratedBody, _inputData.Height?.ConvertToMilliMeter()));
+		}
+
 		#endregion
 	}
 
diff --git a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
index e97eaac8d4..cf66a80242 100644
--- a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
+++ b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
@@ -14,6 +14,7 @@ using System.Xml;
 using Castle.Core.Internal;
 using Microsoft.Build.Framework;
 using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -340,6 +341,16 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public void SetVehicleInputData(IVehicleDeclarationInputData vehicleInputData)
 		{
+			if (vehicleInputData.ExemptedVehicle != ExemptedVehicle) {
+				throw new VectoException("Only exempted stage inputs are allowed");
+			}
+
+			if (ExemptedVehicle) {
+				SetExemptedVehicleInputData(vehicleInputData);
+				return;
+			}
+
+
 			Manufacturer = vehicleInputData.Manufacturer;
 			Identifier = vehicleInputData.Identifier;
 			ManufacturerAddress = vehicleInputData.ManufacturerAddress;
@@ -383,6 +394,23 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			OnPropertyChanged(string.Empty);
 		}
 
+		private void SetExemptedVehicleInputData(IVehicleDeclarationInputData vehicleInputData)
+		{
+			Debug.Assert(vehicleInputData.ExemptedVehicle);
+			Manufacturer = vehicleInputData.Manufacturer;
+			Identifier = vehicleInputData.Identifier;
+			ManufacturerAddress = vehicleInputData.ManufacturerAddress;
+			VIN = vehicleInputData.VIN;
+			Model = vehicleInputData.Model;
+			LegislativeClass = vehicleInputData.LegislativeClass;
+			CurbMassChassis = vehicleInputData.CurbMassChassis;
+			GrossVehicleMassRating = vehicleInputData.GrossVehicleMassRating;
+			RegisteredClass = vehicleInputData.RegisteredClass;
+			NumberPassengerSeatsUpperDeck = vehicleInputData.NumberPassengerSeatsUpperDeck;
+			NumberPassengerSeatsLowerDeck = vehicleInputData.NumberPassengerSeatsLowerDeck;
+			VehicleCode = vehicleInputData.VehicleCode;
+			Height = vehicleInputData.Height;
+		}
 
 
 
@@ -739,12 +767,12 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public IAirdragDeclarationInputData AirdragInputData
 		{
-			get => MultistageAirdragViewModel.AirDragViewModel;
+			get => MultistageAirdragViewModel?.AirDragViewModel;
 		}
 
 		public IBusAuxiliariesDeclarationData BusAuxiliaries
 		{
-			get => MultistageAuxiliariesViewModel.HasValues ? MultistageAuxiliariesViewModel : null;
+			get => MultistageAuxiliariesViewModel != null &&  MultistageAuxiliariesViewModel.HasValues ? MultistageAuxiliariesViewModel : null;
 		}
 
 		#region not implemented
@@ -1138,7 +1166,8 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		{
 			get
 			{
-				return !Error.IsNullOrEmpty() || MultistageAuxiliariesViewModel.HasErrors;
+				return !Error.IsNullOrEmpty() || 
+						(MultistageAuxiliariesViewModel != null && MultistageAuxiliariesViewModel.HasErrors);
 			}
 		}
 		#endregion
diff --git a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
index c44443fdd1..e7fc911c90 100644
--- a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
+++ b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
@@ -41,6 +41,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 	public interface IMultiStageJobViewModel : IDeclarationMultistageJobInputData, IMultistageVIFInputData, IMultistageBusInputDataProvider, IJobViewModel, IEditViewModel
 	{
 		IManufacturingStageViewModel ManufacturingStageViewModel { get; }
+		bool Exempted { get; }
 	}
 
 
@@ -75,10 +76,10 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			_dialogHelper = multistageDependencies.DialogHelperLazy;
 			_inputDataReader = inputDataReader;
 
-			var exempted = PrimaryVehicle.Vehicle.ExemptedVehicle;
+			_exempted = PrimaryVehicle.Vehicle.ExemptedVehicle;
 
 			_manufacturingStageViewModel =
-				vmFactory.GetManufacturingStageViewModel(_consolidateManufacturingStage, exempted);
+				vmFactory.GetManufacturingStageViewModel(_consolidateManufacturingStage, _exempted);
 
 			// QUESTION: HEV/PEV ?
 			//var hybridElectric = inputData.PrimaryVehicleData.Vehicle.HybridElectricHDV;
@@ -221,7 +222,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 				SaveInputDataExecute(filename:null);
 			}, () => true);
 
-		private void SaveInputDataExecute(string filename)
+		public void SaveInputDataExecute(string filename)
 		{
 			if(_manufacturingStageViewModel.Vehicle is IMultistageVehicleViewModel vehicleViewModel)
 			{
@@ -306,6 +307,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		private readonly DataSource _dataSource;
 		private readonly IMultistageBusInputDataProvider _inputData;
 		private bool _selected;
+		private readonly bool _exempted;
 
 		public ICommand LoadVehicleDataCommand
 		{
@@ -434,6 +436,8 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public string Name => "Multistage";
 
+		public bool Exempted => _exempted;
+
 		#endregion
 	}
 
diff --git a/VECTO3GUI2020/Views/Multistage/MultiStageView.xaml b/VECTO3GUI2020/Views/Multistage/MultiStageView.xaml
index 449554b41c..357289757c 100644
--- a/VECTO3GUI2020/Views/Multistage/MultiStageView.xaml
+++ b/VECTO3GUI2020/Views/Multistage/MultiStageView.xaml
@@ -13,7 +13,8 @@
             <customControls:FilePicker 
                 DockPanel.Dock="Top" 
                 Command="{Binding LoadVehicleDataCommand}" 
-                Text="{Binding VehicleInputDataFilePath, TargetNullValue=Select Vehicle Input Data . . .}"></customControls:FilePicker>
+                Text="{Binding VehicleInputDataFilePath, TargetNullValue=Select Vehicle Input Data . . .}"/>
+            <Label DockPanel.Dock="Top" HorizontalAlignment="Center"  Visibility="{Binding Exempted}">Exempted Vehicle</Label>
             <Border BorderThickness="1" BorderBrush="{DynamicResource ButtonHighlightColor}" Height="40" DockPanel.Dock="Bottom">
                 <DockPanel LastChildFill="False">
                     <Button DockPanel.Dock="Right"
@@ -46,7 +47,6 @@
                 </DockPanel>
             </Border>
             <ContentControl DockPanel.Dock="Top" Content="{Binding ManufacturingStageViewModel}"/>
-
         </DockPanel>
     </Grid>
 </UserControl>
diff --git a/VECTO3GUI2020/Views/Multistage/VehicleView_v2_8_exempted.xaml b/VECTO3GUI2020/Views/Multistage/VehicleView_v2_8_exempted.xaml
index 0e6f60a872..21ae48bcda 100644
--- a/VECTO3GUI2020/Views/Multistage/VehicleView_v2_8_exempted.xaml
+++ b/VECTO3GUI2020/Views/Multistage/VehicleView_v2_8_exempted.xaml
@@ -28,31 +28,18 @@
                     <ContentControl Content="{Binding ParameterViewModels[CurbMassChassis]}"/>
                     <ContentControl Content="{Binding ParameterViewModels[GrossVehicleMassRating]}"/>
                     <ContentControl Content="{Binding ParameterViewModels[RegisteredClass]}"/>
-
-
-
-                    <Separator/>
-
                     <ContentControl 
                         Content="{Binding ParameterViewModels[VehicleCode]}"/>
-
                     <ContentControl 
                         Content="{Binding ParameterViewModels[LowEntry]}"/>
-                    <Separator/>
-
                     <ContentControl 
                         Content="{Binding ParameterViewModels[HeightInMm]}"/>
-                    <Separator/>
 
                     <Label Style="{DynamicResource LabelStyle1}">Number of Passengers</Label>
                     <ContentControl 
                         Content="{Binding ParameterViewModels[NumberPassengerSeatsLowerDeck]}"/>
                     <ContentControl 
                         Content="{Binding ParameterViewModels[NumberPassengerSeatsUpperDeck]}"/>
-                    <ContentControl 
-                        Content="{Binding ParameterViewModels[NumberPassengersStandingLowerDeck]}"/>
-                    <ContentControl 
-                        Content="{Binding ParameterViewModels[NumberPassengersStandingUpperDeck]}"/>
 
 
 
diff --git a/Vecto3GUI2020Test/TestData/exempted_primary_heavyBus.VIF.xml b/Vecto3GUI2020Test/TestData/exempted_primary_heavyBus.VIF.xml
new file mode 100644
index 0000000000..ef4e364d6b
--- /dev/null
+++ b/Vecto3GUI2020Test/TestData/exempted_primary_heavyBus.VIF.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VectoOutputMultistage xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.3" xmlns:v2.6="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.6" xmlns:v2.8="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.8" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1 V:\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistage.0.1.xsd">
+  <PrimaryVehicle xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1">
+    <Data id="VEH-4cb168560c0d4b3d886d" xsi:type="PrimaryVehicleDataType">
+      <Vehicle xsi:type="VehicleExemptedPrimaryBusType">
+        <ManufacturerPrimaryVehicle>Some Manufacturer</ManufacturerPrimaryVehicle>
+        <ManufacturerAddressPrimaryVehicle>Infinite Loop 1</ManufacturerAddressPrimaryVehicle>
+        <Model>Sample Bus Model</Model>
+        <VIN>VEH-1234567890</VIN>
+        <Date>2017-02-15T11:00:00Z</Date>
+        <LegislativeCategory>N2</LegislativeCategory>
+        <ChassisConfiguration>Bus</ChassisConfiguration>
+        <AxleConfiguration>6x2</AxleConfiguration>
+        <Articulated>false</Articulated>
+        <TechnicalPermissibleMaximumLadenMass unit="kg">15400.0</TechnicalPermissibleMaximumLadenMass>
+        <ZeroEmissionVehicle>true</ZeroEmissionVehicle>
+        <SumNetPower unit="W">350000</SumNetPower>
+        <Technology>Fuel cell vehicle</Technology>
+      </Vehicle>
+      <InputDataSignature>
+        <di:Reference URI="#VEH-1234567890">
+          <di:Transforms>
+            <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" />
+            <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+          </di:Transforms>
+          <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
+          <di:DigestValue>sYhNx2MDHaOAMTlPflP/qQbEkazmRDxY0Vw6yzwwcJc=</di:DigestValue>
+        </di:Reference>
+      </InputDataSignature>
+      <ManufacturerRecordSignature>
+        <di:Reference URI="#RESULT-4c4c52e522874a398b3a">
+          <di:Transforms>
+            <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" />
+            <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+          </di:Transforms>
+          <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
+          <di:DigestValue>guwkv90jOyWgDpgQwAEbLRkq7pWGeVaGA+dHizLYufQ=</di:DigestValue>
+        </di:Reference>
+      </ManufacturerRecordSignature>
+      <Results>
+        <Status>success</Status>
+        <ExemptedVehicle />
+      </Results>
+      <ApplicationInformation>
+        <SimulationToolVersion>0.7.3.2247-DEV !!NOT FOR CERTIFICATION!!</SimulationToolVersion>
+        <Date>2021-06-15T16:00:43.6769906Z</Date>
+      </ApplicationInformation>
+    </Data>
+    <Signature>
+      <di:Reference URI="#VEH-4cb168560c0d4b3d886d">
+        <di:Transforms>
+          <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" />
+          <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+        </di:Transforms>
+        <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
+        <di:DigestValue>KeeEnRNO5Gjm7XB+YYx542ujYbE0k7a9SkWe/BWo7bI=</di:DigestValue>
+      </di:Reference>
+    </Signature>
+  </PrimaryVehicle>
+</VectoOutputMultistage>
\ No newline at end of file
diff --git a/Vecto3GUI2020Test/Vecto3GUI2020Test.csproj b/Vecto3GUI2020Test/Vecto3GUI2020Test.csproj
index 5bac291cf2..cf5c33f623 100644
--- a/Vecto3GUI2020Test/Vecto3GUI2020Test.csproj
+++ b/Vecto3GUI2020Test/Vecto3GUI2020Test.csproj
@@ -109,6 +109,9 @@
     <None Update="inputdata\vecto_vehicle-completed_heavyBus_31b.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="TestData\exempted_primary_heavyBus.VIF.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="TestData\final.VIF_Report_4.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
diff --git a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
index b1777c717e..daff148eaa 100644
--- a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Configuration;
 using System.IO;
 using System.Linq;
 using System.Runtime.CompilerServices;
@@ -29,13 +30,13 @@ namespace Vecto3GUI2020Test
     public class LoadAndSaveVehicleData : ViewModelTestBase
 	{
 		[Test]
-		public void loadInputFileMultipleStage()
+		public void LoadInputFileMultipleStage()
 		{
 			loadFile(consolidated_multiple_stages);
 		}
 
 		[Test]
-		public void loadPrimaryAndSaveVehicleData()
+		public void LoadPrimaryAndSaveVehicleData()
 		{
 			//Load Primary Vehicle VIF
 			var newMultiStageJob = loadFile(primary_vehicle_only);
@@ -63,7 +64,7 @@ namespace Vecto3GUI2020Test
 		}
 
 		[Test]
-		public void loadPrimaryAndSave()
+		public void LoadPrimaryAndSave()
 		{
 			//load file
 			var newMultiStageJob = loadFile(primary_vehicle_only);
@@ -71,6 +72,79 @@ namespace Vecto3GUI2020Test
 
 
 
+		}
+		[Test, Combinatorial]
+		public void LoadAndSaveExemptedPrimary(
+			[Values(LegislativeClass.M3)] LegislativeClass legislativeCategory
+			)
+		{
+			string exempted = "exempted_primary_heavyBus.VIF.xml";
+			var newMultiStageJob = loadFile(exempted);
+			Assert.IsTrue(newMultiStageJob.MultiStageJobViewModel.Exempted);
+
+
+			var multistageJobViewModel = newMultiStageJob.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
+
+			var outputPath = GetFullPath("test1.xml");
+
+			var vehicleVm =
+				multistageJobViewModel.ManufacturingStageViewModel.VehicleViewModel as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+
+			Assert.IsTrue(vehicleVm.ExemptedVehicle);
+
+
+            var manufacturer = "TestManufacturer";
+            var manufacturerAddress = "TestManufacturerAddress";
+            var vehicleIdentificationNumber = "12345678";
+			var model = "model";
+			var curbMassChassis = Kilogram.Create(123456);
+            var technicalpermissableLadenMass = Kilogram.Create(654321);
+            var registeredClass = RegistrationClass.II_III;
+            var bodyWorkCode = VehicleCode.CG;
+            var lowEntry = false;
+            var height = Meter.Create(1.5).ConvertToMilliMeter();
+			var PassengerSeatsLowerDeck = 4;
+			var passengerSeatsUpperDeck = 12;
+
+            vehicleVm.ParameterViewModels[nameof(vehicleVm.Manufacturer)].CurrentContent = manufacturer;
+
+
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.ManufacturerAddress)].CurrentContent = manufacturerAddress;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.HeightInMm)].CurrentContent = height;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.VIN)].CurrentContent = vehicleIdentificationNumber;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.Model)].CurrentContent = model;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.LegislativeClass)].CurrentContent = legislativeCategory;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.CurbMassChassis)].CurrentContent = curbMassChassis;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.GrossVehicleMassRating)].CurrentContent = technicalpermissableLadenMass;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.RegisteredClass)].CurrentContent = registeredClass;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.VehicleCode)].CurrentContent = bodyWorkCode;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.LowEntry)].CurrentContent = lowEntry;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.NumberPassengerSeatsLowerDeck)].CurrentContent = PassengerSeatsLowerDeck;
+			vehicleVm.ParameterViewModels[nameof(vehicleVm.NumberPassengerSeatsUpperDeck)].CurrentContent = passengerSeatsUpperDeck;
+
+
+			multistageJobViewModel.SaveInputDataExecute(outputPath);
+
+
+			Assert.AreEqual(outputPath, multistageJobViewModel.VehicleInputDataFilePath);
+
+			Assert.AreEqual( manufacturer, vehicleVm.Manufacturer);
+			Assert.AreEqual(manufacturerAddress, vehicleVm.ManufacturerAddress);
+			Assert.AreEqual(height, vehicleVm.HeightInMm);
+			Assert.AreEqual(model, vehicleVm.Model);
+			Assert.AreEqual(legislativeCategory, vehicleVm.LegislativeClass);
+			Assert.AreEqual(curbMassChassis, vehicleVm.CurbMassChassis);
+			Assert.AreEqual(technicalpermissableLadenMass, vehicleVm.GrossVehicleMassRating);
+			Assert.AreEqual(registeredClass, vehicleVm.RegisteredClass);
+			Assert.AreEqual(bodyWorkCode, vehicleVm.VehicleCode);
+			Assert.AreEqual(lowEntry, vehicleVm.LowEntry);
+			Assert.AreEqual(passengerSeatsUpperDeck, vehicleVm.NumberPassengerSeatsUpperDeck);
+			Assert.AreEqual(PassengerSeatsLowerDeck, vehicleVm.NumberPassengerSeatsLowerDeck);
+
+
+
+
 		}
 
 
@@ -96,7 +170,7 @@ namespace Vecto3GUI2020Test
 		}
 
 		[Test]
-		public void reloadInputFile()
+		public void ReloadInputFile()
 		{
 			var newMultistageJobViewModel = loadFile(consolidated_multiple_stages_airdrag) as NewMultiStageJobViewModel;
 
@@ -120,13 +194,13 @@ namespace Vecto3GUI2020Test
 
 
 		[Test]
-		public void loadInputFileMultipleStageAirdrag()
+		public void LoadInputFileMultipleStageAirdrag()
 		{
 			loadFile(consolidated_multiple_stages_airdrag);
 		}
 
 		[Test]
-		public void loadAndSaveFullInputDataSample()
+		public void LoadAndSaveFullInputDataSample()
 		{
 			var vm = loadFile(primary_vehicle_only);
 			var multiStageJobViewModel = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
@@ -191,33 +265,33 @@ namespace Vecto3GUI2020Test
 			Assert.IsTrue(vehicleViewModel.VIN.IsNullOrEmpty());
 			Assert.IsNull(vehicleViewModel.Model);
 
-			var vehicleViewModel_v2_8 = vehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8;
-			Assert.NotNull(vehicleViewModel_v2_8);
+			var vehicleViewModelV28 = vehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8;
+			Assert.NotNull(vehicleViewModelV28);
 
-			Assert.Null(vehicleViewModel_v2_8.HeightInMm);
-			Assert.Null(vehicleViewModel_v2_8.LengthInMm);
-			Assert.Null(vehicleViewModel_v2_8.WidthInMm);
-			Assert.Null(vehicleViewModel_v2_8.EntranceHeightInMm);
+			Assert.Null(vehicleViewModelV28.HeightInMm);
+			Assert.Null(vehicleViewModelV28.LengthInMm);
+			Assert.Null(vehicleViewModelV28.WidthInMm);
+			Assert.Null(vehicleViewModelV28.EntranceHeightInMm);
 
 
 
-			Assert.Null(vehicleViewModel_v2_8.ConsolidatedHeightInMm);
-			Assert.Null(vehicleViewModel_v2_8.ConsolidatedLengthInMm);
-			Assert.Null(vehicleViewModel_v2_8.ConsolidatedWidthInMm);
-			Assert.Null(vehicleViewModel_v2_8.ConsolidatedEntranceHeightInMm);
+			Assert.Null(vehicleViewModelV28.ConsolidatedHeightInMm);
+			Assert.Null(vehicleViewModelV28.ConsolidatedLengthInMm);
+			Assert.Null(vehicleViewModelV28.ConsolidatedWidthInMm);
+			Assert.Null(vehicleViewModelV28.ConsolidatedEntranceHeightInMm);
 
 
-			Assert.IsFalse(vehicleViewModel_v2_8.AirdragModifiedMultistageEditingEnabled);
+			Assert.IsFalse(vehicleViewModelV28.AirdragModifiedMultistageEditingEnabled);
 
-			Assert.IsNull(vehicleViewModel_v2_8.AirdragModifiedMultistage);
-			Assert.IsNull(vehicleViewModel_v2_8.ConsolidatedAirdragModifiedEnum);
-			Assert.IsTrue(vehicleViewModel_v2_8.AirdragModifiedEnum == AIRDRAGMODIFIED.UNKNOWN || vehicleViewModel_v2_8.AirdragModifiedEnum == null);
+			Assert.IsNull(vehicleViewModelV28.AirdragModifiedMultistage);
+			Assert.IsNull(vehicleViewModelV28.ConsolidatedAirdragModifiedEnum);
+			Assert.IsTrue(vehicleViewModelV28.AirdragModifiedEnum == AIRDRAGMODIFIED.UNKNOWN || vehicleViewModelV28.AirdragModifiedEnum == null);
 			
 
 
-			Assert.AreEqual(vehicleViewModel_v2_8.AirdragModifiedMultistageEditingEnabled, false);
+			Assert.AreEqual(vehicleViewModelV28.AirdragModifiedMultistageEditingEnabled, false);
 
-			Assert.Null(vehicleViewModel_v2_8.BusAuxiliaries);
+			Assert.Null(vehicleViewModelV28.BusAuxiliaries);
 
 
 			var vifInputData = vm.MultiStageJobViewModel as IMultistageVIFInputData;
@@ -229,7 +303,7 @@ namespace Vecto3GUI2020Test
 		[TestCase(consolidated_multiple_stages, null)]
 		[TestCase(consolidated_one_stage, null)]
 		[TestCase(primary_vehicle_only, null)]
-		public void loadAirdragComponentAndSaveVehicleData(string fileName, object expectedAirdragModifiedValue)
+		public void LoadAirdragComponentAndSaveVehicleData(string fileName, object expectedAirdragModifiedValue)
 		{
 			var vm = loadFile(fileName);
 
@@ -291,7 +365,7 @@ namespace Vecto3GUI2020Test
 
 
 		[Test]
-		public void loadVehicleDataTest()
+		public void LoadVehicleDataTest()
 		{
 			
 			
@@ -382,7 +456,7 @@ namespace Vecto3GUI2020Test
 			Assert.NotNull(airdrag.AirDragViewModel.XMLSource);
 
 
-			TestADASInput(vehicleViewModel);
+			TestAdasInput(vehicleViewModel);
 			TestComponents(vehicleViewModel.Components);
 			TestAirdragComponent(vehicleViewModel.Components.AirdragInputData);
 			TestAuxiliariesComponent(vehicleViewModel.BusAuxiliaries);
@@ -392,7 +466,7 @@ namespace Vecto3GUI2020Test
 
 		}
 
-		private void TestADASInput(IVehicleDeclarationInputData vehicle)
+		private void TestAdasInput(IVehicleDeclarationInputData vehicle)
 		{
 			Assert.AreEqual(true, vehicle.ADAS.EngineStopStart);
 			Assert.AreEqual(EcoRollType.None, vehicle.ADAS.EcoRoll);
diff --git a/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs b/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
index e896552e22..f74f91c18f 100644
--- a/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
@@ -104,16 +104,18 @@ namespace Vecto3GUI2020Test
 			var manstageVehicleViewModel = newMultistageJobViewModel.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as DeclarationInterimStageBusVehicleViewModel_v2_8;
 			Assert.NotNull(manstageVehicleViewModel);
 
-			var auxiliariesViewModel = manstageVehicleViewModel.MultistageAuxiliariesViewModel;
-			Assert.NotNull(auxiliariesViewModel);
-
+			Assert.AreEqual(mockDialogHelper.Object.OpenXMLFileDialog(), newMultistageJobViewModel.VifPath);
 
+			if (!manstageVehicleViewModel.ExemptedVehicle) {
+				var auxiliariesViewModel = manstageVehicleViewModel.MultistageAuxiliariesViewModel;
+				Assert.NotNull(auxiliariesViewModel);
 
+				var airdragViewModel = (manstageVehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8)?.MultistageAirdragViewModel;
+				Assert.NotNull(airdragViewModel);
+			}
+			
 
-			var airdragViewModel = (manstageVehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8)?.MultistageAirdragViewModel;
-			Assert.NotNull(airdragViewModel);
 
-			Assert.AreEqual(mockDialogHelper.Object.OpenXMLFileDialog(), newMultistageJobViewModel.VifPath);
 
 
 
@@ -132,6 +134,11 @@ namespace Vecto3GUI2020Test
 						(message, caption, button, image) => {
 							TestContext.WriteLine($"{caption}\n {message}");
 						}));
+
+				_mockDialogHelper.Setup(dialogHelper =>
+						dialogHelper.ShowMessageBox(It.IsAny<string>(), It.IsAny<string>()))
+					.Callback<string, string>((message, caption) => 
+						TestContext.WriteLine($"{{caption}}\n {message}"));
 			}
 			if (fileToLoad != null) {
 				var filePath = Path.GetFullPath(TestDataDirPath + fileToLoad);
-- 
GitLab