From 5469b59633c7aeddb0513e6d650bccd6517fdad7 Mon Sep 17 00:00:00 2001
From: "harald.martini@student.tugraz.at" <harald.martini@student.tugraz.at>
Date: Wed, 23 Jun 2021 10:08:04 +0200
Subject: [PATCH] Updated Tests, removed HideOnMainWindowBehavior

---
 .../Behaviours/HideOnMainWindowBehavior.cs    |  32 ----
 VECTO3GUI2020/Behaviours/MinSizeBehavior.cs   |  63 -------
 VECTO3GUI2020/Helper/ExceptionExtension.cs    |  29 +++
 VECTO3GUI2020/Helper/FileHelper.cs            |  13 ++
 .../Helper/VisualTreeHelperExtensions.cs      |  28 +++
 VECTO3GUI2020/MainWindow.xaml                 |   3 +
 VECTO3GUI2020/Ninject/Vecto3GUI2020Module.cs  |   4 +-
 VECTO3GUI2020/VECTO3GUI2020.csproj            |   5 +-
 .../Implementation/JobListViewModel.cs        |  24 ++-
 .../MultistageJobViewModel_v0_1.cs            |  36 ++--
 VECTO3GUI2020/Views/SettingsView.xaml         |   3 -
 Vecto3GUI2020Test/TestHelper.cs               |  28 +++
 Vecto3GUI2020Test/UI/UITests.cs               |   4 +-
 .../ViewModelTests/AirdragTests.cs            |  90 ++++-----
 .../ViewModelTests/ExemptedTests.cs           | 174 ++++++++++++++++++
 .../ViewModelTests/LoadAndSaveVehicleData.cs  | 112 ++---------
 Vecto3GUI2020Test/ViewModelTests/VIFTests.cs  |  16 +-
 .../ViewModelTests/VehicleViewModelTests.cs   |  52 +-----
 .../ViewModelTests/ViewModelTestBase.cs       |  42 ++---
 19 files changed, 416 insertions(+), 342 deletions(-)
 delete mode 100644 VECTO3GUI2020/Behaviours/HideOnMainWindowBehavior.cs
 delete mode 100644 VECTO3GUI2020/Behaviours/MinSizeBehavior.cs
 create mode 100644 VECTO3GUI2020/Helper/ExceptionExtension.cs
 create mode 100644 VECTO3GUI2020/Helper/FileHelper.cs
 create mode 100644 VECTO3GUI2020/Helper/VisualTreeHelperExtensions.cs
 create mode 100644 Vecto3GUI2020Test/TestHelper.cs
 create mode 100644 Vecto3GUI2020Test/ViewModelTests/ExemptedTests.cs

diff --git a/VECTO3GUI2020/Behaviours/HideOnMainWindowBehavior.cs b/VECTO3GUI2020/Behaviours/HideOnMainWindowBehavior.cs
deleted file mode 100644
index 5ecc5f7514..0000000000
--- a/VECTO3GUI2020/Behaviours/HideOnMainWindowBehavior.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System.Windows;
-using Microsoft.Xaml.Behaviors;
-
-namespace VECTO3GUI2020.Behaviours
-{
-	public class HideOnMainWindowBehavior : Behavior<FrameworkElement>
-	{
-		#region Overrides of Behavior
-
-		private Visibility savedState;
-		protected override void OnAttached()
-		{
-
-			base.OnAttached();
-			var window = Window.GetWindow(this.AssociatedObject);
-			if (window == Application.Current.MainWindow) {
-				savedState = AssociatedObject.Visibility;
-				this.AssociatedObject.Visibility = Visibility.Hidden;
-			}
-		}
-
-		protected override void OnDetaching()
-		{
-			if (savedState != null) {
-				this.AssociatedObject.Visibility = savedState;
-			}
-			base.OnDetaching();
-		}
-
-		#endregion
-	}
-}
\ No newline at end of file
diff --git a/VECTO3GUI2020/Behaviours/MinSizeBehavior.cs b/VECTO3GUI2020/Behaviours/MinSizeBehavior.cs
deleted file mode 100644
index 1a2bb8675f..0000000000
--- a/VECTO3GUI2020/Behaviours/MinSizeBehavior.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Media;
-using Microsoft.Xaml.Behaviors;
-
-namespace VECTO3GUI2020.Behaviours
-{
-	public class MinSizeBehavior : Behavior<Window>
-	{
-		#region Overrides of Behavior
-
-		private double _initialMinWidth;
-		private double _initialMinHeight;
-
-		protected override void OnAttached()
-		{
-			this.AssociatedObject.Activated += OnWindowActivated;
-			_initialMinHeight = this.AssociatedObject.MinHeight;
-			_initialMinWidth = this.AssociatedObject.MinWidth;
-			base.OnAttached();
-			
-		}
-
-		private void OnWindowActivated(object sender, EventArgs e)
-		{
-			for(var i = 0; i < VisualTreeHelper.GetChildrenCount((Window)sender); i++)
-			{
-				var child = VisualTreeHelper.GetChild((Window)sender, 0) as FrameworkElement;
-				if (child.MinHeight != 0 && this.AssociatedObject.MinHeight == 0) {
-					this.AssociatedObject.MinHeight = child.MinHeight;
-				}
-				if (child.MinWidth != 0 && this.AssociatedObject.MinWidth == 0)
-				{
-					this.AssociatedObject.MinWidth = child.MinWidth;
-				}
-			}
-
-
-
-		}
-
-		private void OnWindowInitialized(object sender, EventArgs e)
-		{
-	
-
-			
-
-		}
-
-		protected override void OnDetaching()
-		{
-
-
-			this.AssociatedObject.Initialized -= OnWindowActivated;
-
-			base.OnDetaching();
-
-		}
-
-		#endregion
-	}
-}
\ No newline at end of file
diff --git a/VECTO3GUI2020/Helper/ExceptionExtension.cs b/VECTO3GUI2020/Helper/ExceptionExtension.cs
new file mode 100644
index 0000000000..cf656d3604
--- /dev/null
+++ b/VECTO3GUI2020/Helper/ExceptionExtension.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Documents;
+
+namespace VECTO3GUI2020.Helper
+{
+	public static class ExceptionExtension
+	{
+		public static string GetInnerExceptionMessages(this Exception ex, string separator = "\n")
+		{
+			IList<string> errorStrings = new List<string>();
+
+
+			do {
+				errorStrings.Add(ex.Message);
+				ex = ex.InnerException;
+			} while (ex != null);
+
+			var errorString = String.Join(separator, errorStrings);
+
+
+			return errorString;
+		}
+
+
+
+	}
+}
\ No newline at end of file
diff --git a/VECTO3GUI2020/Helper/FileHelper.cs b/VECTO3GUI2020/Helper/FileHelper.cs
new file mode 100644
index 0000000000..47b2d021f2
--- /dev/null
+++ b/VECTO3GUI2020/Helper/FileHelper.cs
@@ -0,0 +1,13 @@
+using System.IO;
+
+namespace VECTO3GUI2020.Helper
+{
+	public static class FileHelper
+	{
+		public static void CreateDirectory(string fileName)
+		{
+			Path.GetDirectoryName(fileName);
+			Directory.CreateDirectory(fileName);
+		}
+	}
+}
\ No newline at end of file
diff --git a/VECTO3GUI2020/Helper/VisualTreeHelperExtensions.cs b/VECTO3GUI2020/Helper/VisualTreeHelperExtensions.cs
new file mode 100644
index 0000000000..d9d8b66e8c
--- /dev/null
+++ b/VECTO3GUI2020/Helper/VisualTreeHelperExtensions.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Windows;
+using System.Windows.Media;
+using TUGraz.VectoCommon.Models;
+
+namespace VECTO3GUI2020.Helper
+{
+	public static class VisualTreeHelperExtensions
+	{
+
+		public static T GetChild<T>(FrameworkElement rootElement) where T : FrameworkElement
+		{
+			T child = null;
+			for(var i = 0; i < VisualTreeHelper.GetChildrenCount(rootElement); i++) {
+				var childElement = VisualTreeHelper.GetChild(rootElement, i);
+				if (childElement.GetType() == typeof(T)) {
+					child = childElement as T;
+					return child;
+				} else {
+					return GetChild<T>(childElement as FrameworkElement);
+				}
+			}
+
+
+			return child;
+		}
+	}
+}
\ No newline at end of file
diff --git a/VECTO3GUI2020/MainWindow.xaml b/VECTO3GUI2020/MainWindow.xaml
index aca144dd8f..3ef1c31a2b 100644
--- a/VECTO3GUI2020/MainWindow.xaml
+++ b/VECTO3GUI2020/MainWindow.xaml
@@ -7,6 +7,9 @@
         xmlns:Implementation="clr-namespace:VECTO3GUI2020.ViewModel.Implementation" d:DataContext="{d:DesignInstance Type=Implementation:MainWindowViewModel}" x:Class="VECTO3GUI2020.MainWindow"
         mc:Ignorable="d"
         Title="Vecto" Height="450" Width="820"
