aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-10-18 22:38:21 -0500
committerSean Hall <r.sean.hall@gmail.com>2020-10-24 20:17:06 -0500
commit1b6a4f9b4600079e829d5884f768563ed7dea5e5 (patch)
tree7db199ee381f31e675e6a28c248f037dc5f9018d
parentc9d14eb51e4b8458fd5e2738fcc7d1c1129ad22e (diff)
downloadwix-1b6a4f9b4600079e829d5884f768563ed7dea5e5.tar.gz
wix-1b6a4f9b4600079e829d5884f768563ed7dea5e5.tar.bz2
wix-1b6a4f9b4600079e829d5884f768563ed7dea5e5.zip
Add CompareVersions engine method and expose verutil in Mba.Core.
-rw-r--r--src/WixToolset.Mba.Core/Engine.cs6
-rw-r--r--src/WixToolset.Mba.Core/IBootstrapperEngine.cs6
-rw-r--r--src/WixToolset.Mba.Core/IEngine.cs3
-rw-r--r--src/WixToolset.Mba.Core/VerUtil.cs126
-rw-r--r--src/WixToolset.Mba.Core/VerUtilVersion.cs63
-rw-r--r--src/WixToolset.Mba.Core/VerUtilVersionReleaseLabel.cs22
-rw-r--r--src/balutil/BalBootstrapperEngine.cpp26
-rw-r--r--src/balutil/inc/IBootstrapperApplication.h2
-rw-r--r--src/balutil/inc/IBootstrapperEngine.h6
-rw-r--r--src/bextutil/BextBundleExtensionEngine.cpp26
-rw-r--r--src/bextutil/inc/IBundleExtensionEngine.h6
-rw-r--r--src/mbanative/mbanative.def6
-rw-r--r--src/mbanative/precomp.h1
-rw-r--r--src/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs2
-rw-r--r--src/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs93
15 files changed, 392 insertions, 2 deletions
diff --git a/src/WixToolset.Mba.Core/Engine.cs b/src/WixToolset.Mba.Core/Engine.cs
index e3ad097a..c6570f9d 100644
--- a/src/WixToolset.Mba.Core/Engine.cs
+++ b/src/WixToolset.Mba.Core/Engine.cs
@@ -49,6 +49,12 @@ namespace WixToolset.Mba.Core
49 this.engine.CloseSplashScreen(); 49 this.engine.CloseSplashScreen();
50 } 50 }
51 51
52 public int CompareVersions(string version1, string version2)
53 {
54 this.engine.CompareVersions(version1, version2, out var result);
55 return result;
56 }
57
52 public bool ContainsVariable(string name) 58 public bool ContainsVariable(string name)
53 { 59 {
54 int capacity = 0; 60 int capacity = 0;
diff --git a/src/WixToolset.Mba.Core/IBootstrapperEngine.cs b/src/WixToolset.Mba.Core/IBootstrapperEngine.cs
index 584e0f6d..5cc42071 100644
--- a/src/WixToolset.Mba.Core/IBootstrapperEngine.cs
+++ b/src/WixToolset.Mba.Core/IBootstrapperEngine.cs
@@ -145,6 +145,12 @@ namespace WixToolset.Mba.Core
145 [MarshalAs(UnmanagedType.LPWStr)] string wzArguments, 145 [MarshalAs(UnmanagedType.LPWStr)] string wzArguments,
146 [MarshalAs(UnmanagedType.U4)] int dwWaitForInputIdleTimeout 146 [MarshalAs(UnmanagedType.U4)] int dwWaitForInputIdleTimeout
147 ); 147 );
148
149 void CompareVersions(
150 [MarshalAs(UnmanagedType.LPWStr)] string wzVersion1,
151 [MarshalAs(UnmanagedType.LPWStr)] string wzVersion2,
152 [MarshalAs(UnmanagedType.I4)] out int pnResult
153 );
148 } 154 }
149 155
150 /// <summary> 156 /// <summary>
diff --git a/src/WixToolset.Mba.Core/IEngine.cs b/src/WixToolset.Mba.Core/IEngine.cs
index b486e51d..8403352d 100644
--- a/src/WixToolset.Mba.Core/IEngine.cs
+++ b/src/WixToolset.Mba.Core/IEngine.cs
@@ -25,6 +25,9 @@ namespace WixToolset.Mba.Core
25 /// </summary> 25 /// </summary>
26 void CloseSplashScreen(); 26 void CloseSplashScreen();
27 27
28 /// <returns>0 if equal, 1 if version1 &gt; version2, -1 if version1 &lt; version2</returns>
29 int CompareVersions(string version1, string version2);
30
28 /// <summary> 31 /// <summary>
29 /// Checks if a variable exists in the engine. 32 /// Checks if a variable exists in the engine.
30 /// </summary> 33 /// </summary>
diff --git a/src/WixToolset.Mba.Core/VerUtil.cs b/src/WixToolset.Mba.Core/VerUtil.cs
new file mode 100644
index 00000000..dcc9dee2
--- /dev/null
+++ b/src/WixToolset.Mba.Core/VerUtil.cs
@@ -0,0 +1,126 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System;
6 using System.Runtime.InteropServices;
7 using System.Text;
8
9 public static class VerUtil
10 {
11 [DllImport("mbanative.dll", ExactSpelling = true, PreserveSig = false)]
12 internal static extern int VerCompareParsedVersions(
13 VersionHandle pVersion1,
14 VersionHandle pVersion2
15 );
16
17 [DllImport("mbanative.dll", ExactSpelling = true, PreserveSig = false)]
18 internal static extern int VerCompareStringVersions(
19 [MarshalAs(UnmanagedType.LPWStr)] string wzVersion1,
20 [MarshalAs(UnmanagedType.LPWStr)] string wzVersion2,
21 [MarshalAs(UnmanagedType.Bool)] bool fStrict
22 );
23
24 [DllImport("mbanative.dll", ExactSpelling = true, PreserveSig = false)]
25 internal static extern VersionHandle VerCopyVersion(
26 VersionHandle pSource
27 );
28
29 [DllImport("mbanative.dll", ExactSpelling = true)]
30 internal static extern void VerFreeVersion(
31 IntPtr pVersion
32 );
33
34 [DllImport("mbanative.dll", ExactSpelling = true, PreserveSig = false)]
35 internal static extern VersionHandle VerParseVersion(
36 [MarshalAs(UnmanagedType.LPWStr)] string wzVersion,
37 [MarshalAs(UnmanagedType.U4)] uint cchValue,
38 [MarshalAs(UnmanagedType.Bool)] bool fStrict
39 );
40
41 [DllImport("mbanative.dll", ExactSpelling = true, PreserveSig = false)]
42 internal static extern VersionHandle VerVersionFromQword(
43 [MarshalAs(UnmanagedType.I8)] long qwVersion
44 );
45
46 [StructLayout(LayoutKind.Sequential)]
47 internal struct VersionReleaseLabelStruct
48 {
49 public bool fNumeric;
50 public uint dwValue;
51 public IntPtr cchLabelOffset;
52 public int cchLabel;
53 }
54
55 [StructLayout(LayoutKind.Sequential)]
56 internal struct VersionStruct
57 {
58 public IntPtr sczVersion;
59 public uint dwMajor;
60 public uint dwMinor;
61 public uint dwPatch;
62 public uint dwRevision;
63 public int cReleaseLabels;
64 public IntPtr rgReleaseLabels;
65 public IntPtr cchMetadataOffset;
66 public bool fInvalid;
67 }
68
69 internal static string VersionStringFromOffset(IntPtr wzVersion, IntPtr cchOffset, int? cchLength = null)
70 {
71 var offset = cchOffset.ToInt64() * UnicodeEncoding.CharSize;
72 var wz = new IntPtr(wzVersion.ToInt64() + offset);
73 if (cchLength.HasValue)
74 {
75 return Marshal.PtrToStringUni(wz, (int)cchLength);
76 }
77 else
78 {
79 return Marshal.PtrToStringUni(wz);
80 }
81 }
82
83 internal sealed class VersionHandle : SafeHandle
84 {
85 public VersionHandle() : base(IntPtr.Zero, true) { }
86
87 public override bool IsInvalid => false;
88
89 protected override bool ReleaseHandle()
90 {
91 VerFreeVersion(this.handle);
92 return true;
93 }
94 }
95
96 /// <returns>0 if equal, 1 if version1 &gt; version2, -1 if version1 &lt; version2</returns>
97 public static int CompareParsedVersions(VerUtilVersion version1, VerUtilVersion version2)
98 {
99 return VerCompareParsedVersions(version1.GetHandle(), version2.GetHandle());
100 }
101
102 /// <returns>0 if equal, 1 if version1 &gt; version2, -1 if version1 &lt; version2</returns>
103 public static int CompareStringVersions(string version1, string version2, bool strict)
104 {
105 return VerCompareStringVersions(version1, version2, strict);
106 }
107
108 public static VerUtilVersion CopyVersion(VerUtilVersion version)
109 {
110 var handle = VerCopyVersion(version.GetHandle());
111 return new VerUtilVersion(handle);
112 }
113
114 public static VerUtilVersion ParseVersion(string version, bool strict)
115 {
116 var handle = VerParseVersion(version, 0, strict);
117 return new VerUtilVersion(handle);
118 }
119
120 public static VerUtilVersion VersionFromQword(long version)
121 {
122 var handle = VerVersionFromQword(version);
123 return new VerUtilVersion(handle);
124 }
125 }
126}
diff --git a/src/WixToolset.Mba.Core/VerUtilVersion.cs b/src/WixToolset.Mba.Core/VerUtilVersion.cs
new file mode 100644
index 00000000..2b509a21
--- /dev/null
+++ b/src/WixToolset.Mba.Core/VerUtilVersion.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System;
6 using System.Runtime.InteropServices;
7
8 public sealed class VerUtilVersion : IDisposable
9 {
10 internal VerUtilVersion(VerUtil.VersionHandle handle)
11 {
12 this.Handle = handle;
13
14 var pVersion = handle.DangerousGetHandle();
15 var version = (VerUtil.VersionStruct)Marshal.PtrToStructure(pVersion, typeof(VerUtil.VersionStruct));
16 this.Version = Marshal.PtrToStringUni(version.sczVersion);
17 this.Major = version.dwMajor;
18 this.Minor = version.dwMinor;
19 this.Patch = version.dwPatch;
20 this.Revision = version.dwRevision;
21 this.ReleaseLabels = new VerUtilVersionReleaseLabel[version.cReleaseLabels];
22 this.Metadata = VerUtil.VersionStringFromOffset(version.sczVersion, version.cchMetadataOffset);
23 this.IsInvalid = version.fInvalid;
24
25 for (var i = 0; i < version.cReleaseLabels; ++i)
26 {
27 var offset = i * Marshal.SizeOf(typeof(VerUtil.VersionReleaseLabelStruct));
28 var pReleaseLabel = new IntPtr(version.rgReleaseLabels.ToInt64() + offset);
29 this.ReleaseLabels[i] = new VerUtilVersionReleaseLabel(pReleaseLabel, version.sczVersion);
30 }
31 }
32
33 public string Version { get; private set; }
34 public uint Major { get; private set; }
35 public uint Minor { get; private set; }
36 public uint Patch { get; private set; }
37 public uint Revision { get; private set; }
38 public VerUtilVersionReleaseLabel[] ReleaseLabels { get; private set; }
39 public string Metadata { get; private set; }
40 public bool IsInvalid { get; private set; }
41
42 public void Dispose()
43 {
44 if (this.Handle != null)
45 {
46 this.Handle.Dispose();
47 this.Handle = null;
48 }
49 }
50
51 private VerUtil.VersionHandle Handle { get; set; }
52
53 internal VerUtil.VersionHandle GetHandle()
54 {
55 if (this.Handle == null)
56 {
57 throw new ObjectDisposedException(this.Version);
58 }
59
60 return this.Handle;
61 }
62 }
63}
diff --git a/src/WixToolset.Mba.Core/VerUtilVersionReleaseLabel.cs b/src/WixToolset.Mba.Core/VerUtilVersionReleaseLabel.cs
new file mode 100644
index 00000000..84ff3b36
--- /dev/null
+++ b/src/WixToolset.Mba.Core/VerUtilVersionReleaseLabel.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System;
6 using System.Runtime.InteropServices;
7
8 public sealed class VerUtilVersionReleaseLabel
9 {
10 internal VerUtilVersionReleaseLabel(IntPtr pReleaseLabel, IntPtr wzVersion)
11 {
12 var releaseLabel = (VerUtil.VersionReleaseLabelStruct)Marshal.PtrToStructure(pReleaseLabel, typeof(VerUtil.VersionReleaseLabelStruct));
13 this.IsNumeric = releaseLabel.fNumeric;
14 this.Value = releaseLabel.dwValue;
15 this.Label = VerUtil.VersionStringFromOffset(wzVersion, releaseLabel.cchLabelOffset, releaseLabel.cchLabel);
16 }
17
18 public bool IsNumeric { get; private set; }
19 public uint Value { get; private set; }
20 public string Label { get; private set; }
21 }
22}
diff --git a/src/balutil/BalBootstrapperEngine.cpp b/src/balutil/BalBootstrapperEngine.cpp
index b68ea7c2..8a78b127 100644
--- a/src/balutil/BalBootstrapperEngine.cpp
+++ b/src/balutil/BalBootstrapperEngine.cpp
@@ -535,6 +535,32 @@ public: // IBootstrapperEngine
535 return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_LAUNCHAPPROVEDEXE, &args, &results, m_pvBAEngineProcContext); 535 return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_LAUNCHAPPROVEDEXE, &args, &results, m_pvBAEngineProcContext);
536 } 536 }
537 537
538 virtual STDMETHODIMP CompareVersions(
539 __in_z LPCWSTR wzVersion1,
540 __in_z LPCWSTR wzVersion2,
541 __out int* pnResult
542 )
543 {
544 HRESULT hr = S_OK;
545 BAENGINE_COMPAREVERSIONS_ARGS args = { };
546 BAENGINE_COMPAREVERSIONS_RESULTS results = { };
547
548 ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required");
549
550 args.cbSize = sizeof(args);
551 args.wzVersion1 = wzVersion1;
552 args.wzVersion2 = wzVersion2;
553
554 results.cbSize = sizeof(results);
555
556 hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_COMPAREVERSIONS, &args, &results, m_pvBAEngineProcContext);
557
558 *pnResult = results.nResult;
559
560 LExit:
561 return hr;
562 }
563
538public: // IMarshal 564public: // IMarshal
539 virtual STDMETHODIMP GetUnmarshalClass( 565 virtual STDMETHODIMP GetUnmarshalClass(
540 __in REFIID /*riid*/, 566 __in REFIID /*riid*/,
diff --git a/src/balutil/inc/IBootstrapperApplication.h b/src/balutil/inc/IBootstrapperApplication.h
index 9cc19120..75ea7bc9 100644
--- a/src/balutil/inc/IBootstrapperApplication.h
+++ b/src/balutil/inc/IBootstrapperApplication.h
@@ -396,7 +396,7 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A
396 __inout BOOL* pfCancel 396 __inout BOOL* pfCancel
397 ) = 0; 397 ) = 0;
398 398
399 // OnExecuteBegin - called when the engine begins executing a package. 399 // OnExecutePackageBegin - called when the engine begins executing a package.
400 // 400 //
401 STDMETHOD(OnExecutePackageBegin)( 401 STDMETHOD(OnExecutePackageBegin)(
402 __in_z LPCWSTR wzPackageId, 402 __in_z LPCWSTR wzPackageId,
diff --git a/src/balutil/inc/IBootstrapperEngine.h b/src/balutil/inc/IBootstrapperEngine.h
index cf055102..cd89a9f0 100644
--- a/src/balutil/inc/IBootstrapperEngine.h
+++ b/src/balutil/inc/IBootstrapperEngine.h
@@ -127,4 +127,10 @@ DECLARE_INTERFACE_IID_(IBootstrapperEngine, IUnknown, "6480D616-27A0-44D7-905B-8
127 __in_z_opt LPCWSTR wzArguments, 127 __in_z_opt LPCWSTR wzArguments,
128 __in DWORD dwWaitForInputIdleTimeout 128 __in DWORD dwWaitForInputIdleTimeout
129 ) = 0; 129 ) = 0;
130
131 STDMETHOD(CompareVersions)(
132 __in_z LPCWSTR wzVersion1,
133 __in_z LPCWSTR wzVersion2,
134 __out int* pnResult
135 ) = 0;
130}; 136};
diff --git a/src/bextutil/BextBundleExtensionEngine.cpp b/src/bextutil/BextBundleExtensionEngine.cpp
index 983782a9..9906a7f5 100644
--- a/src/bextutil/BextBundleExtensionEngine.cpp
+++ b/src/bextutil/BextBundleExtensionEngine.cpp
@@ -280,6 +280,32 @@ public: // IBundleExtensionEngine
280 return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLEVERSION, &args, &results, m_pvBundleExtensionEngineProcContext); 280 return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLEVERSION, &args, &results, m_pvBundleExtensionEngineProcContext);
281 } 281 }
282 282
283 virtual STDMETHODIMP CompareVersions(
284 __in_z LPCWSTR wzVersion1,
285 __in_z LPCWSTR wzVersion2,
286 __out int* pnResult
287 )
288 {
289 HRESULT hr = S_OK;
290 BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_ARGS args = { };
291 BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_RESULTS results = { };
292
293 ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required");
294
295 args.cbSize = sizeof(args);
296 args.wzVersion1 = wzVersion1;
297 args.wzVersion2 = wzVersion2;
298
299 results.cbSize = sizeof(results);
300
301 hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_COMPAREVERSIONS, &args, &results, m_pvBundleExtensionEngineProcContext);
302
303 *pnResult = results.nResult;
304
305 LExit:
306 return hr;
307 }
308
283public: 309public:
284 CBextBundleExtensionEngine( 310 CBextBundleExtensionEngine(
285 __in PFN_BUNDLE_EXTENSION_ENGINE_PROC pfnBundleExtensionEngineProc, 311 __in PFN_BUNDLE_EXTENSION_ENGINE_PROC pfnBundleExtensionEngineProc,
diff --git a/src/bextutil/inc/IBundleExtensionEngine.h b/src/bextutil/inc/IBundleExtensionEngine.h
index 77ea2770..a96e3812 100644
--- a/src/bextutil/inc/IBundleExtensionEngine.h
+++ b/src/bextutil/inc/IBundleExtensionEngine.h
@@ -58,4 +58,10 @@ DECLARE_INTERFACE_IID_(IBundleExtensionEngine, IUnknown, "9D027A39-F6B6-42CC-973
58 __in_z LPCWSTR wzVariable, 58 __in_z LPCWSTR wzVariable,
59 __in_z_opt LPCWSTR wzValue 59 __in_z_opt LPCWSTR wzValue
60 ) = 0; 60 ) = 0;
61
62 STDMETHOD(CompareVersions)(
63 __in_z LPCWSTR wzVersion1,
64 __in_z LPCWSTR wzVersion2,
65 __out int* pnResult
66 ) = 0;
61}; 67};
diff --git a/src/mbanative/mbanative.def b/src/mbanative/mbanative.def
index bd366ac7..28e923b6 100644
--- a/src/mbanative/mbanative.def
+++ b/src/mbanative/mbanative.def
@@ -4,3 +4,9 @@
4EXPORTS 4EXPORTS
5 InitializeFromCreateArgs 5 InitializeFromCreateArgs
6 StoreBAInCreateResults 6 StoreBAInCreateResults
7 VerCompareParsedVersions
8 VerCompareStringVersions
9 VerCopyVersion
10 VerFreeVersion
11 VerParseVersion
12 VerVersionFromQword
diff --git a/src/mbanative/precomp.h b/src/mbanative/precomp.h
index d19b4695..2e2f3ff8 100644
--- a/src/mbanative/precomp.h
+++ b/src/mbanative/precomp.h
@@ -6,6 +6,7 @@
6#include <msiquery.h> 6#include <msiquery.h>
7 7
8#include <dutil.h> 8#include <dutil.h>
9#include <verutil.h>
9 10
10#include <BootstrapperEngine.h> 11#include <BootstrapperEngine.h>
11#include <BootstrapperApplication.h> 12#include <BootstrapperApplication.h>
diff --git a/src/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs b/src/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs
index 12483ddf..7fe0a405 100644
--- a/src/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs
+++ b/src/test/WixToolsetTest.Mba.Core/BaseBootstrapperApplicationFactoryFixture.cs
@@ -1,6 +1,6 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 2
3namespace WixToolsetTest.Util 3namespace WixToolsetTest.Mba.Core
4{ 4{
5 using System; 5 using System;
6 using System.Runtime.InteropServices; 6 using System.Runtime.InteropServices;
diff --git a/src/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs b/src/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
new file mode 100644
index 00000000..44142e3d
--- /dev/null
+++ b/src/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
@@ -0,0 +1,93 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Mba.Core
4{
5 using System;
6 using WixToolset.Mba.Core;
7 using Xunit;
8
9 public class VerUtilFixture
10 {
11 [Fact]
12 public void CanCompareStringVersions()
13 {
14 var version1 = "1.2.3.4+abcd";
15 var version2 = "1.2.3.4+zyxw";
16
17 Assert.Equal(0, VerUtil.CompareStringVersions(version1, version2, strict: false));
18 }
19
20 [Fact]
21 public void CanCopyVersion()
22 {
23 var version = "1.2.3.4-5.6.7.8.9.0";
24
25 VerUtilVersion copiedVersion = null;
26 try
27 {
28 using (var parsedVersion = VerUtil.ParseVersion(version, strict: true))
29 {
30 copiedVersion = VerUtil.CopyVersion(parsedVersion);
31 }
32
33 using (var secondVersion = VerUtil.ParseVersion(version, strict: true))
34 {
35 Assert.Equal(0, VerUtil.CompareParsedVersions(copiedVersion, secondVersion));
36 }
37 }
38 finally
39 {
40 copiedVersion?.Dispose();
41 }
42 }
43
44 [Fact]
45 public void CanCreateFromQword()
46 {
47 var version = new Version(100, 200, 300, 400);
48 var qwVersion = Engine.VersionToLong(version);
49
50 using var parsedVersion = VerUtil.VersionFromQword(qwVersion);
51 Assert.Equal("100.200.300.400", parsedVersion.Version);
52 Assert.Equal(100u, parsedVersion.Major);
53 Assert.Equal(200u, parsedVersion.Minor);
54 Assert.Equal(300u, parsedVersion.Patch);
55 Assert.Equal(400u, parsedVersion.Revision);
56 Assert.Empty(parsedVersion.ReleaseLabels);
57 Assert.Equal("", parsedVersion.Metadata);
58 Assert.False(parsedVersion.IsInvalid);
59 }
60
61 [Fact]
62 public void CanParseVersion()
63 {
64 var version = "1.2.3.4-a.b.c.d.5.+abc123";
65
66 using var parsedVersion = VerUtil.ParseVersion(version, strict: false);
67 Assert.Equal(version, parsedVersion.Version);
68 Assert.Equal(1u, parsedVersion.Major);
69 Assert.Equal(2u, parsedVersion.Minor);
70 Assert.Equal(3u, parsedVersion.Patch);
71 Assert.Equal(4u, parsedVersion.Revision);
72 Assert.Equal(5, parsedVersion.ReleaseLabels.Length);
73 Assert.Equal("+abc123", parsedVersion.Metadata);
74 Assert.True(parsedVersion.IsInvalid);
75
76 Assert.Equal("a", parsedVersion.ReleaseLabels[0].Label);
77 Assert.False(parsedVersion.ReleaseLabels[0].IsNumeric);
78
79 Assert.Equal("b", parsedVersion.ReleaseLabels[1].Label);
80 Assert.False(parsedVersion.ReleaseLabels[1].IsNumeric);
81
82 Assert.Equal("c", parsedVersion.ReleaseLabels[2].Label);
83 Assert.False(parsedVersion.ReleaseLabels[2].IsNumeric);
84
85 Assert.Equal("d", parsedVersion.ReleaseLabels[3].Label);
86 Assert.False(parsedVersion.ReleaseLabels[3].IsNumeric);
87
88 Assert.Equal("5", parsedVersion.ReleaseLabels[4].Label);
89 Assert.True(parsedVersion.ReleaseLabels[4].IsNumeric);
90 Assert.Equal(5u, parsedVersion.ReleaseLabels[4].Value);
91 }
92 }
93}