aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-05-16 16:03:25 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-05-17 22:54:13 -0500
commit0ea53e27361cbfe664df98d717e55005f329aff1 (patch)
treed75e02fadee9669593ca3ccf28401b67064244af
parentd5985a1688bc878e42ffd3ce3939fa52303cab16 (diff)
downloadwix-0ea53e27361cbfe664df98d717e55005f329aff1.tar.gz
wix-0ea53e27361cbfe664df98d717e55005f329aff1.tar.bz2
wix-0ea53e27361cbfe664df98d717e55005f329aff1.zip
Store the prefix character in VERUTIL_VERSION.
Fix edge case where version string is all v's.
-rw-r--r--src/api/burn/WixToolset.Mba.Core/VerUtil.cs1
-rw-r--r--src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs6
-rw-r--r--src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs2
-rw-r--r--src/burn/test/BurnUnitTest/RegistrationTest.cpp3
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/verutil.h1
-rw-r--r--src/libs/dutil/WixToolset.DUtil/verutil.cpp37
-rw-r--r--src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp82
7 files changed, 118 insertions, 14 deletions
diff --git a/src/api/burn/WixToolset.Mba.Core/VerUtil.cs b/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
index a342f85c..611f9710 100644
--- a/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
+++ b/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
@@ -59,6 +59,7 @@ namespace WixToolset.Mba.Core
59 internal struct VersionStruct 59 internal struct VersionStruct
60 { 60 {
61 public IntPtr sczVersion; 61 public IntPtr sczVersion;
62 public char chPrefix;
62 public uint dwMajor; 63 public uint dwMajor;
63 public uint dwMinor; 64 public uint dwMinor;
64 public uint dwPatch; 65 public uint dwPatch;
diff --git a/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs b/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
index 7408c26f..731dedaf 100644
--- a/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
+++ b/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
@@ -17,6 +17,7 @@ namespace WixToolset.Mba.Core
17 var pVersion = handle.DangerousGetHandle(); 17 var pVersion = handle.DangerousGetHandle();
18 var version = (VerUtil.VersionStruct)Marshal.PtrToStructure(pVersion, typeof(VerUtil.VersionStruct)); 18 var version = (VerUtil.VersionStruct)Marshal.PtrToStructure(pVersion, typeof(VerUtil.VersionStruct));
19 this.Version = Marshal.PtrToStringUni(version.sczVersion); 19 this.Version = Marshal.PtrToStringUni(version.sczVersion);
20 this.Prefix = version.chPrefix;
20 this.Major = version.dwMajor; 21 this.Major = version.dwMajor;
21 this.Minor = version.dwMinor; 22 this.Minor = version.dwMinor;
22 this.Patch = version.dwPatch; 23 this.Patch = version.dwPatch;
@@ -39,6 +40,11 @@ namespace WixToolset.Mba.Core
39 public string Version { get; private set; } 40 public string Version { get; private set; }
40 41
41 /// <summary> 42 /// <summary>
43 /// Prefix character that was stripped from <c>Version</c>, or the null character if there was no prefix.
44 /// </summary>
45 public char Prefix { get; private set; }
46
47 /// <summary>
42 /// For version A.B.C.D, Major is A. It is 0 if not specified. 48 /// For version A.B.C.D, Major is A. It is 0 if not specified.
43 /// </summary> 49 /// </summary>
44 public uint Major { get; private set; } 50 public uint Major { get; private set; }
diff --git a/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs b/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
index 44142e3d..ceb1b12a 100644
--- a/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
+++ b/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
@@ -49,6 +49,7 @@ namespace WixToolsetTest.Mba.Core
49 49
50 using var parsedVersion = VerUtil.VersionFromQword(qwVersion); 50 using var parsedVersion = VerUtil.VersionFromQword(qwVersion);
51 Assert.Equal("100.200.300.400", parsedVersion.Version); 51 Assert.Equal("100.200.300.400", parsedVersion.Version);
52 Assert.Equal('\0', parsedVersion.Prefix);
52 Assert.Equal(100u, parsedVersion.Major); 53 Assert.Equal(100u, parsedVersion.Major);
53 Assert.Equal(200u, parsedVersion.Minor); 54 Assert.Equal(200u, parsedVersion.Minor);
54 Assert.Equal(300u, parsedVersion.Patch); 55 Assert.Equal(300u, parsedVersion.Patch);
@@ -65,6 +66,7 @@ namespace WixToolsetTest.Mba.Core
65 66
66 using var parsedVersion = VerUtil.ParseVersion(version, strict: false); 67 using var parsedVersion = VerUtil.ParseVersion(version, strict: false);
67 Assert.Equal(version, parsedVersion.Version); 68 Assert.Equal(version, parsedVersion.Version);
69 Assert.Equal('\0', parsedVersion.Prefix);
68 Assert.Equal(1u, parsedVersion.Major); 70 Assert.Equal(1u, parsedVersion.Major);
69 Assert.Equal(2u, parsedVersion.Minor); 71 Assert.Equal(2u, parsedVersion.Minor);
70 Assert.Equal(3u, parsedVersion.Patch); 72 Assert.Equal(3u, parsedVersion.Patch);
diff --git a/src/burn/test/BurnUnitTest/RegistrationTest.cpp b/src/burn/test/BurnUnitTest/RegistrationTest.cpp
index 9aadc2cc..883b9cc8 100644
--- a/src/burn/test/BurnUnitTest/RegistrationTest.cpp
+++ b/src/burn/test/BurnUnitTest/RegistrationTest.cpp
@@ -559,6 +559,7 @@ namespace Bootstrapper
559 L" <Variable Id='MyBurnVariable2' Type='string' Value='foo' Hidden='no' Persisted='yes' />" 559 L" <Variable Id='MyBurnVariable2' Type='string' Value='foo' Hidden='no' Persisted='yes' />"
560 L" <Variable Id='MyBurnVariable3' Type='version' Value='v1.1-alpha' Hidden='no' Persisted='yes' />" 560 L" <Variable Id='MyBurnVariable3' Type='version' Value='v1.1-alpha' Hidden='no' Persisted='yes' />"
561 L" <Variable Id='MyBurnVariable4' Type='string' Value='foo' Hidden='no' Persisted='no' />" 561 L" <Variable Id='MyBurnVariable4' Type='string' Value='foo' Hidden='no' Persisted='no' />"
562 L" <Variable Id='MyBurnVariable5' Type='version' Hidden='no' Persisted='yes' />"
562 L" <CommandLine Variables='upperCase' />" 563 L" <CommandLine Variables='upperCase' />"
563 L"</Bundle>"; 564 L"</Bundle>";
564 565
@@ -597,6 +598,7 @@ namespace Bootstrapper
597 VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42); 598 VariableSetNumericHelper(&variables, L"MyBurnVariable1", 42);
598 VariableSetStringHelper(&variables, L"MyBurnVariable2", L"bar", FALSE); 599 VariableSetStringHelper(&variables, L"MyBurnVariable2", L"bar", FALSE);
599 VariableSetVersionHelper(&variables, L"MyBurnVariable3", L"v1.0-beta"); 600 VariableSetVersionHelper(&variables, L"MyBurnVariable3", L"v1.0-beta");
601 VariableSetVersionHelper(&variables, L"MyBurnVariable5", L"vvv");
600 602
601 hr = VariableSerialize(&variables, TRUE, &pbBuffer, &cbBuffer); 603 hr = VariableSerialize(&variables, TRUE, &pbBuffer, &cbBuffer);
602 TestThrowOnFailure(hr, "Failed to serialize variables."); 604 TestThrowOnFailure(hr, "Failed to serialize variables.");
@@ -616,6 +618,7 @@ namespace Bootstrapper
616 this->ValidateVariableKey(L"MyBurnVariable1", gcnew String(L"42")); 618 this->ValidateVariableKey(L"MyBurnVariable1", gcnew String(L"42"));
617 this->ValidateVariableKey(L"MyBurnVariable2", gcnew String(L"bar")); 619 this->ValidateVariableKey(L"MyBurnVariable2", gcnew String(L"bar"));
618 this->ValidateVariableKey(L"MyBurnVariable3", gcnew String(L"1.0-beta")); 620 this->ValidateVariableKey(L"MyBurnVariable3", gcnew String(L"1.0-beta"));
621 this->ValidateVariableKey(L"MyBurnVariable5", gcnew String(L"vvv"));
619 this->ValidateVariableKeyEmpty(L"WixBundleForcedRestartPackage"); 622 this->ValidateVariableKeyEmpty(L"WixBundleForcedRestartPackage");
620 623
621 hr = StrAlloc(&sczRelatedBundleId, MAX_GUID_CHARS + 1); 624 hr = StrAlloc(&sczRelatedBundleId, MAX_GUID_CHARS + 1);
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/verutil.h b/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
index 5247bb61..4fdaa522 100644
--- a/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
+++ b/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
@@ -19,6 +19,7 @@ typedef struct _VERUTIL_VERSION_RELEASE_LABEL
19typedef struct _VERUTIL_VERSION 19typedef struct _VERUTIL_VERSION
20{ 20{
21 LPWSTR sczVersion; 21 LPWSTR sczVersion;
22 WCHAR chPrefix;
22 DWORD dwMajor; 23 DWORD dwMajor;
23 DWORD dwMinor; 24 DWORD dwMinor;
24 DWORD dwPatch; 25 DWORD dwPatch;
diff --git a/src/libs/dutil/WixToolset.DUtil/verutil.cpp b/src/libs/dutil/WixToolset.DUtil/verutil.cpp
index 8881d7bc..30b979b1 100644
--- a/src/libs/dutil/WixToolset.DUtil/verutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/verutil.cpp
@@ -194,6 +194,7 @@ DAPI_(HRESULT) VerCopyVersion(
194 hr = StrAllocString(&pCopy->sczVersion, pSource->sczVersion, 0); 194 hr = StrAllocString(&pCopy->sczVersion, pSource->sczVersion, 0);
195 VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", pSource->sczVersion); 195 VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", pSource->sczVersion);
196 196
197 pCopy->chPrefix = pSource->chPrefix;
197 pCopy->dwMajor = pSource->dwMajor; 198 pCopy->dwMajor = pSource->dwMajor;
198 pCopy->dwMinor = pSource->dwMinor; 199 pCopy->dwMinor = pSource->dwMinor;
199 pCopy->dwPatch = pSource->dwPatch; 200 pCopy->dwPatch = pSource->dwPatch;
@@ -251,6 +252,7 @@ DAPI_(HRESULT) VerParseVersion(
251{ 252{
252 HRESULT hr = S_OK; 253 HRESULT hr = S_OK;
253 VERUTIL_VERSION* pVersion = NULL; 254 VERUTIL_VERSION* pVersion = NULL;
255 LPCWSTR wzString = NULL;
254 LPCWSTR wzEnd = NULL; 256 LPCWSTR wzEnd = NULL;
255 LPCWSTR wzPartBegin = NULL; 257 LPCWSTR wzPartBegin = NULL;
256 LPCWSTR wzPartEnd = NULL; 258 LPCWSTR wzPartEnd = NULL;
@@ -277,22 +279,22 @@ DAPI_(HRESULT) VerParseVersion(
277 VerExitOnRootFailure(hr = E_INVALIDARG, "Version string is too long: %Iu", cchVersion); 279 VerExitOnRootFailure(hr = E_INVALIDARG, "Version string is too long: %Iu", cchVersion);
278 } 280 }
279 281
280 if (L'v' == *wzVersion || L'V' == *wzVersion)
281 {
282 ++wzVersion;
283 --cchVersion;
284 }
285
286 pVersion = reinterpret_cast<VERUTIL_VERSION*>(MemAlloc(sizeof(VERUTIL_VERSION), TRUE)); 282 pVersion = reinterpret_cast<VERUTIL_VERSION*>(MemAlloc(sizeof(VERUTIL_VERSION), TRUE));
287 VerExitOnNull(pVersion, hr, E_OUTOFMEMORY, "Failed to allocate memory for Verutil version '%ls'.", wzVersion); 283 VerExitOnNull(pVersion, hr, E_OUTOFMEMORY, "Failed to allocate memory for Verutil version '%ls'.", wzVersion);
288 284
289 hr = StrAllocString(&pVersion->sczVersion, wzVersion, cchVersion); 285 wzString = wzVersion;
290 VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", wzVersion); 286
287 if (L'v' == *wzString || L'V' == *wzString)
288 {
289 pVersion->chPrefix = *wzString;
290 ++wzString;
291 --cchVersion;
292 }
291 293
292 wzVersion = wzPartBegin = wzPartEnd = pVersion->sczVersion; 294 wzPartBegin = wzPartEnd = wzString;
293 295
294 // Save end pointer. 296 // Save end pointer.
295 wzEnd = wzVersion + cchVersion; 297 wzEnd = wzString + cchVersion;
296 298
297 // Parse version number 299 // Parse version number
298 while (wzPartBegin < wzEnd) 300 while (wzPartBegin < wzEnd)
@@ -473,7 +475,7 @@ DAPI_(HRESULT) VerParseVersion(
473 pReleaseLabel->dwValue = uLabel; 475 pReleaseLabel->dwValue = uLabel;
474 } 476 }
475 477
476 pReleaseLabel->cchLabelOffset = wzPartBegin - pVersion->sczVersion; 478 pReleaseLabel->cchLabelOffset = wzPartBegin - wzString;
477 pReleaseLabel->cchLabel = cchLabel; 479 pReleaseLabel->cchLabel = cchLabel;
478 480
479 if (fTrailingDot) 481 if (fTrailingDot)
@@ -507,9 +509,20 @@ DAPI_(HRESULT) VerParseVersion(
507 ExitFunction1(hr = E_INVALIDARG); 509 ExitFunction1(hr = E_INVALIDARG);
508 } 510 }
509 511
510 pVersion->cchMetadataOffset = min(wzPartBegin, wzEnd) - pVersion->sczVersion; 512 pVersion->cchMetadataOffset = min(wzPartBegin, wzEnd) - wzString;
511 pVersion->fInvalid = fInvalid; 513 pVersion->fInvalid = fInvalid;
512 514
515 // If the whole string was invalid, then don't clip off the prefix.
516 if (!pVersion->cchMetadataOffset && pVersion->chPrefix)
517 {
518 pVersion->chPrefix = '\0';
519 wzString = wzVersion;
520 ++cchVersion;
521 }
522
523 hr = StrAllocString(&pVersion->sczVersion, wzString, cchVersion);
524 VerExitOnFailure(hr, "Failed to copy Verutil version string '%ls'.", wzVersion);
525
513 *ppVersion = pVersion; 526 *ppVersion = pVersion;
514 pVersion = NULL; 527 pVersion = NULL;
515 hr = S_OK; 528 hr = S_OK;
diff --git a/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp b/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
index 8f24ad1a..c20b9887 100644
--- a/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
+++ b/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
@@ -34,6 +34,7 @@ namespace DutilTests
34 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3); 34 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3);
35 35
36 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 36 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
37 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
37 Assert::Equal<DWORD>(1, pVersion1->dwMajor); 38 Assert::Equal<DWORD>(1, pVersion1->dwMajor);
38 Assert::Equal<DWORD>(2, pVersion1->dwMinor); 39 Assert::Equal<DWORD>(2, pVersion1->dwMinor);
39 Assert::Equal<DWORD>(3, pVersion1->dwPatch); 40 Assert::Equal<DWORD>(3, pVersion1->dwPatch);
@@ -43,6 +44,7 @@ namespace DutilTests
43 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 44 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
44 45
45 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 46 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
47 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
46 Assert::Equal<DWORD>(1, pVersion2->dwMajor); 48 Assert::Equal<DWORD>(1, pVersion2->dwMajor);
47 Assert::Equal<DWORD>(2, pVersion2->dwMinor); 49 Assert::Equal<DWORD>(2, pVersion2->dwMinor);
48 Assert::Equal<DWORD>(3, pVersion2->dwPatch); 50 Assert::Equal<DWORD>(3, pVersion2->dwPatch);
@@ -52,6 +54,7 @@ namespace DutilTests
52 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 54 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
53 55
54 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 56 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
57 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
55 Assert::Equal<DWORD>(1, pVersion3->dwMajor); 58 Assert::Equal<DWORD>(1, pVersion3->dwMajor);
56 Assert::Equal<DWORD>(2, pVersion3->dwMinor); 59 Assert::Equal<DWORD>(2, pVersion3->dwMinor);
57 Assert::Equal<DWORD>(3, pVersion3->dwPatch); 60 Assert::Equal<DWORD>(3, pVersion3->dwPatch);
@@ -89,6 +92,7 @@ namespace DutilTests
89 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2); 92 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2);
90 93
91 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 94 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
95 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
92 Assert::Equal<DWORD>(1, pVersion1->dwMajor); 96 Assert::Equal<DWORD>(1, pVersion1->dwMajor);
93 Assert::Equal<DWORD>(0, pVersion1->dwMinor); 97 Assert::Equal<DWORD>(0, pVersion1->dwMinor);
94 Assert::Equal<DWORD>(0, pVersion1->dwPatch); 98 Assert::Equal<DWORD>(0, pVersion1->dwPatch);
@@ -109,6 +113,7 @@ namespace DutilTests
109 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 113 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
110 114
111 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 115 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
116 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
112 Assert::Equal<DWORD>(1, pVersion2->dwMajor); 117 Assert::Equal<DWORD>(1, pVersion2->dwMajor);
113 Assert::Equal<DWORD>(0, pVersion2->dwMinor); 118 Assert::Equal<DWORD>(0, pVersion2->dwMinor);
114 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 119 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -170,6 +175,7 @@ namespace DutilTests
170 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion6); 175 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion6);
171 176
172 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 177 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
178 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
173 Assert::Equal<DWORD>(10, pVersion1->dwMajor); 179 Assert::Equal<DWORD>(10, pVersion1->dwMajor);
174 Assert::Equal<DWORD>(0, pVersion1->dwMinor); 180 Assert::Equal<DWORD>(0, pVersion1->dwMinor);
175 Assert::Equal<DWORD>(0, pVersion1->dwPatch); 181 Assert::Equal<DWORD>(0, pVersion1->dwPatch);
@@ -179,6 +185,7 @@ namespace DutilTests
179 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid); 185 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid);
180 186
181 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 187 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
188 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
182 Assert::Equal<DWORD>(10, pVersion2->dwMajor); 189 Assert::Equal<DWORD>(10, pVersion2->dwMajor);
183 Assert::Equal<DWORD>(0, pVersion2->dwMinor); 190 Assert::Equal<DWORD>(0, pVersion2->dwMinor);
184 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 191 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -188,6 +195,7 @@ namespace DutilTests
188 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 195 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
189 196
190 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 197 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
198 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
191 Assert::Equal<DWORD>(0, pVersion3->dwMajor); 199 Assert::Equal<DWORD>(0, pVersion3->dwMajor);
192 Assert::Equal<DWORD>(0, pVersion3->dwMinor); 200 Assert::Equal<DWORD>(0, pVersion3->dwMinor);
193 Assert::Equal<DWORD>(0, pVersion3->dwPatch); 201 Assert::Equal<DWORD>(0, pVersion3->dwPatch);
@@ -197,6 +205,7 @@ namespace DutilTests
197 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 205 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
198 206
199 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 207 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
208 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
200 Assert::Equal<DWORD>(0, pVersion4->dwMajor); 209 Assert::Equal<DWORD>(0, pVersion4->dwMajor);
201 Assert::Equal<DWORD>(0, pVersion4->dwMinor); 210 Assert::Equal<DWORD>(0, pVersion4->dwMinor);
202 Assert::Equal<DWORD>(0, pVersion4->dwPatch); 211 Assert::Equal<DWORD>(0, pVersion4->dwPatch);
@@ -206,6 +215,7 @@ namespace DutilTests
206 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid); 215 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid);
207 216
208 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion); 217 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
218 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
209 Assert::Equal<DWORD>(10, pVersion5->dwMajor); 219 Assert::Equal<DWORD>(10, pVersion5->dwMajor);
210 Assert::Equal<DWORD>(0, pVersion5->dwMinor); 220 Assert::Equal<DWORD>(0, pVersion5->dwMinor);
211 Assert::Equal<DWORD>(0, pVersion5->dwPatch); 221 Assert::Equal<DWORD>(0, pVersion5->dwPatch);
@@ -221,6 +231,7 @@ namespace DutilTests
221 Assert::Equal<BOOL>(FALSE, pVersion5->fInvalid); 231 Assert::Equal<BOOL>(FALSE, pVersion5->fInvalid);
222 232
223 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion); 233 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion);
234 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix);
224 Assert::Equal<DWORD>(10, pVersion6->dwMajor); 235 Assert::Equal<DWORD>(10, pVersion6->dwMajor);
225 Assert::Equal<DWORD>(0, pVersion6->dwMinor); 236 Assert::Equal<DWORD>(0, pVersion6->dwMinor);
226 Assert::Equal<DWORD>(0, pVersion6->dwPatch); 237 Assert::Equal<DWORD>(0, pVersion6->dwPatch);
@@ -273,6 +284,7 @@ namespace DutilTests
273 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3); 284 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3);
274 285
275 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 286 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
287 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
276 Assert::Equal<DWORD>(0, pVersion1->dwMajor); 288 Assert::Equal<DWORD>(0, pVersion1->dwMajor);
277 Assert::Equal<DWORD>(0, pVersion1->dwMinor); 289 Assert::Equal<DWORD>(0, pVersion1->dwMinor);
278 Assert::Equal<DWORD>(1, pVersion1->dwPatch); 290 Assert::Equal<DWORD>(1, pVersion1->dwPatch);
@@ -287,6 +299,7 @@ namespace DutilTests
287 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 299 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
288 300
289 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 301 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
302 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
290 Assert::Equal<DWORD>(0, pVersion2->dwMajor); 303 Assert::Equal<DWORD>(0, pVersion2->dwMajor);
291 Assert::Equal<DWORD>(0, pVersion2->dwMinor); 304 Assert::Equal<DWORD>(0, pVersion2->dwMinor);
292 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 305 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -302,6 +315,7 @@ namespace DutilTests
302 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 315 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
303 316
304 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 317 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
318 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
305 Assert::Equal<DWORD>(1, pVersion3->dwMajor); 319 Assert::Equal<DWORD>(1, pVersion3->dwMajor);
306 Assert::Equal<DWORD>(0, pVersion3->dwMinor); 320 Assert::Equal<DWORD>(0, pVersion3->dwMinor);
307 Assert::Equal<DWORD>(0, pVersion3->dwPatch); 321 Assert::Equal<DWORD>(0, pVersion3->dwPatch);
@@ -355,6 +369,7 @@ namespace DutilTests
355 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion4); 369 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion4);
356 370
357 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 371 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
372 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
358 Assert::Equal<DWORD>(0, pVersion1->dwMajor); 373 Assert::Equal<DWORD>(0, pVersion1->dwMajor);
359 Assert::Equal<DWORD>(1, pVersion1->dwMinor); 374 Assert::Equal<DWORD>(1, pVersion1->dwMinor);
360 Assert::Equal<DWORD>(0, pVersion1->dwPatch); 375 Assert::Equal<DWORD>(0, pVersion1->dwPatch);
@@ -374,6 +389,7 @@ namespace DutilTests
374 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 389 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
375 390
376 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 391 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
392 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
377 Assert::Equal<DWORD>(0, pVersion2->dwMajor); 393 Assert::Equal<DWORD>(0, pVersion2->dwMajor);
378 Assert::Equal<DWORD>(1, pVersion2->dwMinor); 394 Assert::Equal<DWORD>(1, pVersion2->dwMinor);
379 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 395 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -393,6 +409,7 @@ namespace DutilTests
393 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 409 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
394 410
395 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 411 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
412 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
396 Assert::Equal<DWORD>(0, pVersion3->dwMajor); 413 Assert::Equal<DWORD>(0, pVersion3->dwMajor);
397 Assert::Equal<DWORD>(1, pVersion3->dwMinor); 414 Assert::Equal<DWORD>(1, pVersion3->dwMinor);
398 Assert::Equal<DWORD>(0, pVersion3->dwPatch); 415 Assert::Equal<DWORD>(0, pVersion3->dwPatch);
@@ -416,6 +433,7 @@ namespace DutilTests
416 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 433 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
417 434
418 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 435 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
436 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
419 Assert::Equal<DWORD>(0, pVersion4->dwMajor); 437 Assert::Equal<DWORD>(0, pVersion4->dwMajor);
420 Assert::Equal<DWORD>(1, pVersion4->dwMinor); 438 Assert::Equal<DWORD>(1, pVersion4->dwMinor);
421 Assert::Equal<DWORD>(0, pVersion4->dwPatch); 439 Assert::Equal<DWORD>(0, pVersion4->dwPatch);
@@ -473,6 +491,7 @@ namespace DutilTests
473 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3); 491 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3);
474 492
475 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 493 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
494 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
476 Assert::Equal<DWORD>(1, pVersion1->dwMajor); 495 Assert::Equal<DWORD>(1, pVersion1->dwMajor);
477 Assert::Equal<DWORD>(2, pVersion1->dwMinor); 496 Assert::Equal<DWORD>(2, pVersion1->dwMinor);
478 Assert::Equal<DWORD>(3, pVersion1->dwPatch); 497 Assert::Equal<DWORD>(3, pVersion1->dwPatch);
@@ -482,6 +501,7 @@ namespace DutilTests
482 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 501 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
483 502
484 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 503 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
504 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
485 Assert::Equal<DWORD>(1, pVersion2->dwMajor); 505 Assert::Equal<DWORD>(1, pVersion2->dwMajor);
486 Assert::Equal<DWORD>(2, pVersion2->dwMinor); 506 Assert::Equal<DWORD>(2, pVersion2->dwMinor);
487 Assert::Equal<DWORD>(3, pVersion2->dwPatch); 507 Assert::Equal<DWORD>(3, pVersion2->dwPatch);
@@ -491,6 +511,7 @@ namespace DutilTests
491 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 511 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
492 512
493 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 513 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
514 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
494 Assert::Equal<DWORD>(1, pVersion3->dwMajor); 515 Assert::Equal<DWORD>(1, pVersion3->dwMajor);
495 Assert::Equal<DWORD>(2, pVersion3->dwMinor); 516 Assert::Equal<DWORD>(2, pVersion3->dwMinor);
496 Assert::Equal<DWORD>(3, pVersion3->dwPatch); 517 Assert::Equal<DWORD>(3, pVersion3->dwPatch);
@@ -518,9 +539,13 @@ namespace DutilTests
518 VERUTIL_VERSION* pVersion1 = NULL; 539 VERUTIL_VERSION* pVersion1 = NULL;
519 VERUTIL_VERSION* pVersion2 = NULL; 540 VERUTIL_VERSION* pVersion2 = NULL;
520 VERUTIL_VERSION* pVersion3 = NULL; 541 VERUTIL_VERSION* pVersion3 = NULL;
542 VERUTIL_VERSION* pVersion4 = NULL;
543 VERUTIL_VERSION* pVersion5 = NULL;
521 LPCWSTR wzVersion1 = L"10.20.30.40"; 544 LPCWSTR wzVersion1 = L"10.20.30.40";
522 LPCWSTR wzVersion2 = L"v10.20.30.40"; 545 LPCWSTR wzVersion2 = L"v10.20.30.40";
523 LPCWSTR wzVersion3 = L"V10.20.30.40"; 546 LPCWSTR wzVersion3 = L"V10.20.30.40";
547 LPCWSTR wzVersion4 = L"v10.20.30.40-abc";
548 LPCWSTR wzVersion5 = L"vvv";
524 549
525 try 550 try
526 { 551 {
@@ -533,7 +558,14 @@ namespace DutilTests
533 hr = VerParseVersion(wzVersion3, 0, FALSE, &pVersion3); 558 hr = VerParseVersion(wzVersion3, 0, FALSE, &pVersion3);
534 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3); 559 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion3);
535 560
561 hr = VerParseVersion(wzVersion4, 0, FALSE, &pVersion4);
562 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion4);
563
564 hr = VerParseVersion(wzVersion5, 0, FALSE, &pVersion5);
565 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion5);
566
536 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 567 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
568 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
537 Assert::Equal<DWORD>(10, pVersion1->dwMajor); 569 Assert::Equal<DWORD>(10, pVersion1->dwMajor);
538 Assert::Equal<DWORD>(20, pVersion1->dwMinor); 570 Assert::Equal<DWORD>(20, pVersion1->dwMinor);
539 Assert::Equal<DWORD>(30, pVersion1->dwPatch); 571 Assert::Equal<DWORD>(30, pVersion1->dwPatch);
@@ -543,6 +575,7 @@ namespace DutilTests
543 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 575 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
544 576
545 NativeAssert::StringEqual(wzVersion1, pVersion2->sczVersion); 577 NativeAssert::StringEqual(wzVersion1, pVersion2->sczVersion);
578 Assert::Equal<WCHAR>(L'v', pVersion2->chPrefix);
546 Assert::Equal<DWORD>(10, pVersion2->dwMajor); 579 Assert::Equal<DWORD>(10, pVersion2->dwMajor);
547 Assert::Equal<DWORD>(20, pVersion2->dwMinor); 580 Assert::Equal<DWORD>(20, pVersion2->dwMinor);
548 Assert::Equal<DWORD>(30, pVersion2->dwPatch); 581 Assert::Equal<DWORD>(30, pVersion2->dwPatch);
@@ -552,6 +585,7 @@ namespace DutilTests
552 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 585 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
553 586
554 NativeAssert::StringEqual(wzVersion1, pVersion3->sczVersion); 587 NativeAssert::StringEqual(wzVersion1, pVersion3->sczVersion);
588 Assert::Equal<WCHAR>(L'V', pVersion3->chPrefix);
555 Assert::Equal<DWORD>(10, pVersion3->dwMajor); 589 Assert::Equal<DWORD>(10, pVersion3->dwMajor);
556 Assert::Equal<DWORD>(20, pVersion3->dwMinor); 590 Assert::Equal<DWORD>(20, pVersion3->dwMinor);
557 Assert::Equal<DWORD>(30, pVersion3->dwPatch); 591 Assert::Equal<DWORD>(30, pVersion3->dwPatch);
@@ -560,14 +594,42 @@ namespace DutilTests
560 Assert::Equal<DWORD>(11, pVersion3->cchMetadataOffset); 594 Assert::Equal<DWORD>(11, pVersion3->cchMetadataOffset);
561 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 595 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
562 596
597 NativeAssert::StringEqual(L"10.20.30.40-abc", pVersion4->sczVersion);
598 Assert::Equal<WCHAR>(L'v', pVersion4->chPrefix);
599 Assert::Equal<DWORD>(10, pVersion4->dwMajor);
600 Assert::Equal<DWORD>(20, pVersion4->dwMinor);
601 Assert::Equal<DWORD>(30, pVersion4->dwPatch);
602 Assert::Equal<DWORD>(40, pVersion4->dwRevision);
603 Assert::Equal<DWORD>(1, pVersion4->cReleaseLabels);
604
605 Assert::Equal<BOOL>(FALSE, pVersion4->rgReleaseLabels[0].fNumeric);
606 Assert::Equal<DWORD>(3, pVersion4->rgReleaseLabels[0].cchLabel);
607 Assert::Equal<DWORD>(12, pVersion4->rgReleaseLabels[0].cchLabelOffset);
608
609 Assert::Equal<DWORD>(15, pVersion4->cchMetadataOffset);
610 Assert::Equal<BOOL>(FALSE, pVersion4->fInvalid);
611
612 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
613 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
614 Assert::Equal<DWORD>(0, pVersion5->dwMajor);
615 Assert::Equal<DWORD>(0, pVersion5->dwMinor);
616 Assert::Equal<DWORD>(0, pVersion5->dwPatch);
617 Assert::Equal<DWORD>(0, pVersion5->dwRevision);
618 Assert::Equal<DWORD>(0, pVersion5->cReleaseLabels);
619 Assert::Equal<DWORD>(0, pVersion5->cchMetadataOffset);
620 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid);
621
563 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0); 622 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0);
564 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 0); 623 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 0);
624 TestVerutilCompareParsedVersions(pVersion1, pVersion4, 1);
565 } 625 }
566 finally 626 finally
567 { 627 {
568 ReleaseVerutilVersion(pVersion1); 628 ReleaseVerutilVersion(pVersion1);
569 ReleaseVerutilVersion(pVersion2); 629 ReleaseVerutilVersion(pVersion2);
570 ReleaseVerutilVersion(pVersion3); 630 ReleaseVerutilVersion(pVersion3);
631 ReleaseVerutilVersion(pVersion4);
632 ReleaseVerutilVersion(pVersion5);
571 } 633 }
572 } 634 }
573 635
@@ -589,6 +651,7 @@ namespace DutilTests
589 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2); 651 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2);
590 652
591 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 653 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
654 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
592 Assert::Equal<DWORD>(4294967295, pVersion1->dwMajor); 655 Assert::Equal<DWORD>(4294967295, pVersion1->dwMajor);
593 Assert::Equal<DWORD>(4294967295, pVersion1->dwMinor); 656 Assert::Equal<DWORD>(4294967295, pVersion1->dwMinor);
594 Assert::Equal<DWORD>(4294967295, pVersion1->dwPatch); 657 Assert::Equal<DWORD>(4294967295, pVersion1->dwPatch);
@@ -598,6 +661,7 @@ namespace DutilTests
598 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 661 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
599 662
600 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 663 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
664 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
601 Assert::Equal<DWORD>(0, pVersion2->dwMajor); 665 Assert::Equal<DWORD>(0, pVersion2->dwMajor);
602 Assert::Equal<DWORD>(0, pVersion2->dwMinor); 666 Assert::Equal<DWORD>(0, pVersion2->dwMinor);
603 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 667 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -633,6 +697,7 @@ namespace DutilTests
633 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2); 697 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion2);
634 698
635 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 699 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
700 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
636 Assert::Equal<DWORD>(1, pVersion1->dwMajor); 701 Assert::Equal<DWORD>(1, pVersion1->dwMajor);
637 Assert::Equal<DWORD>(2, pVersion1->dwMinor); 702 Assert::Equal<DWORD>(2, pVersion1->dwMinor);
638 Assert::Equal<DWORD>(3, pVersion1->dwPatch); 703 Assert::Equal<DWORD>(3, pVersion1->dwPatch);
@@ -642,6 +707,7 @@ namespace DutilTests
642 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 707 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
643 708
644 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 709 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
710 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
645 Assert::Equal<DWORD>(1, pVersion2->dwMajor); 711 Assert::Equal<DWORD>(1, pVersion2->dwMajor);
646 Assert::Equal<DWORD>(2, pVersion2->dwMinor); 712 Assert::Equal<DWORD>(2, pVersion2->dwMinor);
647 Assert::Equal<DWORD>(3, pVersion2->dwPatch); 713 Assert::Equal<DWORD>(3, pVersion2->dwPatch);
@@ -674,6 +740,7 @@ namespace DutilTests
674 NativeAssert::Succeeded(hr, "VerParseVersion failed"); 740 NativeAssert::Succeeded(hr, "VerParseVersion failed");
675 741
676 NativeAssert::StringEqual(wzVersion, pSource->sczVersion); 742 NativeAssert::StringEqual(wzVersion, pSource->sczVersion);
743 Assert::Equal<WCHAR>(L'\0', pSource->chPrefix);
677 Assert::Equal<DWORD>(1, pSource->dwMajor); 744 Assert::Equal<DWORD>(1, pSource->dwMajor);
678 Assert::Equal<DWORD>(2, pSource->dwMinor); 745 Assert::Equal<DWORD>(2, pSource->dwMinor);
679 Assert::Equal<DWORD>(3, pSource->dwPatch); 746 Assert::Equal<DWORD>(3, pSource->dwPatch);
@@ -688,6 +755,7 @@ namespace DutilTests
688 755
689 Assert::False(pSource == pCopy); 756 Assert::False(pSource == pCopy);
690 Assert::False(pSource->sczVersion == pCopy->sczVersion); 757 Assert::False(pSource->sczVersion == pCopy->sczVersion);
758 Assert::Equal<WCHAR>(L'\0', pCopy->chPrefix);
691 759
692 hr = VerCompareParsedVersions(pSource, pCopy, &nResult); 760 hr = VerCompareParsedVersions(pSource, pCopy, &nResult);
693 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed"); 761 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed");
@@ -705,7 +773,7 @@ namespace DutilTests
705 void VerCopyVersionCopiesPrereleaseVersion() 773 void VerCopyVersionCopiesPrereleaseVersion()
706 { 774 {
707 HRESULT hr = S_OK; 775 HRESULT hr = S_OK;
708 LPCWSTR wzVersion = L"1.2.3.4-a.b.c.d.5.+abc123"; 776 LPCWSTR wzVersion = L"v1.2.3.4-a.b.c.d.5.+abc123";
709 VERUTIL_VERSION* pSource = NULL; 777 VERUTIL_VERSION* pSource = NULL;
710 VERUTIL_VERSION* pCopy = NULL; 778 VERUTIL_VERSION* pCopy = NULL;
711 int nResult = 0; 779 int nResult = 0;
@@ -715,7 +783,8 @@ namespace DutilTests
715 hr = VerParseVersion(wzVersion, 0, FALSE, &pSource); 783 hr = VerParseVersion(wzVersion, 0, FALSE, &pSource);
716 NativeAssert::Succeeded(hr, "VerParseVersion failed"); 784 NativeAssert::Succeeded(hr, "VerParseVersion failed");
717 785
718 NativeAssert::StringEqual(wzVersion, pSource->sczVersion); 786 NativeAssert::StringEqual(L"1.2.3.4-a.b.c.d.5.+abc123", pSource->sczVersion);
787 Assert::Equal<WCHAR>(L'v', pSource->chPrefix);
719 Assert::Equal<DWORD>(1, pSource->dwMajor); 788 Assert::Equal<DWORD>(1, pSource->dwMajor);
720 Assert::Equal<DWORD>(2, pSource->dwMinor); 789 Assert::Equal<DWORD>(2, pSource->dwMinor);
721 Assert::Equal<DWORD>(3, pSource->dwPatch); 790 Assert::Equal<DWORD>(3, pSource->dwPatch);
@@ -752,6 +821,7 @@ namespace DutilTests
752 Assert::False(pSource == pCopy); 821 Assert::False(pSource == pCopy);
753 Assert::False(pSource->sczVersion == pCopy->sczVersion); 822 Assert::False(pSource->sczVersion == pCopy->sczVersion);
754 Assert::False(pSource->rgReleaseLabels == pCopy->rgReleaseLabels); 823 Assert::False(pSource->rgReleaseLabels == pCopy->rgReleaseLabels);
824 Assert::Equal<WCHAR>(L'v', pCopy->chPrefix);
755 825
756 hr = VerCompareParsedVersions(pSource, pCopy, &nResult); 826 hr = VerCompareParsedVersions(pSource, pCopy, &nResult);
757 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed"); 827 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed");
@@ -808,6 +878,7 @@ namespace DutilTests
808 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion7); 878 NativeAssert::Succeeded(hr, "Failed to parse version '{0}'", wzVersion7);
809 879
810 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion); 880 NativeAssert::StringEqual(wzVersion1, pVersion1->sczVersion);
881 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
811 Assert::Equal<DWORD>(0, pVersion1->dwMajor); 882 Assert::Equal<DWORD>(0, pVersion1->dwMajor);
812 Assert::Equal<DWORD>(0, pVersion1->dwMinor); 883 Assert::Equal<DWORD>(0, pVersion1->dwMinor);
813 Assert::Equal<DWORD>(0, pVersion1->dwPatch); 884 Assert::Equal<DWORD>(0, pVersion1->dwPatch);
@@ -817,6 +888,7 @@ namespace DutilTests
817 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid); 888 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid);
818 889
819 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 890 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
891 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
820 Assert::Equal<DWORD>(1, pVersion2->dwMajor); 892 Assert::Equal<DWORD>(1, pVersion2->dwMajor);
821 Assert::Equal<DWORD>(0, pVersion2->dwMinor); 893 Assert::Equal<DWORD>(0, pVersion2->dwMinor);
822 Assert::Equal<DWORD>(0, pVersion2->dwPatch); 894 Assert::Equal<DWORD>(0, pVersion2->dwPatch);
@@ -826,6 +898,7 @@ namespace DutilTests
826 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 898 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
827 899
828 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 900 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
901 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
829 Assert::Equal<DWORD>(2, pVersion3->dwMajor); 902 Assert::Equal<DWORD>(2, pVersion3->dwMajor);
830 Assert::Equal<DWORD>(1, pVersion3->dwMinor); 903 Assert::Equal<DWORD>(1, pVersion3->dwMinor);
831 Assert::Equal<DWORD>(0, pVersion3->dwPatch); 904 Assert::Equal<DWORD>(0, pVersion3->dwPatch);
@@ -835,6 +908,7 @@ namespace DutilTests
835 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid); 908 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid);
836 909
837 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 910 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
911 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
838 Assert::Equal<DWORD>(3, pVersion4->dwMajor); 912 Assert::Equal<DWORD>(3, pVersion4->dwMajor);
839 Assert::Equal<DWORD>(2, pVersion4->dwMinor); 913 Assert::Equal<DWORD>(2, pVersion4->dwMinor);
840 Assert::Equal<DWORD>(1, pVersion4->dwPatch); 914 Assert::Equal<DWORD>(1, pVersion4->dwPatch);
@@ -844,6 +918,7 @@ namespace DutilTests
844 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid); 918 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid);
845 919
846 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion); 920 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
921 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
847 Assert::Equal<DWORD>(4, pVersion5->dwMajor); 922 Assert::Equal<DWORD>(4, pVersion5->dwMajor);
848 Assert::Equal<DWORD>(3, pVersion5->dwMinor); 923 Assert::Equal<DWORD>(3, pVersion5->dwMinor);
849 Assert::Equal<DWORD>(2, pVersion5->dwPatch); 924 Assert::Equal<DWORD>(2, pVersion5->dwPatch);
@@ -853,6 +928,7 @@ namespace DutilTests
853 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid); 928 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid);
854 929
855 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion); 930 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion);
931 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix);
856 Assert::Equal<DWORD>(5, pVersion6->dwMajor); 932 Assert::Equal<DWORD>(5, pVersion6->dwMajor);
857 Assert::Equal<DWORD>(0, pVersion6->dwMinor); 933 Assert::Equal<DWORD>(0, pVersion6->dwMinor);
858 Assert::Equal<DWORD>(0, pVersion6->dwPatch); 934 Assert::Equal<DWORD>(0, pVersion6->dwPatch);
@@ -862,6 +938,7 @@ namespace DutilTests
862 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid); 938 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid);
863 939
864 NativeAssert::StringEqual(wzVersion7, pVersion7->sczVersion); 940 NativeAssert::StringEqual(wzVersion7, pVersion7->sczVersion);
941 Assert::Equal<WCHAR>(L'\0', pVersion7->chPrefix);
865 Assert::Equal<DWORD>(6, pVersion7->dwMajor); 942 Assert::Equal<DWORD>(6, pVersion7->dwMajor);
866 Assert::Equal<DWORD>(0, pVersion7->dwMinor); 943 Assert::Equal<DWORD>(0, pVersion7->dwMinor);
867 Assert::Equal<DWORD>(0, pVersion7->dwPatch); 944 Assert::Equal<DWORD>(0, pVersion7->dwPatch);
@@ -899,6 +976,7 @@ namespace DutilTests
899 NativeAssert::Succeeded(hr, "VerVersionFromQword failed"); 976 NativeAssert::Succeeded(hr, "VerVersionFromQword failed");
900 977
901 NativeAssert::StringEqual(L"1.2.3.4", pVersion1->sczVersion); 978 NativeAssert::StringEqual(L"1.2.3.4", pVersion1->sczVersion);
979 Assert::Equal<WCHAR>(L'\0', pVersion1->chPrefix);
902 Assert::Equal<DWORD>(1, pVersion1->dwMajor); 980 Assert::Equal<DWORD>(1, pVersion1->dwMajor);
903 Assert::Equal<DWORD>(2, pVersion1->dwMinor); 981 Assert::Equal<DWORD>(2, pVersion1->dwMinor);
904 Assert::Equal<DWORD>(3, pVersion1->dwPatch); 982 Assert::Equal<DWORD>(3, pVersion1->dwPatch);