+        MinWidth="600"
+        MinHeight="400"
+
         WindowStartupLocation="CenterScreen"
         AutomationProperties.Name="="
         x:Name="MainView">
diff --git a/VECTO3GUI2020/Ninject/Vecto3GUI2020Module.cs b/VECTO3GUI2020/Ninject/Vecto3GUI2020Module.cs
index e2c1ddb92f..cfbe3a2fc2 100644
--- a/VECTO3GUI2020/Ninject/Vecto3GUI2020Module.cs
+++ b/VECTO3GUI2020/Ninject/Vecto3GUI2020Module.cs
@@ -1,4 +1,5 @@
-using Ninject.Modules;
+using System.Windows;
+using Ninject.Modules;
 using VECTO3GUI2020.Helper;
 using VECTO3GUI2020.Model.Implementation;
 using VECTO3GUI2020.Model.Interfaces;
@@ -24,6 +25,7 @@ namespace VECTO3GUI2020.Ninject
 			Bind<IDialogHelper>().To<DialogHelper>().InSingletonScope();
 			Bind<IWindowHelper>().To<WindowHelper>();
 			Bind<AboutViewModel>().ToSelf().InSingletonScope();
+			
 		}
 
 		#endregion
diff --git a/VECTO3GUI2020/VECTO3GUI2020.csproj b/VECTO3GUI2020/VECTO3GUI2020.csproj
index b0f12108be..f02e5ebaa9 100644
--- a/VECTO3GUI2020/VECTO3GUI2020.csproj
+++ b/VECTO3GUI2020/VECTO3GUI2020.csproj
@@ -155,8 +155,6 @@
       <SubType>Designer</SubType>
     </ApplicationDefinition>
     <Compile Include="Behaviours\AutoScrollDataGridBehaviour.cs" />
-    <Compile Include="Behaviours\HideOnMainWindowBehavior.cs" />
-    <Compile Include="Behaviours\MinSizeBehavior.cs" />
     <Compile Include="Helper\ConvertedSIDummyCreator.cs" />
     <Compile Include="Helper\Converter\AlwaysVisibleConverter.cs" />
     <Compile Include="Helper\Converter\BoolToVisibilityConverter.cs" />
@@ -174,11 +172,14 @@
     <Compile Include="Helper\Converter\VehicleCategoryToStringConverter.cs" />
     <Compile Include="Helper\Converter\XToBoolConverter.cs" />
     <Compile Include="Helper\DoubleValidation.cs" />
+    <Compile Include="Helper\ExceptionExtension.cs" />
     <Compile Include="Helper\Exceptions.cs" />
     <Compile Include="Helper\EnumHelper.cs" />
