From b639c9f5730e2b4586f814c149de932ab4f597c3 Mon Sep 17 00:00:00 2001
From: Stefanos Doumpoulakis <dubulak@gmail.com>
Date: Tue, 4 Oct 2022 16:32:21 +0300
Subject: [PATCH] implemented: validate MRF simulation tool version

---
 .../InputData/FileIO/JSON/JSONInputData.cs    |  8 +--
 VectoCore/VectoCore/Utils/VectoVersionCore.cs | 32 ++++++++++++
 .../VectoCoreTest/Utils/VectoVersionTest.cs   | 49 +++++++++++++++++++
 VectoCore/VectoCoreTest/VectoCoreTest.csproj  |  1 +
 4 files changed, 86 insertions(+), 4 deletions(-)
 create mode 100644 VectoCore/VectoCoreTest/Utils/VectoVersionTest.cs

diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index e66bc41c28..bb757828fa 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -970,15 +970,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			string simToolVersionStr = XMLManufacturerReportReader.ReadElementValue(xmlDoc, "SimulationToolVersion");
 			string vectoVersionStr = VectoSimulationCore.VersionNumber;
 
-			bool xmlVersionOlder = true;
+			bool xmlVersionNewer = VectoSimulationCore.CompareVersions(simToolVersionStr, vectoVersionStr) > 0;
 			
-			if (!xmlVersionOlder) {
-				throw new VectoException($"Not allowed to run simulation with MRF having newer simulation tool version");
+			if (xmlVersionNewer) {
+				throw new VectoException($"Not allowed to run simulation with MRF having newer simulation tool version ({simToolVersionStr})");
 			}
 		}
 
 		#endregion
-		
+
 		private void ReadManufacturerReport()
 		{
 			var xmlDoc = new XmlDocument();
diff --git a/VectoCore/VectoCore/Utils/VectoVersionCore.cs b/VectoCore/VectoCore/Utils/VectoVersionCore.cs
index 27aa603475..02a0ea995a 100644
--- a/VectoCore/VectoCore/Utils/VectoVersionCore.cs
+++ b/VectoCore/VectoCore/Utils/VectoVersionCore.cs
@@ -29,6 +29,9 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
+using TUGraz.VectoCommon.Utils;
+
 namespace TUGraz.VectoCore.Utils
 {
 	public static class VectoSimulationCore
@@ -57,5 +60,34 @@ namespace TUGraz.VectoCore.Utils
 				return string.Format("VectoCore {0}", VersionNumber);
 			}
 		}
+
+		public enum VersionPart {
+			Major = 0,
+			Minor = 1,
+			Patch = 2,
+			Build = 3
+		};
+
+		public static int CompareVersions(string a, string b, VersionPart bound = VersionPart.Build)
+		{ 
+			var va = a.Split('-')[0].Split('.');
+			var vb = b.Split('-')[0].Split('.');
+			
+			for (int i = 0; (i < va.Length) && (i <= (int)bound); i++) {
+				string vbPartStr = (i < vb.Length) ? vb[i] : "0";
+				int vbPart = 0;
+				int.TryParse(vbPartStr, out vbPart);
+
+				int vaPart = 0;
+				int.TryParse(va[i], out vaPart);
+
+				if (vaPart != vbPart) {
+					return (vaPart > vbPart) ? 1 : -1;
+				}
+			}
+
+			return 0;
+		}
+
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/VectoVersionTest.cs b/VectoCore/VectoCoreTest/Utils/VectoVersionTest.cs
new file mode 100644
index 0000000000..73039967e1
--- /dev/null
+++ b/VectoCore/VectoCoreTest/Utils/VectoVersionTest.cs
@@ -0,0 +1,49 @@
+using System;
+using TUGraz.VectoCommon.Utils;
+using NUnit.Framework;
+using static TUGraz.VectoCore.Utils.VectoSimulationCore;
+
+namespace TUGraz.VectoCore.Tests.Utils
+{
+    [TestFixture]
+	[Parallelizable(ParallelScope.All)]
+    public class VectoVersionTest
+    {
+        [
+        TestCase("1.1.3.400-DEV", "1.2.2.100-RC", VersionPart.Major, 0),
+        TestCase("1.2.1.400-DEV", "1.1.2.100-RC", VersionPart.Major, 0),
+        TestCase("1.1.3.400-DEV", "1.1.1.100-RC", VersionPart.Major, 0),
+
+        TestCase("1.1.3.400-DEV", "2.1.3.400-DEV", VersionPart.Major, -1),
+        TestCase("2.2.1.400-DEV", "1.2.1.400-DEV", VersionPart.Major, 1),
+        TestCase("1.2.3.400-DEV", "1.1.1.400-DEV", VersionPart.Major, 0),
+        
+        TestCase("1.1.3.400-DEV", "1.2.2.100-RC", VersionPart.Minor, -1),
+        TestCase("1.2.1.400-DEV", "1.1.2.100-RC", VersionPart.Minor, 1),
+        TestCase("1.1.3.400-DEV", "1.1.1.100-RC", VersionPart.Minor, 0),
+        
+        TestCase("1.1.3.400-DEV", "1.1.2.100-RC", VersionPart.Minor, 0),
+        TestCase("1.2.1.400-DEV", "1.2.2.100-RC", VersionPart.Minor, 0),
+        TestCase("1.3.3.400-DEV", "1.3.1.100-RC", VersionPart.Minor, 0),
+        
+        TestCase("1.1.3.400-DEV", "1.1.4.100-RC", VersionPart.Patch, -1),
+        TestCase("1.2.1.400-DEV", "1.2.0.100-RC", VersionPart.Patch, 1),
+        TestCase("1.1.3.400-DEV", "1.1.3.100-RC", VersionPart.Patch, 0),
+
+        TestCase("1.1.4.400-DEV", "1.1.4.100-RC", VersionPart.Patch, 0),
+        TestCase("1.2.0.400-DEV", "1.2.0.100-RC", VersionPart.Patch, 0),
+        
+        TestCase("1.1.3.400-DEV", "1.1.3.500-RC", VersionPart.Build, -1),
+        TestCase("1.2.1.400-DEV", "1.2.1.100-RC", VersionPart.Build, 1),
+        TestCase("1.1.3.400-DEV", "1.1.3.400-RC", VersionPart.Build, 0),
+
+        TestCase("1.1.3.400-DEV", "1.1.4.400-DEV", VersionPart.Build, -1),
+        TestCase("1.2.2.400-DEV", "1.2.1.400-DEV", VersionPart.Build, 1),
+        TestCase("1.1.3.400-DEV", "1.1.3.400-DEV", VersionPart.Build, 0),
+        ]
+        public void TestCompareVersionsWithBound(string a, string b, VersionPart bound, int result)
+        {
+            Assert.IsTrue(CompareVersions(a, b, bound) == result);
+        }
+    }
+}
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index 5a4d54137d..b1ddded146 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -206,6 +206,7 @@
     <Compile Include="Algorithms\DelaunayMapTest.cs" />
     <Compile Include="Utils\MockModalDataContainer.cs" />
     <Compile Include="Utils\DoubleExtensionMethodTest.cs" />
+    <Compile Include="Utils\VectoVersionTest.cs" />
     <Compile Include="Utils\VectoMathTest.cs" />
     <Compile Include="XML\XMLDeclarationInputTest.cs" />
     <Compile Include="XML\XMLDeclarationReaderVersionsTest.cs" />
-- 
GitLab