aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-05-16 16:07:43 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-05-17 22:54:13 -0500
commit46fb0597d4d6192833ddcf836f4bcf6295ef0aaf (patch)
treebfe188365bb37b298c42238d39568ebfc8809dcb
parent0ea53e27361cbfe664df98d717e55005f329aff1 (diff)
downloadwix-46fb0597d4d6192833ddcf836f4bcf6295ef0aaf.tar.gz
wix-46fb0597d4d6192833ddcf836f4bcf6295ef0aaf.tar.bz2
wix-46fb0597d4d6192833ddcf836f4bcf6295ef0aaf.zip
Keep track of when parts of verutil/WixVersions are missing.
Return null when WixVersion.TryParse returns false. 6776
-rw-r--r--src/api/burn/WixToolset.Mba.Core/VerUtil.cs4
-rw-r--r--src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs24
-rw-r--r--src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs8
-rw-r--r--src/api/wix/WixToolset.Data/WixVersion.cs33
-rw-r--r--src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs80
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/verutil.h4
-rw-r--r--src/libs/dutil/WixToolset.DUtil/verutil.cpp13
-rw-r--r--src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp168
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs10
9 files changed, 322 insertions, 22 deletions
diff --git a/src/api/burn/WixToolset.Mba.Core/VerUtil.cs b/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
index 611f9710..14552310 100644
--- a/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
+++ b/src/api/burn/WixToolset.Mba.Core/VerUtil.cs
@@ -68,6 +68,10 @@ namespace WixToolset.Mba.Core
68 public IntPtr rgReleaseLabels; 68 public IntPtr rgReleaseLabels;
69 public IntPtr cchMetadataOffset; 69 public IntPtr cchMetadataOffset;
70 public bool fInvalid; 70 public bool fInvalid;
71 public bool fHasMajor;
72 public bool fHasMinor;
73 public bool fHasPatch;
74 public bool fHasRevision;
71 } 75 }
72 76
73 internal static string VersionStringFromOffset(IntPtr wzVersion, IntPtr cchOffset, int? cchLength = null) 77 internal static string VersionStringFromOffset(IntPtr wzVersion, IntPtr cchOffset, int? cchLength = null)
diff --git a/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs b/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
index 731dedaf..e0312474 100644
--- a/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
+++ b/src/api/burn/WixToolset.Mba.Core/VerUtilVersion.cs
@@ -25,6 +25,10 @@ namespace WixToolset.Mba.Core
25 this.ReleaseLabels = new VerUtilVersionReleaseLabel[version.cReleaseLabels]; 25 this.ReleaseLabels = new VerUtilVersionReleaseLabel[version.cReleaseLabels];
26 this.Metadata = VerUtil.VersionStringFromOffset(version.sczVersion, version.cchMetadataOffset); 26 this.Metadata = VerUtil.VersionStringFromOffset(version.sczVersion, version.cchMetadataOffset);
27 this.IsInvalid = version.fInvalid; 27 this.IsInvalid = version.fInvalid;
28 this.HasMajor = version.fHasMajor;
29 this.HasMinor = version.fHasMinor;
30 this.HasPatch = version.fHasPatch;
31 this.HasRevision = version.fHasRevision;
28 32
29 for (var i = 0; i < version.cReleaseLabels; ++i) 33 for (var i = 0; i < version.cReleaseLabels; ++i)
30 { 34 {
@@ -80,6 +84,26 @@ namespace WixToolset.Mba.Core
80 /// </summary> 84 /// </summary>
81 public bool IsInvalid { get; private set; } 85 public bool IsInvalid { get; private set; }
82 86
87 /// <summary>
88 /// Whether the Major part was specified.
89 /// </summary>
90 public bool HasMajor { get; private set; }
91
92 /// <summary>
93 /// Whether the Minor part was specified.
94 /// </summary>
95 public bool HasMinor { get; private set; }
96
97 /// <summary>
98 /// Whether the Patch part was specified.
99 /// </summary>
100 public bool HasPatch { get; private set; }
101
102 /// <summary>
103 /// Whether the Revision part was specified.
104 /// </summary>
105 public bool HasRevision { get; private set; }
106
83 /// <inheritdoc/> 107 /// <inheritdoc/>
84 public void Dispose() 108 public void Dispose()
85 { 109 {
diff --git a/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs b/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
index ceb1b12a..6fb8aced 100644
--- a/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
+++ b/src/api/burn/test/WixToolsetTest.Mba.Core/VerUtilFixture.cs
@@ -57,6 +57,10 @@ namespace WixToolsetTest.Mba.Core
57 Assert.Empty(parsedVersion.ReleaseLabels); 57 Assert.Empty(parsedVersion.ReleaseLabels);
58 Assert.Equal("", parsedVersion.Metadata); 58 Assert.Equal("", parsedVersion.Metadata);
59 Assert.False(parsedVersion.IsInvalid); 59 Assert.False(parsedVersion.IsInvalid);
60 Assert.True(parsedVersion.HasMajor);
61 Assert.True(parsedVersion.HasMinor);
62 Assert.True(parsedVersion.HasPatch);
63 Assert.True(parsedVersion.HasRevision);
60 } 64 }
61 65
62 [Fact] 66 [Fact]
@@ -74,6 +78,10 @@ namespace WixToolsetTest.Mba.Core
74 Assert.Equal(5, parsedVersion.ReleaseLabels.Length); 78 Assert.Equal(5, parsedVersion.ReleaseLabels.Length);
75 Assert.Equal("+abc123", parsedVersion.Metadata); 79 Assert.Equal("+abc123", parsedVersion.Metadata);
76 Assert.True(parsedVersion.IsInvalid); 80 Assert.True(parsedVersion.IsInvalid);
81 Assert.True(parsedVersion.HasMajor);
82 Assert.True(parsedVersion.HasMinor);
83 Assert.True(parsedVersion.HasPatch);
84 Assert.True(parsedVersion.HasRevision);
77 85
78 Assert.Equal("a", parsedVersion.ReleaseLabels[0].Label); 86 Assert.Equal("a", parsedVersion.ReleaseLabels[0].Label);
79 Assert.False(parsedVersion.ReleaseLabels[0].IsNumeric); 87 Assert.False(parsedVersion.ReleaseLabels[0].IsNumeric);
diff --git a/src/api/wix/WixToolset.Data/WixVersion.cs b/src/api/wix/WixToolset.Data/WixVersion.cs
index 2b02bd7d..ab68b55a 100644
--- a/src/api/wix/WixToolset.Data/WixVersion.cs
+++ b/src/api/wix/WixToolset.Data/WixVersion.cs
@@ -22,22 +22,42 @@ namespace WixToolset.Data
22 /// <summary> 22 /// <summary>
23 /// Gets or sets the major version. 23 /// Gets or sets the major version.
24 /// </summary> 24 /// </summary>
25 public uint? Major { get; set; } 25 public uint Major { get; set; }
26 26
27 /// <summary> 27 /// <summary>
28 /// Gets or sets the minor version. 28 /// Gets or sets the minor version.
29 /// </summary> 29 /// </summary>
30 public uint? Minor { get; set; } 30 public uint Minor { get; set; }
31 31
32 /// <summary> 32 /// <summary>
33 /// Gets or sets the patch version. 33 /// Gets or sets the patch version.
34 /// </summary> 34 /// </summary>
35 public uint? Patch { get; set; } 35 public uint Patch { get; set; }
36 36
37 /// <summary> 37 /// <summary>
38 /// Gets or sets the revision version. 38 /// Gets or sets the revision version.
39 /// </summary> 39 /// </summary>
40 public uint? Revision { get; set; } 40 public uint Revision { get; set; }
41
42 /// <summary>
43 /// Gets or sets whether the major version was defined.
44 /// </summary>
45 public bool HasMajor { get; set; }
46
47 /// <summary>
48 /// Gets or sets the whether the minor version was defined.
49 /// </summary>
50 public bool HasMinor { get; set; }
51
52 /// <summary>
53 /// Gets or sets the whether the patch version was defined.
54 /// </summary>
55 public bool HasPatch { get; set; }
56
57 /// <summary>
58 /// Gets or sets the whether the revision version was defined.
59 /// </summary>
60 public bool HasRevision { get; set; }
41 61
42 /// <summary> 62 /// <summary>
43 /// Gets or sets the labels in the version. 63 /// Gets or sets the labels in the version.
@@ -143,15 +163,19 @@ namespace WixToolset.Data
143 { 163 {
144 case 0: 164 case 0:
145 version.Major = part; 165 version.Major = part;
166 version.HasMajor = true;
146 break; 167 break;
147 case 1: 168 case 1:
148 version.Minor = part; 169 version.Minor = part;
170 version.HasMinor = true;
149 break; 171 break;
150 case 2: 172 case 2:
151 version.Patch = part; 173 version.Patch = part;
174 version.HasPatch = true;
152 break; 175 break;
153 case 3: 176 case 3:
154 version.Revision = part; 177 version.Revision = part;
178 version.HasRevision = true;
155 break; 179 break;
156 } 180 }
157 181
@@ -264,6 +288,7 @@ namespace WixToolset.Data
264 288
265 if (invalid) 289 if (invalid)
266 { 290 {
291 version = null;
267 return false; 292 return false;
268 } 293 }
269 294
diff --git a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs b/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs
index 45253460..ffa3213a 100644
--- a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs
+++ b/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs
@@ -11,13 +11,15 @@ namespace WixToolsetTest.Data
11 [Fact] 11 [Fact]
12 public void CannotParseEmptyStringAsVersion() 12 public void CannotParseEmptyStringAsVersion()
13 { 13 {
14 Assert.False(WixVersion.TryParse(String.Empty, out var _)); 14 Assert.False(WixVersion.TryParse(String.Empty, out var version));
15 Assert.Null(version);
15 } 16 }
16 17
17 [Fact] 18 [Fact]
18 public void CannotParseInvalidStringAsVersion() 19 public void CannotParseInvalidStringAsVersion()
19 { 20 {
20 Assert.False(WixVersion.TryParse("invalid", out var _)); 21 Assert.False(WixVersion.TryParse("invalid", out var version));
22 Assert.Null(version);
21 } 23 }
22 24
23 [Fact] 25 [Fact]
@@ -29,6 +31,10 @@ namespace WixToolsetTest.Data
29 Assert.Equal((uint)2, version.Minor); 31 Assert.Equal((uint)2, version.Minor);
30 Assert.Equal((uint)3, version.Patch); 32 Assert.Equal((uint)3, version.Patch);
31 Assert.Equal((uint)4, version.Revision); 33 Assert.Equal((uint)4, version.Revision);
34 Assert.True(version.HasMajor);
35 Assert.True(version.HasMinor);
36 Assert.True(version.HasPatch);
37 Assert.True(version.HasRevision);
32 Assert.Null(version.Labels); 38 Assert.Null(version.Labels);
33 Assert.Null(version.Metadata); 39 Assert.Null(version.Metadata);
34 } 40 }
@@ -41,7 +47,11 @@ namespace WixToolsetTest.Data
41 Assert.Equal((uint)1, version.Major); 47 Assert.Equal((uint)1, version.Major);
42 Assert.Equal((uint)2, version.Minor); 48 Assert.Equal((uint)2, version.Minor);
43 Assert.Equal((uint)3, version.Patch); 49 Assert.Equal((uint)3, version.Patch);
44 Assert.Null(version.Revision); 50 Assert.Equal((uint)0, version.Revision);
51 Assert.True(version.HasMajor);
52 Assert.True(version.HasMinor);
53 Assert.True(version.HasPatch);
54 Assert.False(version.HasRevision);
45 Assert.Null(version.Labels); 55 Assert.Null(version.Labels);
46 Assert.Null(version.Metadata); 56 Assert.Null(version.Metadata);
47 } 57 }
@@ -55,6 +65,10 @@ namespace WixToolsetTest.Data
55 Assert.Equal((uint)2, version.Minor); 65 Assert.Equal((uint)2, version.Minor);
56 Assert.Equal((uint)3, version.Patch); 66 Assert.Equal((uint)3, version.Patch);
57 Assert.Equal((uint)0, version.Revision); 67 Assert.Equal((uint)0, version.Revision);
68 Assert.True(version.HasMajor);
69 Assert.True(version.HasMinor);
70 Assert.True(version.HasPatch);
71 Assert.True(version.HasRevision);
58 Assert.Null(version.Labels); 72 Assert.Null(version.Labels);
59 Assert.Null(version.Metadata); 73 Assert.Null(version.Metadata);
60 } 74 }
@@ -66,8 +80,12 @@ namespace WixToolsetTest.Data
66 Assert.Null(version.Prefix); 80 Assert.Null(version.Prefix);
67 Assert.Equal((uint)1, version.Major); 81 Assert.Equal((uint)1, version.Major);
68 Assert.Equal((uint)2, version.Minor); 82 Assert.Equal((uint)2, version.Minor);
69 Assert.Null(version.Patch); 83 Assert.Equal((uint)0, version.Patch);
70 Assert.Null(version.Revision); 84 Assert.Equal((uint)0, version.Revision);
85 Assert.True(version.HasMajor);
86 Assert.True(version.HasMinor);
87 Assert.False(version.HasPatch);
88 Assert.False(version.HasRevision);
71 Assert.Equal("19", version.Labels[0].Label); 89 Assert.Equal("19", version.Labels[0].Label);
72 Assert.Equal((uint)19, version.Labels[0].Numeric); 90 Assert.Equal((uint)19, version.Labels[0].Numeric);
73 Assert.Null(version.Metadata); 91 Assert.Null(version.Metadata);
@@ -80,8 +98,12 @@ namespace WixToolsetTest.Data
80 Assert.Null(version.Prefix); 98 Assert.Null(version.Prefix);
81 Assert.Equal((uint)1, version.Major); 99 Assert.Equal((uint)1, version.Major);
82 Assert.Equal((uint)2, version.Minor); 100 Assert.Equal((uint)2, version.Minor);
83 Assert.Null(version.Patch); 101 Assert.Equal((uint)0, version.Patch);
84 Assert.Null(version.Revision); 102 Assert.Equal((uint)0, version.Revision);
103 Assert.True(version.HasMajor);
104 Assert.True(version.HasMinor);
105 Assert.False(version.HasPatch);
106 Assert.False(version.HasRevision);
85 Assert.Equal("2", version.Labels[0].Label); 107 Assert.Equal("2", version.Labels[0].Label);
86 Assert.Equal((uint)2, version.Labels[0].Numeric); 108 Assert.Equal((uint)2, version.Labels[0].Numeric);
87 Assert.Equal("0", version.Labels[1].Label); 109 Assert.Equal("0", version.Labels[1].Label);
@@ -97,6 +119,11 @@ namespace WixToolsetTest.Data
97 Assert.Equal((uint)0, version.Major); 119 Assert.Equal((uint)0, version.Major);
98 Assert.Equal((uint)0, version.Minor); 120 Assert.Equal((uint)0, version.Minor);
99 Assert.Equal((uint)1, version.Patch); 121 Assert.Equal((uint)1, version.Patch);
122 Assert.Equal((uint)0, version.Revision);
123 Assert.True(version.HasMajor);
124 Assert.True(version.HasMinor);
125 Assert.True(version.HasPatch);
126 Assert.False(version.HasRevision);
100 Assert.Equal("a", version.Labels[0].Label); 127 Assert.Equal("a", version.Labels[0].Label);
101 Assert.Null(version.Labels[0].Numeric); 128 Assert.Null(version.Labels[0].Numeric);
102 Assert.Null(version.Metadata); 129 Assert.Null(version.Metadata);
@@ -109,8 +136,12 @@ namespace WixToolsetTest.Data
109 Assert.Null(version.Prefix); 136 Assert.Null(version.Prefix);
110 Assert.Equal((uint)0, version.Major); 137 Assert.Equal((uint)0, version.Major);
111 Assert.Equal((uint)1, version.Minor); 138 Assert.Equal((uint)1, version.Minor);
112 Assert.Null(version.Patch); 139 Assert.Equal((uint)0, version.Patch);
113 Assert.Null(version.Revision); 140 Assert.Equal((uint)0, version.Revision);
141 Assert.True(version.HasMajor);
142 Assert.True(version.HasMinor);
143 Assert.False(version.HasPatch);
144 Assert.False(version.HasRevision);
114 Assert.Equal("a", version.Labels[0].Label); 145 Assert.Equal("a", version.Labels[0].Label);
115 Assert.Null(version.Labels[0].Numeric); 146 Assert.Null(version.Labels[0].Numeric);
116 Assert.Equal("000", version.Labels[1].Label); 147 Assert.Equal("000", version.Labels[1].Label);
@@ -126,7 +157,11 @@ namespace WixToolsetTest.Data
126 Assert.Equal((uint)1, version.Major); 157 Assert.Equal((uint)1, version.Major);
127 Assert.Equal((uint)2, version.Minor); 158 Assert.Equal((uint)2, version.Minor);
128 Assert.Equal((uint)3, version.Patch); 159 Assert.Equal((uint)3, version.Patch);
129 Assert.Null(version.Revision); 160 Assert.Equal((uint)0, version.Revision);
161 Assert.True(version.HasMajor);
162 Assert.True(version.HasMinor);
163 Assert.True(version.HasPatch);
164 Assert.False(version.HasRevision);
130 Assert.Null(version.Labels); 165 Assert.Null(version.Labels);
131 Assert.Equal("abcd", version.Metadata); 166 Assert.Equal("abcd", version.Metadata);
132 } 167 }
@@ -134,8 +169,10 @@ namespace WixToolsetTest.Data
134 [Fact] 169 [Fact]
135 public void CannotParseUnexpectedContentAsMetadata() 170 public void CannotParseUnexpectedContentAsMetadata()
136 { 171 {
137 Assert.False(WixVersion.TryParse("1.2.3.abcd", out var _)); 172 Assert.False(WixVersion.TryParse("1.2.3.abcd", out var version));
138 Assert.False(WixVersion.TryParse("1.2.3.-abcd", out var _)); 173 Assert.Null(version);
174 Assert.False(WixVersion.TryParse("1.2.3.-abcd", out version));
175 Assert.Null(version);
139 } 176 }
140 177
141 [Fact] 178 [Fact]
@@ -147,6 +184,10 @@ namespace WixToolsetTest.Data
147 Assert.Equal((uint)20, version.Minor); 184 Assert.Equal((uint)20, version.Minor);
148 Assert.Equal((uint)30, version.Patch); 185 Assert.Equal((uint)30, version.Patch);
149 Assert.Equal((uint)40, version.Revision); 186 Assert.Equal((uint)40, version.Revision);
187 Assert.True(version.HasMajor);
188 Assert.True(version.HasMinor);
189 Assert.True(version.HasPatch);
190 Assert.True(version.HasRevision);
150 Assert.Null(version.Labels); 191 Assert.Null(version.Labels);
151 Assert.Null(version.Metadata); 192 Assert.Null(version.Metadata);
152 193
@@ -156,6 +197,10 @@ namespace WixToolsetTest.Data
156 Assert.Equal((uint)200, version2.Minor); 197 Assert.Equal((uint)200, version2.Minor);
157 Assert.Equal((uint)300, version2.Patch); 198 Assert.Equal((uint)300, version2.Patch);
158 Assert.Equal((uint)400, version2.Revision); 199 Assert.Equal((uint)400, version2.Revision);
200 Assert.True(version.HasMajor);
201 Assert.True(version.HasMinor);
202 Assert.True(version.HasPatch);
203 Assert.True(version.HasRevision);
159 Assert.Null(version2.Labels); 204 Assert.Null(version2.Labels);
160 Assert.Null(version2.Metadata); 205 Assert.Null(version2.Metadata);
161 } 206 }
@@ -169,6 +214,10 @@ namespace WixToolsetTest.Data
169 Assert.Equal(4294967295, version.Minor); 214 Assert.Equal(4294967295, version.Minor);
170 Assert.Equal(4294967295, version.Patch); 215 Assert.Equal(4294967295, version.Patch);
171 Assert.Equal(4294967295, version.Revision); 216 Assert.Equal(4294967295, version.Revision);
217 Assert.True(version.HasMajor);
218 Assert.True(version.HasMinor);
219 Assert.True(version.HasPatch);
220 Assert.True(version.HasRevision);
172 Assert.Null(version.Labels); 221 Assert.Null(version.Labels);
173 Assert.Null(version.Metadata); 222 Assert.Null(version.Metadata);
174 } 223 }
@@ -176,7 +225,8 @@ namespace WixToolsetTest.Data
176 [Fact] 225 [Fact]
177 public void CannotParseTooLargeNumbers() 226 public void CannotParseTooLargeNumbers()
178 { 227 {
179 Assert.False(WixVersion.TryParse("4294967296.4294967296.4294967296.4294967296", out var _)); 228 Assert.False(WixVersion.TryParse("4294967296.4294967296.4294967296.4294967296", out var version));
229 Assert.Null(version);
180 } 230 }
181 231
182 [Fact] 232 [Fact]
@@ -188,6 +238,10 @@ namespace WixToolsetTest.Data
188 Assert.Equal((uint)2, version.Minor); 238 Assert.Equal((uint)2, version.Minor);
189 Assert.Equal((uint)3, version.Patch); 239 Assert.Equal((uint)3, version.Patch);
190 Assert.Equal((uint)4, version.Revision); 240 Assert.Equal((uint)4, version.Revision);
241 Assert.True(version.HasMajor);
242 Assert.True(version.HasMinor);
243 Assert.True(version.HasPatch);
244 Assert.True(version.HasRevision);
191 Assert.Equal("a", version.Labels[0].Label); 245 Assert.Equal("a", version.Labels[0].Label);
192 Assert.Null(version.Labels[0].Numeric); 246 Assert.Null(version.Labels[0].Numeric);
193 Assert.Equal("b", version.Labels[1].Label); 247 Assert.Equal("b", version.Labels[1].Label);
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/verutil.h b/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
index 4fdaa522..cab18be7 100644
--- a/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
+++ b/src/libs/dutil/WixToolset.DUtil/inc/verutil.h
@@ -28,6 +28,10 @@ typedef struct _VERUTIL_VERSION
28 VERUTIL_VERSION_RELEASE_LABEL* rgReleaseLabels; 28 VERUTIL_VERSION_RELEASE_LABEL* rgReleaseLabels;
29 SIZE_T cchMetadataOffset; 29 SIZE_T cchMetadataOffset;
30 BOOL fInvalid; 30 BOOL fInvalid;
31 BOOL fHasMajor;
32 BOOL fHasMinor;
33 BOOL fHasPatch;
34 BOOL fHasRevision;
31} VERUTIL_VERSION; 35} VERUTIL_VERSION;
32 36
33/******************************************************************* 37/*******************************************************************
diff --git a/src/libs/dutil/WixToolset.DUtil/verutil.cpp b/src/libs/dutil/WixToolset.DUtil/verutil.cpp
index 30b979b1..276441b5 100644
--- a/src/libs/dutil/WixToolset.DUtil/verutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/verutil.cpp
@@ -196,9 +196,13 @@ DAPI_(HRESULT) VerCopyVersion(
196 196
197 pCopy->chPrefix = pSource->chPrefix; 197 pCopy->chPrefix = pSource->chPrefix;
198 pCopy->dwMajor = pSource->dwMajor; 198 pCopy->dwMajor = pSource->dwMajor;
199 pCopy->fHasMajor = pSource->fHasMajor;
199 pCopy->dwMinor = pSource->dwMinor; 200 pCopy->dwMinor = pSource->dwMinor;
201 pCopy->fHasMinor = pSource->fHasMinor;
200 pCopy->dwPatch = pSource->dwPatch; 202 pCopy->dwPatch = pSource->dwPatch;
203 pCopy->fHasPatch = pSource->fHasPatch;
201 pCopy->dwRevision = pSource->dwRevision; 204 pCopy->dwRevision = pSource->dwRevision;
205 pCopy->fHasRevision = pSource->fHasRevision;
202 206
203 if (pSource->cReleaseLabels) 207 if (pSource->cReleaseLabels)
204 { 208 {
@@ -370,15 +374,19 @@ DAPI_(HRESULT) VerParseVersion(
370 { 374 {
371 case 0: 375 case 0:
372 pVersion->dwMajor = uPart; 376 pVersion->dwMajor = uPart;
377 pVersion->fHasMajor = TRUE;
373 break; 378 break;
374 case 1: 379 case 1:
375 pVersion->dwMinor = uPart; 380 pVersion->dwMinor = uPart;
381 pVersion->fHasMinor = TRUE;
376 break; 382 break;
377 case 2: 383 case 2:
378 pVersion->dwPatch = uPart; 384 pVersion->dwPatch = uPart;
385 pVersion->fHasPatch = TRUE;
379 break; 386 break;
380 case 3: 387 case 3:
381 pVersion->dwRevision = uPart; 388 pVersion->dwRevision = uPart;
389 pVersion->fHasRevision = TRUE;
382 break; 390 break;
383 } 391 }
384 392
@@ -549,6 +557,11 @@ DAPI_(HRESULT) VerVersionFromQword(
549 pVersion->dwPatch = (WORD)(qwVersion >> 16 & 0xffff); 557 pVersion->dwPatch = (WORD)(qwVersion >> 16 & 0xffff);
550 pVersion->dwRevision = (WORD)(qwVersion & 0xffff); 558 pVersion->dwRevision = (WORD)(qwVersion & 0xffff);
551 559
560 pVersion->fHasMajor = TRUE;
561 pVersion->fHasMinor = TRUE;
562 pVersion->fHasPatch = TRUE;
563 pVersion->fHasRevision = TRUE;
564
552 hr = StrAllocFormatted(&pVersion->sczVersion, L"%lu.%lu.%lu.%lu", pVersion->dwMajor, pVersion->dwMinor, pVersion->dwPatch, pVersion->dwRevision); 565 hr = StrAllocFormatted(&pVersion->sczVersion, L"%lu.%lu.%lu.%lu", pVersion->dwMajor, pVersion->dwMinor, pVersion->dwPatch, pVersion->dwRevision);
553 ExitOnFailure(hr, "Failed to allocate and format the version string."); 566 ExitOnFailure(hr, "Failed to allocate and format the version string.");
554 567
diff --git a/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp b/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
index c20b9887..3402097c 100644
--- a/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
+++ b/src/libs/dutil/test/DUtilUnitTest/VerUtilTests.cpp
@@ -42,6 +42,10 @@ namespace DutilTests
42 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 42 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
43 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset); 43 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset);
44 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 44 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
45 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
46 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
47 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
48 Assert::Equal<BOOL>(TRUE, pVersion1->fHasRevision);
45 49
46 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 50 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
47 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 51 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -52,6 +56,10 @@ namespace DutilTests
52 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 56 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
53 Assert::Equal<DWORD>(5, pVersion2->cchMetadataOffset); 57 Assert::Equal<DWORD>(5, pVersion2->cchMetadataOffset);
54 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 58 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
59 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
60 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
61 Assert::Equal<BOOL>(TRUE, pVersion2->fHasPatch);
62 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
55 63
56 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 64 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
57 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 65 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -62,6 +70,10 @@ namespace DutilTests
62 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels); 70 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels);
63 Assert::Equal<DWORD>(7, pVersion3->cchMetadataOffset); 71 Assert::Equal<DWORD>(7, pVersion3->cchMetadataOffset);
64 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 72 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
73 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
74 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMinor);
75 Assert::Equal<BOOL>(TRUE, pVersion3->fHasPatch);
76 Assert::Equal<BOOL>(TRUE, pVersion3->fHasRevision);
65 77
66 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1); 78 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1);
67 TestVerutilCompareParsedVersions(pVersion3, pVersion2, 0); 79 TestVerutilCompareParsedVersions(pVersion3, pVersion2, 0);
@@ -111,6 +123,10 @@ namespace DutilTests
111 123
112 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset); 124 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset);
113 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 125 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
126 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
127 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
128 Assert::Equal<BOOL>(FALSE, pVersion1->fHasPatch);
129 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
114 130
115 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 131 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
116 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 132 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -127,6 +143,10 @@ namespace DutilTests
127 143
128 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset); 144 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset);
129 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 145 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
146 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
147 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
148 Assert::Equal<BOOL>(FALSE, pVersion2->fHasPatch);
149 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
130 150
131 TestVerutilCompareParsedVersions(pVersion1, pVersion2, -1); 151 TestVerutilCompareParsedVersions(pVersion1, pVersion2, -1);
132 } 152 }
@@ -183,6 +203,10 @@ namespace DutilTests
183 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 203 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
184 Assert::Equal<DWORD>(3, pVersion1->cchMetadataOffset); 204 Assert::Equal<DWORD>(3, pVersion1->cchMetadataOffset);
185 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid); 205 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid);
206 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
207 Assert::Equal<BOOL>(FALSE, pVersion1->fHasMinor);
208 Assert::Equal<BOOL>(FALSE, pVersion1->fHasPatch);
209 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
186 210
187 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 211 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
188 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 212 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -193,6 +217,10 @@ namespace DutilTests
193 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 217 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
194 Assert::Equal<DWORD>(3, pVersion2->cchMetadataOffset); 218 Assert::Equal<DWORD>(3, pVersion2->cchMetadataOffset);
195 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 219 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
220 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
221 Assert::Equal<BOOL>(FALSE, pVersion2->fHasMinor);
222 Assert::Equal<BOOL>(FALSE, pVersion2->fHasPatch);
223 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
196 224
197 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 225 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
198 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 226 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -203,6 +231,10 @@ namespace DutilTests
203 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels); 231 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels);
204 Assert::Equal<DWORD>(1, pVersion3->cchMetadataOffset); 232 Assert::Equal<DWORD>(1, pVersion3->cchMetadataOffset);
205 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 233 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
234 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
235 Assert::Equal<BOOL>(FALSE, pVersion3->fHasMinor);
236 Assert::Equal<BOOL>(FALSE, pVersion3->fHasPatch);
237 Assert::Equal<BOOL>(FALSE, pVersion3->fHasRevision);
206 238
207 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 239 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
208 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix); 240 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
@@ -213,6 +245,10 @@ namespace DutilTests
213 Assert::Equal<DWORD>(0, pVersion4->cReleaseLabels); 245 Assert::Equal<DWORD>(0, pVersion4->cReleaseLabels);
214 Assert::Equal<DWORD>(0, pVersion4->cchMetadataOffset); 246 Assert::Equal<DWORD>(0, pVersion4->cchMetadataOffset);
215 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid); 247 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid);
248 Assert::Equal<BOOL>(FALSE, pVersion4->fHasMajor);
249 Assert::Equal<BOOL>(FALSE, pVersion4->fHasMinor);
250 Assert::Equal<BOOL>(FALSE, pVersion4->fHasPatch);
251 Assert::Equal<BOOL>(FALSE, pVersion4->fHasRevision);
216 252
217 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion); 253 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
218 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix); 254 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
@@ -229,6 +265,10 @@ namespace DutilTests
229 265
230 Assert::Equal<DWORD>(4, pVersion5->cchMetadataOffset); 266 Assert::Equal<DWORD>(4, pVersion5->cchMetadataOffset);
231 Assert::Equal<BOOL>(FALSE, pVersion5->fInvalid); 267 Assert::Equal<BOOL>(FALSE, pVersion5->fInvalid);
268 Assert::Equal<BOOL>(TRUE, pVersion5->fHasMajor);
269 Assert::Equal<BOOL>(FALSE, pVersion5->fHasMinor);
270 Assert::Equal<BOOL>(FALSE, pVersion5->fHasPatch);
271 Assert::Equal<BOOL>(FALSE, pVersion5->fHasRevision);
232 272
233 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion); 273 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion);
234 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix); 274 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix);
@@ -245,6 +285,10 @@ namespace DutilTests
245 285
246 Assert::Equal<DWORD>(5, pVersion6->cchMetadataOffset); 286 Assert::Equal<DWORD>(5, pVersion6->cchMetadataOffset);
247 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid); 287 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid);
288 Assert::Equal<BOOL>(TRUE, pVersion6->fHasMajor);
289 Assert::Equal<BOOL>(FALSE, pVersion6->fHasMinor);
290 Assert::Equal<BOOL>(FALSE, pVersion6->fHasPatch);
291 Assert::Equal<BOOL>(FALSE, pVersion6->fHasRevision);
248 292
249 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1); 293 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1);
250 TestVerutilCompareParsedVersions(pVersion3, pVersion4, 1); 294 TestVerutilCompareParsedVersions(pVersion3, pVersion4, 1);
@@ -297,6 +341,10 @@ namespace DutilTests
297 341
298 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset); 342 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset);
299 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 343 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
344 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
345 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
346 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
347 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
300 348
301 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 349 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
302 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 350 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -313,6 +361,10 @@ namespace DutilTests
313 361
314 Assert::Equal<DWORD>(3, pVersion2->cchMetadataOffset); 362 Assert::Equal<DWORD>(3, pVersion2->cchMetadataOffset);
315 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 363 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
364 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
365 Assert::Equal<BOOL>(FALSE, pVersion2->fHasMinor);
366 Assert::Equal<BOOL>(FALSE, pVersion2->fHasPatch);
367 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
316 368
317 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 369 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
318 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 370 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -329,6 +381,10 @@ namespace DutilTests
329 381
330 Assert::Equal<DWORD>(3, pVersion3->cchMetadataOffset); 382 Assert::Equal<DWORD>(3, pVersion3->cchMetadataOffset);
331 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 383 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
384 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
385 Assert::Equal<BOOL>(FALSE, pVersion3->fHasMinor);
386 Assert::Equal<BOOL>(FALSE, pVersion3->fHasPatch);
387 Assert::Equal<BOOL>(FALSE, pVersion3->fHasRevision);
332 388
333 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1); 389 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1);
334 TestVerutilCompareParsedVersions(pVersion1, pVersion3, -1); 390 TestVerutilCompareParsedVersions(pVersion1, pVersion3, -1);
@@ -387,6 +443,10 @@ namespace DutilTests
387 443
388 Assert::Equal<DWORD>(8, pVersion1->cchMetadataOffset); 444 Assert::Equal<DWORD>(8, pVersion1->cchMetadataOffset);
389 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 445 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
446 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
447 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
448 Assert::Equal<BOOL>(FALSE, pVersion1->fHasPatch);
449 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
390 450
391 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 451 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
392 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 452 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -407,6 +467,10 @@ namespace DutilTests
407 467
408 Assert::Equal<DWORD>(9, pVersion2->cchMetadataOffset); 468 Assert::Equal<DWORD>(9, pVersion2->cchMetadataOffset);
409 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 469 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
470 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
471 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
472 Assert::Equal<BOOL>(TRUE, pVersion2->fHasPatch);
473 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
410 474
411 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 475 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
412 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 476 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -431,6 +495,10 @@ namespace DutilTests
431 495
432 Assert::Equal<DWORD>(9, pVersion3->cchMetadataOffset); 496 Assert::Equal<DWORD>(9, pVersion3->cchMetadataOffset);
433 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 497 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
498 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
499 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMinor);
500 Assert::Equal<BOOL>(FALSE, pVersion3->fHasPatch);
501 Assert::Equal<BOOL>(FALSE, pVersion3->fHasRevision);
434 502
435 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 503 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
436 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix); 504 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
@@ -455,6 +523,10 @@ namespace DutilTests
455 523
456 Assert::Equal<DWORD>(13, pVersion4->cchMetadataOffset); 524 Assert::Equal<DWORD>(13, pVersion4->cchMetadataOffset);
457 Assert::Equal<BOOL>(FALSE, pVersion4->fInvalid); 525 Assert::Equal<BOOL>(FALSE, pVersion4->fInvalid);
526 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMajor);
527 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMinor);
528 Assert::Equal<BOOL>(TRUE, pVersion4->fHasPatch);
529 Assert::Equal<BOOL>(FALSE, pVersion4->fHasRevision);
458 530
459 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0); 531 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0);
460 TestVerutilCompareParsedVersions(pVersion3, pVersion4, 0); 532 TestVerutilCompareParsedVersions(pVersion3, pVersion4, 0);
@@ -499,6 +571,10 @@ namespace DutilTests
499 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 571 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
500 Assert::Equal<DWORD>(6, pVersion1->cchMetadataOffset); 572 Assert::Equal<DWORD>(6, pVersion1->cchMetadataOffset);
501 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 573 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
574 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
575 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
576 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
577 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
502 578
503 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 579 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
504 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 580 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -509,6 +585,10 @@ namespace DutilTests
509 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 585 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
510 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset); 586 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset);
511 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 587 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
588 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
589 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
590 Assert::Equal<BOOL>(TRUE, pVersion2->fHasPatch);
591 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
512 592
513 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 593 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
514 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 594 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -519,6 +599,10 @@ namespace DutilTests
519 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels); 599 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels);
520 Assert::Equal<DWORD>(6, pVersion3->cchMetadataOffset); 600 Assert::Equal<DWORD>(6, pVersion3->cchMetadataOffset);
521 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid); 601 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid);
602 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
603 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMinor);
604 Assert::Equal<BOOL>(TRUE, pVersion3->fHasPatch);
605 Assert::Equal<BOOL>(FALSE, pVersion3->fHasRevision);
522 606
523 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1); 607 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1);
524 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 1); 608 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 1);
@@ -573,6 +657,10 @@ namespace DutilTests
573 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 657 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
574 Assert::Equal<DWORD>(11, pVersion1->cchMetadataOffset); 658 Assert::Equal<DWORD>(11, pVersion1->cchMetadataOffset);
575 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 659 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
660 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
661 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
662 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
663 Assert::Equal<BOOL>(TRUE, pVersion1->fHasRevision);
576 664
577 NativeAssert::StringEqual(wzVersion1, pVersion2->sczVersion); 665 NativeAssert::StringEqual(wzVersion1, pVersion2->sczVersion);
578 Assert::Equal<WCHAR>(L'v', pVersion2->chPrefix); 666 Assert::Equal<WCHAR>(L'v', pVersion2->chPrefix);
@@ -583,6 +671,10 @@ namespace DutilTests
583 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 671 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
584 Assert::Equal<DWORD>(11, pVersion2->cchMetadataOffset); 672 Assert::Equal<DWORD>(11, pVersion2->cchMetadataOffset);
585 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 673 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
674 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
675 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
676 Assert::Equal<BOOL>(TRUE, pVersion2->fHasPatch);
677 Assert::Equal<BOOL>(TRUE, pVersion2->fHasRevision);
586 678
587 NativeAssert::StringEqual(wzVersion1, pVersion3->sczVersion); 679 NativeAssert::StringEqual(wzVersion1, pVersion3->sczVersion);
588 Assert::Equal<WCHAR>(L'V', pVersion3->chPrefix); 680 Assert::Equal<WCHAR>(L'V', pVersion3->chPrefix);
@@ -593,6 +685,10 @@ namespace DutilTests
593 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels); 685 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels);
594 Assert::Equal<DWORD>(11, pVersion3->cchMetadataOffset); 686 Assert::Equal<DWORD>(11, pVersion3->cchMetadataOffset);
595 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid); 687 Assert::Equal<BOOL>(FALSE, pVersion3->fInvalid);
688 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
689 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMinor);
690 Assert::Equal<BOOL>(TRUE, pVersion3->fHasPatch);
691 Assert::Equal<BOOL>(TRUE, pVersion3->fHasRevision);
596 692
597 NativeAssert::StringEqual(L"10.20.30.40-abc", pVersion4->sczVersion); 693 NativeAssert::StringEqual(L"10.20.30.40-abc", pVersion4->sczVersion);
598 Assert::Equal<WCHAR>(L'v', pVersion4->chPrefix); 694 Assert::Equal<WCHAR>(L'v', pVersion4->chPrefix);
@@ -608,6 +704,10 @@ namespace DutilTests
608 704
609 Assert::Equal<DWORD>(15, pVersion4->cchMetadataOffset); 705 Assert::Equal<DWORD>(15, pVersion4->cchMetadataOffset);
610 Assert::Equal<BOOL>(FALSE, pVersion4->fInvalid); 706 Assert::Equal<BOOL>(FALSE, pVersion4->fInvalid);
707 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMajor);
708 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMinor);
709 Assert::Equal<BOOL>(TRUE, pVersion4->fHasPatch);
710 Assert::Equal<BOOL>(TRUE, pVersion4->fHasRevision);
611 711
612 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion); 712 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
613 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix); 713 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
@@ -618,6 +718,10 @@ namespace DutilTests
618 Assert::Equal<DWORD>(0, pVersion5->cReleaseLabels); 718 Assert::Equal<DWORD>(0, pVersion5->cReleaseLabels);
619 Assert::Equal<DWORD>(0, pVersion5->cchMetadataOffset); 719 Assert::Equal<DWORD>(0, pVersion5->cchMetadataOffset);
620 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid); 720 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid);
721 Assert::Equal<BOOL>(FALSE, pVersion5->fHasMajor);
722 Assert::Equal<BOOL>(FALSE, pVersion5->fHasMinor);
723 Assert::Equal<BOOL>(FALSE, pVersion5->fHasPatch);
724 Assert::Equal<BOOL>(FALSE, pVersion5->fHasRevision);
621 725
622 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0); 726 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0);
623 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 0); 727 TestVerutilCompareParsedVersions(pVersion1, pVersion3, 0);
@@ -659,6 +763,10 @@ namespace DutilTests
659 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 763 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
660 Assert::Equal<DWORD>(43, pVersion1->cchMetadataOffset); 764 Assert::Equal<DWORD>(43, pVersion1->cchMetadataOffset);
661 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 765 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
766 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
767 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
768 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
769 Assert::Equal<BOOL>(TRUE, pVersion1->fHasRevision);
662 770
663 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 771 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
664 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 772 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -669,6 +777,10 @@ namespace DutilTests
669 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 777 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
670 Assert::Equal<DWORD>(0, pVersion2->cchMetadataOffset); 778 Assert::Equal<DWORD>(0, pVersion2->cchMetadataOffset);
671 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 779 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
780 Assert::Equal<BOOL>(FALSE, pVersion2->fHasMajor);
781 Assert::Equal<BOOL>(FALSE, pVersion2->fHasMinor);
782 Assert::Equal<BOOL>(FALSE, pVersion2->fHasPatch);
783 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
672 784
673 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1); 785 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 1);
674 } 786 }
@@ -705,6 +817,10 @@ namespace DutilTests
705 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 817 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
706 Assert::Equal<DWORD>(6, pVersion1->cchMetadataOffset); 818 Assert::Equal<DWORD>(6, pVersion1->cchMetadataOffset);
707 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 819 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
820 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
821 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
822 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
823 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
708 824
709 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 825 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
710 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 826 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -715,6 +831,10 @@ namespace DutilTests
715 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 831 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
716 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset); 832 Assert::Equal<DWORD>(6, pVersion2->cchMetadataOffset);
717 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid); 833 Assert::Equal<BOOL>(FALSE, pVersion2->fInvalid);
834 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
835 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMinor);
836 Assert::Equal<BOOL>(TRUE, pVersion2->fHasPatch);
837 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
718 838
719 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0); 839 TestVerutilCompareParsedVersions(pVersion1, pVersion2, 0);
720 } 840 }
@@ -749,6 +869,10 @@ namespace DutilTests
749 869
750 Assert::Equal<DWORD>(8, pSource->cchMetadataOffset); 870 Assert::Equal<DWORD>(8, pSource->cchMetadataOffset);
751 Assert::Equal<BOOL>(FALSE, pSource->fInvalid); 871 Assert::Equal<BOOL>(FALSE, pSource->fInvalid);
872 Assert::Equal<BOOL>(TRUE, pSource->fHasMajor);
873 Assert::Equal<BOOL>(TRUE, pSource->fHasMinor);
874 Assert::Equal<BOOL>(TRUE, pSource->fHasPatch);
875 Assert::Equal<BOOL>(TRUE, pSource->fHasRevision);
752 876
753 hr = VerCopyVersion(pSource, &pCopy); 877 hr = VerCopyVersion(pSource, &pCopy);
754 NativeAssert::Succeeded(hr, "VerCopyVersion failed"); 878 NativeAssert::Succeeded(hr, "VerCopyVersion failed");
@@ -756,6 +880,10 @@ namespace DutilTests
756 Assert::False(pSource == pCopy); 880 Assert::False(pSource == pCopy);
757 Assert::False(pSource->sczVersion == pCopy->sczVersion); 881 Assert::False(pSource->sczVersion == pCopy->sczVersion);
758 Assert::Equal<WCHAR>(L'\0', pCopy->chPrefix); 882 Assert::Equal<WCHAR>(L'\0', pCopy->chPrefix);
883 Assert::Equal<BOOL>(TRUE, pCopy->fHasMajor);
884 Assert::Equal<BOOL>(TRUE, pCopy->fHasMinor);
885 Assert::Equal<BOOL>(TRUE, pCopy->fHasPatch);
886 Assert::Equal<BOOL>(TRUE, pCopy->fHasRevision);
759 887
760 hr = VerCompareParsedVersions(pSource, pCopy, &nResult); 888 hr = VerCompareParsedVersions(pSource, pCopy, &nResult);
761 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed"); 889 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed");
@@ -814,6 +942,10 @@ namespace DutilTests
814 942
815 Assert::Equal<DWORD>(18, pSource->cchMetadataOffset); 943 Assert::Equal<DWORD>(18, pSource->cchMetadataOffset);
816 Assert::Equal<BOOL>(TRUE, pSource->fInvalid); 944 Assert::Equal<BOOL>(TRUE, pSource->fInvalid);
945 Assert::Equal<BOOL>(TRUE, pSource->fHasMajor);
946 Assert::Equal<BOOL>(TRUE, pSource->fHasMinor);
947 Assert::Equal<BOOL>(TRUE, pSource->fHasPatch);
948 Assert::Equal<BOOL>(TRUE, pSource->fHasRevision);
817 949
818 hr = VerCopyVersion(pSource, &pCopy); 950 hr = VerCopyVersion(pSource, &pCopy);
819 NativeAssert::Succeeded(hr, "VerCopyVersion failed"); 951 NativeAssert::Succeeded(hr, "VerCopyVersion failed");
@@ -822,6 +954,10 @@ namespace DutilTests
822 Assert::False(pSource->sczVersion == pCopy->sczVersion); 954 Assert::False(pSource->sczVersion == pCopy->sczVersion);
823 Assert::False(pSource->rgReleaseLabels == pCopy->rgReleaseLabels); 955 Assert::False(pSource->rgReleaseLabels == pCopy->rgReleaseLabels);
824 Assert::Equal<WCHAR>(L'v', pCopy->chPrefix); 956 Assert::Equal<WCHAR>(L'v', pCopy->chPrefix);
957 Assert::Equal<BOOL>(TRUE, pCopy->fHasMajor);
958 Assert::Equal<BOOL>(TRUE, pCopy->fHasMinor);
959 Assert::Equal<BOOL>(TRUE, pCopy->fHasPatch);
960 Assert::Equal<BOOL>(TRUE, pCopy->fHasRevision);
825 961
826 hr = VerCompareParsedVersions(pSource, pCopy, &nResult); 962 hr = VerCompareParsedVersions(pSource, pCopy, &nResult);
827 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed"); 963 NativeAssert::Succeeded(hr, "VerCompareParsedVersions failed");
@@ -886,6 +1022,10 @@ namespace DutilTests
886 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 1022 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
887 Assert::Equal<DWORD>(0, pVersion1->cchMetadataOffset); 1023 Assert::Equal<DWORD>(0, pVersion1->cchMetadataOffset);
888 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid); 1024 Assert::Equal<BOOL>(TRUE, pVersion1->fInvalid);
1025 Assert::Equal<BOOL>(FALSE, pVersion1->fHasMajor);
1026 Assert::Equal<BOOL>(FALSE, pVersion1->fHasMinor);
1027 Assert::Equal<BOOL>(FALSE, pVersion1->fHasPatch);
1028 Assert::Equal<BOOL>(FALSE, pVersion1->fHasRevision);
889 1029
890 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion); 1030 NativeAssert::StringEqual(wzVersion2, pVersion2->sczVersion);
891 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix); 1031 Assert::Equal<WCHAR>(L'\0', pVersion2->chPrefix);
@@ -896,6 +1036,10 @@ namespace DutilTests
896 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels); 1036 Assert::Equal<DWORD>(0, pVersion2->cReleaseLabels);
897 Assert::Equal<DWORD>(2, pVersion2->cchMetadataOffset); 1037 Assert::Equal<DWORD>(2, pVersion2->cchMetadataOffset);
898 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid); 1038 Assert::Equal<BOOL>(TRUE, pVersion2->fInvalid);
1039 Assert::Equal<BOOL>(TRUE, pVersion2->fHasMajor);
1040 Assert::Equal<BOOL>(FALSE, pVersion2->fHasMinor);
1041 Assert::Equal<BOOL>(FALSE, pVersion2->fHasPatch);
1042 Assert::Equal<BOOL>(FALSE, pVersion2->fHasRevision);
899 1043
900 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion); 1044 NativeAssert::StringEqual(wzVersion3, pVersion3->sczVersion);
901 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix); 1045 Assert::Equal<WCHAR>(L'\0', pVersion3->chPrefix);
@@ -906,6 +1050,10 @@ namespace DutilTests
906 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels); 1050 Assert::Equal<DWORD>(0, pVersion3->cReleaseLabels);
907 Assert::Equal<DWORD>(4, pVersion3->cchMetadataOffset); 1051 Assert::Equal<DWORD>(4, pVersion3->cchMetadataOffset);
908 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid); 1052 Assert::Equal<BOOL>(TRUE, pVersion3->fInvalid);
1053 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMajor);
1054 Assert::Equal<BOOL>(TRUE, pVersion3->fHasMinor);
1055 Assert::Equal<BOOL>(FALSE, pVersion3->fHasPatch);
1056 Assert::Equal<BOOL>(FALSE, pVersion3->fHasRevision);
909 1057
910 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion); 1058 NativeAssert::StringEqual(wzVersion4, pVersion4->sczVersion);
911 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix); 1059 Assert::Equal<WCHAR>(L'\0', pVersion4->chPrefix);
@@ -916,6 +1064,10 @@ namespace DutilTests
916 Assert::Equal<DWORD>(0, pVersion4->cReleaseLabels); 1064 Assert::Equal<DWORD>(0, pVersion4->cReleaseLabels);
917 Assert::Equal<DWORD>(6, pVersion4->cchMetadataOffset); 1065 Assert::Equal<DWORD>(6, pVersion4->cchMetadataOffset);
918 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid); 1066 Assert::Equal<BOOL>(TRUE, pVersion4->fInvalid);
1067 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMajor);
1068 Assert::Equal<BOOL>(TRUE, pVersion4->fHasMinor);
1069 Assert::Equal<BOOL>(TRUE, pVersion4->fHasPatch);
1070 Assert::Equal<BOOL>(FALSE, pVersion4->fHasRevision);
919 1071
920 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion); 1072 NativeAssert::StringEqual(wzVersion5, pVersion5->sczVersion);
921 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix); 1073 Assert::Equal<WCHAR>(L'\0', pVersion5->chPrefix);
@@ -926,6 +1078,10 @@ namespace DutilTests
926 Assert::Equal<DWORD>(0, pVersion5->cReleaseLabels); 1078 Assert::Equal<DWORD>(0, pVersion5->cReleaseLabels);
927 Assert::Equal<DWORD>(8, pVersion5->cchMetadataOffset); 1079 Assert::Equal<DWORD>(8, pVersion5->cchMetadataOffset);
928 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid); 1080 Assert::Equal<BOOL>(TRUE, pVersion5->fInvalid);
1081 Assert::Equal<BOOL>(TRUE, pVersion5->fHasMajor);
1082 Assert::Equal<BOOL>(TRUE, pVersion5->fHasMinor);
1083 Assert::Equal<BOOL>(TRUE, pVersion5->fHasPatch);
1084 Assert::Equal<BOOL>(TRUE, pVersion5->fHasRevision);
929 1085
930 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion); 1086 NativeAssert::StringEqual(wzVersion6, pVersion6->sczVersion);
931 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix); 1087 Assert::Equal<WCHAR>(L'\0', pVersion6->chPrefix);
@@ -936,6 +1092,10 @@ namespace DutilTests
936 Assert::Equal<DWORD>(0, pVersion6->cReleaseLabels); 1092 Assert::Equal<DWORD>(0, pVersion6->cReleaseLabels);
937 Assert::Equal<DWORD>(2, pVersion6->cchMetadataOffset); 1093 Assert::Equal<DWORD>(2, pVersion6->cchMetadataOffset);
938 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid); 1094 Assert::Equal<BOOL>(TRUE, pVersion6->fInvalid);
1095 Assert::Equal<BOOL>(TRUE, pVersion6->fHasMajor);
1096 Assert::Equal<BOOL>(FALSE, pVersion6->fHasMinor);
1097 Assert::Equal<BOOL>(FALSE, pVersion6->fHasPatch);
1098 Assert::Equal<BOOL>(FALSE, pVersion6->fHasRevision);
939 1099
940 NativeAssert::StringEqual(wzVersion7, pVersion7->sczVersion); 1100 NativeAssert::StringEqual(wzVersion7, pVersion7->sczVersion);
941 Assert::Equal<WCHAR>(L'\0', pVersion7->chPrefix); 1101 Assert::Equal<WCHAR>(L'\0', pVersion7->chPrefix);
@@ -951,6 +1111,10 @@ namespace DutilTests
951 1111
952 Assert::Equal<DWORD>(4, pVersion7->cchMetadataOffset); 1112 Assert::Equal<DWORD>(4, pVersion7->cchMetadataOffset);
953 Assert::Equal<BOOL>(TRUE, pVersion7->fInvalid); 1113 Assert::Equal<BOOL>(TRUE, pVersion7->fInvalid);
1114 Assert::Equal<BOOL>(TRUE, pVersion7->fHasMajor);
1115 Assert::Equal<BOOL>(FALSE, pVersion7->fHasMinor);
1116 Assert::Equal<BOOL>(FALSE, pVersion7->fHasPatch);
1117 Assert::Equal<BOOL>(FALSE, pVersion7->fHasRevision);
954 } 1118 }
955 finally 1119 finally
956 { 1120 {
@@ -984,6 +1148,10 @@ namespace DutilTests
984 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels); 1148 Assert::Equal<DWORD>(0, pVersion1->cReleaseLabels);
985 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset); 1149 Assert::Equal<DWORD>(7, pVersion1->cchMetadataOffset);
986 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid); 1150 Assert::Equal<BOOL>(FALSE, pVersion1->fInvalid);
1151 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMajor);
1152 Assert::Equal<BOOL>(TRUE, pVersion1->fHasMinor);
1153 Assert::Equal<BOOL>(TRUE, pVersion1->fHasPatch);
1154 Assert::Equal<BOOL>(TRUE, pVersion1->fHasRevision);
987 } 1155 }
988 finally 1156 finally
989 { 1157 {
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
index e63bf65c..672bb235 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
@@ -254,10 +254,10 @@ namespace WixToolset.Core.Burn.Bundles
254 return new Version(0, 0); 254 return new Version(0, 0);
255 } 255 }
256 256
257 var major = wixVersion.Major ?? 0; 257 var major = wixVersion.Major;
258 var minor = wixVersion.Minor ?? 0; 258 var minor = wixVersion.Minor;
259 var build = wixVersion.Patch ?? 0; 259 var build = wixVersion.Patch;
260 var revision = wixVersion.Revision ?? 0; 260 var revision = wixVersion.Revision;
261 261
262 if (UInt16.MaxValue < major || UInt16.MaxValue < minor || UInt16.MaxValue < build || UInt16.MaxValue < revision) 262 if (UInt16.MaxValue < major || UInt16.MaxValue < minor || UInt16.MaxValue < build || UInt16.MaxValue < revision)
263 { 263 {
@@ -369,7 +369,7 @@ namespace WixToolset.Core.Burn.Bundles
369 public BURN_SPLASH_SCREEN_TYPE Type; 369 public BURN_SPLASH_SCREEN_TYPE Type;
370 370
371 [MarshalAs(UnmanagedType.U2)] 371 [MarshalAs(UnmanagedType.U2)]
372 public UInt16 ResourceId; 372 public ushort ResourceId;
373 373
374 public byte[] ToBytes() 374 public byte[] ToBytes()
375 { 375 {