+    <Compile Include="Helper\FileHelper.cs" />
     <Compile Include="Helper\IndexedStorage.cs" />
     <Compile Include="Helper\IWindowHelper.cs" />
     <Compile Include="Helper\DialogHelper.cs" />
+    <Compile Include="Helper\VisualTreeHelperExtensions.cs" />
     <Compile Include="Helper\TemplateSelector\MultistageParameterDataTemplateSelector.cs" />
     <Compile Include="Helper\MultistageParameterViewModel.cs" />
     <Compile Include="Helper\NameOfMarkUpExtension.cs" />
diff --git a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
index 2ba4e70116..e95d495646 100644
--- a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
+++ b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
@@ -101,7 +101,7 @@ namespace VECTO3GUI2020.ViewModel.Implementation
 
         
 
-        public JobListViewModel()
+        private JobListViewModel()
         {
 			BindingOperations.EnableCollectionSynchronization(Jobs, _jobsLock);
 		}
@@ -111,7 +111,8 @@ namespace VECTO3GUI2020.ViewModel.Implementation
             IXMLInputDataReader inputDataReader,
             IDialogHelper dialogHelper,
             IWindowHelper windowHelper,
-			IMultiStageViewModelFactory multiStageViewModelFactory, IOutputViewModel outputViewModel) : this()
+			IMultiStageViewModelFactory multiStageViewModelFactory, 
+			IOutputViewModel outputViewModel) : this()
         {
             _documentViewModelFactory = documentViewModelFactory;
             _dialogHelper = dialogHelper;
@@ -136,16 +137,27 @@ namespace VECTO3GUI2020.ViewModel.Implementation
 			NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target);
 
 
-			System.Windows.Application.Current.Exit += new ExitEventHandler(this.OnApplicationExit);
+			if(System.Windows.Application.Current != null){
+				System.Windows.Application.Current.Exit += new ExitEventHandler(this.OnApplicationExit);
+				LoadFiles();
+			}
+		}
+
+
+		#region Store and Restore JobList
+		private void LoadFiles()
+		{
 			var filesToRead = ReadFileNamesFromFile();
-			if (filesToRead != null) {
-				foreach (var fileName in filesToRead) { 
+			if (filesToRead != null)
+			{
+				foreach (var fileName in filesToRead)
+				{
 					Task.Run(() => AddJobAsync(fileName));
 				}
 			}
 		}
 
-		#region Store and Restore JobList
+
 		private void OnApplicationExit(object sender, EventArgs e)
 		{
 			SaveFileNamesToFile();
diff --git a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
index bc70a46ddb..b68c0416cc 100644
--- a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
+++ b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageJobViewModel_v0_1.cs
@@ -122,7 +122,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 							var auxiliariesErrorInfo =
 								vehicleViewModel.MultistageAuxiliariesViewModel as IDataErrorInfo;
-							if (!auxiliariesErrorInfo.Error.IsNullOrEmpty()) {
+							if (auxiliariesErrorInfo != null && !auxiliariesErrorInfo.Error.IsNullOrEmpty()) {
 								errorMessage += "Auxiliaries\n";
 								errorMessage += auxiliariesErrorInfo.Error.Replace(",", "\n");
 							}
@@ -149,10 +149,14 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 				}, () => true);
 			}
 		}
-
-		public void SaveVif(string outputFile)
+		/// <summary>
+		/// Creates a new VIF file
+		/// </summary>
+		/// <param name="outputFile"></param>
+		/// <returns>Name of the created File</returns>
+		public string SaveVif(string outputFile)
 		{
-			SaveVif(vifData:this, outputFile:outputFile, dialogHelper:_dialogHelper.Value);
+			return SaveVif(vifData:this, outputFile:outputFile, dialogHelper:_dialogHelper.Value);
 		}
 
 		public void SaveVif(IMultistageVIFInputData vifData, FileOutputVIFWriter writer, IDialogHelper dialogHelper = null)
@@ -160,12 +164,21 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			SaveVif(vifData, null, writer, dialogHelper);
 		}
 
-		private void SaveVif(IMultistageVIFInputData vifData, string outputFile,
+
+		/// <summary>
+		/// Creates a new VIF file
+		/// </summary>
+		/// <param name="vifData"></param>
+		/// <param name="outputFile"></param>
+		/// <param name="writer"></param>
+		/// <param name="dialogHelper"></param>
+		/// <returns>Name of the created file</returns>
+
+		private string SaveVif(IMultistageVIFInputData vifData, string outputFile,
 			FileOutputVIFWriter writer = null, IDialogHelper dialogHelper = null)
 		{
 			try {
-
-
+				FileHelper.CreateDirectory(outputFile);
 				if (writer == null) {
 					var numberOfManufacturingStages =
 						vifData.MultistageJobInputData.JobInputData.ManufacturingStages?.Count ?? 0;
@@ -194,22 +207,21 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 						dialogHelper?.ShowMessageBox($"Error writing file {validator.ValidationError}", "Error",
 							MessageBoxButton.OK, MessageBoxImage.Error);
 						Debug.WriteLine("Invalid Outputfile");
-						return;
+						return null;
 					} else {
 						dialogHelper?.ShowMessageBox($"Written to {writer.XMLMultistageReportFileName}", "Info",
 							MessageBoxButton.OK, MessageBoxImage.Information);
 						_jobListViewModel.AddJobAsync(writer.XMLMultistageReportFileName);
 						Debug.WriteLine($"Written to {writer.XMLMultistageReportFileName}");
-
+						return writer.XMLMultistageReportFileName;
 					}
 				}
 
 			}catch (Exception e) {
-				dialogHelper?.ShowMessageBox($"{e.Message}", "Error writing VIF", MessageBoxButton.OK,
+				dialogHelper?.ShowMessageBox($"{e.GetInnerExceptionMessages()}", "Error writing VIF", MessageBoxButton.OK,
 					MessageBoxImage.Error);
-
+				return null;
 			}
-			
 		}
 
 		private ICommand _saveInputDataCommand;
diff --git a/VECTO3GUI2020/Views/SettingsView.xaml b/VECTO3GUI2020/Views/SettingsView.xaml
index b4ce56aa8c..6ef78b6a93 100644
--- a/VECTO3GUI2020/Views/SettingsView.xaml
+++ b/VECTO3GUI2020/Views/SettingsView.xaml
@@ -99,9 +99,6 @@
        
             <!--</Grid>-->
             <DockPanel DockPanel.Dock="Bottom" LastChildFill="False">
-                <i:Interaction.Behaviors>
-                    <behaviour:HideOnMainWindowBehavior></behaviour:HideOnMainWindowBehavior>
-                </i:Interaction.Behaviors>
                 <Button DockPanel.Dock="Right"
                         Width="100"
                         Command="{Binding CloseWindowCommand}" 
diff --git a/Vecto3GUI2020Test/TestHelper.cs b/Vecto3GUI2020Test/TestHelper.cs
new file mode 100644
index 0000000000..70e3915442
--- /dev/null
+++ b/Vecto3GUI2020Test/TestHelper.cs
@@ -0,0 +1,28 @@
+using System.CodeDom;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.InputData.FileIO.XML;
+
+namespace Vecto3GUI2020Test
+{
+	public class TestHelper
+	{
+		private IXMLInputDataReader _inputDataReader;
+
+		public TestHelper(IXMLInputDataReader inputDataReader)
+		{
+			_inputDataReader = inputDataReader;
+		}
+
+
+
+
+		public IInputDataProvider GetInputDataProvider(string fileName)
+		{
+			return _inputDataReader.Create(fileName);
+		}
+
+
+
+
+	}
+}
\ No newline at end of file
diff --git a/Vecto3GUI2020Test/UI/UITests.cs b/Vecto3GUI2020Test/UI/UITests.cs
index 969b9c5a05..436e722c67 100644
--- a/Vecto3GUI2020Test/UI/UITests.cs
+++ b/Vecto3GUI2020Test/UI/UITests.cs
@@ -16,7 +16,9 @@ namespace Vecto3GUI2020Test
 {/// <summary>
 /// The Application under Test has to run on a Windows 10 Machine on a Desktop called "VE
 /// </summary>
-    [TestFixture]
+/// 
+    [Ignore("GUI tests are not working that good")]
+	[TestFixture]
     public class UITests : VECTO3GUI2020Session
     {
 		[SetUp]
diff --git a/Vecto3GUI2020Test/ViewModelTests/AirdragTests.cs b/Vecto3GUI2020Test/ViewModelTests/AirdragTests.cs
index 2aadd6117d..4fe432a6ce 100644
--- a/Vecto3GUI2020Test/ViewModelTests/AirdragTests.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/AirdragTests.cs
@@ -17,31 +17,31 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 		#region Airdrag
 		[Test]
-		public void airdragModifiedInPreviousStages()
+		public void AirdragModifiedInPreviousStages()
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
-			var vehicleVM = vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+			var vehicleVm = vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 				DeclarationInterimStageBusVehicleViewModel_v2_8;
 
-			Assert.IsTrue(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+			Assert.IsTrue(vehicleVm.AirdragModifiedMultistageEditingEnabled);
 
 			//try to change to false
 
-			vehicleVM.AirdragModifiedMultistage = false; //should not change the value
-			Assert.IsTrue(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+			vehicleVm.AirdragModifiedMultistage = false; //should not change the value
+			Assert.IsTrue(vehicleVm.AirdragModifiedMultistageEditingEnabled);
 		}
 
 		[Test]
-		public void airdragNotModifiedInPreviousStages()
+		public void AirdragNotModifiedInPreviousStages()
 		{
 			var vm = loadFile(consolidated_multiple_stages);
 
-			var vehicleVM =
+			var vehicleVm =
 				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 					DeclarationInterimStageBusVehicleViewModel_v2_8;
 
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageEditingEnabled);
 		}
 
 		/// <summary>
@@ -50,32 +50,32 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		///		=> 'AirdragModifiedMultistage' required in all consecutive stages
 		/// </summary>
 		[Test]
-		public void airdragComponentLoadedFirstTime()
+		public void AirdragComponentLoadedFirstTime()
 		{
 			///Load VIF without airdrag 
 
 			var vm = loadFile(primary_vehicle_only);
-			var vehicleVM =
+			var vehicleVm =
 				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 					DeclarationInterimStageBusVehicleViewModel_v2_8;
 
-			Assert.IsNull(vehicleVM.AirdragModifiedMultistage);
+			Assert.IsNull(vehicleVm.AirdragModifiedMultistage);
 
-			var airdragViewModel = vehicleVM.MultistageAirdragViewModel as MultistageAirdragViewModel;
+			var airdragViewModel = vehicleVm.MultistageAirdragViewModel as MultistageAirdragViewModel;
 			Assert.IsTrue(airdragViewModel.LoadAirdragFile(GetFullPath(airdragLoadTestFile)));
 
-			Assert.IsNull(vehicleVM.AirdragModifiedMultistage);
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageMandatory);
+			Assert.IsNull(vehicleVm.AirdragModifiedMultistage);
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageMandatory);
 
-			vehicleVM.AirdragModifiedMultistageEditingEnabled = true;
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+			vehicleVm.AirdragModifiedMultistageEditingEnabled = true;
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageEditingEnabled);
 
-			Assert.IsNull(vehicleVM.AirdragModifiedMultistage);
+			Assert.IsNull(vehicleVm.AirdragModifiedMultistage);
 
 			//Set Mandatory Fields
-			vehicleVM.Manufacturer = "testManufacturer";
-			vehicleVM.ManufacturerAddress = "Address";
-			vehicleVM.VIN = "123456789";
+			vehicleVm.Manufacturer = "testManufacturer";
+			vehicleVm.ManufacturerAddress = "Address";
+			vehicleVm.VIN = "123456789";
 
 			//Save as new VIF
 			var multistageJobViewModel = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
@@ -84,41 +84,41 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 			var resultFile = $"{outputName}.VIF_Report_2.xml";
 			Assert.IsTrue(checkFileNameExists(resultFile));
-			var secondstageVM = loadFile(resultFile);
-			Assert.IsNotNull(secondstageVM);
-			var secondStageVehicleVM =
-				(secondstageVM.MultiStageJobViewModel.ManufacturingStageViewModel.VehicleViewModel) as
+			var secondstageVm = loadFile(resultFile);
+			Assert.IsNotNull(secondstageVm);
+			var secondStageVehicleVm =
+				(secondstageVm.MultiStageJobViewModel.ManufacturingStageViewModel.VehicleViewModel) as
 				DeclarationInterimStageBusVehicleViewModel_v2_8;
-			Assert.IsTrue(secondStageVehicleVM.AirdragModifiedMultistageEditingEnabled);
-			Assert.IsTrue(secondStageVehicleVM.AirdragModifiedMultistageMandatory);
-			Assert.IsNull(secondStageVehicleVM.ConsolidatedVehicleData.AirdragModifiedMultistage);
+			Assert.IsTrue(secondStageVehicleVm.AirdragModifiedMultistageEditingEnabled);
+			Assert.IsTrue(secondStageVehicleVm.AirdragModifiedMultistageMandatory);
+			Assert.IsNull(secondStageVehicleVm.ConsolidatedVehicleData.AirdragModifiedMultistage);
 
 			//try to disable AirdragModified
-			secondStageVehicleVM.AirdragModifiedMultistageEditingEnabled = false;
-			Assert.IsTrue(secondStageVehicleVM.AirdragModifiedMultistageEditingEnabled);
+			secondStageVehicleVm.AirdragModifiedMultistageEditingEnabled = false;
+			Assert.IsTrue(secondStageVehicleVm.AirdragModifiedMultistageEditingEnabled);
 		}
 		/// <summary>
 		///  no airdrag component set in VIF => AirdragModifiedMultistage is disabled
 		/// </summary>
 		[Test]
-		public void airdragModifiedDisabled()
+		public void AirdragModifiedDisabled()
 		{
 			var vm = loadFile(primary_vehicle_only);
-			var vehicleVM =
+			var vehicleVm =
 				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 					DeclarationInterimStageBusVehicleViewModel_v2_8;
 
-			Assert.IsNull(vehicleVM.AirdragModifiedMultistage);
+			Assert.IsNull(vehicleVm.AirdragModifiedMultistage);
 
-			Assert.IsNull(vehicleVM.AirdragModifiedMultistage);
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageMandatory);
+			Assert.IsNull(vehicleVm.AirdragModifiedMultistage);
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageMandatory);
 
-			var airdragViewModel = vehicleVM.MultistageAirdragViewModel;
+			var airdragViewModel = vehicleVm.MultistageAirdragViewModel;
 			Assert.IsTrue(airdragViewModel.LoadAirdragFile(GetFullPath(airdragLoadTestFile)), "Airdrag file not loaded");
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageMandatory);
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageMandatory);
 
-			vehicleVM.AirdragModifiedMultistageEditingEnabled = true;
-			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+			vehicleVm.AirdragModifiedMultistageEditingEnabled = true;
+			Assert.IsFalse(vehicleVm.AirdragModifiedMultistageEditingEnabled);
 
 		}
 		/// <summary>
@@ -126,7 +126,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		/// </summary>
 		[Test]
 
-		public void airdragModifiedMandatory()
+		public void AirdragModifiedMandatory()
 		{
 			//var vm = loadFile(primary_vehicle_only);
 			//var vehicleVM =
@@ -144,7 +144,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		}
 
 		[Test]
-		public void temporarySaveAirdragComponent1()
+		public void TemporarySaveAirdragComponent1()
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
@@ -176,7 +176,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		}
 
 		[Test]
-		public void temporarySaveAirdragComponent2()
+		public void TemporarySaveAirdragComponent2()
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
@@ -187,7 +187,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 			//Load input file
 			var multistageJobViewModel = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
-			var mockDialogHelper = setMockDialogHelper(stageInputFullSample, null);
+			var mockDialogHelper = SetMockDialogHelper(stageInputFullSample, null);
 			multistageJobViewModel.LoadVehicleDataCommand.Execute(null);
 
 
@@ -214,7 +214,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		}
 
 		[Test]
-		public void removeAirdragComponent()
+		public void RemoveAirdragComponent()
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
@@ -225,7 +225,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 			//Load input file
 			var multistageJobViewModel = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
-			var mockDialogHelper = setMockDialogHelper(stageInputFullSample, null);
+			var mockDialogHelper = SetMockDialogHelper(stageInputFullSample, null);
 			multistageJobViewModel.LoadVehicleDataCommand.Execute(null);
 
 
@@ -241,7 +241,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 
 		[Test]
-		public void airdragModifiedSetToTrueWhenComponentIsLoaded()
+		public void AirdragModifiedSetToTrueWhenComponentIsLoaded()
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
diff --git a/Vecto3GUI2020Test/ViewModelTests/ExemptedTests.cs b/Vecto3GUI2020Test/ViewModelTests/ExemptedTests.cs
new file mode 100644
index 0000000000..a14896327f
--- /dev/null
+++ b/Vecto3GUI2020Test/ViewModelTests/ExemptedTests.cs
@@ -0,0 +1,174 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using Ninject;
+using NUnit.Framework;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using VECTO3GUI2020.ViewModel.Interfaces;
+using VECTO3GUI2020.ViewModel.MultiStage.Implementation;
+
+namespace Vecto3GUI2020Test.ViewModelTests
+{
+	[TestFixture]
+	public class ExemptedTests : ViewModelTestBase
+	{
+		#region SaveInputData
+		[Test, Combinatorial]
+		public void LoadAndSaveExemptedPrimary()
+		{
+			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 legislativeCategory = LegislativeClass.M3;
+			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);
+		}
+		#endregion
+
+		#region SaveInputData
+		[Test]
+		public void SaveAsNewVif()
+		{
+			var newMultiStageJob = loadFile(exempted);
+			Assert.IsTrue(newMultiStageJob.MultiStageJobViewModel.Exempted);
+
+
+			var multistageJobViewModel = newMultiStageJob.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
+
+			var outputFile = GetFullPath("exemptedNewVif/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 legislativeCategory = LegislativeClass.M3;
+			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;
+
+			try {
+				Directory.Delete(Path.GetDirectoryName(outputFile), true);
+			} catch (Exception e) {
+				WriteLine(e.Message);
+			}
+			var result = multistageJobViewModel.SaveVif(outputFile);
+
+			//Check that file exists
+			Assert.IsTrue(File.Exists(result));
+
+			//Check that file was added to JobList
+			var jobListVm = _kernel.Get<IJobListViewModel>();
+			Assert.AreEqual(1, jobListVm.Jobs.Count);
+			Assert.AreEqual(result, jobListVm.Jobs[0].DataSource.SourceFile);
+
+			var inputDataProvider = _testHelper.GetInputDataProvider(result) as IMultistageBusInputDataProvider;
+			Assert.NotNull(inputDataProvider);
+
+
+			var lastManStage = inputDataProvider.JobInputData.ManufacturingStages.Last();
+
+
+			Assert.AreEqual(manufacturer, lastManStage.Vehicle.Manufacturer);
+			Assert.AreEqual(manufacturerAddress, lastManStage.Vehicle.ManufacturerAddress);
+			Assert.AreEqual(height.ConvertToMeter(), lastManStage.Vehicle.Height);
+			Assert.AreEqual(model, lastManStage.Vehicle.Model);
+			Assert.AreEqual(legislativeCategory, lastManStage.Vehicle.LegislativeClass);
+			Assert.AreEqual(curbMassChassis, lastManStage.Vehicle.CurbMassChassis);
+			Assert.AreEqual(technicalpermissableLadenMass, lastManStage.Vehicle.GrossVehicleMassRating);
+			Assert.AreEqual(registeredClass, lastManStage.Vehicle.RegisteredClass);
+			Assert.AreEqual(bodyWorkCode, lastManStage.Vehicle.VehicleCode);
+			Assert.AreEqual(lowEntry, lastManStage.Vehicle.LowEntry);
+			Assert.AreEqual(passengerSeatsUpperDeck, lastManStage.Vehicle.NumberPassengerSeatsUpperDeck);
+			Assert.AreEqual(PassengerSeatsLowerDeck, lastManStage.Vehicle.NumberPassengerSeatsLowerDeck);
+
+		}
+		#endregion
+
+
+
+	}
+}
\ No newline at end of file
diff --git a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
index daff148eaa..ae93b40edf 100644
--- a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
@@ -56,7 +56,7 @@ namespace Vecto3GUI2020Test
 
 			var fileName = primary_vehicle_only.Replace(".xml", "") + "_output.xml";
 			deleteFile(fileName);
-			setMockDialogHelper(null, fileToSave: fileName);
+			SetMockDialogHelper(null, fileToSave: fileName);
 
 
 			manufacturingStage.SaveInputDataAsCommand.Execute(null);
@@ -64,111 +64,21 @@ namespace Vecto3GUI2020Test
 		}
 
 		[Test]
-		public void LoadPrimaryAndSave()
+		public void LoadPrimaryAndSaveAsVif()
 		{
 			//load file
 			var newMultiStageJob = loadFile(primary_vehicle_only);
 			var vehicle = newMultiStageJob.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as DeclarationInterimStageBusVehicleViewModel_v2_8;
 
-
-
 		}
-		[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);
 
+		
 
 
 
-		}
-
-
-
-
-		[Ignore("Validation is only performed with gui")]
-		[TestCase(primary_vehicle_only)]
-		[TestCase(consolidated_multiple_stages)]
-		[TestCase(consolidated_one_stage)]
-		public void SaveVehicleDataWithMissingFields(string fileName)
-		{
-			var newMultistageJobViewModel = loadFile(fileName);
-			var manstage = newMultistageJobViewModel.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
-			Assert.NotNull(manstage);
-
-			var saveFileName = fileName.Replace(".xml", "") + "_output.xml";
-			deleteFile(saveFileName);
-			_kernel.Rebind<IDialogHelper>().ToConstant(setMockDialogHelper(fileToSave: saveFileName).Object);
-			manstage.SaveInputDataAsCommand.Execute(null);
-
-			Assert.False(checkFileNameExists(saveFileName));
-
-		}
-
 		[Test]
 		public void ReloadInputFile()
 		{
@@ -182,7 +92,7 @@ namespace Vecto3GUI2020Test
 
 			Assert.True(vehicle.AirdragModifiedMultistageEditingEnabled);
 
-			var mockDialog = setMockDialogHelper(consolidated_multiple_stages_hev);
+			var mockDialog = SetMockDialogHelper(consolidated_multiple_stages_hev);
 			newMultistageJobViewModel.AddVifFile.Execute(null);
 			Assert.AreEqual(mockDialog.Object.OpenXMLFileDialog(null), newMultistageJobViewModel.VifPath);
 			vehicle = newMultistageJobViewModel.MultiStageJobViewModel.VehicleInputData as DeclarationInterimStageBusVehicleViewModel_v2_8;
@@ -207,7 +117,7 @@ namespace Vecto3GUI2020Test
 
 
 			var fileToSave = "loadAndSaveFullInputDataTest.xml";
-			var mockDialogHelper = setMockDialogHelper(stageInputFullSample, fileToSave);
+			var mockDialogHelper = SetMockDialogHelper(stageInputFullSample, fileToSave);
 			multiStageJobViewModel.LoadVehicleDataCommand.Execute(null);
 
 			var manufacturingStageViewModel =
@@ -299,6 +209,12 @@ namespace Vecto3GUI2020Test
 			Assert.Null(vifInputData.VehicleInputData.Components);
 		}
 
+
+
+
+
+
+
 		[TestCase(consolidated_multiple_stages_airdrag, true)]
 		[TestCase(consolidated_multiple_stages, null)]
 		[TestCase(consolidated_one_stage, null)]
@@ -325,7 +241,7 @@ namespace Vecto3GUI2020Test
 			
 			var fileToSave = "stageInput.xml";
 
-			var mockDialogHelper = setMockDialogHelper(null, fileToSave: fileToSave);
+			var mockDialogHelper = SetMockDialogHelper(null, fileToSave: fileToSave);
 
 			TestContext.Write("Saving file with loaded Airdrag Component ... ");
 			var multistageJobViewModel = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
@@ -397,7 +313,7 @@ namespace Vecto3GUI2020Test
 			var manStageViewModel = multiStageViewModel.ManufacturingStageViewModel as ManufacturingStageViewModel_v0_1;
 
 			var vehicleInputData = "vecto_vehicle-stage_input_full-sample.xml";
-			var mockDialogHelper = setMockDialogHelper(fileToLoad: vehicleInputData, fileToSave: null);
+			var mockDialogHelper = SetMockDialogHelper(fileToLoad: vehicleInputData, fileToSave: null);
 			var vehicleInputDataFilePath = mockDialogHelper.Object.OpenXMLFileDialog();
 			TestContext.WriteLine($"Loading {vehicleInputDataFilePath}");
 			Assert.IsTrue(File.Exists(vehicleInputDataFilePath));
diff --git a/Vecto3GUI2020Test/ViewModelTests/VIFTests.cs b/Vecto3GUI2020Test/ViewModelTests/VIFTests.cs
index f43a7276f3..3b2df880ea 100644
--- a/Vecto3GUI2020Test/ViewModelTests/VIFTests.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/VIFTests.cs
@@ -18,7 +18,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		[Test]
 		public void loadPrimaryVehicleOnlyAndCreateNewVIF()
 		{
-			var multistagevm = loadFile(primary_vehicle_only).MultiStageJobViewModel;
+			var multistagevm = loadFile(primary_vehicle_only).MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
 			var stage = multistagevm.ManufacturingStageViewModel.StageCount;
 
 			Assert.AreEqual(2, stage);
@@ -33,10 +33,10 @@ namespace Vecto3GUI2020Test.ViewModelTests
 			var writer = GetFileOutputVIFWriter(multistagevm);
 			
 			deleteFile(writer.XMLMultistageReportFileName);
-			setMockDialogHelper(null, writer.XMLMultistageReportFileName);
-			_kernel.Rebind<IDialogHelper>().ToConstant(setMockDialogHelper(null, writer.XMLMultistageReportFileName).Object);
+			SetMockDialogHelper(null, writer.XMLMultistageReportFileName);
+			_kernel.Rebind<IDialogHelper>().ToConstant(SetMockDialogHelper(null, writer.XMLMultistageReportFileName).Object);
 
-			MultiStageJobViewModel_v0_1.SaveVif(multistagevm, writer);
+			multistagevm.SaveVif(multistagevm, writer);
 
 			Assert.IsTrue(File.Exists(writer.XMLMultistageReportFileName));
 
@@ -50,7 +50,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		{
 			
 
-			setMockDialogHelper(consolidated_multiple_stages, null);
+			SetMockDialogHelper(consolidated_multiple_stages, null);
 			
 			var newMultistageJobViewModel = _kernel.Get<NewMultiStageJobViewModel>();
 			newMultistageJobViewModel.AddVifFile.Execute(null);
@@ -65,7 +65,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
 			var multiStageViewModel = newMultistageJobViewModel.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
 			Assert.NotNull(multiStageViewModel);
 
-			setMockDialogHelper(stageInputFullSample, null);
+			SetMockDialogHelper(stageInputFullSample, null);
 
 			multiStageViewModel.LoadVehicleDataCommand.Execute(null);
 			
@@ -80,9 +80,9 @@ namespace Vecto3GUI2020Test.ViewModelTests
 			var writer = GetFileOutputVIFWriter(multiStageViewModel);
 			
 			deleteFile(writer.XMLMultistageReportFileName);
-			setMockDialogHelper(null, writer.XMLMultistageReportFileName);
+			SetMockDialogHelper(null, writer.XMLMultistageReportFileName);
 
-			MultiStageJobViewModel_v0_1.SaveVif(multiStageViewModel, writer);
+			multiStageViewModel.SaveVif(multiStageViewModel, writer);
 			
 			var validator = new XMLValidator(XmlReader.Create(writer.XMLMultistageReportFileName));
 			Assert.True(validator.ValidateXML(TUGraz.VectoCore.Utils.XmlDocumentType.MultistageOutputData));
diff --git a/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs b/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
index 7f5d3ef569..33120846ca 100644
--- a/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
@@ -106,59 +106,18 @@ namespace Vecto3GUI2020Test.ViewModelTests
 			var vehicleVM =
 				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 					DeclarationInterimStageBusVehicleViewModel_v2_8;
-			setMockDialogHelper(stageInputFullSample);
+			SetMockDialogHelper(stageInputFullSample);
 			var vmConc = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
 			vmConc.LoadVehicleDataCommand.Execute(null);
 			Assert.IsFalse(vmConc.ManufacturingStageViewModel.VehicleViewModel.HasErrors);
 			
 		}
 
-		//[Test]
-		//public void groupEditing()
-		//{
-		//	var vm = loadFile(primary_vehicle_only);
-		//	var vehicleVM =
-		//		vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
-		//			DeclarationInterimStageBusVehicleViewModel_v2_8;
-
-		//	vehicleVM.NumberOfPassengersUpperDeck = 2;
-
-		//	Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
-		//	Assert.AreEqual(2, vehicleVM.NumberOfPassengersUpperDeck);
-		//	vehicleVM.NumberOfPassengersLowerDeck = 3;
-		//	Assert.AreEqual(3, vehicleVM.NumberOfPassengersLowerDeck);
-		//}
-
-
-		//[Test]
-		//public void automaticallyEnableEditingWhenContentIsSet()
-		//{
-		//	var vm = loadFile(primary_vehicle_only);
-		//	var vehicleVM =
-		//		vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
-		//			DeclarationInterimStageBusVehicleViewModel_v2_8;
-
-			
-		//	vehicleVM.NumberOfPassengersUpperDeck = 2;
-		//	Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
-
-		//	vehicleVM.NumberOfPassengersUpperDeck = null;
-
-		//	getMockDialogHelper(stageInputFullSample);
-		//	var vmConc = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
-		//	vmConc.LoadVehicleDataCommand.Execute(null);
-
-
-		//	Assert.IsTrue(vehicleVM.ParameterViewModels[nameof(vehicleVM.NumberOfPassengersUpperDeck)].EditingEnabled);
-		//	Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
-		//}
-
-
 
 
 		#region ADAS
 		[Test]
-		public void loadPrimaryAndEdit()
+		public void LoadPrimaryAndEdit()
 		{
 			var vm = loadFile(primary_vehicle_only);
 			Assert.NotNull(vm);
@@ -176,13 +135,6 @@ namespace Vecto3GUI2020Test.ViewModelTests
 			Assert.Null(vehicleData.ADAS);
 
 		}
-
-
-
-
-
-
-
 		#endregion
 
 
diff --git a/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs b/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
index f74f91c18f..1a2e88c5ae 100644
--- a/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/ViewModelTestBase.cs
@@ -19,20 +19,12 @@ namespace Vecto3GUI2020Test
 	{
 		protected const string TestDataDirPath = @"Testdata\";
 		protected const string consolidated_multiple_stages = "vecto_multistage_consolidated_multiple_stages.xml";
-
-		protected const string consolidated_multiple_stages_airdrag =
-			"vecto_multistage_consolidated_multiple_stages_airdrag.xml";
-
-		protected const string consolidated_multiple_stages_hev =
-			"vecto_multistage_consolidated_multiple_stages_hev.xml";
-
+		protected const string consolidated_multiple_stages_airdrag = "vecto_multistage_consolidated_multiple_stages_airdrag.xml";
+		protected const string consolidated_multiple_stages_hev = "vecto_multistage_consolidated_multiple_stages_hev.xml";
 		protected const string consolidated_one_stage = "vecto_multistage_consolidated_one_stage.xml";
 		protected const string primary_vehicle_only = "vecto_multistage_primary_vehicle_only.xml";
-
-		
-
+		protected const string exempted = "exempted_primary_heavyBus.VIF.xml";
 		protected const string stageInputFullSample = "vecto_vehicle-stage_input_full-sample.xml";
-
 		protected const string airdragLoadTestFile = "AirdragLoadTestFile.xml";
 
 		//protected IXMLInputDataReader xmlInputReader;
@@ -40,6 +32,8 @@ namespace Vecto3GUI2020Test
 		private Mock<IDialogHelper> _mockDialogHelper;
 
 
+		protected TestHelper _testHelper;
+
 		[SetUp]
 		public void OneTimeSetUp()
 		{
@@ -54,8 +48,9 @@ namespace Vecto3GUI2020Test
 				new Vecto3GUI2020Module()
 			);
 			//xmlInputReader = _kernel.Get<IXMLInputDataReader>();
-			_kernel.Rebind<IDialogHelper>().ToConstant(setMockDialogHelper().Object);
+			_kernel.Rebind<IDialogHelper>().ToConstant(SetMockDialogHelper().Object);
 
+			_testHelper = new TestHelper(_kernel.Get<IXMLInputDataReader>());
 		}
 
 		[TearDown]
@@ -94,7 +89,7 @@ namespace Vecto3GUI2020Test
 
 		public virtual NewMultiStageJobViewModel loadFile(string fileName)
 		{
-			var mockDialogHelper = setMockDialogHelper(fileName);
+			var mockDialogHelper = SetMockDialogHelper(fileName);
 
 			var newMultistageJobViewModel = _kernel.Get<NewMultiStageJobViewModel>();
 			newMultistageJobViewModel.AddVifFile.Execute(null);
@@ -113,16 +108,10 @@ namespace Vecto3GUI2020Test
 				var airdragViewModel = (manstageVehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8)?.MultistageAirdragViewModel;
 				Assert.NotNull(airdragViewModel);
 			}
-			
-
-
-
-
-
 			return newMultistageJobViewModel;
 		}
 
-		protected virtual Mock<IDialogHelper> setMockDialogHelper(string fileToLoad = null, string fileToSave = null)
+		protected virtual Mock<IDialogHelper> SetMockDialogHelper(string fileToLoad = null, string fileToSave = null)
 		{
 			if (_mockDialogHelper == null) {
 				_mockDialogHelper = new Mock<IDialogHelper>();
@@ -139,6 +128,8 @@ namespace Vecto3GUI2020Test
 						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);
@@ -164,7 +155,7 @@ namespace Vecto3GUI2020Test
 			return _mockDialogHelper;
 		}
 
-		protected Mock<IDialogHelper> getMockDialogHelper()
+		protected Mock<IDialogHelper> GetMockDialogHelper()
 		{
 			return _mockDialogHelper;
 		}
@@ -175,5 +166,14 @@ namespace Vecto3GUI2020Test
 			Debug.WriteLine(path);
 			return path;
 		}
+
+		protected void Write(string outputMessage)
+		{
+			TestContext.Write(outputMessage);
+		}
+		protected void WriteLine(string outputMessage)
+		{
+			TestContext.WriteLine(outputMessage);
+		}
 	}
 }
\ No newline at end of file
-- 
GitLab